Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-html / lib / server.js
1 (function(e, a) { for(var i in a) e[i] = a[i]; if(a.__esModule) Object.defineProperty(e, "__esModule", { value: true }); }(exports,
2 /******/ (() => { // webpackBootstrap
3 /******/        "use strict";
4 /******/        var __webpack_modules__ = ([
5 /* 0 */,
6 /* 1 */,
7 /* 2 */,
8 /* 3 */
9 /***/ ((module) => {
10
11 module.exports = require("path");;
12
13 /***/ }),
14 /* 4 */
15 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
16
17
18 /* --------------------------------------------------------------------------------------------
19  * Copyright (c) Microsoft Corporation. All rights reserved.
20  * Licensed under the MIT License. See License.txt in the project root for license information.
21  * ------------------------------------------------------------------------------------------ */
22 function __export(m) {
23     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
24 }
25 Object.defineProperty(exports, "__esModule", ({ value: true }));
26 const node_1 = __webpack_require__(5);
27 __export(__webpack_require__(5));
28 __export(__webpack_require__(24));
29 function createProtocolConnection(input, output, logger, options) {
30     return node_1.createMessageConnection(input, output, logger, options);
31 }
32 exports.createProtocolConnection = createProtocolConnection;
33 //# sourceMappingURL=main.js.map
34
35 /***/ }),
36 /* 5 */
37 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
38
39 /* --------------------------------------------------------------------------------------------
40  * Copyright (c) Microsoft Corporation. All rights reserved.
41  * Licensed under the MIT License. See License.txt in the project root for license information.
42  * ----------------------------------------------------------------------------------------- */
43
44
45 module.exports = __webpack_require__(6);
46
47 /***/ }),
48 /* 6 */
49 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
50
51
52 function __export(m) {
53     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
54 }
55 Object.defineProperty(exports, "__esModule", ({ value: true }));
56 /* --------------------------------------------------------------------------------------------
57  * Copyright (c) Microsoft Corporation. All rights reserved.
58  * Licensed under the MIT License. See License.txt in the project root for license information.
59  * ----------------------------------------------------------------------------------------- */
60 const ril_1 = __webpack_require__(7);
61 // Install the node runtime abstract.
62 ril_1.default.install();
63 const api_1 = __webpack_require__(11);
64 const path = __webpack_require__(3);
65 const os = __webpack_require__(21);
66 const crypto_1 = __webpack_require__(22);
67 const net_1 = __webpack_require__(23);
68 __export(__webpack_require__(11));
69 class IPCMessageReader extends api_1.AbstractMessageReader {
70     constructor(process) {
71         super();
72         this.process = process;
73         let eventEmitter = this.process;
74         eventEmitter.on('error', (error) => this.fireError(error));
75         eventEmitter.on('close', () => this.fireClose());
76     }
77     listen(callback) {
78         this.process.on('message', callback);
79         return api_1.Disposable.create(() => this.process.off('message', callback));
80     }
81 }
82 exports.IPCMessageReader = IPCMessageReader;
83 class IPCMessageWriter extends api_1.AbstractMessageWriter {
84     constructor(process) {
85         super();
86         this.process = process;
87         this.errorCount = 0;
88         let eventEmitter = this.process;
89         eventEmitter.on('error', (error) => this.fireError(error));
90         eventEmitter.on('close', () => this.fireClose);
91     }
92     write(msg) {
93         try {
94             if (typeof this.process.send === 'function') {
95                 this.process.send(msg, undefined, undefined, (error) => {
96                     if (error) {
97                         this.errorCount++;
98                         this.handleError(error, msg);
99                     }
100                     else {
101                         this.errorCount = 0;
102                     }
103                 });
104             }
105             return Promise.resolve();
106         }
107         catch (error) {
108             this.handleError(error, msg);
109             return Promise.reject(error);
110         }
111     }
112     handleError(error, msg) {
113         this.errorCount++;
114         this.fireError(error, msg, this.errorCount);
115     }
116 }
117 exports.IPCMessageWriter = IPCMessageWriter;
118 class SocketMessageReader extends api_1.ReadableStreamMessageReader {
119     constructor(socket, encoding = 'utf-8') {
120         super(ril_1.default().stream.asReadableStream(socket), encoding);
121     }
122 }
123 exports.SocketMessageReader = SocketMessageReader;
124 class SocketMessageWriter extends api_1.WriteableStreamMessageWriter {
125     constructor(socket, options) {
126         super(ril_1.default().stream.asWritableStream(socket), options);
127         this.socket = socket;
128     }
129     dispose() {
130         super.dispose();
131         this.socket.destroy();
132     }
133 }
134 exports.SocketMessageWriter = SocketMessageWriter;
135 class StreamMessageReader extends api_1.ReadableStreamMessageReader {
136     constructor(readble, encoding) {
137         super(ril_1.default().stream.asReadableStream(readble), encoding);
138     }
139 }
140 exports.StreamMessageReader = StreamMessageReader;
141 class StreamMessageWriter extends api_1.WriteableStreamMessageWriter {
142     constructor(writable, options) {
143         super(ril_1.default().stream.asWritableStream(writable), options);
144     }
145 }
146 exports.StreamMessageWriter = StreamMessageWriter;
147 function generateRandomPipeName() {
148     const randomSuffix = crypto_1.randomBytes(21).toString('hex');
149     if (process.platform === 'win32') {
150         return `\\\\.\\pipe\\vscode-jsonrpc-${randomSuffix}-sock`;
151     }
152     else {
153         // Mac/Unix: use socket file
154         return path.join(os.tmpdir(), `vscode-${randomSuffix}.sock`);
155     }
156 }
157 exports.generateRandomPipeName = generateRandomPipeName;
158 function createClientPipeTransport(pipeName, encoding = 'utf-8') {
159     let connectResolve;
160     const connected = new Promise((resolve, _reject) => {
161         connectResolve = resolve;
162     });
163     return new Promise((resolve, reject) => {
164         let server = net_1.createServer((socket) => {
165             server.close();
166             connectResolve([
167                 new SocketMessageReader(socket, encoding),
168                 new SocketMessageWriter(socket, encoding)
169             ]);
170         });
171         server.on('error', reject);
172         server.listen(pipeName, () => {
173             server.removeListener('error', reject);
174             resolve({
175                 onConnected: () => { return connected; }
176             });
177         });
178     });
179 }
180 exports.createClientPipeTransport = createClientPipeTransport;
181 function createServerPipeTransport(pipeName, encoding = 'utf-8') {
182     const socket = net_1.createConnection(pipeName);
183     return [
184         new SocketMessageReader(socket, encoding),
185         new SocketMessageWriter(socket, encoding)
186     ];
187 }
188 exports.createServerPipeTransport = createServerPipeTransport;
189 function createClientSocketTransport(port, encoding = 'utf-8') {
190     let connectResolve;
191     const connected = new Promise((resolve, _reject) => {
192         connectResolve = resolve;
193     });
194     return new Promise((resolve, reject) => {
195         const server = net_1.createServer((socket) => {
196             server.close();
197             connectResolve([
198                 new SocketMessageReader(socket, encoding),
199                 new SocketMessageWriter(socket, encoding)
200             ]);
201         });
202         server.on('error', reject);
203         server.listen(port, '127.0.0.1', () => {
204             server.removeListener('error', reject);
205             resolve({
206                 onConnected: () => { return connected; }
207             });
208         });
209     });
210 }
211 exports.createClientSocketTransport = createClientSocketTransport;
212 function createServerSocketTransport(port, encoding = 'utf-8') {
213     const socket = net_1.createConnection(port, '127.0.0.1');
214     return [
215         new SocketMessageReader(socket, encoding),
216         new SocketMessageWriter(socket, encoding)
217     ];
218 }
219 exports.createServerSocketTransport = createServerSocketTransport;
220 function isMessageReader(value) {
221     return value.listen !== undefined && value.read === undefined;
222 }
223 function isMessageWriter(value) {
224     return value.write !== undefined && value.end === undefined;
225 }
226 function createMessageConnection(input, output, logger, options) {
227     if (!logger) {
228         logger = api_1.NullLogger;
229     }
230     const reader = isMessageReader(input) ? input : new StreamMessageReader(input);
231     const writer = isMessageWriter(output) ? output : new StreamMessageWriter(output);
232     if (api_1.ConnectionStrategy.is(options)) {
233         options = { connectionStrategy: options };
234     }
235     return api_1.createMessageConnection(reader, writer, logger, options);
236 }
237 exports.createMessageConnection = createMessageConnection;
238 //# sourceMappingURL=main.js.map
239
240 /***/ }),
241 /* 7 */
242 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
243
244
245 /* --------------------------------------------------------------------------------------------
246  * Copyright (c) Microsoft Corporation. All rights reserved.
247  * Licensed under the MIT License. See License.txt in the project root for license information.
248  * ------------------------------------------------------------------------------------------ */
249 Object.defineProperty(exports, "__esModule", ({ value: true }));
250 const ral_1 = __webpack_require__(8);
251 const disposable_1 = __webpack_require__(9);
252 const util_1 = __webpack_require__(10);
253 const DefaultSize = 8192;
254 const CR = Buffer.from('\r', 'ascii')[0];
255 const LF = Buffer.from('\n', 'ascii')[0];
256 const CRLF = '\r\n';
257 class MessageBuffer {
258     constructor(encoding = 'utf-8') {
259         this._encoding = encoding;
260         this.index = 0;
261         this.buffer = Buffer.allocUnsafe(DefaultSize);
262     }
263     get encoding() {
264         return this._encoding;
265     }
266     append(chunk) {
267         let toAppend;
268         if (typeof chunk === 'string') {
269             toAppend = Buffer.from(chunk, this._encoding);
270         }
271         else {
272             toAppend = chunk;
273         }
274         if (this.buffer.length - this.index >= toAppend.length) {
275             this.buffer.set(toAppend, this.index);
276         }
277         else {
278             var newSize = (Math.ceil((this.index + toAppend.length) / DefaultSize) + 1) * DefaultSize;
279             if (this.index === 0) {
280                 this.buffer = Buffer.allocUnsafe(newSize);
281                 this.buffer.set(toAppend);
282             }
283             else {
284                 this.buffer = Buffer.concat([this.buffer.slice(0, this.index), toAppend], newSize);
285             }
286         }
287         this.index += toAppend.length;
288     }
289     tryReadHeaders() {
290         let current = 0;
291         while (current + 3 < this.index && (this.buffer[current] !== CR || this.buffer[current + 1] !== LF || this.buffer[current + 2] !== CR || this.buffer[current + 3] !== LF)) {
292             current++;
293         }
294         // No header / body separator found (e.g CRLFCRLF)
295         if (current + 3 >= this.index) {
296             return undefined;
297         }
298         const result = new Map();
299         const headers = this.buffer.toString('ascii', 0, current).split(CRLF);
300         headers.forEach((header) => {
301             let index = header.indexOf(':');
302             if (index === -1) {
303                 throw new Error('Message header must separate key and value using :');
304             }
305             let key = header.substr(0, index);
306             let value = header.substr(index + 1).trim();
307             result.set(key, value);
308         });
309         let nextStart = current + 4;
310         this.buffer = this.buffer.slice(nextStart);
311         this.index = this.index - nextStart;
312         return result;
313     }
314     tryReadBody(length) {
315         if (this.index < length) {
316             return undefined;
317         }
318         const result = Buffer.alloc(length);
319         this.buffer.copy(result, 0, 0, length);
320         const nextStart = length;
321         this.buffer.copy(this.buffer, 0, nextStart);
322         this.index = this.index - nextStart;
323         return result;
324     }
325     get numberOfBytes() {
326         return this.index;
327     }
328 }
329 class ReadableStreamWrapper {
330     constructor(stream) {
331         this.stream = stream;
332     }
333     onClose(listener) {
334         this.stream.on('close', listener);
335         return disposable_1.Disposable.create(() => this.stream.off('close', listener));
336     }
337     onError(listener) {
338         this.stream.on('error', listener);
339         return disposable_1.Disposable.create(() => this.stream.off('error', listener));
340     }
341     onEnd(listener) {
342         this.stream.on('end', listener);
343         return disposable_1.Disposable.create(() => this.stream.off('end', listener));
344     }
345     onData(listener) {
346         this.stream.on('data', listener);
347         return disposable_1.Disposable.create(() => this.stream.off('data', listener));
348     }
349 }
350 class WritableStreamWrapper {
351     constructor(stream) {
352         this.stream = stream;
353     }
354     onClose(listener) {
355         this.stream.on('close', listener);
356         return disposable_1.Disposable.create(() => this.stream.off('close', listener));
357     }
358     onError(listener) {
359         this.stream.on('error', listener);
360         return disposable_1.Disposable.create(() => this.stream.off('error', listener));
361     }
362     onEnd(listener) {
363         this.stream.on('end', listener);
364         return disposable_1.Disposable.create(() => this.stream.off('end', listener));
365     }
366     write(data, encoding) {
367         return new Promise((resolve, reject) => {
368             const callback = (error) => {
369                 if (error === undefined || error === null) {
370                     resolve();
371                 }
372                 else {
373                     reject(error);
374                 }
375             };
376             if (typeof data === 'string') {
377                 this.stream.write(data, encoding, callback);
378             }
379             else {
380                 this.stream.write(data, callback);
381             }
382         });
383     }
384     end() {
385         this.stream.end();
386     }
387 }
388 const _ril = Object.freeze({
389     messageBuffer: Object.freeze({
390         create: (encoding) => new MessageBuffer(encoding)
391     }),
392     applicationJson: Object.freeze({
393         encoder: Object.freeze({
394             name: 'application/json',
395             encode: (msg, options) => {
396                 return Promise.resolve(Buffer.from(JSON.stringify(msg, undefined, 0), options.charset));
397             }
398         }),
399         decoder: Object.freeze({
400             name: 'application/json',
401             decode: (buffer, options) => {
402                 if (buffer instanceof Buffer) {
403                     return Promise.resolve(JSON.parse(buffer.toString(options.charset)));
404                 }
405                 else {
406                     return Promise.resolve(JSON.parse(new util_1.TextDecoder(options.charset).decode(buffer)));
407                 }
408             }
409         })
410     }),
411     stream: Object.freeze({
412         asReadableStream: (socket) => new ReadableStreamWrapper(socket),
413         asWritableStream: (socket) => new WritableStreamWrapper(socket)
414     }),
415     console: console,
416     timer: Object.freeze({
417         setTimeout(callback, ms, ...args) {
418             return setTimeout(callback, ms, ...args);
419         },
420         clearTimeout(handle) {
421             clearTimeout(handle);
422         },
423         setImmediate(callback, ...args) {
424             return setImmediate(callback, ...args);
425         },
426         clearImmediate(handle) {
427             clearImmediate(handle);
428         }
429     })
430 });
431 function RIL() {
432     return _ril;
433 }
434 (function (RIL) {
435     function install() {
436         ral_1.default.install(_ril);
437     }
438     RIL.install = install;
439 })(RIL || (RIL = {}));
440 exports.default = RIL;
441 //# sourceMappingURL=ril.js.map
442
443 /***/ }),
444 /* 8 */
445 /***/ ((__unused_webpack_module, exports) => {
446
447
448 /* --------------------------------------------------------------------------------------------
449  * Copyright (c) Microsoft Corporation. All rights reserved.
450  * Licensed under the MIT License. See License.txt in the project root for license information.
451  * ------------------------------------------------------------------------------------------ */
452 Object.defineProperty(exports, "__esModule", ({ value: true }));
453 let _ral;
454 function RAL() {
455     if (_ral === undefined) {
456         throw new Error(`No runtime abstraction layer installed`);
457     }
458     return _ral;
459 }
460 (function (RAL) {
461     function install(ral) {
462         if (ral === undefined) {
463             throw new Error(`No runtime abstraction layer provided`);
464         }
465         _ral = ral;
466     }
467     RAL.install = install;
468 })(RAL || (RAL = {}));
469 exports.default = RAL;
470 //# sourceMappingURL=ral.js.map
471
472 /***/ }),
473 /* 9 */
474 /***/ ((__unused_webpack_module, exports) => {
475
476
477 /*---------------------------------------------------------------------------------------------
478  *  Copyright (c) Microsoft Corporation. All rights reserved.
479  *  Licensed under the MIT License. See License.txt in the project root for license information.
480  *--------------------------------------------------------------------------------------------*/
481 Object.defineProperty(exports, "__esModule", ({ value: true }));
482 var Disposable;
483 (function (Disposable) {
484     function create(func) {
485         return {
486             dispose: func
487         };
488     }
489     Disposable.create = create;
490 })(Disposable = exports.Disposable || (exports.Disposable = {}));
491 //# sourceMappingURL=disposable.js.map
492
493 /***/ }),
494 /* 10 */
495 /***/ ((module) => {
496
497 module.exports = require("util");;
498
499 /***/ }),
500 /* 11 */
501 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
502
503
504 /* --------------------------------------------------------------------------------------------
505  * Copyright (c) Microsoft Corporation. All rights reserved.
506  * Licensed under the MIT License. See License.txt in the project root for license information.
507  * ------------------------------------------------------------------------------------------ */
508 /// <reference path="../../typings/thenable.d.ts" />
509 Object.defineProperty(exports, "__esModule", ({ value: true }));
510 const messages_1 = __webpack_require__(12);
511 exports.RequestType = messages_1.RequestType;
512 exports.RequestType0 = messages_1.RequestType0;
513 exports.RequestType1 = messages_1.RequestType1;
514 exports.RequestType2 = messages_1.RequestType2;
515 exports.RequestType3 = messages_1.RequestType3;
516 exports.RequestType4 = messages_1.RequestType4;
517 exports.RequestType5 = messages_1.RequestType5;
518 exports.RequestType6 = messages_1.RequestType6;
519 exports.RequestType7 = messages_1.RequestType7;
520 exports.RequestType8 = messages_1.RequestType8;
521 exports.RequestType9 = messages_1.RequestType9;
522 exports.ResponseError = messages_1.ResponseError;
523 exports.ErrorCodes = messages_1.ErrorCodes;
524 exports.NotificationType = messages_1.NotificationType;
525 exports.NotificationType0 = messages_1.NotificationType0;
526 exports.NotificationType1 = messages_1.NotificationType1;
527 exports.NotificationType2 = messages_1.NotificationType2;
528 exports.NotificationType3 = messages_1.NotificationType3;
529 exports.NotificationType4 = messages_1.NotificationType4;
530 exports.NotificationType5 = messages_1.NotificationType5;
531 exports.NotificationType6 = messages_1.NotificationType6;
532 exports.NotificationType7 = messages_1.NotificationType7;
533 exports.NotificationType8 = messages_1.NotificationType8;
534 exports.NotificationType9 = messages_1.NotificationType9;
535 const disposable_1 = __webpack_require__(9);
536 exports.Disposable = disposable_1.Disposable;
537 const events_1 = __webpack_require__(14);
538 exports.Event = events_1.Event;
539 exports.Emitter = events_1.Emitter;
540 const cancellation_1 = __webpack_require__(15);
541 exports.CancellationTokenSource = cancellation_1.CancellationTokenSource;
542 exports.CancellationToken = cancellation_1.CancellationToken;
543 const messageReader_1 = __webpack_require__(16);
544 exports.MessageReader = messageReader_1.MessageReader;
545 exports.AbstractMessageReader = messageReader_1.AbstractMessageReader;
546 exports.ReadableStreamMessageReader = messageReader_1.ReadableStreamMessageReader;
547 const messageWriter_1 = __webpack_require__(17);
548 exports.MessageWriter = messageWriter_1.MessageWriter;
549 exports.AbstractMessageWriter = messageWriter_1.AbstractMessageWriter;
550 exports.WriteableStreamMessageWriter = messageWriter_1.WriteableStreamMessageWriter;
551 const connection_1 = __webpack_require__(19);
552 exports.ConnectionStrategy = connection_1.ConnectionStrategy;
553 exports.ConnectionOptions = connection_1.ConnectionOptions;
554 exports.NullLogger = connection_1.NullLogger;
555 exports.createMessageConnection = connection_1.createMessageConnection;
556 exports.ProgressType = connection_1.ProgressType;
557 exports.Trace = connection_1.Trace;
558 exports.TraceFormat = connection_1.TraceFormat;
559 exports.SetTraceNotification = connection_1.SetTraceNotification;
560 exports.LogTraceNotification = connection_1.LogTraceNotification;
561 exports.ConnectionErrors = connection_1.ConnectionErrors;
562 exports.ConnectionError = connection_1.ConnectionError;
563 exports.CancellationReceiverStrategy = connection_1.CancellationReceiverStrategy;
564 exports.CancellationSenderStrategy = connection_1.CancellationSenderStrategy;
565 exports.CancellationStrategy = connection_1.CancellationStrategy;
566 const ral_1 = __webpack_require__(8);
567 exports.RAL = ral_1.default;
568 //# sourceMappingURL=api.js.map
569
570 /***/ }),
571 /* 12 */
572 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
573
574
575 /* --------------------------------------------------------------------------------------------
576  * Copyright (c) Microsoft Corporation. All rights reserved.
577  * Licensed under the MIT License. See License.txt in the project root for license information.
578  * ------------------------------------------------------------------------------------------ */
579 Object.defineProperty(exports, "__esModule", ({ value: true }));
580 const is = __webpack_require__(13);
581 /**
582  * Predefined error codes.
583  */
584 var ErrorCodes;
585 (function (ErrorCodes) {
586     // Defined by JSON RPC
587     ErrorCodes.ParseError = -32700;
588     ErrorCodes.InvalidRequest = -32600;
589     ErrorCodes.MethodNotFound = -32601;
590     ErrorCodes.InvalidParams = -32602;
591     ErrorCodes.InternalError = -32603;
592     ErrorCodes.serverErrorStart = -32099;
593     ErrorCodes.serverErrorEnd = -32000;
594     ErrorCodes.ServerNotInitialized = -32002;
595     ErrorCodes.UnknownErrorCode = -32001;
596     // Defined by the protocol.
597     ErrorCodes.RequestCancelled = -32800;
598     ErrorCodes.ContentModified = -32801;
599     // Defined by VSCode library.
600     ErrorCodes.MessageWriteError = 1;
601     ErrorCodes.MessageReadError = 2;
602 })(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {}));
603 /**
604  * An error object return in a response in case a request
605  * has failed.
606  */
607 class ResponseError extends Error {
608     constructor(code, message, data) {
609         super(message);
610         this.code = is.number(code) ? code : ErrorCodes.UnknownErrorCode;
611         this.data = data;
612         Object.setPrototypeOf(this, ResponseError.prototype);
613     }
614     toJson() {
615         return {
616             code: this.code,
617             message: this.message,
618             data: this.data,
619         };
620     }
621 }
622 exports.ResponseError = ResponseError;
623 /**
624  * An abstract implementation of a MessageType.
625  */
626 class AbstractMessageSignature {
627     constructor(_method, _numberOfParams) {
628         this._method = _method;
629         this._numberOfParams = _numberOfParams;
630     }
631     get method() {
632         return this._method;
633     }
634     get numberOfParams() {
635         return this._numberOfParams;
636     }
637 }
638 exports.AbstractMessageSignature = AbstractMessageSignature;
639 /**
640  * Classes to type request response pairs
641  *
642  * The type parameter RO will be removed in the next major version
643  * of the JSON RPC library since it is a LSP concept and doesn't
644  * belong here. For now it is tagged as default never.
645  */
646 class RequestType0 extends AbstractMessageSignature {
647     constructor(method) {
648         super(method, 0);
649     }
650 }
651 exports.RequestType0 = RequestType0;
652 class RequestType extends AbstractMessageSignature {
653     constructor(method) {
654         super(method, 1);
655     }
656 }
657 exports.RequestType = RequestType;
658 class RequestType1 extends AbstractMessageSignature {
659     constructor(method) {
660         super(method, 1);
661     }
662 }
663 exports.RequestType1 = RequestType1;
664 class RequestType2 extends AbstractMessageSignature {
665     constructor(method) {
666         super(method, 2);
667     }
668 }
669 exports.RequestType2 = RequestType2;
670 class RequestType3 extends AbstractMessageSignature {
671     constructor(method) {
672         super(method, 3);
673     }
674 }
675 exports.RequestType3 = RequestType3;
676 class RequestType4 extends AbstractMessageSignature {
677     constructor(method) {
678         super(method, 4);
679     }
680 }
681 exports.RequestType4 = RequestType4;
682 class RequestType5 extends AbstractMessageSignature {
683     constructor(method) {
684         super(method, 5);
685     }
686 }
687 exports.RequestType5 = RequestType5;
688 class RequestType6 extends AbstractMessageSignature {
689     constructor(method) {
690         super(method, 6);
691     }
692 }
693 exports.RequestType6 = RequestType6;
694 class RequestType7 extends AbstractMessageSignature {
695     constructor(method) {
696         super(method, 7);
697     }
698 }
699 exports.RequestType7 = RequestType7;
700 class RequestType8 extends AbstractMessageSignature {
701     constructor(method) {
702         super(method, 8);
703     }
704 }
705 exports.RequestType8 = RequestType8;
706 class RequestType9 extends AbstractMessageSignature {
707     constructor(method) {
708         super(method, 9);
709     }
710 }
711 exports.RequestType9 = RequestType9;
712 /**
713  * The type parameter RO will be removed in the next major version
714  * of the JSON RPC library since it is a LSP concept and doesn't
715  * belong here. For now it is tagged as default never.
716  */
717 class NotificationType extends AbstractMessageSignature {
718     constructor(method) {
719         super(method, 1);
720         this._ = undefined;
721     }
722 }
723 exports.NotificationType = NotificationType;
724 class NotificationType0 extends AbstractMessageSignature {
725     constructor(method) {
726         super(method, 0);
727     }
728 }
729 exports.NotificationType0 = NotificationType0;
730 class NotificationType1 extends AbstractMessageSignature {
731     constructor(method) {
732         super(method, 1);
733     }
734 }
735 exports.NotificationType1 = NotificationType1;
736 class NotificationType2 extends AbstractMessageSignature {
737     constructor(method) {
738         super(method, 2);
739     }
740 }
741 exports.NotificationType2 = NotificationType2;
742 class NotificationType3 extends AbstractMessageSignature {
743     constructor(method) {
744         super(method, 3);
745     }
746 }
747 exports.NotificationType3 = NotificationType3;
748 class NotificationType4 extends AbstractMessageSignature {
749     constructor(method) {
750         super(method, 4);
751     }
752 }
753 exports.NotificationType4 = NotificationType4;
754 class NotificationType5 extends AbstractMessageSignature {
755     constructor(method) {
756         super(method, 5);
757     }
758 }
759 exports.NotificationType5 = NotificationType5;
760 class NotificationType6 extends AbstractMessageSignature {
761     constructor(method) {
762         super(method, 6);
763     }
764 }
765 exports.NotificationType6 = NotificationType6;
766 class NotificationType7 extends AbstractMessageSignature {
767     constructor(method) {
768         super(method, 7);
769     }
770 }
771 exports.NotificationType7 = NotificationType7;
772 class NotificationType8 extends AbstractMessageSignature {
773     constructor(method) {
774         super(method, 8);
775     }
776 }
777 exports.NotificationType8 = NotificationType8;
778 class NotificationType9 extends AbstractMessageSignature {
779     constructor(method) {
780         super(method, 9);
781     }
782 }
783 exports.NotificationType9 = NotificationType9;
784 /**
785  * Tests if the given message is a request message
786  */
787 function isRequestMessage(message) {
788     const candidate = message;
789     return candidate && is.string(candidate.method) && (is.string(candidate.id) || is.number(candidate.id));
790 }
791 exports.isRequestMessage = isRequestMessage;
792 /**
793  * Tests if the given message is a notification message
794  */
795 function isNotificationMessage(message) {
796     const candidate = message;
797     return candidate && is.string(candidate.method) && message.id === void 0;
798 }
799 exports.isNotificationMessage = isNotificationMessage;
800 /**
801  * Tests if the given message is a response message
802  */
803 function isResponseMessage(message) {
804     const candidate = message;
805     return candidate && (candidate.result !== void 0 || !!candidate.error) && (is.string(candidate.id) || is.number(candidate.id) || candidate.id === null);
806 }
807 exports.isResponseMessage = isResponseMessage;
808 //# sourceMappingURL=messages.js.map
809
810 /***/ }),
811 /* 13 */
812 /***/ ((__unused_webpack_module, exports) => {
813
814
815 /* --------------------------------------------------------------------------------------------
816  * Copyright (c) Microsoft Corporation. All rights reserved.
817  * Licensed under the MIT License. See License.txt in the project root for license information.
818  * ------------------------------------------------------------------------------------------ */
819 Object.defineProperty(exports, "__esModule", ({ value: true }));
820 function boolean(value) {
821     return value === true || value === false;
822 }
823 exports.boolean = boolean;
824 function string(value) {
825     return typeof value === 'string' || value instanceof String;
826 }
827 exports.string = string;
828 function number(value) {
829     return typeof value === 'number' || value instanceof Number;
830 }
831 exports.number = number;
832 function error(value) {
833     return value instanceof Error;
834 }
835 exports.error = error;
836 function func(value) {
837     return typeof value === 'function';
838 }
839 exports.func = func;
840 function array(value) {
841     return Array.isArray(value);
842 }
843 exports.array = array;
844 function stringArray(value) {
845     return array(value) && value.every(elem => string(elem));
846 }
847 exports.stringArray = stringArray;
848 //# sourceMappingURL=is.js.map
849
850 /***/ }),
851 /* 14 */
852 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
853
854
855 /* --------------------------------------------------------------------------------------------
856  * Copyright (c) Microsoft Corporation. All rights reserved.
857  * Licensed under the MIT License. See License.txt in the project root for license information.
858  * ------------------------------------------------------------------------------------------ */
859 Object.defineProperty(exports, "__esModule", ({ value: true }));
860 const ral_1 = __webpack_require__(8);
861 var Event;
862 (function (Event) {
863     const _disposable = { dispose() { } };
864     Event.None = function () { return _disposable; };
865 })(Event = exports.Event || (exports.Event = {}));
866 class CallbackList {
867     add(callback, context = null, bucket) {
868         if (!this._callbacks) {
869             this._callbacks = [];
870             this._contexts = [];
871         }
872         this._callbacks.push(callback);
873         this._contexts.push(context);
874         if (Array.isArray(bucket)) {
875             bucket.push({ dispose: () => this.remove(callback, context) });
876         }
877     }
878     remove(callback, context = null) {
879         if (!this._callbacks) {
880             return;
881         }
882         let foundCallbackWithDifferentContext = false;
883         for (let i = 0, len = this._callbacks.length; i < len; i++) {
884             if (this._callbacks[i] === callback) {
885                 if (this._contexts[i] === context) {
886                     // callback & context match => remove it
887                     this._callbacks.splice(i, 1);
888                     this._contexts.splice(i, 1);
889                     return;
890                 }
891                 else {
892                     foundCallbackWithDifferentContext = true;
893                 }
894             }
895         }
896         if (foundCallbackWithDifferentContext) {
897             throw new Error('When adding a listener with a context, you should remove it with the same context');
898         }
899     }
900     invoke(...args) {
901         if (!this._callbacks) {
902             return [];
903         }
904         const ret = [], callbacks = this._callbacks.slice(0), contexts = this._contexts.slice(0);
905         for (let i = 0, len = callbacks.length; i < len; i++) {
906             try {
907                 ret.push(callbacks[i].apply(contexts[i], args));
908             }
909             catch (e) {
910                 // eslint-disable-next-line no-console
911                 ral_1.default().console.error(e);
912             }
913         }
914         return ret;
915     }
916     isEmpty() {
917         return !this._callbacks || this._callbacks.length === 0;
918     }
919     dispose() {
920         this._callbacks = undefined;
921         this._contexts = undefined;
922     }
923 }
924 class Emitter {
925     constructor(_options) {
926         this._options = _options;
927     }
928     /**
929      * For the public to allow to subscribe
930      * to events from this Emitter
931      */
932     get event() {
933         if (!this._event) {
934             this._event = (listener, thisArgs, disposables) => {
935                 if (!this._callbacks) {
936                     this._callbacks = new CallbackList();
937                 }
938                 if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
939                     this._options.onFirstListenerAdd(this);
940                 }
941                 this._callbacks.add(listener, thisArgs);
942                 const result = {
943                     dispose: () => {
944                         if (!this._callbacks) {
945                             // disposable is disposed after emitter is disposed.
946                             return;
947                         }
948                         this._callbacks.remove(listener, thisArgs);
949                         result.dispose = Emitter._noop;
950                         if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {
951                             this._options.onLastListenerRemove(this);
952                         }
953                     }
954                 };
955                 if (Array.isArray(disposables)) {
956                     disposables.push(result);
957                 }
958                 return result;
959             };
960         }
961         return this._event;
962     }
963     /**
964      * To be kept private to fire an event to
965      * subscribers
966      */
967     fire(event) {
968         if (this._callbacks) {
969             this._callbacks.invoke.call(this._callbacks, event);
970         }
971     }
972     dispose() {
973         if (this._callbacks) {
974             this._callbacks.dispose();
975             this._callbacks = undefined;
976         }
977     }
978 }
979 exports.Emitter = Emitter;
980 Emitter._noop = function () { };
981 //# sourceMappingURL=events.js.map
982
983 /***/ }),
984 /* 15 */
985 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
986
987
988 /*---------------------------------------------------------------------------------------------
989  *  Copyright (c) Microsoft Corporation. All rights reserved.
990  *  Licensed under the MIT License. See License.txt in the project root for license information.
991  *--------------------------------------------------------------------------------------------*/
992 Object.defineProperty(exports, "__esModule", ({ value: true }));
993 const ral_1 = __webpack_require__(8);
994 const Is = __webpack_require__(13);
995 const events_1 = __webpack_require__(14);
996 var CancellationToken;
997 (function (CancellationToken) {
998     CancellationToken.None = Object.freeze({
999         isCancellationRequested: false,
1000         onCancellationRequested: events_1.Event.None
1001     });
1002     CancellationToken.Cancelled = Object.freeze({
1003         isCancellationRequested: true,
1004         onCancellationRequested: events_1.Event.None
1005     });
1006     function is(value) {
1007         const candidate = value;
1008         return candidate && (candidate === CancellationToken.None
1009             || candidate === CancellationToken.Cancelled
1010             || (Is.boolean(candidate.isCancellationRequested) && !!candidate.onCancellationRequested));
1011     }
1012     CancellationToken.is = is;
1013 })(CancellationToken = exports.CancellationToken || (exports.CancellationToken = {}));
1014 const shortcutEvent = Object.freeze(function (callback, context) {
1015     const handle = ral_1.default().timer.setTimeout(callback.bind(context), 0);
1016     return { dispose() { ral_1.default().timer.clearTimeout(handle); } };
1017 });
1018 class MutableToken {
1019     constructor() {
1020         this._isCancelled = false;
1021     }
1022     cancel() {
1023         if (!this._isCancelled) {
1024             this._isCancelled = true;
1025             if (this._emitter) {
1026                 this._emitter.fire(undefined);
1027                 this.dispose();
1028             }
1029         }
1030     }
1031     get isCancellationRequested() {
1032         return this._isCancelled;
1033     }
1034     get onCancellationRequested() {
1035         if (this._isCancelled) {
1036             return shortcutEvent;
1037         }
1038         if (!this._emitter) {
1039             this._emitter = new events_1.Emitter();
1040         }
1041         return this._emitter.event;
1042     }
1043     dispose() {
1044         if (this._emitter) {
1045             this._emitter.dispose();
1046             this._emitter = undefined;
1047         }
1048     }
1049 }
1050 class CancellationTokenSource {
1051     get token() {
1052         if (!this._token) {
1053             // be lazy and create the token only when
1054             // actually needed
1055             this._token = new MutableToken();
1056         }
1057         return this._token;
1058     }
1059     cancel() {
1060         if (!this._token) {
1061             // save an object by returning the default
1062             // cancelled token when cancellation happens
1063             // before someone asks for the token
1064             this._token = CancellationToken.Cancelled;
1065         }
1066         else {
1067             this._token.cancel();
1068         }
1069     }
1070     dispose() {
1071         if (!this._token) {
1072             // ensure to initialize with an empty token if we had none
1073             this._token = CancellationToken.None;
1074         }
1075         else if (this._token instanceof MutableToken) {
1076             // actually dispose
1077             this._token.dispose();
1078         }
1079     }
1080 }
1081 exports.CancellationTokenSource = CancellationTokenSource;
1082 //# sourceMappingURL=cancellation.js.map
1083
1084 /***/ }),
1085 /* 16 */
1086 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1087
1088
1089 /* --------------------------------------------------------------------------------------------
1090  * Copyright (c) Microsoft Corporation. All rights reserved.
1091  * Licensed under the MIT License. See License.txt in the project root for license information.
1092  * ------------------------------------------------------------------------------------------ */
1093 Object.defineProperty(exports, "__esModule", ({ value: true }));
1094 const ral_1 = __webpack_require__(8);
1095 const Is = __webpack_require__(13);
1096 const events_1 = __webpack_require__(14);
1097 var MessageReader;
1098 (function (MessageReader) {
1099     function is(value) {
1100         let candidate = value;
1101         return candidate && Is.func(candidate.listen) && Is.func(candidate.dispose) &&
1102             Is.func(candidate.onError) && Is.func(candidate.onClose) && Is.func(candidate.onPartialMessage);
1103     }
1104     MessageReader.is = is;
1105 })(MessageReader = exports.MessageReader || (exports.MessageReader = {}));
1106 class AbstractMessageReader {
1107     constructor() {
1108         this.errorEmitter = new events_1.Emitter();
1109         this.closeEmitter = new events_1.Emitter();
1110         this.partialMessageEmitter = new events_1.Emitter();
1111     }
1112     dispose() {
1113         this.errorEmitter.dispose();
1114         this.closeEmitter.dispose();
1115     }
1116     get onError() {
1117         return this.errorEmitter.event;
1118     }
1119     fireError(error) {
1120         this.errorEmitter.fire(this.asError(error));
1121     }
1122     get onClose() {
1123         return this.closeEmitter.event;
1124     }
1125     fireClose() {
1126         this.closeEmitter.fire(undefined);
1127     }
1128     get onPartialMessage() {
1129         return this.partialMessageEmitter.event;
1130     }
1131     firePartialMessage(info) {
1132         this.partialMessageEmitter.fire(info);
1133     }
1134     asError(error) {
1135         if (error instanceof Error) {
1136             return error;
1137         }
1138         else {
1139             return new Error(`Reader received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);
1140         }
1141     }
1142 }
1143 exports.AbstractMessageReader = AbstractMessageReader;
1144 var ResolvedMessageReaderOptions;
1145 (function (ResolvedMessageReaderOptions) {
1146     function fromOptions(options) {
1147         var _a;
1148         let charset;
1149         let result;
1150         let contentDecoder;
1151         const contentDecoders = new Map();
1152         let contentTypeDecoder;
1153         const contentTypeDecoders = new Map();
1154         if (options === undefined || typeof options === 'string') {
1155             charset = options !== null && options !== void 0 ? options : 'utf-8';
1156         }
1157         else {
1158             charset = (_a = options.charset) !== null && _a !== void 0 ? _a : 'utf-8';
1159             if (options.contentDecoder !== undefined) {
1160                 contentDecoder = options.contentDecoder;
1161                 contentDecoders.set(contentDecoder.name, contentDecoder);
1162             }
1163             if (options.contentDecoders !== undefined) {
1164                 for (const decoder of options.contentDecoders) {
1165                     contentDecoders.set(decoder.name, decoder);
1166                 }
1167             }
1168             if (options.contentTypeDecoder !== undefined) {
1169                 contentTypeDecoder = options.contentTypeDecoder;
1170                 contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);
1171             }
1172             if (options.contentTypeDecoders !== undefined) {
1173                 for (const decoder of options.contentTypeDecoders) {
1174                     contentTypeDecoders.set(decoder.name, decoder);
1175                 }
1176             }
1177         }
1178         if (contentTypeDecoder === undefined) {
1179             contentTypeDecoder = ral_1.default().applicationJson.decoder;
1180             contentTypeDecoders.set(contentTypeDecoder.name, contentTypeDecoder);
1181         }
1182         return { charset, contentDecoder, contentDecoders, contentTypeDecoder, contentTypeDecoders };
1183     }
1184     ResolvedMessageReaderOptions.fromOptions = fromOptions;
1185 })(ResolvedMessageReaderOptions || (ResolvedMessageReaderOptions = {}));
1186 class ReadableStreamMessageReader extends AbstractMessageReader {
1187     constructor(readable, options) {
1188         super();
1189         this.readable = readable;
1190         this.options = ResolvedMessageReaderOptions.fromOptions(options);
1191         this.buffer = ral_1.default().messageBuffer.create(this.options.charset);
1192         this._partialMessageTimeout = 10000;
1193         this.nextMessageLength = -1;
1194         this.messageToken = 0;
1195     }
1196     set partialMessageTimeout(timeout) {
1197         this._partialMessageTimeout = timeout;
1198     }
1199     get partialMessageTimeout() {
1200         return this._partialMessageTimeout;
1201     }
1202     listen(callback) {
1203         this.nextMessageLength = -1;
1204         this.messageToken = 0;
1205         this.partialMessageTimer = undefined;
1206         this.callback = callback;
1207         const result = this.readable.onData((data) => {
1208             this.onData(data);
1209         });
1210         this.readable.onError((error) => this.fireError(error));
1211         this.readable.onClose(() => this.fireClose());
1212         return result;
1213     }
1214     onData(data) {
1215         this.buffer.append(data);
1216         while (true) {
1217             if (this.nextMessageLength === -1) {
1218                 const headers = this.buffer.tryReadHeaders();
1219                 if (!headers) {
1220                     return;
1221                 }
1222                 const contentLength = headers.get('Content-Length');
1223                 if (!contentLength) {
1224                     throw new Error('Header must provide a Content-Length property.');
1225                 }
1226                 const length = parseInt(contentLength);
1227                 if (isNaN(length)) {
1228                     throw new Error('Content-Length value must be a number.');
1229                 }
1230                 this.nextMessageLength = length;
1231             }
1232             const body = this.buffer.tryReadBody(this.nextMessageLength);
1233             if (body === undefined) {
1234                 /** We haven't received the full message yet. */
1235                 this.setPartialMessageTimer();
1236                 return;
1237             }
1238             this.clearPartialMessageTimer();
1239             this.nextMessageLength = -1;
1240             let p;
1241             if (this.options.contentDecoder !== undefined) {
1242                 p = this.options.contentDecoder.decode(body);
1243             }
1244             else {
1245                 p = Promise.resolve(body);
1246             }
1247             p.then((value) => {
1248                 this.options.contentTypeDecoder.decode(value, this.options).then((msg) => {
1249                     this.callback(msg);
1250                 }, (error) => {
1251                     this.fireError(error);
1252                 });
1253             }, (error) => {
1254                 this.fireError(error);
1255             });
1256         }
1257     }
1258     clearPartialMessageTimer() {
1259         if (this.partialMessageTimer) {
1260             ral_1.default().timer.clearTimeout(this.partialMessageTimer);
1261             this.partialMessageTimer = undefined;
1262         }
1263     }
1264     setPartialMessageTimer() {
1265         this.clearPartialMessageTimer();
1266         if (this._partialMessageTimeout <= 0) {
1267             return;
1268         }
1269         this.partialMessageTimer = ral_1.default().timer.setTimeout((token, timeout) => {
1270             this.partialMessageTimer = undefined;
1271             if (token === this.messageToken) {
1272                 this.firePartialMessage({ messageToken: token, waitingTime: timeout });
1273                 this.setPartialMessageTimer();
1274             }
1275         }, this._partialMessageTimeout, this.messageToken, this._partialMessageTimeout);
1276     }
1277 }
1278 exports.ReadableStreamMessageReader = ReadableStreamMessageReader;
1279 //# sourceMappingURL=messageReader.js.map
1280
1281 /***/ }),
1282 /* 17 */
1283 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1284
1285
1286 /* --------------------------------------------------------------------------------------------
1287  * Copyright (c) Microsoft Corporation. All rights reserved.
1288  * Licensed under the MIT License. See License.txt in the project root for license information.
1289  * ------------------------------------------------------------------------------------------ */
1290 Object.defineProperty(exports, "__esModule", ({ value: true }));
1291 const ral_1 = __webpack_require__(8);
1292 const Is = __webpack_require__(13);
1293 const semaphore_1 = __webpack_require__(18);
1294 const events_1 = __webpack_require__(14);
1295 const ContentLength = 'Content-Length: ';
1296 const CRLF = '\r\n';
1297 var MessageWriter;
1298 (function (MessageWriter) {
1299     function is(value) {
1300         let candidate = value;
1301         return candidate && Is.func(candidate.dispose) && Is.func(candidate.onClose) &&
1302             Is.func(candidate.onError) && Is.func(candidate.write);
1303     }
1304     MessageWriter.is = is;
1305 })(MessageWriter = exports.MessageWriter || (exports.MessageWriter = {}));
1306 class AbstractMessageWriter {
1307     constructor() {
1308         this.errorEmitter = new events_1.Emitter();
1309         this.closeEmitter = new events_1.Emitter();
1310     }
1311     dispose() {
1312         this.errorEmitter.dispose();
1313         this.closeEmitter.dispose();
1314     }
1315     get onError() {
1316         return this.errorEmitter.event;
1317     }
1318     fireError(error, message, count) {
1319         this.errorEmitter.fire([this.asError(error), message, count]);
1320     }
1321     get onClose() {
1322         return this.closeEmitter.event;
1323     }
1324     fireClose() {
1325         this.closeEmitter.fire(undefined);
1326     }
1327     asError(error) {
1328         if (error instanceof Error) {
1329             return error;
1330         }
1331         else {
1332             return new Error(`Writer received error. Reason: ${Is.string(error.message) ? error.message : 'unknown'}`);
1333         }
1334     }
1335 }
1336 exports.AbstractMessageWriter = AbstractMessageWriter;
1337 var ResolvedMessageWriterOptions;
1338 (function (ResolvedMessageWriterOptions) {
1339     function fromOptions(options) {
1340         var _a, _b;
1341         if (options === undefined || typeof options === 'string') {
1342             return { charset: options !== null && options !== void 0 ? options : 'utf-8', contentTypeEncoder: ral_1.default().applicationJson.encoder };
1343         }
1344         else {
1345             return { charset: (_a = options.charset) !== null && _a !== void 0 ? _a : 'utf-8', contentEncoder: options.contentEncoder, contentTypeEncoder: (_b = options.contentTypeEncoder) !== null && _b !== void 0 ? _b : ral_1.default().applicationJson.encoder };
1346         }
1347     }
1348     ResolvedMessageWriterOptions.fromOptions = fromOptions;
1349 })(ResolvedMessageWriterOptions || (ResolvedMessageWriterOptions = {}));
1350 class WriteableStreamMessageWriter extends AbstractMessageWriter {
1351     constructor(writable, options) {
1352         super();
1353         this.writable = writable;
1354         this.options = ResolvedMessageWriterOptions.fromOptions(options);
1355         this.errorCount = 0;
1356         this.writeSemaphore = new semaphore_1.Semaphore(1);
1357         this.writable.onError((error) => this.fireError(error));
1358         this.writable.onClose(() => this.fireClose());
1359     }
1360     async write(msg) {
1361         const payload = this.options.contentTypeEncoder.encode(msg, this.options).then((buffer) => {
1362             if (this.options.contentEncoder !== undefined) {
1363                 return this.options.contentEncoder.encode(buffer);
1364             }
1365             else {
1366                 return buffer;
1367             }
1368         });
1369         return payload.then((buffer) => {
1370             const headers = [];
1371             headers.push(ContentLength, buffer.byteLength.toString(), CRLF);
1372             headers.push(CRLF);
1373             return this.doWrite(msg, headers, buffer);
1374         }, (error) => {
1375             this.fireError(error);
1376             throw error;
1377         });
1378     }
1379     doWrite(msg, headers, data) {
1380         return this.writeSemaphore.lock(async () => {
1381             try {
1382                 await this.writable.write(headers.join(''), 'ascii');
1383                 return this.writable.write(data);
1384             }
1385             catch (error) {
1386                 this.handleError(error, msg);
1387             }
1388         });
1389     }
1390     handleError(error, msg) {
1391         this.errorCount++;
1392         this.fireError(error, msg, this.errorCount);
1393     }
1394 }
1395 exports.WriteableStreamMessageWriter = WriteableStreamMessageWriter;
1396 //# sourceMappingURL=messageWriter.js.map
1397
1398 /***/ }),
1399 /* 18 */
1400 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1401
1402
1403 /* --------------------------------------------------------------------------------------------
1404  * Copyright (c) Microsoft Corporation. All rights reserved.
1405  * Licensed under the MIT License. See License.txt in the project root for license information.
1406  * ------------------------------------------------------------------------------------------ */
1407 Object.defineProperty(exports, "__esModule", ({ value: true }));
1408 const ral_1 = __webpack_require__(8);
1409 class Semaphore {
1410     constructor(capacity = 1) {
1411         if (capacity <= 0) {
1412             throw new Error('Capacity must be greater than 0');
1413         }
1414         this._capacity = capacity;
1415         this._active = 0;
1416         this._waiting = [];
1417     }
1418     lock(thunk) {
1419         return new Promise((resolve, reject) => {
1420             this._waiting.push({ thunk, resolve, reject });
1421             this.runNext();
1422         });
1423     }
1424     get active() {
1425         return this._active;
1426     }
1427     runNext() {
1428         if (this._waiting.length === 0 || this._active === this._capacity) {
1429             return;
1430         }
1431         ral_1.default().timer.setImmediate(() => this.doRunNext());
1432     }
1433     doRunNext() {
1434         if (this._waiting.length === 0 || this._active === this._capacity) {
1435             return;
1436         }
1437         const next = this._waiting.shift();
1438         this._active++;
1439         if (this._active > this._capacity) {
1440             throw new Error(`To many thunks active`);
1441         }
1442         try {
1443             const result = next.thunk();
1444             if (result instanceof Promise) {
1445                 result.then((value) => {
1446                     this._active--;
1447                     next.resolve(value);
1448                     this.runNext();
1449                 }, (err) => {
1450                     this._active--;
1451                     next.reject(err);
1452                     this.runNext();
1453                 });
1454             }
1455             else {
1456                 this._active--;
1457                 next.resolve(result);
1458                 this.runNext();
1459             }
1460         }
1461         catch (err) {
1462             this._active--;
1463             next.reject(err);
1464             this.runNext();
1465         }
1466     }
1467 }
1468 exports.Semaphore = Semaphore;
1469 //# sourceMappingURL=semaphore.js.map
1470
1471 /***/ }),
1472 /* 19 */
1473 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1474
1475
1476 /* --------------------------------------------------------------------------------------------
1477  * Copyright (c) Microsoft Corporation. All rights reserved.
1478  * Licensed under the MIT License. See License.txt in the project root for license information.
1479  * ------------------------------------------------------------------------------------------ */
1480 Object.defineProperty(exports, "__esModule", ({ value: true }));
1481 const ral_1 = __webpack_require__(8);
1482 const Is = __webpack_require__(13);
1483 const messages_1 = __webpack_require__(12);
1484 const linkedMap_1 = __webpack_require__(20);
1485 const events_1 = __webpack_require__(14);
1486 const cancellation_1 = __webpack_require__(15);
1487 var CancelNotification;
1488 (function (CancelNotification) {
1489     CancelNotification.type = new messages_1.NotificationType('$/cancelRequest');
1490 })(CancelNotification || (CancelNotification = {}));
1491 var ProgressNotification;
1492 (function (ProgressNotification) {
1493     ProgressNotification.type = new messages_1.NotificationType('$/progress');
1494 })(ProgressNotification || (ProgressNotification = {}));
1495 class ProgressType {
1496     constructor() {
1497     }
1498 }
1499 exports.ProgressType = ProgressType;
1500 exports.NullLogger = Object.freeze({
1501     error: () => { },
1502     warn: () => { },
1503     info: () => { },
1504     log: () => { }
1505 });
1506 var Trace;
1507 (function (Trace) {
1508     Trace[Trace["Off"] = 0] = "Off";
1509     Trace[Trace["Messages"] = 1] = "Messages";
1510     Trace[Trace["Verbose"] = 2] = "Verbose";
1511 })(Trace = exports.Trace || (exports.Trace = {}));
1512 (function (Trace) {
1513     function fromString(value) {
1514         if (!Is.string(value)) {
1515             return Trace.Off;
1516         }
1517         value = value.toLowerCase();
1518         switch (value) {
1519             case 'off':
1520                 return Trace.Off;
1521             case 'messages':
1522                 return Trace.Messages;
1523             case 'verbose':
1524                 return Trace.Verbose;
1525             default:
1526                 return Trace.Off;
1527         }
1528     }
1529     Trace.fromString = fromString;
1530     function toString(value) {
1531         switch (value) {
1532             case Trace.Off:
1533                 return 'off';
1534             case Trace.Messages:
1535                 return 'messages';
1536             case Trace.Verbose:
1537                 return 'verbose';
1538             default:
1539                 return 'off';
1540         }
1541     }
1542     Trace.toString = toString;
1543 })(Trace = exports.Trace || (exports.Trace = {}));
1544 var TraceFormat;
1545 (function (TraceFormat) {
1546     TraceFormat["Text"] = "text";
1547     TraceFormat["JSON"] = "json";
1548 })(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));
1549 (function (TraceFormat) {
1550     function fromString(value) {
1551         value = value.toLowerCase();
1552         if (value === 'json') {
1553             return TraceFormat.JSON;
1554         }
1555         else {
1556             return TraceFormat.Text;
1557         }
1558     }
1559     TraceFormat.fromString = fromString;
1560 })(TraceFormat = exports.TraceFormat || (exports.TraceFormat = {}));
1561 var SetTraceNotification;
1562 (function (SetTraceNotification) {
1563     SetTraceNotification.type = new messages_1.NotificationType('$/setTraceNotification');
1564 })(SetTraceNotification = exports.SetTraceNotification || (exports.SetTraceNotification = {}));
1565 var LogTraceNotification;
1566 (function (LogTraceNotification) {
1567     LogTraceNotification.type = new messages_1.NotificationType('$/logTraceNotification');
1568 })(LogTraceNotification = exports.LogTraceNotification || (exports.LogTraceNotification = {}));
1569 var ConnectionErrors;
1570 (function (ConnectionErrors) {
1571     /**
1572      * The connection is closed.
1573      */
1574     ConnectionErrors[ConnectionErrors["Closed"] = 1] = "Closed";
1575     /**
1576      * The connection got disposed.
1577      */
1578     ConnectionErrors[ConnectionErrors["Disposed"] = 2] = "Disposed";
1579     /**
1580      * The connection is already in listening mode.
1581      */
1582     ConnectionErrors[ConnectionErrors["AlreadyListening"] = 3] = "AlreadyListening";
1583 })(ConnectionErrors = exports.ConnectionErrors || (exports.ConnectionErrors = {}));
1584 class ConnectionError extends Error {
1585     constructor(code, message) {
1586         super(message);
1587         this.code = code;
1588         Object.setPrototypeOf(this, ConnectionError.prototype);
1589     }
1590 }
1591 exports.ConnectionError = ConnectionError;
1592 var ConnectionStrategy;
1593 (function (ConnectionStrategy) {
1594     function is(value) {
1595         const candidate = value;
1596         return candidate && Is.func(candidate.cancelUndispatched);
1597     }
1598     ConnectionStrategy.is = is;
1599 })(ConnectionStrategy = exports.ConnectionStrategy || (exports.ConnectionStrategy = {}));
1600 var CancellationReceiverStrategy;
1601 (function (CancellationReceiverStrategy) {
1602     CancellationReceiverStrategy.Message = Object.freeze({
1603         createCancellationTokenSource(_) {
1604             return new cancellation_1.CancellationTokenSource();
1605         }
1606     });
1607     function is(value) {
1608         const candidate = value;
1609         return candidate && Is.func(candidate.createCancellationTokenSource);
1610     }
1611     CancellationReceiverStrategy.is = is;
1612 })(CancellationReceiverStrategy = exports.CancellationReceiverStrategy || (exports.CancellationReceiverStrategy = {}));
1613 var CancellationSenderStrategy;
1614 (function (CancellationSenderStrategy) {
1615     CancellationSenderStrategy.Message = Object.freeze({
1616         sendCancellation(conn, id) {
1617             conn.sendNotification(CancelNotification.type, { id });
1618         },
1619         cleanup(_) { }
1620     });
1621     function is(value) {
1622         const candidate = value;
1623         return candidate && Is.func(candidate.sendCancellation) && Is.func(candidate.cleanup);
1624     }
1625     CancellationSenderStrategy.is = is;
1626 })(CancellationSenderStrategy = exports.CancellationSenderStrategy || (exports.CancellationSenderStrategy = {}));
1627 var CancellationStrategy;
1628 (function (CancellationStrategy) {
1629     CancellationStrategy.Message = Object.freeze({
1630         receiver: CancellationReceiverStrategy.Message,
1631         sender: CancellationSenderStrategy.Message
1632     });
1633     function is(value) {
1634         const candidate = value;
1635         return candidate && CancellationReceiverStrategy.is(candidate.receiver) && CancellationSenderStrategy.is(candidate.sender);
1636     }
1637     CancellationStrategy.is = is;
1638 })(CancellationStrategy = exports.CancellationStrategy || (exports.CancellationStrategy = {}));
1639 var ConnectionOptions;
1640 (function (ConnectionOptions) {
1641     function is(value) {
1642         const candidate = value;
1643         return candidate && (CancellationStrategy.is(candidate.cancellationStrategy) || ConnectionStrategy.is(candidate.connectionStrategy));
1644     }
1645     ConnectionOptions.is = is;
1646 })(ConnectionOptions = exports.ConnectionOptions || (exports.ConnectionOptions = {}));
1647 var ConnectionState;
1648 (function (ConnectionState) {
1649     ConnectionState[ConnectionState["New"] = 1] = "New";
1650     ConnectionState[ConnectionState["Listening"] = 2] = "Listening";
1651     ConnectionState[ConnectionState["Closed"] = 3] = "Closed";
1652     ConnectionState[ConnectionState["Disposed"] = 4] = "Disposed";
1653 })(ConnectionState || (ConnectionState = {}));
1654 function createMessageConnection(messageReader, messageWriter, _logger, options) {
1655     const logger = _logger !== undefined ? _logger : exports.NullLogger;
1656     let sequenceNumber = 0;
1657     let notificationSquenceNumber = 0;
1658     let unknownResponseSquenceNumber = 0;
1659     const version = '2.0';
1660     let starRequestHandler = undefined;
1661     const requestHandlers = Object.create(null);
1662     let starNotificationHandler = undefined;
1663     const notificationHandlers = Object.create(null);
1664     const progressHandlers = new Map();
1665     let timer;
1666     let messageQueue = new linkedMap_1.LinkedMap();
1667     let responsePromises = Object.create(null);
1668     let requestTokens = Object.create(null);
1669     let trace = Trace.Off;
1670     let traceFormat = TraceFormat.Text;
1671     let tracer;
1672     let state = ConnectionState.New;
1673     const errorEmitter = new events_1.Emitter();
1674     const closeEmitter = new events_1.Emitter();
1675     const unhandledNotificationEmitter = new events_1.Emitter();
1676     const unhandledProgressEmitter = new events_1.Emitter();
1677     const disposeEmitter = new events_1.Emitter();
1678     const cancellationStrategy = (options && options.cancellationStrategy) ? options.cancellationStrategy : CancellationStrategy.Message;
1679     function createRequestQueueKey(id) {
1680         return 'req-' + id.toString();
1681     }
1682     function createResponseQueueKey(id) {
1683         if (id === null) {
1684             return 'res-unknown-' + (++unknownResponseSquenceNumber).toString();
1685         }
1686         else {
1687             return 'res-' + id.toString();
1688         }
1689     }
1690     function createNotificationQueueKey() {
1691         return 'not-' + (++notificationSquenceNumber).toString();
1692     }
1693     function addMessageToQueue(queue, message) {
1694         if (messages_1.isRequestMessage(message)) {
1695             queue.set(createRequestQueueKey(message.id), message);
1696         }
1697         else if (messages_1.isResponseMessage(message)) {
1698             queue.set(createResponseQueueKey(message.id), message);
1699         }
1700         else {
1701             queue.set(createNotificationQueueKey(), message);
1702         }
1703     }
1704     function cancelUndispatched(_message) {
1705         return undefined;
1706     }
1707     function isListening() {
1708         return state === ConnectionState.Listening;
1709     }
1710     function isClosed() {
1711         return state === ConnectionState.Closed;
1712     }
1713     function isDisposed() {
1714         return state === ConnectionState.Disposed;
1715     }
1716     function closeHandler() {
1717         if (state === ConnectionState.New || state === ConnectionState.Listening) {
1718             state = ConnectionState.Closed;
1719             closeEmitter.fire(undefined);
1720         }
1721         // If the connection is disposed don't sent close events.
1722     }
1723     function readErrorHandler(error) {
1724         errorEmitter.fire([error, undefined, undefined]);
1725     }
1726     function writeErrorHandler(data) {
1727         errorEmitter.fire(data);
1728     }
1729     messageReader.onClose(closeHandler);
1730     messageReader.onError(readErrorHandler);
1731     messageWriter.onClose(closeHandler);
1732     messageWriter.onError(writeErrorHandler);
1733     function triggerMessageQueue() {
1734         if (timer || messageQueue.size === 0) {
1735             return;
1736         }
1737         timer = ral_1.default().timer.setImmediate(() => {
1738             timer = undefined;
1739             processMessageQueue();
1740         });
1741     }
1742     function processMessageQueue() {
1743         if (messageQueue.size === 0) {
1744             return;
1745         }
1746         const message = messageQueue.shift();
1747         try {
1748             if (messages_1.isRequestMessage(message)) {
1749                 handleRequest(message);
1750             }
1751             else if (messages_1.isNotificationMessage(message)) {
1752                 handleNotification(message);
1753             }
1754             else if (messages_1.isResponseMessage(message)) {
1755                 handleResponse(message);
1756             }
1757             else {
1758                 handleInvalidMessage(message);
1759             }
1760         }
1761         finally {
1762             triggerMessageQueue();
1763         }
1764     }
1765     const callback = (message) => {
1766         try {
1767             // We have received a cancellation message. Check if the message is still in the queue
1768             // and cancel it if allowed to do so.
1769             if (messages_1.isNotificationMessage(message) && message.method === CancelNotification.type.method) {
1770                 const key = createRequestQueueKey(message.params.id);
1771                 const toCancel = messageQueue.get(key);
1772                 if (messages_1.isRequestMessage(toCancel)) {
1773                     const strategy = options === null || options === void 0 ? void 0 : options.connectionStrategy;
1774                     const response = (strategy && strategy.cancelUndispatched) ? strategy.cancelUndispatched(toCancel, cancelUndispatched) : cancelUndispatched(toCancel);
1775                     if (response && (response.error !== undefined || response.result !== undefined)) {
1776                         messageQueue.delete(key);
1777                         response.id = toCancel.id;
1778                         traceSendingResponse(response, message.method, Date.now());
1779                         messageWriter.write(response);
1780                         return;
1781                     }
1782                 }
1783             }
1784             addMessageToQueue(messageQueue, message);
1785         }
1786         finally {
1787             triggerMessageQueue();
1788         }
1789     };
1790     function handleRequest(requestMessage) {
1791         if (isDisposed()) {
1792             // we return here silently since we fired an event when the
1793             // connection got disposed.
1794             return;
1795         }
1796         function reply(resultOrError, method, startTime) {
1797             const message = {
1798                 jsonrpc: version,
1799                 id: requestMessage.id
1800             };
1801             if (resultOrError instanceof messages_1.ResponseError) {
1802                 message.error = resultOrError.toJson();
1803             }
1804             else {
1805                 message.result = resultOrError === undefined ? null : resultOrError;
1806             }
1807             traceSendingResponse(message, method, startTime);
1808             messageWriter.write(message);
1809         }
1810         function replyError(error, method, startTime) {
1811             const message = {
1812                 jsonrpc: version,
1813                 id: requestMessage.id,
1814                 error: error.toJson()
1815             };
1816             traceSendingResponse(message, method, startTime);
1817             messageWriter.write(message);
1818         }
1819         function replySuccess(result, method, startTime) {
1820             // The JSON RPC defines that a response must either have a result or an error
1821             // So we can't treat undefined as a valid response result.
1822             if (result === undefined) {
1823                 result = null;
1824             }
1825             const message = {
1826                 jsonrpc: version,
1827                 id: requestMessage.id,
1828                 result: result
1829             };
1830             traceSendingResponse(message, method, startTime);
1831             messageWriter.write(message);
1832         }
1833         traceReceivedRequest(requestMessage);
1834         const element = requestHandlers[requestMessage.method];
1835         let type;
1836         let requestHandler;
1837         if (element) {
1838             type = element.type;
1839             requestHandler = element.handler;
1840         }
1841         const startTime = Date.now();
1842         if (requestHandler || starRequestHandler) {
1843             const tokenKey = String(requestMessage.id);
1844             const cancellationSource = cancellationStrategy.receiver.createCancellationTokenSource(tokenKey);
1845             requestTokens[tokenKey] = cancellationSource;
1846             try {
1847                 let handlerResult;
1848                 if (requestMessage.params === undefined || (type !== undefined && type.numberOfParams === 0)) {
1849                     handlerResult = requestHandler
1850                         ? requestHandler(cancellationSource.token)
1851                         : starRequestHandler(requestMessage.method, cancellationSource.token);
1852                 }
1853                 else if (Is.array(requestMessage.params) && (type === undefined || type.numberOfParams > 1)) {
1854                     handlerResult = requestHandler
1855                         ? requestHandler(...requestMessage.params, cancellationSource.token)
1856                         : starRequestHandler(requestMessage.method, ...requestMessage.params, cancellationSource.token);
1857                 }
1858                 else {
1859                     handlerResult = requestHandler
1860                         ? requestHandler(requestMessage.params, cancellationSource.token)
1861                         : starRequestHandler(requestMessage.method, requestMessage.params, cancellationSource.token);
1862                 }
1863                 const promise = handlerResult;
1864                 if (!handlerResult) {
1865                     delete requestTokens[tokenKey];
1866                     replySuccess(handlerResult, requestMessage.method, startTime);
1867                 }
1868                 else if (promise.then) {
1869                     promise.then((resultOrError) => {
1870                         delete requestTokens[tokenKey];
1871                         reply(resultOrError, requestMessage.method, startTime);
1872                     }, error => {
1873                         delete requestTokens[tokenKey];
1874                         if (error instanceof messages_1.ResponseError) {
1875                             replyError(error, requestMessage.method, startTime);
1876                         }
1877                         else if (error && Is.string(error.message)) {
1878                             replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
1879                         }
1880                         else {
1881                             replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
1882                         }
1883                     });
1884                 }
1885                 else {
1886                     delete requestTokens[tokenKey];
1887                     reply(handlerResult, requestMessage.method, startTime);
1888                 }
1889             }
1890             catch (error) {
1891                 delete requestTokens[tokenKey];
1892                 if (error instanceof messages_1.ResponseError) {
1893                     reply(error, requestMessage.method, startTime);
1894                 }
1895                 else if (error && Is.string(error.message)) {
1896                     replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed with message: ${error.message}`), requestMessage.method, startTime);
1897                 }
1898                 else {
1899                     replyError(new messages_1.ResponseError(messages_1.ErrorCodes.InternalError, `Request ${requestMessage.method} failed unexpectedly without providing any details.`), requestMessage.method, startTime);
1900                 }
1901             }
1902         }
1903         else {
1904             replyError(new messages_1.ResponseError(messages_1.ErrorCodes.MethodNotFound, `Unhandled method ${requestMessage.method}`), requestMessage.method, startTime);
1905         }
1906     }
1907     function handleResponse(responseMessage) {
1908         if (isDisposed()) {
1909             // See handle request.
1910             return;
1911         }
1912         if (responseMessage.id === null) {
1913             if (responseMessage.error) {
1914                 logger.error(`Received response message without id: Error is: \n${JSON.stringify(responseMessage.error, undefined, 4)}`);
1915             }
1916             else {
1917                 logger.error(`Received response message without id. No further error information provided.`);
1918             }
1919         }
1920         else {
1921             const key = String(responseMessage.id);
1922             const responsePromise = responsePromises[key];
1923             traceReceivedResponse(responseMessage, responsePromise);
1924             if (responsePromise) {
1925                 delete responsePromises[key];
1926                 try {
1927                     if (responseMessage.error) {
1928                         const error = responseMessage.error;
1929                         responsePromise.reject(new messages_1.ResponseError(error.code, error.message, error.data));
1930                     }
1931                     else if (responseMessage.result !== undefined) {
1932                         responsePromise.resolve(responseMessage.result);
1933                     }
1934                     else {
1935                         throw new Error('Should never happen.');
1936                     }
1937                 }
1938                 catch (error) {
1939                     if (error.message) {
1940                         logger.error(`Response handler '${responsePromise.method}' failed with message: ${error.message}`);
1941                     }
1942                     else {
1943                         logger.error(`Response handler '${responsePromise.method}' failed unexpectedly.`);
1944                     }
1945                 }
1946             }
1947         }
1948     }
1949     function handleNotification(message) {
1950         if (isDisposed()) {
1951             // See handle request.
1952             return;
1953         }
1954         let type = undefined;
1955         let notificationHandler;
1956         if (message.method === CancelNotification.type.method) {
1957             notificationHandler = (params) => {
1958                 const id = params.id;
1959                 const source = requestTokens[String(id)];
1960                 if (source) {
1961                     source.cancel();
1962                 }
1963             };
1964         }
1965         else {
1966             const element = notificationHandlers[message.method];
1967             if (element) {
1968                 notificationHandler = element.handler;
1969                 type = element.type;
1970             }
1971         }
1972         if (notificationHandler || starNotificationHandler) {
1973             try {
1974                 traceReceivedNotification(message);
1975                 if (message.params === undefined || (type !== undefined && type.numberOfParams === 0)) {
1976                     notificationHandler ? notificationHandler() : starNotificationHandler(message.method);
1977                 }
1978                 else if (Is.array(message.params) && (type === undefined || type.numberOfParams > 1)) {
1979                     notificationHandler ? notificationHandler(...message.params) : starNotificationHandler(message.method, ...message.params);
1980                 }
1981                 else {
1982                     notificationHandler ? notificationHandler(message.params) : starNotificationHandler(message.method, message.params);
1983                 }
1984             }
1985             catch (error) {
1986                 if (error.message) {
1987                     logger.error(`Notification handler '${message.method}' failed with message: ${error.message}`);
1988                 }
1989                 else {
1990                     logger.error(`Notification handler '${message.method}' failed unexpectedly.`);
1991                 }
1992             }
1993         }
1994         else {
1995             unhandledNotificationEmitter.fire(message);
1996         }
1997     }
1998     function handleInvalidMessage(message) {
1999         if (!message) {
2000             logger.error('Received empty message.');
2001             return;
2002         }
2003         logger.error(`Received message which is neither a response nor a notification message:\n${JSON.stringify(message, null, 4)}`);
2004         // Test whether we find an id to reject the promise
2005         const responseMessage = message;
2006         if (Is.string(responseMessage.id) || Is.number(responseMessage.id)) {
2007             const key = String(responseMessage.id);
2008             const responseHandler = responsePromises[key];
2009             if (responseHandler) {
2010                 responseHandler.reject(new Error('The received response has neither a result nor an error property.'));
2011             }
2012         }
2013     }
2014     function traceSendingRequest(message) {
2015         if (trace === Trace.Off || !tracer) {
2016             return;
2017         }
2018         if (traceFormat === TraceFormat.Text) {
2019             let data = undefined;
2020             if (trace === Trace.Verbose && message.params) {
2021                 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
2022             }
2023             tracer.log(`Sending request '${message.method} - (${message.id})'.`, data);
2024         }
2025         else {
2026             logLSPMessage('send-request', message);
2027         }
2028     }
2029     function traceSendingNotification(message) {
2030         if (trace === Trace.Off || !tracer) {
2031             return;
2032         }
2033         if (traceFormat === TraceFormat.Text) {
2034             let data = undefined;
2035             if (trace === Trace.Verbose) {
2036                 if (message.params) {
2037                     data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
2038                 }
2039                 else {
2040                     data = 'No parameters provided.\n\n';
2041                 }
2042             }
2043             tracer.log(`Sending notification '${message.method}'.`, data);
2044         }
2045         else {
2046             logLSPMessage('send-notification', message);
2047         }
2048     }
2049     function traceSendingResponse(message, method, startTime) {
2050         if (trace === Trace.Off || !tracer) {
2051             return;
2052         }
2053         if (traceFormat === TraceFormat.Text) {
2054             let data = undefined;
2055             if (trace === Trace.Verbose) {
2056                 if (message.error && message.error.data) {
2057                     data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\n\n`;
2058                 }
2059                 else {
2060                     if (message.result) {
2061                         data = `Result: ${JSON.stringify(message.result, null, 4)}\n\n`;
2062                     }
2063                     else if (message.error === undefined) {
2064                         data = 'No result returned.\n\n';
2065                     }
2066                 }
2067             }
2068             tracer.log(`Sending response '${method} - (${message.id})'. Processing request took ${Date.now() - startTime}ms`, data);
2069         }
2070         else {
2071             logLSPMessage('send-response', message);
2072         }
2073     }
2074     function traceReceivedRequest(message) {
2075         if (trace === Trace.Off || !tracer) {
2076             return;
2077         }
2078         if (traceFormat === TraceFormat.Text) {
2079             let data = undefined;
2080             if (trace === Trace.Verbose && message.params) {
2081                 data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
2082             }
2083             tracer.log(`Received request '${message.method} - (${message.id})'.`, data);
2084         }
2085         else {
2086             logLSPMessage('receive-request', message);
2087         }
2088     }
2089     function traceReceivedNotification(message) {
2090         if (trace === Trace.Off || !tracer || message.method === LogTraceNotification.type.method) {
2091             return;
2092         }
2093         if (traceFormat === TraceFormat.Text) {
2094             let data = undefined;
2095             if (trace === Trace.Verbose) {
2096                 if (message.params) {
2097                     data = `Params: ${JSON.stringify(message.params, null, 4)}\n\n`;
2098                 }
2099                 else {
2100                     data = 'No parameters provided.\n\n';
2101                 }
2102             }
2103             tracer.log(`Received notification '${message.method}'.`, data);
2104         }
2105         else {
2106             logLSPMessage('receive-notification', message);
2107         }
2108     }
2109     function traceReceivedResponse(message, responsePromise) {
2110         if (trace === Trace.Off || !tracer) {
2111             return;
2112         }
2113         if (traceFormat === TraceFormat.Text) {
2114             let data = undefined;
2115             if (trace === Trace.Verbose) {
2116                 if (message.error && message.error.data) {
2117                     data = `Error data: ${JSON.stringify(message.error.data, null, 4)}\n\n`;
2118                 }
2119                 else {
2120                     if (message.result) {
2121                         data = `Result: ${JSON.stringify(message.result, null, 4)}\n\n`;
2122                     }
2123                     else if (message.error === undefined) {
2124                         data = 'No result returned.\n\n';
2125                     }
2126                 }
2127             }
2128             if (responsePromise) {
2129                 const error = message.error ? ` Request failed: ${message.error.message} (${message.error.code}).` : '';
2130                 tracer.log(`Received response '${responsePromise.method} - (${message.id})' in ${Date.now() - responsePromise.timerStart}ms.${error}`, data);
2131             }
2132             else {
2133                 tracer.log(`Received response ${message.id} without active response promise.`, data);
2134             }
2135         }
2136         else {
2137             logLSPMessage('receive-response', message);
2138         }
2139     }
2140     function logLSPMessage(type, message) {
2141         if (!tracer || trace === Trace.Off) {
2142             return;
2143         }
2144         const lspMessage = {
2145             isLSPMessage: true,
2146             type,
2147             message,
2148             timestamp: Date.now()
2149         };
2150         tracer.log(lspMessage);
2151     }
2152     function throwIfClosedOrDisposed() {
2153         if (isClosed()) {
2154             throw new ConnectionError(ConnectionErrors.Closed, 'Connection is closed.');
2155         }
2156         if (isDisposed()) {
2157             throw new ConnectionError(ConnectionErrors.Disposed, 'Connection is disposed.');
2158         }
2159     }
2160     function throwIfListening() {
2161         if (isListening()) {
2162             throw new ConnectionError(ConnectionErrors.AlreadyListening, 'Connection is already listening');
2163         }
2164     }
2165     function throwIfNotListening() {
2166         if (!isListening()) {
2167             throw new Error('Call listen() first.');
2168         }
2169     }
2170     function undefinedToNull(param) {
2171         if (param === undefined) {
2172             return null;
2173         }
2174         else {
2175             return param;
2176         }
2177     }
2178     function computeMessageParams(type, params) {
2179         let result;
2180         const numberOfParams = type.numberOfParams;
2181         switch (numberOfParams) {
2182             case 0:
2183                 result = null;
2184                 break;
2185             case 1:
2186                 result = undefinedToNull(params[0]);
2187                 break;
2188             default:
2189                 result = [];
2190                 for (let i = 0; i < params.length && i < numberOfParams; i++) {
2191                     result.push(undefinedToNull(params[i]));
2192                 }
2193                 if (params.length < numberOfParams) {
2194                     for (let i = params.length; i < numberOfParams; i++) {
2195                         result.push(null);
2196                     }
2197                 }
2198                 break;
2199         }
2200         return result;
2201     }
2202     const connection = {
2203         sendNotification: (type, ...params) => {
2204             throwIfClosedOrDisposed();
2205             let method;
2206             let messageParams;
2207             if (Is.string(type)) {
2208                 method = type;
2209                 switch (params.length) {
2210                     case 0:
2211                         messageParams = null;
2212                         break;
2213                     case 1:
2214                         messageParams = params[0];
2215                         break;
2216                     default:
2217                         messageParams = params;
2218                         break;
2219                 }
2220             }
2221             else {
2222                 method = type.method;
2223                 messageParams = computeMessageParams(type, params);
2224             }
2225             const notificationMessage = {
2226                 jsonrpc: version,
2227                 method: method,
2228                 params: messageParams
2229             };
2230             traceSendingNotification(notificationMessage);
2231             messageWriter.write(notificationMessage);
2232         },
2233         onNotification: (type, handler) => {
2234             throwIfClosedOrDisposed();
2235             if (Is.func(type)) {
2236                 starNotificationHandler = type;
2237             }
2238             else if (handler) {
2239                 if (Is.string(type)) {
2240                     notificationHandlers[type] = { type: undefined, handler };
2241                 }
2242                 else {
2243                     notificationHandlers[type.method] = { type, handler };
2244                 }
2245             }
2246         },
2247         onProgress: (_type, token, handler) => {
2248             if (progressHandlers.has(token)) {
2249                 throw new Error(`Progress handler for token ${token} already registered`);
2250             }
2251             progressHandlers.set(token, handler);
2252             return {
2253                 dispose: () => {
2254                     progressHandlers.delete(token);
2255                 }
2256             };
2257         },
2258         sendProgress: (_type, token, value) => {
2259             connection.sendNotification(ProgressNotification.type, { token, value });
2260         },
2261         onUnhandledProgress: unhandledProgressEmitter.event,
2262         sendRequest: (type, ...params) => {
2263             throwIfClosedOrDisposed();
2264             throwIfNotListening();
2265             let method;
2266             let messageParams;
2267             let token = undefined;
2268             if (Is.string(type)) {
2269                 method = type;
2270                 switch (params.length) {
2271                     case 0:
2272                         messageParams = null;
2273                         break;
2274                     case 1:
2275                         // The cancellation token is optional so it can also be undefined.
2276                         if (cancellation_1.CancellationToken.is(params[0])) {
2277                             messageParams = null;
2278                             token = params[0];
2279                         }
2280                         else {
2281                             messageParams = undefinedToNull(params[0]);
2282                         }
2283                         break;
2284                     default:
2285                         const last = params.length - 1;
2286                         if (cancellation_1.CancellationToken.is(params[last])) {
2287                             token = params[last];
2288                             if (params.length === 2) {
2289                                 messageParams = undefinedToNull(params[0]);
2290                             }
2291                             else {
2292                                 messageParams = params.slice(0, last).map(value => undefinedToNull(value));
2293                             }
2294                         }
2295                         else {
2296                             messageParams = params.map(value => undefinedToNull(value));
2297                         }
2298                         break;
2299                 }
2300             }
2301             else {
2302                 method = type.method;
2303                 messageParams = computeMessageParams(type, params);
2304                 const numberOfParams = type.numberOfParams;
2305                 token = cancellation_1.CancellationToken.is(params[numberOfParams]) ? params[numberOfParams] : undefined;
2306             }
2307             const id = sequenceNumber++;
2308             let disposable;
2309             if (token) {
2310                 disposable = token.onCancellationRequested(() => {
2311                     cancellationStrategy.sender.sendCancellation(connection, id);
2312                 });
2313             }
2314             const result = new Promise((resolve, reject) => {
2315                 const requestMessage = {
2316                     jsonrpc: version,
2317                     id: id,
2318                     method: method,
2319                     params: messageParams
2320                 };
2321                 const resolveWithCleanup = (r) => {
2322                     resolve(r);
2323                     cancellationStrategy.sender.cleanup(id);
2324                     disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
2325                 };
2326                 const rejectWithCleanup = (r) => {
2327                     reject(r);
2328                     cancellationStrategy.sender.cleanup(id);
2329                     disposable === null || disposable === void 0 ? void 0 : disposable.dispose();
2330                 };
2331                 let responsePromise = { method: method, timerStart: Date.now(), resolve: resolveWithCleanup, reject: rejectWithCleanup };
2332                 traceSendingRequest(requestMessage);
2333                 try {
2334                     messageWriter.write(requestMessage);
2335                 }
2336                 catch (e) {
2337                     // Writing the message failed. So we need to reject the promise.
2338                     responsePromise.reject(new messages_1.ResponseError(messages_1.ErrorCodes.MessageWriteError, e.message ? e.message : 'Unknown reason'));
2339                     responsePromise = null;
2340                 }
2341                 if (responsePromise) {
2342                     responsePromises[String(id)] = responsePromise;
2343                 }
2344             });
2345             return result;
2346         },
2347         onRequest: (type, handler) => {
2348             throwIfClosedOrDisposed();
2349             if (Is.func(type)) {
2350                 starRequestHandler = type;
2351             }
2352             else if (handler) {
2353                 if (Is.string(type)) {
2354                     requestHandlers[type] = { type: undefined, handler };
2355                 }
2356                 else {
2357                     requestHandlers[type.method] = { type, handler };
2358                 }
2359             }
2360         },
2361         trace: (_value, _tracer, sendNotificationOrTraceOptions) => {
2362             let _sendNotification = false;
2363             let _traceFormat = TraceFormat.Text;
2364             if (sendNotificationOrTraceOptions !== undefined) {
2365                 if (Is.boolean(sendNotificationOrTraceOptions)) {
2366                     _sendNotification = sendNotificationOrTraceOptions;
2367                 }
2368                 else {
2369                     _sendNotification = sendNotificationOrTraceOptions.sendNotification || false;
2370                     _traceFormat = sendNotificationOrTraceOptions.traceFormat || TraceFormat.Text;
2371                 }
2372             }
2373             trace = _value;
2374             traceFormat = _traceFormat;
2375             if (trace === Trace.Off) {
2376                 tracer = undefined;
2377             }
2378             else {
2379                 tracer = _tracer;
2380             }
2381             if (_sendNotification && !isClosed() && !isDisposed()) {
2382                 connection.sendNotification(SetTraceNotification.type, { value: Trace.toString(_value) });
2383             }
2384         },
2385         onError: errorEmitter.event,
2386         onClose: closeEmitter.event,
2387         onUnhandledNotification: unhandledNotificationEmitter.event,
2388         onDispose: disposeEmitter.event,
2389         dispose: () => {
2390             if (isDisposed()) {
2391                 return;
2392             }
2393             state = ConnectionState.Disposed;
2394             disposeEmitter.fire(undefined);
2395             const error = new Error('Connection got disposed.');
2396             Object.keys(responsePromises).forEach((key) => {
2397                 responsePromises[key].reject(error);
2398             });
2399             responsePromises = Object.create(null);
2400             requestTokens = Object.create(null);
2401             messageQueue = new linkedMap_1.LinkedMap();
2402             // Test for backwards compatibility
2403             if (Is.func(messageWriter.dispose)) {
2404                 messageWriter.dispose();
2405             }
2406             if (Is.func(messageReader.dispose)) {
2407                 messageReader.dispose();
2408             }
2409         },
2410         listen: () => {
2411             throwIfClosedOrDisposed();
2412             throwIfListening();
2413             state = ConnectionState.Listening;
2414             messageReader.listen(callback);
2415         },
2416         inspect: () => {
2417             // eslint-disable-next-line no-console
2418             ral_1.default().console.log('inspect');
2419         }
2420     };
2421     connection.onNotification(LogTraceNotification.type, (params) => {
2422         if (trace === Trace.Off || !tracer) {
2423             return;
2424         }
2425         tracer.log(params.message, trace === Trace.Verbose ? params.verbose : undefined);
2426     });
2427     connection.onNotification(ProgressNotification.type, (params) => {
2428         const handler = progressHandlers.get(params.token);
2429         if (handler) {
2430             handler(params.value);
2431         }
2432         else {
2433             unhandledProgressEmitter.fire(params);
2434         }
2435     });
2436     return connection;
2437 }
2438 exports.createMessageConnection = createMessageConnection;
2439 //# sourceMappingURL=connection.js.map
2440
2441 /***/ }),
2442 /* 20 */
2443 /***/ ((__unused_webpack_module, exports) => {
2444
2445
2446 /*---------------------------------------------------------------------------------------------
2447  *  Copyright (c) Microsoft Corporation. All rights reserved.
2448  *  Licensed under the MIT License. See License.txt in the project root for license information.
2449  *--------------------------------------------------------------------------------------------*/
2450 Object.defineProperty(exports, "__esModule", ({ value: true }));
2451 var Touch;
2452 (function (Touch) {
2453     Touch.None = 0;
2454     Touch.First = 1;
2455     Touch.AsOld = Touch.First;
2456     Touch.Last = 2;
2457     Touch.AsNew = Touch.Last;
2458 })(Touch = exports.Touch || (exports.Touch = {}));
2459 class LinkedMap {
2460     constructor() {
2461         this[Symbol.toStringTag] = 'LinkedMap';
2462         this._map = new Map();
2463         this._head = undefined;
2464         this._tail = undefined;
2465         this._size = 0;
2466         this._state = 0;
2467     }
2468     clear() {
2469         this._map.clear();
2470         this._head = undefined;
2471         this._tail = undefined;
2472         this._size = 0;
2473         this._state++;
2474     }
2475     isEmpty() {
2476         return !this._head && !this._tail;
2477     }
2478     get size() {
2479         return this._size;
2480     }
2481     get first() {
2482         var _a;
2483         return (_a = this._head) === null || _a === void 0 ? void 0 : _a.value;
2484     }
2485     get last() {
2486         var _a;
2487         return (_a = this._tail) === null || _a === void 0 ? void 0 : _a.value;
2488     }
2489     has(key) {
2490         return this._map.has(key);
2491     }
2492     get(key, touch = Touch.None) {
2493         const item = this._map.get(key);
2494         if (!item) {
2495             return undefined;
2496         }
2497         if (touch !== Touch.None) {
2498             this.touch(item, touch);
2499         }
2500         return item.value;
2501     }
2502     set(key, value, touch = Touch.None) {
2503         let item = this._map.get(key);
2504         if (item) {
2505             item.value = value;
2506             if (touch !== Touch.None) {
2507                 this.touch(item, touch);
2508             }
2509         }
2510         else {
2511             item = { key, value, next: undefined, previous: undefined };
2512             switch (touch) {
2513                 case Touch.None:
2514                     this.addItemLast(item);
2515                     break;
2516                 case Touch.First:
2517                     this.addItemFirst(item);
2518                     break;
2519                 case Touch.Last:
2520                     this.addItemLast(item);
2521                     break;
2522                 default:
2523                     this.addItemLast(item);
2524                     break;
2525             }
2526             this._map.set(key, item);
2527             this._size++;
2528         }
2529         return this;
2530     }
2531     delete(key) {
2532         return !!this.remove(key);
2533     }
2534     remove(key) {
2535         const item = this._map.get(key);
2536         if (!item) {
2537             return undefined;
2538         }
2539         this._map.delete(key);
2540         this.removeItem(item);
2541         this._size--;
2542         return item.value;
2543     }
2544     shift() {
2545         if (!this._head && !this._tail) {
2546             return undefined;
2547         }
2548         if (!this._head || !this._tail) {
2549             throw new Error('Invalid list');
2550         }
2551         const item = this._head;
2552         this._map.delete(item.key);
2553         this.removeItem(item);
2554         this._size--;
2555         return item.value;
2556     }
2557     forEach(callbackfn, thisArg) {
2558         const state = this._state;
2559         let current = this._head;
2560         while (current) {
2561             if (thisArg) {
2562                 callbackfn.bind(thisArg)(current.value, current.key, this);
2563             }
2564             else {
2565                 callbackfn(current.value, current.key, this);
2566             }
2567             if (this._state !== state) {
2568                 throw new Error(`LinkedMap got modified during iteration.`);
2569             }
2570             current = current.next;
2571         }
2572     }
2573     keys() {
2574         const map = this;
2575         const state = this._state;
2576         let current = this._head;
2577         const iterator = {
2578             [Symbol.iterator]() {
2579                 return iterator;
2580             },
2581             next() {
2582                 if (map._state !== state) {
2583                     throw new Error(`LinkedMap got modified during iteration.`);
2584                 }
2585                 if (current) {
2586                     const result = { value: current.key, done: false };
2587                     current = current.next;
2588                     return result;
2589                 }
2590                 else {
2591                     return { value: undefined, done: true };
2592                 }
2593             }
2594         };
2595         return iterator;
2596     }
2597     values() {
2598         const map = this;
2599         const state = this._state;
2600         let current = this._head;
2601         const iterator = {
2602             [Symbol.iterator]() {
2603                 return iterator;
2604             },
2605             next() {
2606                 if (map._state !== state) {
2607                     throw new Error(`LinkedMap got modified during iteration.`);
2608                 }
2609                 if (current) {
2610                     const result = { value: current.value, done: false };
2611                     current = current.next;
2612                     return result;
2613                 }
2614                 else {
2615                     return { value: undefined, done: true };
2616                 }
2617             }
2618         };
2619         return iterator;
2620     }
2621     entries() {
2622         const map = this;
2623         const state = this._state;
2624         let current = this._head;
2625         const iterator = {
2626             [Symbol.iterator]() {
2627                 return iterator;
2628             },
2629             next() {
2630                 if (map._state !== state) {
2631                     throw new Error(`LinkedMap got modified during iteration.`);
2632                 }
2633                 if (current) {
2634                     const result = { value: [current.key, current.value], done: false };
2635                     current = current.next;
2636                     return result;
2637                 }
2638                 else {
2639                     return { value: undefined, done: true };
2640                 }
2641             }
2642         };
2643         return iterator;
2644     }
2645     [Symbol.iterator]() {
2646         return this.entries();
2647     }
2648     trimOld(newSize) {
2649         if (newSize >= this.size) {
2650             return;
2651         }
2652         if (newSize === 0) {
2653             this.clear();
2654             return;
2655         }
2656         let current = this._head;
2657         let currentSize = this.size;
2658         while (current && currentSize > newSize) {
2659             this._map.delete(current.key);
2660             current = current.next;
2661             currentSize--;
2662         }
2663         this._head = current;
2664         this._size = currentSize;
2665         if (current) {
2666             current.previous = undefined;
2667         }
2668         this._state++;
2669     }
2670     addItemFirst(item) {
2671         // First time Insert
2672         if (!this._head && !this._tail) {
2673             this._tail = item;
2674         }
2675         else if (!this._head) {
2676             throw new Error('Invalid list');
2677         }
2678         else {
2679             item.next = this._head;
2680             this._head.previous = item;
2681         }
2682         this._head = item;
2683         this._state++;
2684     }
2685     addItemLast(item) {
2686         // First time Insert
2687         if (!this._head && !this._tail) {
2688             this._head = item;
2689         }
2690         else if (!this._tail) {
2691             throw new Error('Invalid list');
2692         }
2693         else {
2694             item.previous = this._tail;
2695             this._tail.next = item;
2696         }
2697         this._tail = item;
2698         this._state++;
2699     }
2700     removeItem(item) {
2701         if (item === this._head && item === this._tail) {
2702             this._head = undefined;
2703             this._tail = undefined;
2704         }
2705         else if (item === this._head) {
2706             // This can only happend if size === 1 which is handle
2707             // by the case above.
2708             if (!item.next) {
2709                 throw new Error('Invalid list');
2710             }
2711             item.next.previous = undefined;
2712             this._head = item.next;
2713         }
2714         else if (item === this._tail) {
2715             // This can only happend if size === 1 which is handle
2716             // by the case above.
2717             if (!item.previous) {
2718                 throw new Error('Invalid list');
2719             }
2720             item.previous.next = undefined;
2721             this._tail = item.previous;
2722         }
2723         else {
2724             const next = item.next;
2725             const previous = item.previous;
2726             if (!next || !previous) {
2727                 throw new Error('Invalid list');
2728             }
2729             next.previous = previous;
2730             previous.next = next;
2731         }
2732         item.next = undefined;
2733         item.previous = undefined;
2734         this._state++;
2735     }
2736     touch(item, touch) {
2737         if (!this._head || !this._tail) {
2738             throw new Error('Invalid list');
2739         }
2740         if ((touch !== Touch.First && touch !== Touch.Last)) {
2741             return;
2742         }
2743         if (touch === Touch.First) {
2744             if (item === this._head) {
2745                 return;
2746             }
2747             const next = item.next;
2748             const previous = item.previous;
2749             // Unlink the item
2750             if (item === this._tail) {
2751                 // previous must be defined since item was not head but is tail
2752                 // So there are more than on item in the map
2753                 previous.next = undefined;
2754                 this._tail = previous;
2755             }
2756             else {
2757                 // Both next and previous are not undefined since item was neither head nor tail.
2758                 next.previous = previous;
2759                 previous.next = next;
2760             }
2761             // Insert the node at head
2762             item.previous = undefined;
2763             item.next = this._head;
2764             this._head.previous = item;
2765             this._head = item;
2766             this._state++;
2767         }
2768         else if (touch === Touch.Last) {
2769             if (item === this._tail) {
2770                 return;
2771             }
2772             const next = item.next;
2773             const previous = item.previous;
2774             // Unlink the item.
2775             if (item === this._head) {
2776                 // next must be defined since item was not tail but is head
2777                 // So there are more than on item in the map
2778                 next.previous = undefined;
2779                 this._head = next;
2780             }
2781             else {
2782                 // Both next and previous are not undefined since item was neither head nor tail.
2783                 next.previous = previous;
2784                 previous.next = next;
2785             }
2786             item.next = undefined;
2787             item.previous = this._tail;
2788             this._tail.next = item;
2789             this._tail = item;
2790             this._state++;
2791         }
2792     }
2793     toJSON() {
2794         const data = [];
2795         this.forEach((value, key) => {
2796             data.push([key, value]);
2797         });
2798         return data;
2799     }
2800     fromJSON(data) {
2801         this.clear();
2802         for (const [key, value] of data) {
2803             this.set(key, value);
2804         }
2805     }
2806 }
2807 exports.LinkedMap = LinkedMap;
2808 class LRUCache extends LinkedMap {
2809     constructor(limit, ratio = 1) {
2810         super();
2811         this._limit = limit;
2812         this._ratio = Math.min(Math.max(0, ratio), 1);
2813     }
2814     get limit() {
2815         return this._limit;
2816     }
2817     set limit(limit) {
2818         this._limit = limit;
2819         this.checkTrim();
2820     }
2821     get ratio() {
2822         return this._ratio;
2823     }
2824     set ratio(ratio) {
2825         this._ratio = Math.min(Math.max(0, ratio), 1);
2826         this.checkTrim();
2827     }
2828     get(key, touch = Touch.AsNew) {
2829         return super.get(key, touch);
2830     }
2831     peek(key) {
2832         return super.get(key, Touch.None);
2833     }
2834     set(key, value) {
2835         super.set(key, value, Touch.Last);
2836         this.checkTrim();
2837         return this;
2838     }
2839     checkTrim() {
2840         if (this.size > this._limit) {
2841             this.trimOld(Math.round(this._limit * this._ratio));
2842         }
2843     }
2844 }
2845 exports.LRUCache = LRUCache;
2846 //# sourceMappingURL=linkedMap.js.map
2847
2848 /***/ }),
2849 /* 21 */
2850 /***/ ((module) => {
2851
2852 module.exports = require("os");;
2853
2854 /***/ }),
2855 /* 22 */
2856 /***/ ((module) => {
2857
2858 module.exports = require("crypto");;
2859
2860 /***/ }),
2861 /* 23 */
2862 /***/ ((module) => {
2863
2864 module.exports = require("net");;
2865
2866 /***/ }),
2867 /* 24 */
2868 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
2869
2870
2871 /* --------------------------------------------------------------------------------------------
2872  * Copyright (c) Microsoft Corporation. All rights reserved.
2873  * Licensed under the MIT License. See License.txt in the project root for license information.
2874  * ------------------------------------------------------------------------------------------ */
2875 function __export(m) {
2876     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
2877 }
2878 Object.defineProperty(exports, "__esModule", ({ value: true }));
2879 __export(__webpack_require__(6));
2880 __export(__webpack_require__(25));
2881 __export(__webpack_require__(26));
2882 __export(__webpack_require__(27));
2883 var connection_1 = __webpack_require__(39);
2884 exports.createProtocolConnection = connection_1.createProtocolConnection;
2885 const st = __webpack_require__(40);
2886 var Proposed;
2887 (function (Proposed) {
2888     Proposed.SemanticTokenTypes = st.SemanticTokenTypes;
2889     Proposed.SemanticTokenModifiers = st.SemanticTokenModifiers;
2890     Proposed.SemanticTokens = st.SemanticTokens;
2891     let SemanticTokensRequest;
2892     (function (SemanticTokensRequest) {
2893         SemanticTokensRequest.method = st.SemanticTokensRequest.method;
2894         SemanticTokensRequest.type = st.SemanticTokensRequest.type;
2895     })(SemanticTokensRequest = Proposed.SemanticTokensRequest || (Proposed.SemanticTokensRequest = {}));
2896     let SemanticTokensEditsRequest;
2897     (function (SemanticTokensEditsRequest) {
2898         SemanticTokensEditsRequest.method = st.SemanticTokensEditsRequest.method;
2899         SemanticTokensEditsRequest.type = st.SemanticTokensEditsRequest.type;
2900     })(SemanticTokensEditsRequest = Proposed.SemanticTokensEditsRequest || (Proposed.SemanticTokensEditsRequest = {}));
2901     let SemanticTokensRangeRequest;
2902     (function (SemanticTokensRangeRequest) {
2903         SemanticTokensRangeRequest.method = st.SemanticTokensRangeRequest.method;
2904         SemanticTokensRangeRequest.type = st.SemanticTokensRangeRequest.type;
2905     })(SemanticTokensRangeRequest = Proposed.SemanticTokensRangeRequest || (Proposed.SemanticTokensRangeRequest = {}));
2906 })(Proposed = exports.Proposed || (exports.Proposed = {}));
2907 //# sourceMappingURL=api.js.map
2908
2909 /***/ }),
2910 /* 25 */
2911 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2912
2913 __webpack_require__.r(__webpack_exports__);
2914 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2915 /* harmony export */   "Position": () => /* binding */ Position,
2916 /* harmony export */   "Range": () => /* binding */ Range,
2917 /* harmony export */   "Location": () => /* binding */ Location,
2918 /* harmony export */   "LocationLink": () => /* binding */ LocationLink,
2919 /* harmony export */   "Color": () => /* binding */ Color,
2920 /* harmony export */   "ColorInformation": () => /* binding */ ColorInformation,
2921 /* harmony export */   "ColorPresentation": () => /* binding */ ColorPresentation,
2922 /* harmony export */   "FoldingRangeKind": () => /* binding */ FoldingRangeKind,
2923 /* harmony export */   "FoldingRange": () => /* binding */ FoldingRange,
2924 /* harmony export */   "DiagnosticRelatedInformation": () => /* binding */ DiagnosticRelatedInformation,
2925 /* harmony export */   "DiagnosticSeverity": () => /* binding */ DiagnosticSeverity,
2926 /* harmony export */   "DiagnosticTag": () => /* binding */ DiagnosticTag,
2927 /* harmony export */   "DiagnosticCode": () => /* binding */ DiagnosticCode,
2928 /* harmony export */   "Diagnostic": () => /* binding */ Diagnostic,
2929 /* harmony export */   "Command": () => /* binding */ Command,
2930 /* harmony export */   "TextEdit": () => /* binding */ TextEdit,
2931 /* harmony export */   "TextDocumentEdit": () => /* binding */ TextDocumentEdit,
2932 /* harmony export */   "CreateFile": () => /* binding */ CreateFile,
2933 /* harmony export */   "RenameFile": () => /* binding */ RenameFile,
2934 /* harmony export */   "DeleteFile": () => /* binding */ DeleteFile,
2935 /* harmony export */   "WorkspaceEdit": () => /* binding */ WorkspaceEdit,
2936 /* harmony export */   "WorkspaceChange": () => /* binding */ WorkspaceChange,
2937 /* harmony export */   "TextDocumentIdentifier": () => /* binding */ TextDocumentIdentifier,
2938 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* binding */ VersionedTextDocumentIdentifier,
2939 /* harmony export */   "TextDocumentItem": () => /* binding */ TextDocumentItem,
2940 /* harmony export */   "MarkupKind": () => /* binding */ MarkupKind,
2941 /* harmony export */   "MarkupContent": () => /* binding */ MarkupContent,
2942 /* harmony export */   "CompletionItemKind": () => /* binding */ CompletionItemKind,
2943 /* harmony export */   "InsertTextFormat": () => /* binding */ InsertTextFormat,
2944 /* harmony export */   "CompletionItemTag": () => /* binding */ CompletionItemTag,
2945 /* harmony export */   "InsertReplaceEdit": () => /* binding */ InsertReplaceEdit,
2946 /* harmony export */   "CompletionItem": () => /* binding */ CompletionItem,
2947 /* harmony export */   "CompletionList": () => /* binding */ CompletionList,
2948 /* harmony export */   "MarkedString": () => /* binding */ MarkedString,
2949 /* harmony export */   "Hover": () => /* binding */ Hover,
2950 /* harmony export */   "ParameterInformation": () => /* binding */ ParameterInformation,
2951 /* harmony export */   "SignatureInformation": () => /* binding */ SignatureInformation,
2952 /* harmony export */   "DocumentHighlightKind": () => /* binding */ DocumentHighlightKind,
2953 /* harmony export */   "DocumentHighlight": () => /* binding */ DocumentHighlight,
2954 /* harmony export */   "SymbolKind": () => /* binding */ SymbolKind,
2955 /* harmony export */   "SymbolTag": () => /* binding */ SymbolTag,
2956 /* harmony export */   "SymbolInformation": () => /* binding */ SymbolInformation,
2957 /* harmony export */   "DocumentSymbol": () => /* binding */ DocumentSymbol,
2958 /* harmony export */   "CodeActionKind": () => /* binding */ CodeActionKind,
2959 /* harmony export */   "CodeActionContext": () => /* binding */ CodeActionContext,
2960 /* harmony export */   "CodeAction": () => /* binding */ CodeAction,
2961 /* harmony export */   "CodeLens": () => /* binding */ CodeLens,
2962 /* harmony export */   "FormattingOptions": () => /* binding */ FormattingOptions,
2963 /* harmony export */   "DocumentLink": () => /* binding */ DocumentLink,
2964 /* harmony export */   "SelectionRange": () => /* binding */ SelectionRange,
2965 /* harmony export */   "EOL": () => /* binding */ EOL,
2966 /* harmony export */   "TextDocument": () => /* binding */ TextDocument
2967 /* harmony export */ });
2968 /* --------------------------------------------------------------------------------------------
2969  * Copyright (c) Microsoft Corporation. All rights reserved.
2970  * Licensed under the MIT License. See License.txt in the project root for license information.
2971  * ------------------------------------------------------------------------------------------ */
2972
2973 /**
2974  * The Position namespace provides helper functions to work with
2975  * [Position](#Position) literals.
2976  */
2977 var Position;
2978 (function (Position) {
2979     /**
2980      * Creates a new Position literal from the given line and character.
2981      * @param line The position's line.
2982      * @param character The position's character.
2983      */
2984     function create(line, character) {
2985         return { line: line, character: character };
2986     }
2987     Position.create = create;
2988     /**
2989      * Checks whether the given liternal conforms to the [Position](#Position) interface.
2990      */
2991     function is(value) {
2992         var candidate = value;
2993         return Is.objectLiteral(candidate) && Is.number(candidate.line) && Is.number(candidate.character);
2994     }
2995     Position.is = is;
2996 })(Position || (Position = {}));
2997 /**
2998  * The Range namespace provides helper functions to work with
2999  * [Range](#Range) literals.
3000  */
3001 var Range;
3002 (function (Range) {
3003     function create(one, two, three, four) {
3004         if (Is.number(one) && Is.number(two) && Is.number(three) && Is.number(four)) {
3005             return { start: Position.create(one, two), end: Position.create(three, four) };
3006         }
3007         else if (Position.is(one) && Position.is(two)) {
3008             return { start: one, end: two };
3009         }
3010         else {
3011             throw new Error("Range#create called with invalid arguments[" + one + ", " + two + ", " + three + ", " + four + "]");
3012         }
3013     }
3014     Range.create = create;
3015     /**
3016      * Checks whether the given literal conforms to the [Range](#Range) interface.
3017      */
3018     function is(value) {
3019         var candidate = value;
3020         return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);
3021     }
3022     Range.is = is;
3023 })(Range || (Range = {}));
3024 /**
3025  * The Location namespace provides helper functions to work with
3026  * [Location](#Location) literals.
3027  */
3028 var Location;
3029 (function (Location) {
3030     /**
3031      * Creates a Location literal.
3032      * @param uri The location's uri.
3033      * @param range The location's range.
3034      */
3035     function create(uri, range) {
3036         return { uri: uri, range: range };
3037     }
3038     Location.create = create;
3039     /**
3040      * Checks whether the given literal conforms to the [Location](#Location) interface.
3041      */
3042     function is(value) {
3043         var candidate = value;
3044         return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));
3045     }
3046     Location.is = is;
3047 })(Location || (Location = {}));
3048 /**
3049  * The LocationLink namespace provides helper functions to work with
3050  * [LocationLink](#LocationLink) literals.
3051  */
3052 var LocationLink;
3053 (function (LocationLink) {
3054     /**
3055      * Creates a LocationLink literal.
3056      * @param targetUri The definition's uri.
3057      * @param targetRange The full range of the definition.
3058      * @param targetSelectionRange The span of the symbol definition at the target.
3059      * @param originSelectionRange The span of the symbol being defined in the originating source file.
3060      */
3061     function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {
3062         return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };
3063     }
3064     LocationLink.create = create;
3065     /**
3066      * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.
3067      */
3068     function is(value) {
3069         var candidate = value;
3070         return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)
3071             && (Range.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange))
3072             && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));
3073     }
3074     LocationLink.is = is;
3075 })(LocationLink || (LocationLink = {}));
3076 /**
3077  * The Color namespace provides helper functions to work with
3078  * [Color](#Color) literals.
3079  */
3080 var Color;
3081 (function (Color) {
3082     /**
3083      * Creates a new Color literal.
3084      */
3085     function create(red, green, blue, alpha) {
3086         return {
3087             red: red,
3088             green: green,
3089             blue: blue,
3090             alpha: alpha,
3091         };
3092     }
3093     Color.create = create;
3094     /**
3095      * Checks whether the given literal conforms to the [Color](#Color) interface.
3096      */
3097     function is(value) {
3098         var candidate = value;
3099         return Is.number(candidate.red)
3100             && Is.number(candidate.green)
3101             && Is.number(candidate.blue)
3102             && Is.number(candidate.alpha);
3103     }
3104     Color.is = is;
3105 })(Color || (Color = {}));
3106 /**
3107  * The ColorInformation namespace provides helper functions to work with
3108  * [ColorInformation](#ColorInformation) literals.
3109  */
3110 var ColorInformation;
3111 (function (ColorInformation) {
3112     /**
3113      * Creates a new ColorInformation literal.
3114      */
3115     function create(range, color) {
3116         return {
3117             range: range,
3118             color: color,
3119         };
3120     }
3121     ColorInformation.create = create;
3122     /**
3123      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
3124      */
3125     function is(value) {
3126         var candidate = value;
3127         return Range.is(candidate.range) && Color.is(candidate.color);
3128     }
3129     ColorInformation.is = is;
3130 })(ColorInformation || (ColorInformation = {}));
3131 /**
3132  * The Color namespace provides helper functions to work with
3133  * [ColorPresentation](#ColorPresentation) literals.
3134  */
3135 var ColorPresentation;
3136 (function (ColorPresentation) {
3137     /**
3138      * Creates a new ColorInformation literal.
3139      */
3140     function create(label, textEdit, additionalTextEdits) {
3141         return {
3142             label: label,
3143             textEdit: textEdit,
3144             additionalTextEdits: additionalTextEdits,
3145         };
3146     }
3147     ColorPresentation.create = create;
3148     /**
3149      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
3150      */
3151     function is(value) {
3152         var candidate = value;
3153         return Is.string(candidate.label)
3154             && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))
3155             && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));
3156     }
3157     ColorPresentation.is = is;
3158 })(ColorPresentation || (ColorPresentation = {}));
3159 /**
3160  * Enum of known range kinds
3161  */
3162 var FoldingRangeKind;
3163 (function (FoldingRangeKind) {
3164     /**
3165      * Folding range for a comment
3166      */
3167     FoldingRangeKind["Comment"] = "comment";
3168     /**
3169      * Folding range for a imports or includes
3170      */
3171     FoldingRangeKind["Imports"] = "imports";
3172     /**
3173      * Folding range for a region (e.g. `#region`)
3174      */
3175     FoldingRangeKind["Region"] = "region";
3176 })(FoldingRangeKind || (FoldingRangeKind = {}));
3177 /**
3178  * The folding range namespace provides helper functions to work with
3179  * [FoldingRange](#FoldingRange) literals.
3180  */
3181 var FoldingRange;
3182 (function (FoldingRange) {
3183     /**
3184      * Creates a new FoldingRange literal.
3185      */
3186     function create(startLine, endLine, startCharacter, endCharacter, kind) {
3187         var result = {
3188             startLine: startLine,
3189             endLine: endLine
3190         };
3191         if (Is.defined(startCharacter)) {
3192             result.startCharacter = startCharacter;
3193         }
3194         if (Is.defined(endCharacter)) {
3195             result.endCharacter = endCharacter;
3196         }
3197         if (Is.defined(kind)) {
3198             result.kind = kind;
3199         }
3200         return result;
3201     }
3202     FoldingRange.create = create;
3203     /**
3204      * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.
3205      */
3206     function is(value) {
3207         var candidate = value;
3208         return Is.number(candidate.startLine) && Is.number(candidate.startLine)
3209             && (Is.undefined(candidate.startCharacter) || Is.number(candidate.startCharacter))
3210             && (Is.undefined(candidate.endCharacter) || Is.number(candidate.endCharacter))
3211             && (Is.undefined(candidate.kind) || Is.string(candidate.kind));
3212     }
3213     FoldingRange.is = is;
3214 })(FoldingRange || (FoldingRange = {}));
3215 /**
3216  * The DiagnosticRelatedInformation namespace provides helper functions to work with
3217  * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.
3218  */
3219 var DiagnosticRelatedInformation;
3220 (function (DiagnosticRelatedInformation) {
3221     /**
3222      * Creates a new DiagnosticRelatedInformation literal.
3223      */
3224     function create(location, message) {
3225         return {
3226             location: location,
3227             message: message
3228         };
3229     }
3230     DiagnosticRelatedInformation.create = create;
3231     /**
3232      * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.
3233      */
3234     function is(value) {
3235         var candidate = value;
3236         return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);
3237     }
3238     DiagnosticRelatedInformation.is = is;
3239 })(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));
3240 /**
3241  * The diagnostic's severity.
3242  */
3243 var DiagnosticSeverity;
3244 (function (DiagnosticSeverity) {
3245     /**
3246      * Reports an error.
3247      */
3248     DiagnosticSeverity.Error = 1;
3249     /**
3250      * Reports a warning.
3251      */
3252     DiagnosticSeverity.Warning = 2;
3253     /**
3254      * Reports an information.
3255      */
3256     DiagnosticSeverity.Information = 3;
3257     /**
3258      * Reports a hint.
3259      */
3260     DiagnosticSeverity.Hint = 4;
3261 })(DiagnosticSeverity || (DiagnosticSeverity = {}));
3262 /**
3263  * The diagnostic tags.
3264  *
3265  * @since 3.15.0
3266  */
3267 var DiagnosticTag;
3268 (function (DiagnosticTag) {
3269     /**
3270      * Unused or unnecessary code.
3271      *
3272      * Clients are allowed to render diagnostics with this tag faded out instead of having
3273      * an error squiggle.
3274      */
3275     DiagnosticTag.Unnecessary = 1;
3276     /**
3277      * Deprecated or obsolete code.
3278      *
3279      * Clients are allowed to rendered diagnostics with this tag strike through.
3280      */
3281     DiagnosticTag.Deprecated = 2;
3282 })(DiagnosticTag || (DiagnosticTag = {}));
3283 /**
3284  * The DiagnosticCode namespace provides functions to deal with complex diagnostic codes.
3285  *
3286  * @since 3.16.0 - Proposed state
3287  */
3288 var DiagnosticCode;
3289 (function (DiagnosticCode) {
3290     /**
3291      * Checks whether the given liternal conforms to the [DiagnosticCode](#DiagnosticCode) interface.
3292      */
3293     function is(value) {
3294         var candidate = value;
3295         return candidate !== undefined && candidate !== null && (Is.number(candidate.value) || Is.string(candidate.value)) && Is.string(candidate.target);
3296     }
3297     DiagnosticCode.is = is;
3298 })(DiagnosticCode || (DiagnosticCode = {}));
3299 /**
3300  * The Diagnostic namespace provides helper functions to work with
3301  * [Diagnostic](#Diagnostic) literals.
3302  */
3303 var Diagnostic;
3304 (function (Diagnostic) {
3305     /**
3306      * Creates a new Diagnostic literal.
3307      */
3308     function create(range, message, severity, code, source, relatedInformation) {
3309         var result = { range: range, message: message };
3310         if (Is.defined(severity)) {
3311             result.severity = severity;
3312         }
3313         if (Is.defined(code)) {
3314             result.code = code;
3315         }
3316         if (Is.defined(source)) {
3317             result.source = source;
3318         }
3319         if (Is.defined(relatedInformation)) {
3320             result.relatedInformation = relatedInformation;
3321         }
3322         return result;
3323     }
3324     Diagnostic.create = create;
3325     /**
3326      * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.
3327      */
3328     function is(value) {
3329         var candidate = value;
3330         return Is.defined(candidate)
3331             && Range.is(candidate.range)
3332             && Is.string(candidate.message)
3333             && (Is.number(candidate.severity) || Is.undefined(candidate.severity))
3334             && (Is.number(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))
3335             && (Is.string(candidate.source) || Is.undefined(candidate.source))
3336             && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));
3337     }
3338     Diagnostic.is = is;
3339 })(Diagnostic || (Diagnostic = {}));
3340 /**
3341  * The Command namespace provides helper functions to work with
3342  * [Command](#Command) literals.
3343  */
3344 var Command;
3345 (function (Command) {
3346     /**
3347      * Creates a new Command literal.
3348      */
3349     function create(title, command) {
3350         var args = [];
3351         for (var _i = 2; _i < arguments.length; _i++) {
3352             args[_i - 2] = arguments[_i];
3353         }
3354         var result = { title: title, command: command };
3355         if (Is.defined(args) && args.length > 0) {
3356             result.arguments = args;
3357         }
3358         return result;
3359     }
3360     Command.create = create;
3361     /**
3362      * Checks whether the given literal conforms to the [Command](#Command) interface.
3363      */
3364     function is(value) {
3365         var candidate = value;
3366         return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);
3367     }
3368     Command.is = is;
3369 })(Command || (Command = {}));
3370 /**
3371  * The TextEdit namespace provides helper function to create replace,
3372  * insert and delete edits more easily.
3373  */
3374 var TextEdit;
3375 (function (TextEdit) {
3376     /**
3377      * Creates a replace text edit.
3378      * @param range The range of text to be replaced.
3379      * @param newText The new text.
3380      */
3381     function replace(range, newText) {
3382         return { range: range, newText: newText };
3383     }
3384     TextEdit.replace = replace;
3385     /**
3386      * Creates a insert text edit.
3387      * @param position The position to insert the text at.
3388      * @param newText The text to be inserted.
3389      */
3390     function insert(position, newText) {
3391         return { range: { start: position, end: position }, newText: newText };
3392     }
3393     TextEdit.insert = insert;
3394     /**
3395      * Creates a delete text edit.
3396      * @param range The range of text to be deleted.
3397      */
3398     function del(range) {
3399         return { range: range, newText: '' };
3400     }
3401     TextEdit.del = del;
3402     function is(value) {
3403         var candidate = value;
3404         return Is.objectLiteral(candidate)
3405             && Is.string(candidate.newText)
3406             && Range.is(candidate.range);
3407     }
3408     TextEdit.is = is;
3409 })(TextEdit || (TextEdit = {}));
3410 /**
3411  * The TextDocumentEdit namespace provides helper function to create
3412  * an edit that manipulates a text document.
3413  */
3414 var TextDocumentEdit;
3415 (function (TextDocumentEdit) {
3416     /**
3417      * Creates a new `TextDocumentEdit`
3418      */
3419     function create(textDocument, edits) {
3420         return { textDocument: textDocument, edits: edits };
3421     }
3422     TextDocumentEdit.create = create;
3423     function is(value) {
3424         var candidate = value;
3425         return Is.defined(candidate)
3426             && VersionedTextDocumentIdentifier.is(candidate.textDocument)
3427             && Array.isArray(candidate.edits);
3428     }
3429     TextDocumentEdit.is = is;
3430 })(TextDocumentEdit || (TextDocumentEdit = {}));
3431 var CreateFile;
3432 (function (CreateFile) {
3433     function create(uri, options) {
3434         var result = {
3435             kind: 'create',
3436             uri: uri
3437         };
3438         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
3439             result.options = options;
3440         }
3441         return result;
3442     }
3443     CreateFile.create = create;
3444     function is(value) {
3445         var candidate = value;
3446         return candidate && candidate.kind === 'create' && Is.string(candidate.uri) &&
3447             (candidate.options === void 0 ||
3448                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
3449     }
3450     CreateFile.is = is;
3451 })(CreateFile || (CreateFile = {}));
3452 var RenameFile;
3453 (function (RenameFile) {
3454     function create(oldUri, newUri, options) {
3455         var result = {
3456             kind: 'rename',
3457             oldUri: oldUri,
3458             newUri: newUri
3459         };
3460         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
3461             result.options = options;
3462         }
3463         return result;
3464     }
3465     RenameFile.create = create;
3466     function is(value) {
3467         var candidate = value;
3468         return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) &&
3469             (candidate.options === void 0 ||
3470                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
3471     }
3472     RenameFile.is = is;
3473 })(RenameFile || (RenameFile = {}));
3474 var DeleteFile;
3475 (function (DeleteFile) {
3476     function create(uri, options) {
3477         var result = {
3478             kind: 'delete',
3479             uri: uri
3480         };
3481         if (options !== void 0 && (options.recursive !== void 0 || options.ignoreIfNotExists !== void 0)) {
3482             result.options = options;
3483         }
3484         return result;
3485     }
3486     DeleteFile.create = create;
3487     function is(value) {
3488         var candidate = value;
3489         return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) &&
3490             (candidate.options === void 0 ||
3491                 ((candidate.options.recursive === void 0 || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === void 0 || Is.boolean(candidate.options.ignoreIfNotExists))));
3492     }
3493     DeleteFile.is = is;
3494 })(DeleteFile || (DeleteFile = {}));
3495 var WorkspaceEdit;
3496 (function (WorkspaceEdit) {
3497     function is(value) {
3498         var candidate = value;
3499         return candidate &&
3500             (candidate.changes !== void 0 || candidate.documentChanges !== void 0) &&
3501             (candidate.documentChanges === void 0 || candidate.documentChanges.every(function (change) {
3502                 if (Is.string(change.kind)) {
3503                     return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);
3504                 }
3505                 else {
3506                     return TextDocumentEdit.is(change);
3507                 }
3508             }));
3509     }
3510     WorkspaceEdit.is = is;
3511 })(WorkspaceEdit || (WorkspaceEdit = {}));
3512 var TextEditChangeImpl = /** @class */ (function () {
3513     function TextEditChangeImpl(edits) {
3514         this.edits = edits;
3515     }
3516     TextEditChangeImpl.prototype.insert = function (position, newText) {
3517         this.edits.push(TextEdit.insert(position, newText));
3518     };
3519     TextEditChangeImpl.prototype.replace = function (range, newText) {
3520         this.edits.push(TextEdit.replace(range, newText));
3521     };
3522     TextEditChangeImpl.prototype.delete = function (range) {
3523         this.edits.push(TextEdit.del(range));
3524     };
3525     TextEditChangeImpl.prototype.add = function (edit) {
3526         this.edits.push(edit);
3527     };
3528     TextEditChangeImpl.prototype.all = function () {
3529         return this.edits;
3530     };
3531     TextEditChangeImpl.prototype.clear = function () {
3532         this.edits.splice(0, this.edits.length);
3533     };
3534     return TextEditChangeImpl;
3535 }());
3536 /**
3537  * A workspace change helps constructing changes to a workspace.
3538  */
3539 var WorkspaceChange = /** @class */ (function () {
3540     function WorkspaceChange(workspaceEdit) {
3541         var _this = this;
3542         this._textEditChanges = Object.create(null);
3543         if (workspaceEdit) {
3544             this._workspaceEdit = workspaceEdit;
3545             if (workspaceEdit.documentChanges) {
3546                 workspaceEdit.documentChanges.forEach(function (change) {
3547                     if (TextDocumentEdit.is(change)) {
3548                         var textEditChange = new TextEditChangeImpl(change.edits);
3549                         _this._textEditChanges[change.textDocument.uri] = textEditChange;
3550                     }
3551                 });
3552             }
3553             else if (workspaceEdit.changes) {
3554                 Object.keys(workspaceEdit.changes).forEach(function (key) {
3555                     var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);
3556                     _this._textEditChanges[key] = textEditChange;
3557                 });
3558             }
3559         }
3560     }
3561     Object.defineProperty(WorkspaceChange.prototype, "edit", {
3562         /**
3563          * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal
3564          * use to be returned from a workspace edit operation like rename.
3565          */
3566         get: function () {
3567             if (this._workspaceEdit === undefined) {
3568                 return { documentChanges: [] };
3569             }
3570             return this._workspaceEdit;
3571         },
3572         enumerable: true,
3573         configurable: true
3574     });
3575     WorkspaceChange.prototype.getTextEditChange = function (key) {
3576         if (VersionedTextDocumentIdentifier.is(key)) {
3577             if (!this._workspaceEdit) {
3578                 this._workspaceEdit = {
3579                     documentChanges: []
3580                 };
3581             }
3582             if (!this._workspaceEdit.documentChanges) {
3583                 throw new Error('Workspace edit is not configured for document changes.');
3584             }
3585             var textDocument = key;
3586             var result = this._textEditChanges[textDocument.uri];
3587             if (!result) {
3588                 var edits = [];
3589                 var textDocumentEdit = {
3590                     textDocument: textDocument,
3591                     edits: edits
3592                 };
3593                 this._workspaceEdit.documentChanges.push(textDocumentEdit);
3594                 result = new TextEditChangeImpl(edits);
3595                 this._textEditChanges[textDocument.uri] = result;
3596             }
3597             return result;
3598         }
3599         else {
3600             if (!this._workspaceEdit) {
3601                 this._workspaceEdit = {
3602                     changes: Object.create(null)
3603                 };
3604             }
3605             if (!this._workspaceEdit.changes) {
3606                 throw new Error('Workspace edit is not configured for normal text edit changes.');
3607             }
3608             var result = this._textEditChanges[key];
3609             if (!result) {
3610                 var edits = [];
3611                 this._workspaceEdit.changes[key] = edits;
3612                 result = new TextEditChangeImpl(edits);
3613                 this._textEditChanges[key] = result;
3614             }
3615             return result;
3616         }
3617     };
3618     WorkspaceChange.prototype.createFile = function (uri, options) {
3619         this.checkDocumentChanges();
3620         this._workspaceEdit.documentChanges.push(CreateFile.create(uri, options));
3621     };
3622     WorkspaceChange.prototype.renameFile = function (oldUri, newUri, options) {
3623         this.checkDocumentChanges();
3624         this._workspaceEdit.documentChanges.push(RenameFile.create(oldUri, newUri, options));
3625     };
3626     WorkspaceChange.prototype.deleteFile = function (uri, options) {
3627         this.checkDocumentChanges();
3628         this._workspaceEdit.documentChanges.push(DeleteFile.create(uri, options));
3629     };
3630     WorkspaceChange.prototype.checkDocumentChanges = function () {
3631         if (!this._workspaceEdit || !this._workspaceEdit.documentChanges) {
3632             throw new Error('Workspace edit is not configured for document changes.');
3633         }
3634     };
3635     return WorkspaceChange;
3636 }());
3637
3638 /**
3639  * The TextDocumentIdentifier namespace provides helper functions to work with
3640  * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.
3641  */
3642 var TextDocumentIdentifier;
3643 (function (TextDocumentIdentifier) {
3644     /**
3645      * Creates a new TextDocumentIdentifier literal.
3646      * @param uri The document's uri.
3647      */
3648     function create(uri) {
3649         return { uri: uri };
3650     }
3651     TextDocumentIdentifier.create = create;
3652     /**
3653      * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.
3654      */
3655     function is(value) {
3656         var candidate = value;
3657         return Is.defined(candidate) && Is.string(candidate.uri);
3658     }
3659     TextDocumentIdentifier.is = is;
3660 })(TextDocumentIdentifier || (TextDocumentIdentifier = {}));
3661 /**
3662  * The VersionedTextDocumentIdentifier namespace provides helper functions to work with
3663  * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.
3664  */
3665 var VersionedTextDocumentIdentifier;
3666 (function (VersionedTextDocumentIdentifier) {
3667     /**
3668      * Creates a new VersionedTextDocumentIdentifier literal.
3669      * @param uri The document's uri.
3670      * @param uri The document's text.
3671      */
3672     function create(uri, version) {
3673         return { uri: uri, version: version };
3674     }
3675     VersionedTextDocumentIdentifier.create = create;
3676     /**
3677      * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.
3678      */
3679     function is(value) {
3680         var candidate = value;
3681         return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.number(candidate.version));
3682     }
3683     VersionedTextDocumentIdentifier.is = is;
3684 })(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));
3685 /**
3686  * The TextDocumentItem namespace provides helper functions to work with
3687  * [TextDocumentItem](#TextDocumentItem) literals.
3688  */
3689 var TextDocumentItem;
3690 (function (TextDocumentItem) {
3691     /**
3692      * Creates a new TextDocumentItem literal.
3693      * @param uri The document's uri.
3694      * @param languageId The document's language identifier.
3695      * @param version The document's version number.
3696      * @param text The document's text.
3697      */
3698     function create(uri, languageId, version, text) {
3699         return { uri: uri, languageId: languageId, version: version, text: text };
3700     }
3701     TextDocumentItem.create = create;
3702     /**
3703      * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.
3704      */
3705     function is(value) {
3706         var candidate = value;
3707         return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.number(candidate.version) && Is.string(candidate.text);
3708     }
3709     TextDocumentItem.is = is;
3710 })(TextDocumentItem || (TextDocumentItem = {}));
3711 /**
3712  * Describes the content type that a client supports in various
3713  * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
3714  *
3715  * Please note that `MarkupKinds` must not start with a `$`. This kinds
3716  * are reserved for internal usage.
3717  */
3718 var MarkupKind;
3719 (function (MarkupKind) {
3720     /**
3721      * Plain text is supported as a content format
3722      */
3723     MarkupKind.PlainText = 'plaintext';
3724     /**
3725      * Markdown is supported as a content format
3726      */
3727     MarkupKind.Markdown = 'markdown';
3728 })(MarkupKind || (MarkupKind = {}));
3729 (function (MarkupKind) {
3730     /**
3731      * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.
3732      */
3733     function is(value) {
3734         var candidate = value;
3735         return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;
3736     }
3737     MarkupKind.is = is;
3738 })(MarkupKind || (MarkupKind = {}));
3739 var MarkupContent;
3740 (function (MarkupContent) {
3741     /**
3742      * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.
3743      */
3744     function is(value) {
3745         var candidate = value;
3746         return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);
3747     }
3748     MarkupContent.is = is;
3749 })(MarkupContent || (MarkupContent = {}));
3750 /**
3751  * The kind of a completion entry.
3752  */
3753 var CompletionItemKind;
3754 (function (CompletionItemKind) {
3755     CompletionItemKind.Text = 1;
3756     CompletionItemKind.Method = 2;
3757     CompletionItemKind.Function = 3;
3758     CompletionItemKind.Constructor = 4;
3759     CompletionItemKind.Field = 5;
3760     CompletionItemKind.Variable = 6;
3761     CompletionItemKind.Class = 7;
3762     CompletionItemKind.Interface = 8;
3763     CompletionItemKind.Module = 9;
3764     CompletionItemKind.Property = 10;
3765     CompletionItemKind.Unit = 11;
3766     CompletionItemKind.Value = 12;
3767     CompletionItemKind.Enum = 13;
3768     CompletionItemKind.Keyword = 14;
3769     CompletionItemKind.Snippet = 15;
3770     CompletionItemKind.Color = 16;
3771     CompletionItemKind.File = 17;
3772     CompletionItemKind.Reference = 18;
3773     CompletionItemKind.Folder = 19;
3774     CompletionItemKind.EnumMember = 20;
3775     CompletionItemKind.Constant = 21;
3776     CompletionItemKind.Struct = 22;
3777     CompletionItemKind.Event = 23;
3778     CompletionItemKind.Operator = 24;
3779     CompletionItemKind.TypeParameter = 25;
3780 })(CompletionItemKind || (CompletionItemKind = {}));
3781 /**
3782  * Defines whether the insert text in a completion item should be interpreted as
3783  * plain text or a snippet.
3784  */
3785 var InsertTextFormat;
3786 (function (InsertTextFormat) {
3787     /**
3788      * The primary text to be inserted is treated as a plain string.
3789      */
3790     InsertTextFormat.PlainText = 1;
3791     /**
3792      * The primary text to be inserted is treated as a snippet.
3793      *
3794      * A snippet can define tab stops and placeholders with `$1`, `$2`
3795      * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
3796      * the end of the snippet. Placeholders with equal identifiers are linked,
3797      * that is typing in one will update others too.
3798      *
3799      * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax
3800      */
3801     InsertTextFormat.Snippet = 2;
3802 })(InsertTextFormat || (InsertTextFormat = {}));
3803 /**
3804  * Completion item tags are extra annotations that tweak the rendering of a completion
3805  * item.
3806  *
3807  * @since 3.15.0
3808  */
3809 var CompletionItemTag;
3810 (function (CompletionItemTag) {
3811     /**
3812      * Render a completion as obsolete, usually using a strike-out.
3813      */
3814     CompletionItemTag.Deprecated = 1;
3815 })(CompletionItemTag || (CompletionItemTag = {}));
3816 /**
3817  * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.
3818  *
3819  * @since 3.16.0 - Proposed state
3820  */
3821 var InsertReplaceEdit;
3822 (function (InsertReplaceEdit) {
3823     /**
3824      * Creates a new insert / replace edit
3825      */
3826     function create(newText, insert, replace) {
3827         return { newText: newText, insert: insert, replace: replace };
3828     }
3829     InsertReplaceEdit.create = create;
3830     /**
3831      * Checks whether the given liternal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.
3832      */
3833     function is(value) {
3834         var candidate = value;
3835         return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);
3836     }
3837     InsertReplaceEdit.is = is;
3838 })(InsertReplaceEdit || (InsertReplaceEdit = {}));
3839 /**
3840  * The CompletionItem namespace provides functions to deal with
3841  * completion items.
3842  */
3843 var CompletionItem;
3844 (function (CompletionItem) {
3845     /**
3846      * Create a completion item and seed it with a label.
3847      * @param label The completion item's label
3848      */
3849     function create(label) {
3850         return { label: label };
3851     }
3852     CompletionItem.create = create;
3853 })(CompletionItem || (CompletionItem = {}));
3854 /**
3855  * The CompletionList namespace provides functions to deal with
3856  * completion lists.
3857  */
3858 var CompletionList;
3859 (function (CompletionList) {
3860     /**
3861      * Creates a new completion list.
3862      *
3863      * @param items The completion items.
3864      * @param isIncomplete The list is not complete.
3865      */
3866     function create(items, isIncomplete) {
3867         return { items: items ? items : [], isIncomplete: !!isIncomplete };
3868     }
3869     CompletionList.create = create;
3870 })(CompletionList || (CompletionList = {}));
3871 var MarkedString;
3872 (function (MarkedString) {
3873     /**
3874      * Creates a marked string from plain text.
3875      *
3876      * @param plainText The plain text.
3877      */
3878     function fromPlainText(plainText) {
3879         return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
3880     }
3881     MarkedString.fromPlainText = fromPlainText;
3882     /**
3883      * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.
3884      */
3885     function is(value) {
3886         var candidate = value;
3887         return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));
3888     }
3889     MarkedString.is = is;
3890 })(MarkedString || (MarkedString = {}));
3891 var Hover;
3892 (function (Hover) {
3893     /**
3894      * Checks whether the given value conforms to the [Hover](#Hover) interface.
3895      */
3896     function is(value) {
3897         var candidate = value;
3898         return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||
3899             MarkedString.is(candidate.contents) ||
3900             Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === void 0 || Range.is(value.range));
3901     }
3902     Hover.is = is;
3903 })(Hover || (Hover = {}));
3904 /**
3905  * The ParameterInformation namespace provides helper functions to work with
3906  * [ParameterInformation](#ParameterInformation) literals.
3907  */
3908 var ParameterInformation;
3909 (function (ParameterInformation) {
3910     /**
3911      * Creates a new parameter information literal.
3912      *
3913      * @param label A label string.
3914      * @param documentation A doc string.
3915      */
3916     function create(label, documentation) {
3917         return documentation ? { label: label, documentation: documentation } : { label: label };
3918     }
3919     ParameterInformation.create = create;
3920 })(ParameterInformation || (ParameterInformation = {}));
3921 /**
3922  * The SignatureInformation namespace provides helper functions to work with
3923  * [SignatureInformation](#SignatureInformation) literals.
3924  */
3925 var SignatureInformation;
3926 (function (SignatureInformation) {
3927     function create(label, documentation) {
3928         var parameters = [];
3929         for (var _i = 2; _i < arguments.length; _i++) {
3930             parameters[_i - 2] = arguments[_i];
3931         }
3932         var result = { label: label };
3933         if (Is.defined(documentation)) {
3934             result.documentation = documentation;
3935         }
3936         if (Is.defined(parameters)) {
3937             result.parameters = parameters;
3938         }
3939         else {
3940             result.parameters = [];
3941         }
3942         return result;
3943     }
3944     SignatureInformation.create = create;
3945 })(SignatureInformation || (SignatureInformation = {}));
3946 /**
3947  * A document highlight kind.
3948  */
3949 var DocumentHighlightKind;
3950 (function (DocumentHighlightKind) {
3951     /**
3952      * A textual occurrence.
3953      */
3954     DocumentHighlightKind.Text = 1;
3955     /**
3956      * Read-access of a symbol, like reading a variable.
3957      */
3958     DocumentHighlightKind.Read = 2;
3959     /**
3960      * Write-access of a symbol, like writing to a variable.
3961      */
3962     DocumentHighlightKind.Write = 3;
3963 })(DocumentHighlightKind || (DocumentHighlightKind = {}));
3964 /**
3965  * DocumentHighlight namespace to provide helper functions to work with
3966  * [DocumentHighlight](#DocumentHighlight) literals.
3967  */
3968 var DocumentHighlight;
3969 (function (DocumentHighlight) {
3970     /**
3971      * Create a DocumentHighlight object.
3972      * @param range The range the highlight applies to.
3973      */
3974     function create(range, kind) {
3975         var result = { range: range };
3976         if (Is.number(kind)) {
3977             result.kind = kind;
3978         }
3979         return result;
3980     }
3981     DocumentHighlight.create = create;
3982 })(DocumentHighlight || (DocumentHighlight = {}));
3983 /**
3984  * A symbol kind.
3985  */
3986 var SymbolKind;
3987 (function (SymbolKind) {
3988     SymbolKind.File = 1;
3989     SymbolKind.Module = 2;
3990     SymbolKind.Namespace = 3;
3991     SymbolKind.Package = 4;
3992     SymbolKind.Class = 5;
3993     SymbolKind.Method = 6;
3994     SymbolKind.Property = 7;
3995     SymbolKind.Field = 8;
3996     SymbolKind.Constructor = 9;
3997     SymbolKind.Enum = 10;
3998     SymbolKind.Interface = 11;
3999     SymbolKind.Function = 12;
4000     SymbolKind.Variable = 13;
4001     SymbolKind.Constant = 14;
4002     SymbolKind.String = 15;
4003     SymbolKind.Number = 16;
4004     SymbolKind.Boolean = 17;
4005     SymbolKind.Array = 18;
4006     SymbolKind.Object = 19;
4007     SymbolKind.Key = 20;
4008     SymbolKind.Null = 21;
4009     SymbolKind.EnumMember = 22;
4010     SymbolKind.Struct = 23;
4011     SymbolKind.Event = 24;
4012     SymbolKind.Operator = 25;
4013     SymbolKind.TypeParameter = 26;
4014 })(SymbolKind || (SymbolKind = {}));
4015 /**
4016  * Symbol tags are extra annotations that tweak the rendering of a symbol.
4017  * @since 3.15
4018  */
4019 var SymbolTag;
4020 (function (SymbolTag) {
4021     /**
4022      * Render a symbol as obsolete, usually using a strike-out.
4023      */
4024     SymbolTag.Deprecated = 1;
4025 })(SymbolTag || (SymbolTag = {}));
4026 var SymbolInformation;
4027 (function (SymbolInformation) {
4028     /**
4029      * Creates a new symbol information literal.
4030      *
4031      * @param name The name of the symbol.
4032      * @param kind The kind of the symbol.
4033      * @param range The range of the location of the symbol.
4034      * @param uri The resource of the location of symbol, defaults to the current document.
4035      * @param containerName The name of the symbol containing the symbol.
4036      */
4037     function create(name, kind, range, uri, containerName) {
4038         var result = {
4039             name: name,
4040             kind: kind,
4041             location: { uri: uri, range: range }
4042         };
4043         if (containerName) {
4044             result.containerName = containerName;
4045         }
4046         return result;
4047     }
4048     SymbolInformation.create = create;
4049 })(SymbolInformation || (SymbolInformation = {}));
4050 var DocumentSymbol;
4051 (function (DocumentSymbol) {
4052     /**
4053      * Creates a new symbol information literal.
4054      *
4055      * @param name The name of the symbol.
4056      * @param detail The detail of the symbol.
4057      * @param kind The kind of the symbol.
4058      * @param range The range of the symbol.
4059      * @param selectionRange The selectionRange of the symbol.
4060      * @param children Children of the symbol.
4061      */
4062     function create(name, detail, kind, range, selectionRange, children) {
4063         var result = {
4064             name: name,
4065             detail: detail,
4066             kind: kind,
4067             range: range,
4068             selectionRange: selectionRange
4069         };
4070         if (children !== void 0) {
4071             result.children = children;
4072         }
4073         return result;
4074     }
4075     DocumentSymbol.create = create;
4076     /**
4077      * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.
4078      */
4079     function is(value) {
4080         var candidate = value;
4081         return candidate &&
4082             Is.string(candidate.name) && Is.number(candidate.kind) &&
4083             Range.is(candidate.range) && Range.is(candidate.selectionRange) &&
4084             (candidate.detail === void 0 || Is.string(candidate.detail)) &&
4085             (candidate.deprecated === void 0 || Is.boolean(candidate.deprecated)) &&
4086             (candidate.children === void 0 || Array.isArray(candidate.children)) &&
4087             (candidate.tags === void 0 || Array.isArray(candidate.tags));
4088     }
4089     DocumentSymbol.is = is;
4090 })(DocumentSymbol || (DocumentSymbol = {}));
4091 /**
4092  * A set of predefined code action kinds
4093  */
4094 var CodeActionKind;
4095 (function (CodeActionKind) {
4096     /**
4097      * Empty kind.
4098      */
4099     CodeActionKind.Empty = '';
4100     /**
4101      * Base kind for quickfix actions: 'quickfix'
4102      */
4103     CodeActionKind.QuickFix = 'quickfix';
4104     /**
4105      * Base kind for refactoring actions: 'refactor'
4106      */
4107     CodeActionKind.Refactor = 'refactor';
4108     /**
4109      * Base kind for refactoring extraction actions: 'refactor.extract'
4110      *
4111      * Example extract actions:
4112      *
4113      * - Extract method
4114      * - Extract function
4115      * - Extract variable
4116      * - Extract interface from class
4117      * - ...
4118      */
4119     CodeActionKind.RefactorExtract = 'refactor.extract';
4120     /**
4121      * Base kind for refactoring inline actions: 'refactor.inline'
4122      *
4123      * Example inline actions:
4124      *
4125      * - Inline function
4126      * - Inline variable
4127      * - Inline constant
4128      * - ...
4129      */
4130     CodeActionKind.RefactorInline = 'refactor.inline';
4131     /**
4132      * Base kind for refactoring rewrite actions: 'refactor.rewrite'
4133      *
4134      * Example rewrite actions:
4135      *
4136      * - Convert JavaScript function to class
4137      * - Add or remove parameter
4138      * - Encapsulate field
4139      * - Make method static
4140      * - Move method to base class
4141      * - ...
4142      */
4143     CodeActionKind.RefactorRewrite = 'refactor.rewrite';
4144     /**
4145      * Base kind for source actions: `source`
4146      *
4147      * Source code actions apply to the entire file.
4148      */
4149     CodeActionKind.Source = 'source';
4150     /**
4151      * Base kind for an organize imports source action: `source.organizeImports`
4152      */
4153     CodeActionKind.SourceOrganizeImports = 'source.organizeImports';
4154     /**
4155      * Base kind for auto-fix source actions: `source.fixAll`.
4156      *
4157      * Fix all actions automatically fix errors that have a clear fix that do not require user input.
4158      * They should not suppress errors or perform unsafe fixes such as generating new types or classes.
4159      *
4160      * @since 3.15.0
4161      */
4162     CodeActionKind.SourceFixAll = 'source.fixAll';
4163 })(CodeActionKind || (CodeActionKind = {}));
4164 /**
4165  * The CodeActionContext namespace provides helper functions to work with
4166  * [CodeActionContext](#CodeActionContext) literals.
4167  */
4168 var CodeActionContext;
4169 (function (CodeActionContext) {
4170     /**
4171      * Creates a new CodeActionContext literal.
4172      */
4173     function create(diagnostics, only) {
4174         var result = { diagnostics: diagnostics };
4175         if (only !== void 0 && only !== null) {
4176             result.only = only;
4177         }
4178         return result;
4179     }
4180     CodeActionContext.create = create;
4181     /**
4182      * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.
4183      */
4184     function is(value) {
4185         var candidate = value;
4186         return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === void 0 || Is.typedArray(candidate.only, Is.string));
4187     }
4188     CodeActionContext.is = is;
4189 })(CodeActionContext || (CodeActionContext = {}));
4190 var CodeAction;
4191 (function (CodeAction) {
4192     function create(title, commandOrEdit, kind) {
4193         var result = { title: title };
4194         if (Command.is(commandOrEdit)) {
4195             result.command = commandOrEdit;
4196         }
4197         else {
4198             result.edit = commandOrEdit;
4199         }
4200         if (kind !== void 0) {
4201             result.kind = kind;
4202         }
4203         return result;
4204     }
4205     CodeAction.create = create;
4206     function is(value) {
4207         var candidate = value;
4208         return candidate && Is.string(candidate.title) &&
4209             (candidate.diagnostics === void 0 || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&
4210             (candidate.kind === void 0 || Is.string(candidate.kind)) &&
4211             (candidate.edit !== void 0 || candidate.command !== void 0) &&
4212             (candidate.command === void 0 || Command.is(candidate.command)) &&
4213             (candidate.isPreferred === void 0 || Is.boolean(candidate.isPreferred)) &&
4214             (candidate.edit === void 0 || WorkspaceEdit.is(candidate.edit));
4215     }
4216     CodeAction.is = is;
4217 })(CodeAction || (CodeAction = {}));
4218 /**
4219  * The CodeLens namespace provides helper functions to work with
4220  * [CodeLens](#CodeLens) literals.
4221  */
4222 var CodeLens;
4223 (function (CodeLens) {
4224     /**
4225      * Creates a new CodeLens literal.
4226      */
4227     function create(range, data) {
4228         var result = { range: range };
4229         if (Is.defined(data)) {
4230             result.data = data;
4231         }
4232         return result;
4233     }
4234     CodeLens.create = create;
4235     /**
4236      * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.
4237      */
4238     function is(value) {
4239         var candidate = value;
4240         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));
4241     }
4242     CodeLens.is = is;
4243 })(CodeLens || (CodeLens = {}));
4244 /**
4245  * The FormattingOptions namespace provides helper functions to work with
4246  * [FormattingOptions](#FormattingOptions) literals.
4247  */
4248 var FormattingOptions;
4249 (function (FormattingOptions) {
4250     /**
4251      * Creates a new FormattingOptions literal.
4252      */
4253     function create(tabSize, insertSpaces) {
4254         return { tabSize: tabSize, insertSpaces: insertSpaces };
4255     }
4256     FormattingOptions.create = create;
4257     /**
4258      * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.
4259      */
4260     function is(value) {
4261         var candidate = value;
4262         return Is.defined(candidate) && Is.number(candidate.tabSize) && Is.boolean(candidate.insertSpaces);
4263     }
4264     FormattingOptions.is = is;
4265 })(FormattingOptions || (FormattingOptions = {}));
4266 /**
4267  * The DocumentLink namespace provides helper functions to work with
4268  * [DocumentLink](#DocumentLink) literals.
4269  */
4270 var DocumentLink;
4271 (function (DocumentLink) {
4272     /**
4273      * Creates a new DocumentLink literal.
4274      */
4275     function create(range, target, data) {
4276         return { range: range, target: target, data: data };
4277     }
4278     DocumentLink.create = create;
4279     /**
4280      * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.
4281      */
4282     function is(value) {
4283         var candidate = value;
4284         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));
4285     }
4286     DocumentLink.is = is;
4287 })(DocumentLink || (DocumentLink = {}));
4288 /**
4289  * The SelectionRange namespace provides helper function to work with
4290  * SelectionRange literals.
4291  */
4292 var SelectionRange;
4293 (function (SelectionRange) {
4294     /**
4295      * Creates a new SelectionRange
4296      * @param range the range.
4297      * @param parent an optional parent.
4298      */
4299     function create(range, parent) {
4300         return { range: range, parent: parent };
4301     }
4302     SelectionRange.create = create;
4303     function is(value) {
4304         var candidate = value;
4305         return candidate !== undefined && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));
4306     }
4307     SelectionRange.is = is;
4308 })(SelectionRange || (SelectionRange = {}));
4309 var EOL = ['\n', '\r\n', '\r'];
4310 /**
4311  * @deprecated Use the text document from the new vscode-languageserver-textdocument package.
4312  */
4313 var TextDocument;
4314 (function (TextDocument) {
4315     /**
4316      * Creates a new ITextDocument literal from the given uri and content.
4317      * @param uri The document's uri.
4318      * @param languageId  The document's language Id.
4319      * @param content The document's content.
4320      */
4321     function create(uri, languageId, version, content) {
4322         return new FullTextDocument(uri, languageId, version, content);
4323     }
4324     TextDocument.create = create;
4325     /**
4326      * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.
4327      */
4328     function is(value) {
4329         var candidate = value;
4330         return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.number(candidate.lineCount)
4331             && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;
4332     }
4333     TextDocument.is = is;
4334     function applyEdits(document, edits) {
4335         var text = document.getText();
4336         var sortedEdits = mergeSort(edits, function (a, b) {
4337             var diff = a.range.start.line - b.range.start.line;
4338             if (diff === 0) {
4339                 return a.range.start.character - b.range.start.character;
4340             }
4341             return diff;
4342         });
4343         var lastModifiedOffset = text.length;
4344         for (var i = sortedEdits.length - 1; i >= 0; i--) {
4345             var e = sortedEdits[i];
4346             var startOffset = document.offsetAt(e.range.start);
4347             var endOffset = document.offsetAt(e.range.end);
4348             if (endOffset <= lastModifiedOffset) {
4349                 text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);
4350             }
4351             else {
4352                 throw new Error('Overlapping edit');
4353             }
4354             lastModifiedOffset = startOffset;
4355         }
4356         return text;
4357     }
4358     TextDocument.applyEdits = applyEdits;
4359     function mergeSort(data, compare) {
4360         if (data.length <= 1) {
4361             // sorted
4362             return data;
4363         }
4364         var p = (data.length / 2) | 0;
4365         var left = data.slice(0, p);
4366         var right = data.slice(p);
4367         mergeSort(left, compare);
4368         mergeSort(right, compare);
4369         var leftIdx = 0;
4370         var rightIdx = 0;
4371         var i = 0;
4372         while (leftIdx < left.length && rightIdx < right.length) {
4373             var ret = compare(left[leftIdx], right[rightIdx]);
4374             if (ret <= 0) {
4375                 // smaller_equal -> take left to preserve order
4376                 data[i++] = left[leftIdx++];
4377             }
4378             else {
4379                 // greater -> take right
4380                 data[i++] = right[rightIdx++];
4381             }
4382         }
4383         while (leftIdx < left.length) {
4384             data[i++] = left[leftIdx++];
4385         }
4386         while (rightIdx < right.length) {
4387             data[i++] = right[rightIdx++];
4388         }
4389         return data;
4390     }
4391 })(TextDocument || (TextDocument = {}));
4392 var FullTextDocument = /** @class */ (function () {
4393     function FullTextDocument(uri, languageId, version, content) {
4394         this._uri = uri;
4395         this._languageId = languageId;
4396         this._version = version;
4397         this._content = content;
4398         this._lineOffsets = undefined;
4399     }
4400     Object.defineProperty(FullTextDocument.prototype, "uri", {
4401         get: function () {
4402             return this._uri;
4403         },
4404         enumerable: true,
4405         configurable: true
4406     });
4407     Object.defineProperty(FullTextDocument.prototype, "languageId", {
4408         get: function () {
4409             return this._languageId;
4410         },
4411         enumerable: true,
4412         configurable: true
4413     });
4414     Object.defineProperty(FullTextDocument.prototype, "version", {
4415         get: function () {
4416             return this._version;
4417         },
4418         enumerable: true,
4419         configurable: true
4420     });
4421     FullTextDocument.prototype.getText = function (range) {
4422         if (range) {
4423             var start = this.offsetAt(range.start);
4424             var end = this.offsetAt(range.end);
4425             return this._content.substring(start, end);
4426         }
4427         return this._content;
4428     };
4429     FullTextDocument.prototype.update = function (event, version) {
4430         this._content = event.text;
4431         this._version = version;
4432         this._lineOffsets = undefined;
4433     };
4434     FullTextDocument.prototype.getLineOffsets = function () {
4435         if (this._lineOffsets === undefined) {
4436             var lineOffsets = [];
4437             var text = this._content;
4438             var isLineStart = true;
4439             for (var i = 0; i < text.length; i++) {
4440                 if (isLineStart) {
4441                     lineOffsets.push(i);
4442                     isLineStart = false;
4443                 }
4444                 var ch = text.charAt(i);
4445                 isLineStart = (ch === '\r' || ch === '\n');
4446                 if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') {
4447                     i++;
4448                 }
4449             }
4450             if (isLineStart && text.length > 0) {
4451                 lineOffsets.push(text.length);
4452             }
4453             this._lineOffsets = lineOffsets;
4454         }
4455         return this._lineOffsets;
4456     };
4457     FullTextDocument.prototype.positionAt = function (offset) {
4458         offset = Math.max(Math.min(offset, this._content.length), 0);
4459         var lineOffsets = this.getLineOffsets();
4460         var low = 0, high = lineOffsets.length;
4461         if (high === 0) {
4462             return Position.create(0, offset);
4463         }
4464         while (low < high) {
4465             var mid = Math.floor((low + high) / 2);
4466             if (lineOffsets[mid] > offset) {
4467                 high = mid;
4468             }
4469             else {
4470                 low = mid + 1;
4471             }
4472         }
4473         // low is the least x for which the line offset is larger than the current offset
4474         // or array.length if no line offset is larger than the current offset
4475         var line = low - 1;
4476         return Position.create(line, offset - lineOffsets[line]);
4477     };
4478     FullTextDocument.prototype.offsetAt = function (position) {
4479         var lineOffsets = this.getLineOffsets();
4480         if (position.line >= lineOffsets.length) {
4481             return this._content.length;
4482         }
4483         else if (position.line < 0) {
4484             return 0;
4485         }
4486         var lineOffset = lineOffsets[position.line];
4487         var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
4488         return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
4489     };
4490     Object.defineProperty(FullTextDocument.prototype, "lineCount", {
4491         get: function () {
4492             return this.getLineOffsets().length;
4493         },
4494         enumerable: true,
4495         configurable: true
4496     });
4497     return FullTextDocument;
4498 }());
4499 var Is;
4500 (function (Is) {
4501     var toString = Object.prototype.toString;
4502     function defined(value) {
4503         return typeof value !== 'undefined';
4504     }
4505     Is.defined = defined;
4506     function undefined(value) {
4507         return typeof value === 'undefined';
4508     }
4509     Is.undefined = undefined;
4510     function boolean(value) {
4511         return value === true || value === false;
4512     }
4513     Is.boolean = boolean;
4514     function string(value) {
4515         return toString.call(value) === '[object String]';
4516     }
4517     Is.string = string;
4518     function number(value) {
4519         return toString.call(value) === '[object Number]';
4520     }
4521     Is.number = number;
4522     function func(value) {
4523         return toString.call(value) === '[object Function]';
4524     }
4525     Is.func = func;
4526     function objectLiteral(value) {
4527         // Strictly speaking class instances pass this check as well. Since the LSP
4528         // doesn't use classes we ignore this for now. If we do we need to add something
4529         // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
4530         return value !== null && typeof value === 'object';
4531     }
4532     Is.objectLiteral = objectLiteral;
4533     function typedArray(value, check) {
4534         return Array.isArray(value) && value.every(check);
4535     }
4536     Is.typedArray = typedArray;
4537 })(Is || (Is = {}));
4538
4539
4540 /***/ }),
4541 /* 26 */
4542 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4543
4544
4545 /* --------------------------------------------------------------------------------------------
4546  * Copyright (c) Microsoft Corporation. All rights reserved.
4547  * Licensed under the MIT License. See License.txt in the project root for license information.
4548  * ------------------------------------------------------------------------------------------ */
4549 Object.defineProperty(exports, "__esModule", ({ value: true }));
4550 const vscode_jsonrpc_1 = __webpack_require__(6);
4551 class ProtocolRequestType0 extends vscode_jsonrpc_1.RequestType0 {
4552     constructor(method) {
4553         super(method);
4554     }
4555 }
4556 exports.ProtocolRequestType0 = ProtocolRequestType0;
4557 class ProtocolRequestType extends vscode_jsonrpc_1.RequestType {
4558     constructor(method) {
4559         super(method);
4560     }
4561 }
4562 exports.ProtocolRequestType = ProtocolRequestType;
4563 class ProtocolNotificationType extends vscode_jsonrpc_1.NotificationType {
4564     constructor(method) {
4565         super(method);
4566     }
4567 }
4568 exports.ProtocolNotificationType = ProtocolNotificationType;
4569 class ProtocolNotificationType0 extends vscode_jsonrpc_1.NotificationType0 {
4570     constructor(method) {
4571         super(method);
4572     }
4573 }
4574 exports.ProtocolNotificationType0 = ProtocolNotificationType0;
4575 //# sourceMappingURL=messages.js.map
4576
4577 /***/ }),
4578 /* 27 */
4579 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
4580
4581
4582 /* --------------------------------------------------------------------------------------------
4583  * Copyright (c) Microsoft Corporation. All rights reserved.
4584  * Licensed under the MIT License. See License.txt in the project root for license information.
4585  * ------------------------------------------------------------------------------------------ */
4586 Object.defineProperty(exports, "__esModule", ({ value: true }));
4587 const Is = __webpack_require__(28);
4588 const vscode_jsonrpc_1 = __webpack_require__(6);
4589 const messages_1 = __webpack_require__(26);
4590 const protocol_implementation_1 = __webpack_require__(29);
4591 exports.ImplementationRequest = protocol_implementation_1.ImplementationRequest;
4592 const protocol_typeDefinition_1 = __webpack_require__(30);
4593 exports.TypeDefinitionRequest = protocol_typeDefinition_1.TypeDefinitionRequest;
4594 const protocol_workspaceFolders_1 = __webpack_require__(31);
4595 exports.WorkspaceFoldersRequest = protocol_workspaceFolders_1.WorkspaceFoldersRequest;
4596 exports.DidChangeWorkspaceFoldersNotification = protocol_workspaceFolders_1.DidChangeWorkspaceFoldersNotification;
4597 const protocol_configuration_1 = __webpack_require__(32);
4598 exports.ConfigurationRequest = protocol_configuration_1.ConfigurationRequest;
4599 const protocol_colorProvider_1 = __webpack_require__(33);
4600 exports.DocumentColorRequest = protocol_colorProvider_1.DocumentColorRequest;
4601 exports.ColorPresentationRequest = protocol_colorProvider_1.ColorPresentationRequest;
4602 const protocol_foldingRange_1 = __webpack_require__(34);
4603 exports.FoldingRangeRequest = protocol_foldingRange_1.FoldingRangeRequest;
4604 const protocol_declaration_1 = __webpack_require__(35);
4605 exports.DeclarationRequest = protocol_declaration_1.DeclarationRequest;
4606 const protocol_selectionRange_1 = __webpack_require__(36);
4607 exports.SelectionRangeRequest = protocol_selectionRange_1.SelectionRangeRequest;
4608 const protocol_progress_1 = __webpack_require__(37);
4609 exports.WorkDoneProgress = protocol_progress_1.WorkDoneProgress;
4610 exports.WorkDoneProgressCreateRequest = protocol_progress_1.WorkDoneProgressCreateRequest;
4611 exports.WorkDoneProgressCancelNotification = protocol_progress_1.WorkDoneProgressCancelNotification;
4612 const protocol_callHierarchy_1 = __webpack_require__(38);
4613 exports.CallHierarchyIncomingCallsRequest = protocol_callHierarchy_1.CallHierarchyIncomingCallsRequest;
4614 exports.CallHierarchyOutgoingCallsRequest = protocol_callHierarchy_1.CallHierarchyOutgoingCallsRequest;
4615 exports.CallHierarchyPrepareRequest = protocol_callHierarchy_1.CallHierarchyPrepareRequest;
4616 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
4617 let __noDynamicImport;
4618 /**
4619  * The DocumentFilter namespace provides helper functions to work with
4620  * [DocumentFilter](#DocumentFilter) literals.
4621  */
4622 var DocumentFilter;
4623 (function (DocumentFilter) {
4624     function is(value) {
4625         const candidate = value;
4626         return Is.string(candidate.language) || Is.string(candidate.scheme) || Is.string(candidate.pattern);
4627     }
4628     DocumentFilter.is = is;
4629 })(DocumentFilter = exports.DocumentFilter || (exports.DocumentFilter = {}));
4630 /**
4631  * The DocumentSelector namespace provides helper functions to work with
4632  * [DocumentSelector](#DocumentSelector)s.
4633  */
4634 var DocumentSelector;
4635 (function (DocumentSelector) {
4636     function is(value) {
4637         if (!Array.isArray(value)) {
4638             return false;
4639         }
4640         for (let elem of value) {
4641             if (!Is.string(elem) && !DocumentFilter.is(elem)) {
4642                 return false;
4643             }
4644         }
4645         return true;
4646     }
4647     DocumentSelector.is = is;
4648 })(DocumentSelector = exports.DocumentSelector || (exports.DocumentSelector = {}));
4649 /**
4650  * The `client/registerCapability` request is sent from the server to the client to register a new capability
4651  * handler on the client side.
4652  */
4653 var RegistrationRequest;
4654 (function (RegistrationRequest) {
4655     RegistrationRequest.type = new messages_1.ProtocolRequestType('client/registerCapability');
4656 })(RegistrationRequest = exports.RegistrationRequest || (exports.RegistrationRequest = {}));
4657 /**
4658  * The `client/unregisterCapability` request is sent from the server to the client to unregister a previously registered capability
4659  * handler on the client side.
4660  */
4661 var UnregistrationRequest;
4662 (function (UnregistrationRequest) {
4663     UnregistrationRequest.type = new messages_1.ProtocolRequestType('client/unregisterCapability');
4664 })(UnregistrationRequest = exports.UnregistrationRequest || (exports.UnregistrationRequest = {}));
4665 var ResourceOperationKind;
4666 (function (ResourceOperationKind) {
4667     /**
4668      * Supports creating new files and folders.
4669      */
4670     ResourceOperationKind.Create = 'create';
4671     /**
4672      * Supports renaming existing files and folders.
4673      */
4674     ResourceOperationKind.Rename = 'rename';
4675     /**
4676      * Supports deleting existing files and folders.
4677      */
4678     ResourceOperationKind.Delete = 'delete';
4679 })(ResourceOperationKind = exports.ResourceOperationKind || (exports.ResourceOperationKind = {}));
4680 var FailureHandlingKind;
4681 (function (FailureHandlingKind) {
4682     /**
4683      * Applying the workspace change is simply aborted if one of the changes provided
4684      * fails. All operations executed before the failing operation stay executed.
4685      */
4686     FailureHandlingKind.Abort = 'abort';
4687     /**
4688      * All operations are executed transactional. That means they either all
4689      * succeed or no changes at all are applied to the workspace.
4690      */
4691     FailureHandlingKind.Transactional = 'transactional';
4692     /**
4693      * If the workspace edit contains only textual file changes they are executed transactional.
4694      * If resource changes (create, rename or delete file) are part of the change the failure
4695      * handling startegy is abort.
4696      */
4697     FailureHandlingKind.TextOnlyTransactional = 'textOnlyTransactional';
4698     /**
4699      * The client tries to undo the operations already executed. But there is no
4700      * guarantee that this is succeeding.
4701      */
4702     FailureHandlingKind.Undo = 'undo';
4703 })(FailureHandlingKind = exports.FailureHandlingKind || (exports.FailureHandlingKind = {}));
4704 /**
4705  * The StaticRegistrationOptions namespace provides helper functions to work with
4706  * [StaticRegistrationOptions](#StaticRegistrationOptions) literals.
4707  */
4708 var StaticRegistrationOptions;
4709 (function (StaticRegistrationOptions) {
4710     function hasId(value) {
4711         const candidate = value;
4712         return candidate && Is.string(candidate.id) && candidate.id.length > 0;
4713     }
4714     StaticRegistrationOptions.hasId = hasId;
4715 })(StaticRegistrationOptions = exports.StaticRegistrationOptions || (exports.StaticRegistrationOptions = {}));
4716 /**
4717  * The TextDocumentRegistrationOptions namespace provides helper functions to work with
4718  * [TextDocumentRegistrationOptions](#TextDocumentRegistrationOptions) literals.
4719  */
4720 var TextDocumentRegistrationOptions;
4721 (function (TextDocumentRegistrationOptions) {
4722     function is(value) {
4723         const candidate = value;
4724         return candidate && (candidate.documentSelector === null || DocumentSelector.is(candidate.documentSelector));
4725     }
4726     TextDocumentRegistrationOptions.is = is;
4727 })(TextDocumentRegistrationOptions = exports.TextDocumentRegistrationOptions || (exports.TextDocumentRegistrationOptions = {}));
4728 /**
4729  * The WorkDoneProgressOptions namespace provides helper functions to work with
4730  * [WorkDoneProgressOptions](#WorkDoneProgressOptions) literals.
4731  */
4732 var WorkDoneProgressOptions;
4733 (function (WorkDoneProgressOptions) {
4734     function is(value) {
4735         const candidate = value;
4736         return Is.objectLiteral(candidate) && (candidate.workDoneProgress === undefined || Is.boolean(candidate.workDoneProgress));
4737     }
4738     WorkDoneProgressOptions.is = is;
4739     function hasWorkDoneProgress(value) {
4740         const candidate = value;
4741         return candidate && Is.boolean(candidate.workDoneProgress);
4742     }
4743     WorkDoneProgressOptions.hasWorkDoneProgress = hasWorkDoneProgress;
4744 })(WorkDoneProgressOptions = exports.WorkDoneProgressOptions || (exports.WorkDoneProgressOptions = {}));
4745 /**
4746  * The initialize request is sent from the client to the server.
4747  * It is sent once as the request after starting up the server.
4748  * The requests parameter is of type [InitializeParams](#InitializeParams)
4749  * the response if of type [InitializeResult](#InitializeResult) of a Thenable that
4750  * resolves to such.
4751  */
4752 var InitializeRequest;
4753 (function (InitializeRequest) {
4754     InitializeRequest.type = new messages_1.ProtocolRequestType('initialize');
4755 })(InitializeRequest = exports.InitializeRequest || (exports.InitializeRequest = {}));
4756 /**
4757  * Known error codes for an `InitializeError`;
4758  */
4759 var InitializeError;
4760 (function (InitializeError) {
4761     /**
4762      * If the protocol version provided by the client can't be handled by the server.
4763      * @deprecated This initialize error got replaced by client capabilities. There is
4764      * no version handshake in version 3.0x
4765      */
4766     InitializeError.unknownProtocolVersion = 1;
4767 })(InitializeError = exports.InitializeError || (exports.InitializeError = {}));
4768 /**
4769  * The intialized notification is sent from the client to the
4770  * server after the client is fully initialized and the server
4771  * is allowed to send requests from the server to the client.
4772  */
4773 var InitializedNotification;
4774 (function (InitializedNotification) {
4775     InitializedNotification.type = new messages_1.ProtocolNotificationType('initialized');
4776 })(InitializedNotification = exports.InitializedNotification || (exports.InitializedNotification = {}));
4777 //---- Shutdown Method ----
4778 /**
4779  * A shutdown request is sent from the client to the server.
4780  * It is sent once when the client decides to shutdown the
4781  * server. The only notification that is sent after a shutdown request
4782  * is the exit event.
4783  */
4784 var ShutdownRequest;
4785 (function (ShutdownRequest) {
4786     ShutdownRequest.type = new messages_1.ProtocolRequestType0('shutdown');
4787 })(ShutdownRequest = exports.ShutdownRequest || (exports.ShutdownRequest = {}));
4788 //---- Exit Notification ----
4789 /**
4790  * The exit event is sent from the client to the server to
4791  * ask the server to exit its process.
4792  */
4793 var ExitNotification;
4794 (function (ExitNotification) {
4795     ExitNotification.type = new messages_1.ProtocolNotificationType0('exit');
4796 })(ExitNotification = exports.ExitNotification || (exports.ExitNotification = {}));
4797 /**
4798  * The configuration change notification is sent from the client to the server
4799  * when the client's configuration has changed. The notification contains
4800  * the changed configuration as defined by the language client.
4801  */
4802 var DidChangeConfigurationNotification;
4803 (function (DidChangeConfigurationNotification) {
4804     DidChangeConfigurationNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeConfiguration');
4805 })(DidChangeConfigurationNotification = exports.DidChangeConfigurationNotification || (exports.DidChangeConfigurationNotification = {}));
4806 //---- Message show and log notifications ----
4807 /**
4808  * The message type
4809  */
4810 var MessageType;
4811 (function (MessageType) {
4812     /**
4813      * An error message.
4814      */
4815     MessageType.Error = 1;
4816     /**
4817      * A warning message.
4818      */
4819     MessageType.Warning = 2;
4820     /**
4821      * An information message.
4822      */
4823     MessageType.Info = 3;
4824     /**
4825      * A log message.
4826      */
4827     MessageType.Log = 4;
4828 })(MessageType = exports.MessageType || (exports.MessageType = {}));
4829 /**
4830  * The show message notification is sent from a server to a client to ask
4831  * the client to display a particular message in the user interface.
4832  */
4833 var ShowMessageNotification;
4834 (function (ShowMessageNotification) {
4835     ShowMessageNotification.type = new messages_1.ProtocolNotificationType('window/showMessage');
4836 })(ShowMessageNotification = exports.ShowMessageNotification || (exports.ShowMessageNotification = {}));
4837 /**
4838  * The show message request is sent from the server to the client to show a message
4839  * and a set of options actions to the user.
4840  */
4841 var ShowMessageRequest;
4842 (function (ShowMessageRequest) {
4843     ShowMessageRequest.type = new messages_1.ProtocolRequestType('window/showMessageRequest');
4844 })(ShowMessageRequest = exports.ShowMessageRequest || (exports.ShowMessageRequest = {}));
4845 /**
4846  * The log message notification is sent from the server to the client to ask
4847  * the client to log a particular message.
4848  */
4849 var LogMessageNotification;
4850 (function (LogMessageNotification) {
4851     LogMessageNotification.type = new messages_1.ProtocolNotificationType('window/logMessage');
4852 })(LogMessageNotification = exports.LogMessageNotification || (exports.LogMessageNotification = {}));
4853 //---- Telemetry notification
4854 /**
4855  * The telemetry event notification is sent from the server to the client to ask
4856  * the client to log telemetry data.
4857  */
4858 var TelemetryEventNotification;
4859 (function (TelemetryEventNotification) {
4860     TelemetryEventNotification.type = new messages_1.ProtocolNotificationType('telemetry/event');
4861 })(TelemetryEventNotification = exports.TelemetryEventNotification || (exports.TelemetryEventNotification = {}));
4862 /**
4863  * Defines how the host (editor) should sync
4864  * document changes to the language server.
4865  */
4866 var TextDocumentSyncKind;
4867 (function (TextDocumentSyncKind) {
4868     /**
4869      * Documents should not be synced at all.
4870      */
4871     TextDocumentSyncKind.None = 0;
4872     /**
4873      * Documents are synced by always sending the full content
4874      * of the document.
4875      */
4876     TextDocumentSyncKind.Full = 1;
4877     /**
4878      * Documents are synced by sending the full content on open.
4879      * After that only incremental updates to the document are
4880      * send.
4881      */
4882     TextDocumentSyncKind.Incremental = 2;
4883 })(TextDocumentSyncKind = exports.TextDocumentSyncKind || (exports.TextDocumentSyncKind = {}));
4884 /**
4885  * The document open notification is sent from the client to the server to signal
4886  * newly opened text documents. The document's truth is now managed by the client
4887  * and the server must not try to read the document's truth using the document's
4888  * uri. Open in this sense means it is managed by the client. It doesn't necessarily
4889  * mean that its content is presented in an editor. An open notification must not
4890  * be sent more than once without a corresponding close notification send before.
4891  * This means open and close notification must be balanced and the max open count
4892  * is one.
4893  */
4894 var DidOpenTextDocumentNotification;
4895 (function (DidOpenTextDocumentNotification) {
4896     DidOpenTextDocumentNotification.method = 'textDocument/didOpen';
4897     DidOpenTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidOpenTextDocumentNotification.method);
4898 })(DidOpenTextDocumentNotification = exports.DidOpenTextDocumentNotification || (exports.DidOpenTextDocumentNotification = {}));
4899 /**
4900  * The document change notification is sent from the client to the server to signal
4901  * changes to a text document.
4902  */
4903 var DidChangeTextDocumentNotification;
4904 (function (DidChangeTextDocumentNotification) {
4905     DidChangeTextDocumentNotification.method = 'textDocument/didChange';
4906     DidChangeTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidChangeTextDocumentNotification.method);
4907 })(DidChangeTextDocumentNotification = exports.DidChangeTextDocumentNotification || (exports.DidChangeTextDocumentNotification = {}));
4908 /**
4909  * The document close notification is sent from the client to the server when
4910  * the document got closed in the client. The document's truth now exists where
4911  * the document's uri points to (e.g. if the document's uri is a file uri the
4912  * truth now exists on disk). As with the open notification the close notification
4913  * is about managing the document's content. Receiving a close notification
4914  * doesn't mean that the document was open in an editor before. A close
4915  * notification requires a previous open notification to be sent.
4916  */
4917 var DidCloseTextDocumentNotification;
4918 (function (DidCloseTextDocumentNotification) {
4919     DidCloseTextDocumentNotification.method = 'textDocument/didClose';
4920     DidCloseTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidCloseTextDocumentNotification.method);
4921 })(DidCloseTextDocumentNotification = exports.DidCloseTextDocumentNotification || (exports.DidCloseTextDocumentNotification = {}));
4922 /**
4923  * The document save notification is sent from the client to the server when
4924  * the document got saved in the client.
4925  */
4926 var DidSaveTextDocumentNotification;
4927 (function (DidSaveTextDocumentNotification) {
4928     DidSaveTextDocumentNotification.method = 'textDocument/didSave';
4929     DidSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(DidSaveTextDocumentNotification.method);
4930 })(DidSaveTextDocumentNotification = exports.DidSaveTextDocumentNotification || (exports.DidSaveTextDocumentNotification = {}));
4931 /**
4932  * Represents reasons why a text document is saved.
4933  */
4934 var TextDocumentSaveReason;
4935 (function (TextDocumentSaveReason) {
4936     /**
4937      * Manually triggered, e.g. by the user pressing save, by starting debugging,
4938      * or by an API call.
4939      */
4940     TextDocumentSaveReason.Manual = 1;
4941     /**
4942      * Automatic after a delay.
4943      */
4944     TextDocumentSaveReason.AfterDelay = 2;
4945     /**
4946      * When the editor lost focus.
4947      */
4948     TextDocumentSaveReason.FocusOut = 3;
4949 })(TextDocumentSaveReason = exports.TextDocumentSaveReason || (exports.TextDocumentSaveReason = {}));
4950 /**
4951  * A document will save notification is sent from the client to the server before
4952  * the document is actually saved.
4953  */
4954 var WillSaveTextDocumentNotification;
4955 (function (WillSaveTextDocumentNotification) {
4956     WillSaveTextDocumentNotification.method = 'textDocument/willSave';
4957     WillSaveTextDocumentNotification.type = new messages_1.ProtocolNotificationType(WillSaveTextDocumentNotification.method);
4958 })(WillSaveTextDocumentNotification = exports.WillSaveTextDocumentNotification || (exports.WillSaveTextDocumentNotification = {}));
4959 /**
4960  * A document will save request is sent from the client to the server before
4961  * the document is actually saved. The request can return an array of TextEdits
4962  * which will be applied to the text document before it is saved. Please note that
4963  * clients might drop results if computing the text edits took too long or if a
4964  * server constantly fails on this request. This is done to keep the save fast and
4965  * reliable.
4966  */
4967 var WillSaveTextDocumentWaitUntilRequest;
4968 (function (WillSaveTextDocumentWaitUntilRequest) {
4969     WillSaveTextDocumentWaitUntilRequest.method = 'textDocument/willSaveWaitUntil';
4970     WillSaveTextDocumentWaitUntilRequest.type = new messages_1.ProtocolRequestType(WillSaveTextDocumentWaitUntilRequest.method);
4971 })(WillSaveTextDocumentWaitUntilRequest = exports.WillSaveTextDocumentWaitUntilRequest || (exports.WillSaveTextDocumentWaitUntilRequest = {}));
4972 /**
4973  * The watched files notification is sent from the client to the server when
4974  * the client detects changes to file watched by the language client.
4975  */
4976 var DidChangeWatchedFilesNotification;
4977 (function (DidChangeWatchedFilesNotification) {
4978     DidChangeWatchedFilesNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWatchedFiles');
4979 })(DidChangeWatchedFilesNotification = exports.DidChangeWatchedFilesNotification || (exports.DidChangeWatchedFilesNotification = {}));
4980 /**
4981  * The file event type
4982  */
4983 var FileChangeType;
4984 (function (FileChangeType) {
4985     /**
4986      * The file got created.
4987      */
4988     FileChangeType.Created = 1;
4989     /**
4990      * The file got changed.
4991      */
4992     FileChangeType.Changed = 2;
4993     /**
4994      * The file got deleted.
4995      */
4996     FileChangeType.Deleted = 3;
4997 })(FileChangeType = exports.FileChangeType || (exports.FileChangeType = {}));
4998 var WatchKind;
4999 (function (WatchKind) {
5000     /**
5001      * Interested in create events.
5002      */
5003     WatchKind.Create = 1;
5004     /**
5005      * Interested in change events
5006      */
5007     WatchKind.Change = 2;
5008     /**
5009      * Interested in delete events
5010      */
5011     WatchKind.Delete = 4;
5012 })(WatchKind = exports.WatchKind || (exports.WatchKind = {}));
5013 /**
5014  * Diagnostics notification are sent from the server to the client to signal
5015  * results of validation runs.
5016  */
5017 var PublishDiagnosticsNotification;
5018 (function (PublishDiagnosticsNotification) {
5019     PublishDiagnosticsNotification.type = new messages_1.ProtocolNotificationType('textDocument/publishDiagnostics');
5020 })(PublishDiagnosticsNotification = exports.PublishDiagnosticsNotification || (exports.PublishDiagnosticsNotification = {}));
5021 /**
5022  * How a completion was triggered
5023  */
5024 var CompletionTriggerKind;
5025 (function (CompletionTriggerKind) {
5026     /**
5027      * Completion was triggered by typing an identifier (24x7 code
5028      * complete), manual invocation (e.g Ctrl+Space) or via API.
5029      */
5030     CompletionTriggerKind.Invoked = 1;
5031     /**
5032      * Completion was triggered by a trigger character specified by
5033      * the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
5034      */
5035     CompletionTriggerKind.TriggerCharacter = 2;
5036     /**
5037      * Completion was re-triggered as current completion list is incomplete
5038      */
5039     CompletionTriggerKind.TriggerForIncompleteCompletions = 3;
5040 })(CompletionTriggerKind = exports.CompletionTriggerKind || (exports.CompletionTriggerKind = {}));
5041 /**
5042  * Request to request completion at a given text document position. The request's
5043  * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response
5044  * is of type [CompletionItem[]](#CompletionItem) or [CompletionList](#CompletionList)
5045  * or a Thenable that resolves to such.
5046  *
5047  * The request can delay the computation of the [`detail`](#CompletionItem.detail)
5048  * and [`documentation`](#CompletionItem.documentation) properties to the `completionItem/resolve`
5049  * request. However, properties that are needed for the initial sorting and filtering, like `sortText`,
5050  * `filterText`, `insertText`, and `textEdit`, must not be changed during resolve.
5051  */
5052 var CompletionRequest;
5053 (function (CompletionRequest) {
5054     CompletionRequest.method = 'textDocument/completion';
5055     CompletionRequest.type = new messages_1.ProtocolRequestType(CompletionRequest.method);
5056     /** @deprecated Use CompletionRequest.type */
5057     CompletionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5058 })(CompletionRequest = exports.CompletionRequest || (exports.CompletionRequest = {}));
5059 /**
5060  * Request to resolve additional information for a given completion item.The request's
5061  * parameter is of type [CompletionItem](#CompletionItem) the response
5062  * is of type [CompletionItem](#CompletionItem) or a Thenable that resolves to such.
5063  */
5064 var CompletionResolveRequest;
5065 (function (CompletionResolveRequest) {
5066     CompletionResolveRequest.method = 'completionItem/resolve';
5067     CompletionResolveRequest.type = new messages_1.ProtocolRequestType(CompletionResolveRequest.method);
5068 })(CompletionResolveRequest = exports.CompletionResolveRequest || (exports.CompletionResolveRequest = {}));
5069 /**
5070  * Request to request hover information at a given text document position. The request's
5071  * parameter is of type [TextDocumentPosition](#TextDocumentPosition) the response is of
5072  * type [Hover](#Hover) or a Thenable that resolves to such.
5073  */
5074 var HoverRequest;
5075 (function (HoverRequest) {
5076     HoverRequest.method = 'textDocument/hover';
5077     HoverRequest.type = new messages_1.ProtocolRequestType(HoverRequest.method);
5078 })(HoverRequest = exports.HoverRequest || (exports.HoverRequest = {}));
5079 /**
5080  * How a signature help was triggered.
5081  *
5082  * @since 3.15.0
5083  */
5084 var SignatureHelpTriggerKind;
5085 (function (SignatureHelpTriggerKind) {
5086     /**
5087      * Signature help was invoked manually by the user or by a command.
5088      */
5089     SignatureHelpTriggerKind.Invoked = 1;
5090     /**
5091      * Signature help was triggered by a trigger character.
5092      */
5093     SignatureHelpTriggerKind.TriggerCharacter = 2;
5094     /**
5095      * Signature help was triggered by the cursor moving or by the document content changing.
5096      */
5097     SignatureHelpTriggerKind.ContentChange = 3;
5098 })(SignatureHelpTriggerKind = exports.SignatureHelpTriggerKind || (exports.SignatureHelpTriggerKind = {}));
5099 var SignatureHelpRequest;
5100 (function (SignatureHelpRequest) {
5101     SignatureHelpRequest.method = 'textDocument/signatureHelp';
5102     SignatureHelpRequest.type = new messages_1.ProtocolRequestType(SignatureHelpRequest.method);
5103 })(SignatureHelpRequest = exports.SignatureHelpRequest || (exports.SignatureHelpRequest = {}));
5104 /**
5105  * A request to resolve the definition location of a symbol at a given text
5106  * document position. The request's parameter is of type [TextDocumentPosition]
5107  * (#TextDocumentPosition) the response is of either type [Definition](#Definition)
5108  * or a typed array of [DefinitionLink](#DefinitionLink) or a Thenable that resolves
5109  * to such.
5110  */
5111 var DefinitionRequest;
5112 (function (DefinitionRequest) {
5113     DefinitionRequest.method = 'textDocument/definition';
5114     DefinitionRequest.type = new messages_1.ProtocolRequestType(DefinitionRequest.method);
5115     /** @deprecated Use DefinitionRequest.type */
5116     DefinitionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5117 })(DefinitionRequest = exports.DefinitionRequest || (exports.DefinitionRequest = {}));
5118 /**
5119  * A request to resolve project-wide references for the symbol denoted
5120  * by the given text document position. The request's parameter is of
5121  * type [ReferenceParams](#ReferenceParams) the response is of type
5122  * [Location[]](#Location) or a Thenable that resolves to such.
5123  */
5124 var ReferencesRequest;
5125 (function (ReferencesRequest) {
5126     ReferencesRequest.method = 'textDocument/references';
5127     ReferencesRequest.type = new messages_1.ProtocolRequestType(ReferencesRequest.method);
5128     /** @deprecated Use ReferencesRequest.type */
5129     ReferencesRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5130 })(ReferencesRequest = exports.ReferencesRequest || (exports.ReferencesRequest = {}));
5131 /**
5132  * Request to resolve a [DocumentHighlight](#DocumentHighlight) for a given
5133  * text document position. The request's parameter is of type [TextDocumentPosition]
5134  * (#TextDocumentPosition) the request response is of type [DocumentHighlight[]]
5135  * (#DocumentHighlight) or a Thenable that resolves to such.
5136  */
5137 var DocumentHighlightRequest;
5138 (function (DocumentHighlightRequest) {
5139     DocumentHighlightRequest.method = 'textDocument/documentHighlight';
5140     DocumentHighlightRequest.type = new messages_1.ProtocolRequestType(DocumentHighlightRequest.method);
5141     /** @deprecated Use DocumentHighlightRequest.type */
5142     DocumentHighlightRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5143 })(DocumentHighlightRequest = exports.DocumentHighlightRequest || (exports.DocumentHighlightRequest = {}));
5144 /**
5145  * A request to list all symbols found in a given text document. The request's
5146  * parameter is of type [TextDocumentIdentifier](#TextDocumentIdentifier) the
5147  * response is of type [SymbolInformation[]](#SymbolInformation) or a Thenable
5148  * that resolves to such.
5149  */
5150 var DocumentSymbolRequest;
5151 (function (DocumentSymbolRequest) {
5152     DocumentSymbolRequest.method = 'textDocument/documentSymbol';
5153     DocumentSymbolRequest.type = new messages_1.ProtocolRequestType(DocumentSymbolRequest.method);
5154     /** @deprecated Use DocumentSymbolRequest.type */
5155     DocumentSymbolRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5156 })(DocumentSymbolRequest = exports.DocumentSymbolRequest || (exports.DocumentSymbolRequest = {}));
5157 /**
5158  * A request to provide commands for the given text document and range.
5159  */
5160 var CodeActionRequest;
5161 (function (CodeActionRequest) {
5162     CodeActionRequest.method = 'textDocument/codeAction';
5163     CodeActionRequest.type = new messages_1.ProtocolRequestType(CodeActionRequest.method);
5164     /** @deprecated Use CodeActionRequest.type */
5165     CodeActionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5166 })(CodeActionRequest = exports.CodeActionRequest || (exports.CodeActionRequest = {}));
5167 /**
5168  * A request to list project-wide symbols matching the query string given
5169  * by the [WorkspaceSymbolParams](#WorkspaceSymbolParams). The response is
5170  * of type [SymbolInformation[]](#SymbolInformation) or a Thenable that
5171  * resolves to such.
5172  */
5173 var WorkspaceSymbolRequest;
5174 (function (WorkspaceSymbolRequest) {
5175     WorkspaceSymbolRequest.method = 'workspace/symbol';
5176     WorkspaceSymbolRequest.type = new messages_1.ProtocolRequestType(WorkspaceSymbolRequest.method);
5177     /** @deprecated Use WorkspaceSymbolRequest.type */
5178     WorkspaceSymbolRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5179 })(WorkspaceSymbolRequest = exports.WorkspaceSymbolRequest || (exports.WorkspaceSymbolRequest = {}));
5180 /**
5181  * A request to provide code lens for the given text document.
5182  */
5183 var CodeLensRequest;
5184 (function (CodeLensRequest) {
5185     CodeLensRequest.type = new messages_1.ProtocolRequestType('textDocument/codeLens');
5186     /** @deprecated Use CodeLensRequest.type */
5187     CodeLensRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5188 })(CodeLensRequest = exports.CodeLensRequest || (exports.CodeLensRequest = {}));
5189 /**
5190  * A request to resolve a command for a given code lens.
5191  */
5192 var CodeLensResolveRequest;
5193 (function (CodeLensResolveRequest) {
5194     CodeLensResolveRequest.type = new messages_1.ProtocolRequestType('codeLens/resolve');
5195 })(CodeLensResolveRequest = exports.CodeLensResolveRequest || (exports.CodeLensResolveRequest = {}));
5196 /**
5197  * A request to provide document links
5198  */
5199 var DocumentLinkRequest;
5200 (function (DocumentLinkRequest) {
5201     DocumentLinkRequest.method = 'textDocument/documentLink';
5202     DocumentLinkRequest.type = new messages_1.ProtocolRequestType(DocumentLinkRequest.method);
5203     /** @deprecated Use DocumentLinkRequest.type */
5204     DocumentLinkRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5205 })(DocumentLinkRequest = exports.DocumentLinkRequest || (exports.DocumentLinkRequest = {}));
5206 /**
5207  * Request to resolve additional information for a given document link. The request's
5208  * parameter is of type [DocumentLink](#DocumentLink) the response
5209  * is of type [DocumentLink](#DocumentLink) or a Thenable that resolves to such.
5210  */
5211 var DocumentLinkResolveRequest;
5212 (function (DocumentLinkResolveRequest) {
5213     DocumentLinkResolveRequest.type = new messages_1.ProtocolRequestType('documentLink/resolve');
5214 })(DocumentLinkResolveRequest = exports.DocumentLinkResolveRequest || (exports.DocumentLinkResolveRequest = {}));
5215 /**
5216  * A request to to format a whole document.
5217  */
5218 var DocumentFormattingRequest;
5219 (function (DocumentFormattingRequest) {
5220     DocumentFormattingRequest.method = 'textDocument/formatting';
5221     DocumentFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentFormattingRequest.method);
5222 })(DocumentFormattingRequest = exports.DocumentFormattingRequest || (exports.DocumentFormattingRequest = {}));
5223 /**
5224  * A request to to format a range in a document.
5225  */
5226 var DocumentRangeFormattingRequest;
5227 (function (DocumentRangeFormattingRequest) {
5228     DocumentRangeFormattingRequest.method = 'textDocument/rangeFormatting';
5229     DocumentRangeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentRangeFormattingRequest.method);
5230 })(DocumentRangeFormattingRequest = exports.DocumentRangeFormattingRequest || (exports.DocumentRangeFormattingRequest = {}));
5231 /**
5232  * A request to format a document on type.
5233  */
5234 var DocumentOnTypeFormattingRequest;
5235 (function (DocumentOnTypeFormattingRequest) {
5236     DocumentOnTypeFormattingRequest.method = 'textDocument/onTypeFormatting';
5237     DocumentOnTypeFormattingRequest.type = new messages_1.ProtocolRequestType(DocumentOnTypeFormattingRequest.method);
5238 })(DocumentOnTypeFormattingRequest = exports.DocumentOnTypeFormattingRequest || (exports.DocumentOnTypeFormattingRequest = {}));
5239 /**
5240  * A request to rename a symbol.
5241  */
5242 var RenameRequest;
5243 (function (RenameRequest) {
5244     RenameRequest.method = 'textDocument/rename';
5245     RenameRequest.type = new messages_1.ProtocolRequestType(RenameRequest.method);
5246 })(RenameRequest = exports.RenameRequest || (exports.RenameRequest = {}));
5247 /**
5248  * A request to test and perform the setup necessary for a rename.
5249  */
5250 var PrepareRenameRequest;
5251 (function (PrepareRenameRequest) {
5252     PrepareRenameRequest.method = 'textDocument/prepareRename';
5253     PrepareRenameRequest.type = new messages_1.ProtocolRequestType(PrepareRenameRequest.method);
5254 })(PrepareRenameRequest = exports.PrepareRenameRequest || (exports.PrepareRenameRequest = {}));
5255 /**
5256  * A request send from the client to the server to execute a command. The request might return
5257  * a workspace edit which the client will apply to the workspace.
5258  */
5259 var ExecuteCommandRequest;
5260 (function (ExecuteCommandRequest) {
5261     ExecuteCommandRequest.type = new messages_1.ProtocolRequestType('workspace/executeCommand');
5262 })(ExecuteCommandRequest = exports.ExecuteCommandRequest || (exports.ExecuteCommandRequest = {}));
5263 /**
5264  * A request sent from the server to the client to modified certain resources.
5265  */
5266 var ApplyWorkspaceEditRequest;
5267 (function (ApplyWorkspaceEditRequest) {
5268     ApplyWorkspaceEditRequest.type = new messages_1.ProtocolRequestType('workspace/applyEdit');
5269 })(ApplyWorkspaceEditRequest = exports.ApplyWorkspaceEditRequest || (exports.ApplyWorkspaceEditRequest = {}));
5270 //# sourceMappingURL=protocol.js.map
5271
5272 /***/ }),
5273 /* 28 */
5274 /***/ ((__unused_webpack_module, exports) => {
5275
5276 /* --------------------------------------------------------------------------------------------
5277  * Copyright (c) Microsoft Corporation. All rights reserved.
5278  * Licensed under the MIT License. See License.txt in the project root for license information.
5279  * ------------------------------------------------------------------------------------------ */
5280
5281 Object.defineProperty(exports, "__esModule", ({ value: true }));
5282 function boolean(value) {
5283     return value === true || value === false;
5284 }
5285 exports.boolean = boolean;
5286 function string(value) {
5287     return typeof value === 'string' || value instanceof String;
5288 }
5289 exports.string = string;
5290 function number(value) {
5291     return typeof value === 'number' || value instanceof Number;
5292 }
5293 exports.number = number;
5294 function error(value) {
5295     return value instanceof Error;
5296 }
5297 exports.error = error;
5298 function func(value) {
5299     return typeof value === 'function';
5300 }
5301 exports.func = func;
5302 function array(value) {
5303     return Array.isArray(value);
5304 }
5305 exports.array = array;
5306 function stringArray(value) {
5307     return array(value) && value.every(elem => string(elem));
5308 }
5309 exports.stringArray = stringArray;
5310 function typedArray(value, check) {
5311     return Array.isArray(value) && value.every(check);
5312 }
5313 exports.typedArray = typedArray;
5314 function objectLiteral(value) {
5315     // Strictly speaking class instances pass this check as well. Since the LSP
5316     // doesn't use classes we ignore this for now. If we do we need to add something
5317     // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
5318     return value !== null && typeof value === 'object';
5319 }
5320 exports.objectLiteral = objectLiteral;
5321 //# sourceMappingURL=is.js.map
5322
5323 /***/ }),
5324 /* 29 */
5325 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5326
5327
5328 /* --------------------------------------------------------------------------------------------
5329  * Copyright (c) Microsoft Corporation. All rights reserved.
5330  * Licensed under the MIT License. See License.txt in the project root for license information.
5331  * ------------------------------------------------------------------------------------------ */
5332 Object.defineProperty(exports, "__esModule", ({ value: true }));
5333 const vscode_jsonrpc_1 = __webpack_require__(6);
5334 const messages_1 = __webpack_require__(26);
5335 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
5336 let __noDynamicImport;
5337 /**
5338  * A request to resolve the implementation locations of a symbol at a given text
5339  * document position. The request's parameter is of type [TextDocumentPositioParams]
5340  * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a
5341  * Thenable that resolves to such.
5342  */
5343 var ImplementationRequest;
5344 (function (ImplementationRequest) {
5345     ImplementationRequest.method = 'textDocument/implementation';
5346     ImplementationRequest.type = new messages_1.ProtocolRequestType(ImplementationRequest.method);
5347     /** @deprecated Use ImplementationRequest.type */
5348     ImplementationRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5349 })(ImplementationRequest = exports.ImplementationRequest || (exports.ImplementationRequest = {}));
5350 //# sourceMappingURL=protocol.implementation.js.map
5351
5352 /***/ }),
5353 /* 30 */
5354 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5355
5356
5357 /* --------------------------------------------------------------------------------------------
5358  * Copyright (c) Microsoft Corporation. All rights reserved.
5359  * Licensed under the MIT License. See License.txt in the project root for license information.
5360  * ------------------------------------------------------------------------------------------ */
5361 Object.defineProperty(exports, "__esModule", ({ value: true }));
5362 const vscode_jsonrpc_1 = __webpack_require__(6);
5363 const messages_1 = __webpack_require__(26);
5364 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
5365 let __noDynamicImport;
5366 /**
5367  * A request to resolve the type definition locations of a symbol at a given text
5368  * document position. The request's parameter is of type [TextDocumentPositioParams]
5369  * (#TextDocumentPositionParams) the response is of type [Definition](#Definition) or a
5370  * Thenable that resolves to such.
5371  */
5372 var TypeDefinitionRequest;
5373 (function (TypeDefinitionRequest) {
5374     TypeDefinitionRequest.method = 'textDocument/typeDefinition';
5375     TypeDefinitionRequest.type = new messages_1.ProtocolRequestType(TypeDefinitionRequest.method);
5376     /** @deprecated Use TypeDefinitionRequest.type */
5377     TypeDefinitionRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5378 })(TypeDefinitionRequest = exports.TypeDefinitionRequest || (exports.TypeDefinitionRequest = {}));
5379 //# sourceMappingURL=protocol.typeDefinition.js.map
5380
5381 /***/ }),
5382 /* 31 */
5383 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5384
5385
5386 /* --------------------------------------------------------------------------------------------
5387  * Copyright (c) Microsoft Corporation. All rights reserved.
5388  * Licensed under the MIT License. See License.txt in the project root for license information.
5389  * ------------------------------------------------------------------------------------------ */
5390 Object.defineProperty(exports, "__esModule", ({ value: true }));
5391 const messages_1 = __webpack_require__(26);
5392 /**
5393  * The `workspace/workspaceFolders` is sent from the server to the client to fetch the open workspace folders.
5394  */
5395 var WorkspaceFoldersRequest;
5396 (function (WorkspaceFoldersRequest) {
5397     WorkspaceFoldersRequest.type = new messages_1.ProtocolRequestType0('workspace/workspaceFolders');
5398 })(WorkspaceFoldersRequest = exports.WorkspaceFoldersRequest || (exports.WorkspaceFoldersRequest = {}));
5399 /**
5400  * The `workspace/didChangeWorkspaceFolders` notification is sent from the client to the server when the workspace
5401  * folder configuration changes.
5402  */
5403 var DidChangeWorkspaceFoldersNotification;
5404 (function (DidChangeWorkspaceFoldersNotification) {
5405     DidChangeWorkspaceFoldersNotification.type = new messages_1.ProtocolNotificationType('workspace/didChangeWorkspaceFolders');
5406 })(DidChangeWorkspaceFoldersNotification = exports.DidChangeWorkspaceFoldersNotification || (exports.DidChangeWorkspaceFoldersNotification = {}));
5407 //# sourceMappingURL=protocol.workspaceFolders.js.map
5408
5409 /***/ }),
5410 /* 32 */
5411 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5412
5413
5414 /* --------------------------------------------------------------------------------------------
5415  * Copyright (c) Microsoft Corporation. All rights reserved.
5416  * Licensed under the MIT License. See License.txt in the project root for license information.
5417  * ------------------------------------------------------------------------------------------ */
5418 Object.defineProperty(exports, "__esModule", ({ value: true }));
5419 const messages_1 = __webpack_require__(26);
5420 /**
5421  * The 'workspace/configuration' request is sent from the server to the client to fetch a certain
5422  * configuration setting.
5423  *
5424  * This pull model replaces the old push model were the client signaled configuration change via an
5425  * event. If the server still needs to react to configuration changes (since the server caches the
5426  * result of `workspace/configuration` requests) the server should register for an empty configuration
5427  * change event and empty the cache if such an event is received.
5428  */
5429 var ConfigurationRequest;
5430 (function (ConfigurationRequest) {
5431     ConfigurationRequest.type = new messages_1.ProtocolRequestType('workspace/configuration');
5432 })(ConfigurationRequest = exports.ConfigurationRequest || (exports.ConfigurationRequest = {}));
5433 //# sourceMappingURL=protocol.configuration.js.map
5434
5435 /***/ }),
5436 /* 33 */
5437 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5438
5439
5440 /* --------------------------------------------------------------------------------------------
5441  * Copyright (c) Microsoft Corporation. All rights reserved.
5442  * Licensed under the MIT License. See License.txt in the project root for license information.
5443  * ------------------------------------------------------------------------------------------ */
5444 Object.defineProperty(exports, "__esModule", ({ value: true }));
5445 const vscode_jsonrpc_1 = __webpack_require__(6);
5446 const messages_1 = __webpack_require__(26);
5447 /**
5448  * A request to list all color symbols found in a given text document. The request's
5449  * parameter is of type [DocumentColorParams](#DocumentColorParams) the
5450  * response is of type [ColorInformation[]](#ColorInformation) or a Thenable
5451  * that resolves to such.
5452  */
5453 var DocumentColorRequest;
5454 (function (DocumentColorRequest) {
5455     DocumentColorRequest.method = 'textDocument/documentColor';
5456     DocumentColorRequest.type = new messages_1.ProtocolRequestType(DocumentColorRequest.method);
5457     /** @deprecated Use DocumentColorRequest.type */
5458     DocumentColorRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5459 })(DocumentColorRequest = exports.DocumentColorRequest || (exports.DocumentColorRequest = {}));
5460 /**
5461  * A request to list all presentation for a color. The request's
5462  * parameter is of type [ColorPresentationParams](#ColorPresentationParams) the
5463  * response is of type [ColorInformation[]](#ColorInformation) or a Thenable
5464  * that resolves to such.
5465  */
5466 var ColorPresentationRequest;
5467 (function (ColorPresentationRequest) {
5468     ColorPresentationRequest.type = new messages_1.ProtocolRequestType('textDocument/colorPresentation');
5469 })(ColorPresentationRequest = exports.ColorPresentationRequest || (exports.ColorPresentationRequest = {}));
5470 //# sourceMappingURL=protocol.colorProvider.js.map
5471
5472 /***/ }),
5473 /* 34 */
5474 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5475
5476
5477 /*---------------------------------------------------------------------------------------------
5478  *  Copyright (c) Microsoft Corporation. All rights reserved.
5479  *  Licensed under the MIT License. See License.txt in the project root for license information.
5480  *--------------------------------------------------------------------------------------------*/
5481 Object.defineProperty(exports, "__esModule", ({ value: true }));
5482 const vscode_jsonrpc_1 = __webpack_require__(6);
5483 const messages_1 = __webpack_require__(26);
5484 /**
5485  * Enum of known range kinds
5486  */
5487 var FoldingRangeKind;
5488 (function (FoldingRangeKind) {
5489     /**
5490      * Folding range for a comment
5491      */
5492     FoldingRangeKind["Comment"] = "comment";
5493     /**
5494      * Folding range for a imports or includes
5495      */
5496     FoldingRangeKind["Imports"] = "imports";
5497     /**
5498      * Folding range for a region (e.g. `#region`)
5499      */
5500     FoldingRangeKind["Region"] = "region";
5501 })(FoldingRangeKind = exports.FoldingRangeKind || (exports.FoldingRangeKind = {}));
5502 /**
5503  * A request to provide folding ranges in a document. The request's
5504  * parameter is of type [FoldingRangeParams](#FoldingRangeParams), the
5505  * response is of type [FoldingRangeList](#FoldingRangeList) or a Thenable
5506  * that resolves to such.
5507  */
5508 var FoldingRangeRequest;
5509 (function (FoldingRangeRequest) {
5510     FoldingRangeRequest.method = 'textDocument/foldingRange';
5511     FoldingRangeRequest.type = new messages_1.ProtocolRequestType(FoldingRangeRequest.method);
5512     /** @deprecated Use FoldingRangeRequest.type */
5513     FoldingRangeRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5514 })(FoldingRangeRequest = exports.FoldingRangeRequest || (exports.FoldingRangeRequest = {}));
5515 //# sourceMappingURL=protocol.foldingRange.js.map
5516
5517 /***/ }),
5518 /* 35 */
5519 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5520
5521
5522 /* --------------------------------------------------------------------------------------------
5523  * Copyright (c) Microsoft Corporation. All rights reserved.
5524  * Licensed under the MIT License. See License.txt in the project root for license information.
5525  * ------------------------------------------------------------------------------------------ */
5526 Object.defineProperty(exports, "__esModule", ({ value: true }));
5527 const vscode_jsonrpc_1 = __webpack_require__(6);
5528 const messages_1 = __webpack_require__(26);
5529 // @ts-ignore: to avoid inlining LocatioLink as dynamic import
5530 let __noDynamicImport;
5531 /**
5532  * A request to resolve the type definition locations of a symbol at a given text
5533  * document position. The request's parameter is of type [TextDocumentPositioParams]
5534  * (#TextDocumentPositionParams) the response is of type [Declaration](#Declaration)
5535  * or a typed array of [DeclarationLink](#DeclarationLink) or a Thenable that resolves
5536  * to such.
5537  */
5538 var DeclarationRequest;
5539 (function (DeclarationRequest) {
5540     DeclarationRequest.method = 'textDocument/declaration';
5541     DeclarationRequest.type = new messages_1.ProtocolRequestType(DeclarationRequest.method);
5542     /** @deprecated Use DeclarationRequest.type */
5543     DeclarationRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5544 })(DeclarationRequest = exports.DeclarationRequest || (exports.DeclarationRequest = {}));
5545 //# sourceMappingURL=protocol.declaration.js.map
5546
5547 /***/ }),
5548 /* 36 */
5549 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5550
5551
5552 /*---------------------------------------------------------------------------------------------
5553  *  Copyright (c) Microsoft Corporation. All rights reserved.
5554  *  Licensed under the MIT License. See License.txt in the project root for license information.
5555  *--------------------------------------------------------------------------------------------*/
5556 Object.defineProperty(exports, "__esModule", ({ value: true }));
5557 const vscode_jsonrpc_1 = __webpack_require__(6);
5558 const messages_1 = __webpack_require__(26);
5559 /**
5560  * A request to provide selection ranges in a document. The request's
5561  * parameter is of type [SelectionRangeParams](#SelectionRangeParams), the
5562  * response is of type [SelectionRange[]](#SelectionRange[]) or a Thenable
5563  * that resolves to such.
5564  */
5565 var SelectionRangeRequest;
5566 (function (SelectionRangeRequest) {
5567     SelectionRangeRequest.method = 'textDocument/selectionRange';
5568     SelectionRangeRequest.type = new messages_1.ProtocolRequestType(SelectionRangeRequest.method);
5569     /** @deprecated  Use SelectionRangeRequest.type */
5570     SelectionRangeRequest.resultType = new vscode_jsonrpc_1.ProgressType();
5571 })(SelectionRangeRequest = exports.SelectionRangeRequest || (exports.SelectionRangeRequest = {}));
5572 //# sourceMappingURL=protocol.selectionRange.js.map
5573
5574 /***/ }),
5575 /* 37 */
5576 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5577
5578
5579 /* --------------------------------------------------------------------------------------------
5580  * Copyright (c) Microsoft Corporation. All rights reserved.
5581  * Licensed under the MIT License. See License.txt in the project root for license information.
5582  * ------------------------------------------------------------------------------------------ */
5583 Object.defineProperty(exports, "__esModule", ({ value: true }));
5584 const vscode_jsonrpc_1 = __webpack_require__(6);
5585 const messages_1 = __webpack_require__(26);
5586 var WorkDoneProgress;
5587 (function (WorkDoneProgress) {
5588     WorkDoneProgress.type = new vscode_jsonrpc_1.ProgressType();
5589 })(WorkDoneProgress = exports.WorkDoneProgress || (exports.WorkDoneProgress = {}));
5590 /**
5591  * The `window/workDoneProgress/create` request is sent from the server to the client to initiate progress
5592  * reporting from the server.
5593  */
5594 var WorkDoneProgressCreateRequest;
5595 (function (WorkDoneProgressCreateRequest) {
5596     WorkDoneProgressCreateRequest.type = new messages_1.ProtocolRequestType('window/workDoneProgress/create');
5597 })(WorkDoneProgressCreateRequest = exports.WorkDoneProgressCreateRequest || (exports.WorkDoneProgressCreateRequest = {}));
5598 /**
5599  * The `window/workDoneProgress/cancel` notification is sent from  the client to the server to cancel a progress
5600  * initiated on the server side.
5601  */
5602 var WorkDoneProgressCancelNotification;
5603 (function (WorkDoneProgressCancelNotification) {
5604     WorkDoneProgressCancelNotification.type = new messages_1.ProtocolNotificationType('window/workDoneProgress/cancel');
5605 })(WorkDoneProgressCancelNotification = exports.WorkDoneProgressCancelNotification || (exports.WorkDoneProgressCancelNotification = {}));
5606 //# sourceMappingURL=protocol.progress.js.map
5607
5608 /***/ }),
5609 /* 38 */
5610 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5611
5612
5613 /* --------------------------------------------------------------------------------------------
5614  * Copyright (c) TypeFox and others. All rights reserved.
5615  * Licensed under the MIT License. See License.txt in the project root for license information.
5616  * ------------------------------------------------------------------------------------------ */
5617 Object.defineProperty(exports, "__esModule", ({ value: true }));
5618 const messages_1 = __webpack_require__(26);
5619 /**
5620  * A request to result a `CallHierarchyItem` in a document at a given position.
5621  * Can be used as an input to a incoming or outgoing call hierarchy.
5622  *
5623  * @since 3.16.0
5624  */
5625 var CallHierarchyPrepareRequest;
5626 (function (CallHierarchyPrepareRequest) {
5627     CallHierarchyPrepareRequest.method = 'textDocument/prepareCallHierarchy';
5628     CallHierarchyPrepareRequest.type = new messages_1.ProtocolRequestType(CallHierarchyPrepareRequest.method);
5629 })(CallHierarchyPrepareRequest = exports.CallHierarchyPrepareRequest || (exports.CallHierarchyPrepareRequest = {}));
5630 /**
5631  * A request to resolve the incoming calls for a given `CallHierarchyItem`.
5632  *
5633  * @since 3.16.0
5634  */
5635 var CallHierarchyIncomingCallsRequest;
5636 (function (CallHierarchyIncomingCallsRequest) {
5637     CallHierarchyIncomingCallsRequest.method = 'callHierarchy/incomingCalls';
5638     CallHierarchyIncomingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyIncomingCallsRequest.method);
5639 })(CallHierarchyIncomingCallsRequest = exports.CallHierarchyIncomingCallsRequest || (exports.CallHierarchyIncomingCallsRequest = {}));
5640 /**
5641  * A request to resolve the outgoing calls for a given `CallHierarchyItem`.
5642  *
5643  * @since 3.16.0
5644  */
5645 var CallHierarchyOutgoingCallsRequest;
5646 (function (CallHierarchyOutgoingCallsRequest) {
5647     CallHierarchyOutgoingCallsRequest.method = 'callHierarchy/outgoingCalls';
5648     CallHierarchyOutgoingCallsRequest.type = new messages_1.ProtocolRequestType(CallHierarchyOutgoingCallsRequest.method);
5649 })(CallHierarchyOutgoingCallsRequest = exports.CallHierarchyOutgoingCallsRequest || (exports.CallHierarchyOutgoingCallsRequest = {}));
5650 //# sourceMappingURL=protocol.callHierarchy.js.map
5651
5652 /***/ }),
5653 /* 39 */
5654 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5655
5656
5657 /* --------------------------------------------------------------------------------------------
5658  * Copyright (c) Microsoft Corporation. All rights reserved.
5659  * Licensed under the MIT License. See License.txt in the project root for license information.
5660  * ------------------------------------------------------------------------------------------ */
5661 Object.defineProperty(exports, "__esModule", ({ value: true }));
5662 const vscode_jsonrpc_1 = __webpack_require__(6);
5663 function createProtocolConnection(input, output, logger, options) {
5664     if (vscode_jsonrpc_1.ConnectionStrategy.is(options)) {
5665         options = { connectionStrategy: options };
5666     }
5667     return vscode_jsonrpc_1.createMessageConnection(input, output, logger, options);
5668 }
5669 exports.createProtocolConnection = createProtocolConnection;
5670 //# sourceMappingURL=connection.js.map
5671
5672 /***/ }),
5673 /* 40 */
5674 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5675
5676
5677 /* --------------------------------------------------------------------------------------------
5678  * Copyright (c) Microsoft Corporation. All rights reserved.
5679  * Licensed under the MIT License. See License.txt in the project root for license information.
5680  * ------------------------------------------------------------------------------------------ */
5681 Object.defineProperty(exports, "__esModule", ({ value: true }));
5682 const messages_1 = __webpack_require__(26);
5683 /**
5684  * A set of predefined token types. This set is not fixed
5685  * an clients can specify additional token types via the
5686  * corresponding client capabilities.
5687  *
5688  * @since 3.16.0 - Proposed state
5689  */
5690 var SemanticTokenTypes;
5691 (function (SemanticTokenTypes) {
5692     SemanticTokenTypes["namespace"] = "namespace";
5693     SemanticTokenTypes["type"] = "type";
5694     SemanticTokenTypes["class"] = "class";
5695     SemanticTokenTypes["enum"] = "enum";
5696     SemanticTokenTypes["interface"] = "interface";
5697     SemanticTokenTypes["struct"] = "struct";
5698     SemanticTokenTypes["typeParameter"] = "typeParameter";
5699     SemanticTokenTypes["parameter"] = "parameter";
5700     SemanticTokenTypes["variable"] = "variable";
5701     SemanticTokenTypes["property"] = "property";
5702     SemanticTokenTypes["enumMember"] = "enumMember";
5703     SemanticTokenTypes["event"] = "event";
5704     SemanticTokenTypes["function"] = "function";
5705     SemanticTokenTypes["member"] = "member";
5706     SemanticTokenTypes["macro"] = "macro";
5707     SemanticTokenTypes["keyword"] = "keyword";
5708     SemanticTokenTypes["modifier"] = "modifier";
5709     SemanticTokenTypes["comment"] = "comment";
5710     SemanticTokenTypes["string"] = "string";
5711     SemanticTokenTypes["number"] = "number";
5712     SemanticTokenTypes["regexp"] = "regexp";
5713     SemanticTokenTypes["operator"] = "operator";
5714 })(SemanticTokenTypes = exports.SemanticTokenTypes || (exports.SemanticTokenTypes = {}));
5715 /**
5716  * A set of predefined token modifiers. This set is not fixed
5717  * an clients can specify additional token types via the
5718  * corresponding client capabilities.
5719  *
5720  * @since 3.16.0 - Proposed state
5721  */
5722 var SemanticTokenModifiers;
5723 (function (SemanticTokenModifiers) {
5724     SemanticTokenModifiers["declaration"] = "declaration";
5725     SemanticTokenModifiers["definition"] = "definition";
5726     SemanticTokenModifiers["readonly"] = "readonly";
5727     SemanticTokenModifiers["static"] = "static";
5728     SemanticTokenModifiers["deprecated"] = "deprecated";
5729     SemanticTokenModifiers["abstract"] = "abstract";
5730     SemanticTokenModifiers["async"] = "async";
5731     SemanticTokenModifiers["modification"] = "modification";
5732     SemanticTokenModifiers["documentation"] = "documentation";
5733     SemanticTokenModifiers["defaultLibrary"] = "defaultLibrary";
5734 })(SemanticTokenModifiers = exports.SemanticTokenModifiers || (exports.SemanticTokenModifiers = {}));
5735 /**
5736  * @since 3.16.0 - Proposed state
5737  */
5738 var SemanticTokens;
5739 (function (SemanticTokens) {
5740     function is(value) {
5741         const candidate = value;
5742         return candidate !== undefined && (candidate.resultId === undefined || typeof candidate.resultId === 'string') &&
5743             Array.isArray(candidate.data) && (candidate.data.length === 0 || typeof candidate.data[0] === 'number');
5744     }
5745     SemanticTokens.is = is;
5746 })(SemanticTokens = exports.SemanticTokens || (exports.SemanticTokens = {}));
5747 /**
5748  * @since 3.16.0 - Proposed state
5749  */
5750 var SemanticTokensRequest;
5751 (function (SemanticTokensRequest) {
5752     SemanticTokensRequest.method = 'textDocument/semanticTokens';
5753     SemanticTokensRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRequest.method);
5754 })(SemanticTokensRequest = exports.SemanticTokensRequest || (exports.SemanticTokensRequest = {}));
5755 /**
5756  * @since 3.16.0 - Proposed state
5757  */
5758 var SemanticTokensEditsRequest;
5759 (function (SemanticTokensEditsRequest) {
5760     SemanticTokensEditsRequest.method = 'textDocument/semanticTokens/edits';
5761     SemanticTokensEditsRequest.type = new messages_1.ProtocolRequestType(SemanticTokensEditsRequest.method);
5762 })(SemanticTokensEditsRequest = exports.SemanticTokensEditsRequest || (exports.SemanticTokensEditsRequest = {}));
5763 /**
5764  * @since 3.16.0 - Proposed state
5765  */
5766 var SemanticTokensRangeRequest;
5767 (function (SemanticTokensRangeRequest) {
5768     SemanticTokensRangeRequest.method = 'textDocument/semanticTokens/range';
5769     SemanticTokensRangeRequest.type = new messages_1.ProtocolRequestType(SemanticTokensRangeRequest.method);
5770 })(SemanticTokensRangeRequest = exports.SemanticTokensRangeRequest || (exports.SemanticTokensRangeRequest = {}));
5771 //# sourceMappingURL=protocol.semanticTokens.proposed.js.map
5772
5773 /***/ }),
5774 /* 41 */,
5775 /* 42 */
5776 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5777
5778
5779 /*---------------------------------------------------------------------------------------------
5780  *  Copyright (c) Microsoft Corporation. All rights reserved.
5781  *  Licensed under the MIT License. See License.txt in the project root for license information.
5782  *--------------------------------------------------------------------------------------------*/
5783 Object.defineProperty(exports, "__esModule", ({ value: true }));
5784 const node_1 = __webpack_require__(43);
5785 const runner_1 = __webpack_require__(59);
5786 const htmlServer_1 = __webpack_require__(60);
5787 const nodeFs_1 = __webpack_require__(153);
5788 // Create a connection for the server.
5789 const connection = node_1.createConnection();
5790 console.log = connection.console.log.bind(connection.console);
5791 console.error = connection.console.error.bind(connection.console);
5792 process.on('unhandledRejection', (e) => {
5793     connection.console.error(runner_1.formatError(`Unhandled exception`, e));
5794 });
5795 htmlServer_1.startServer(connection, { file: nodeFs_1.getNodeFSRequestService() });
5796
5797
5798 /***/ }),
5799 /* 43 */
5800 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
5801
5802 /* --------------------------------------------------------------------------------------------
5803  * Copyright (c) Microsoft Corporation. All rights reserved.
5804  * Licensed under the MIT License. See License.txt in the project root for license information.
5805  * ----------------------------------------------------------------------------------------- */
5806
5807
5808 module.exports = __webpack_require__(44);
5809
5810 /***/ }),
5811 /* 44 */
5812 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
5813
5814
5815 /* --------------------------------------------------------------------------------------------
5816  * Copyright (c) Microsoft Corporation. All rights reserved.
5817  * Licensed under the MIT License. See License.txt in the project root for license information.
5818  * ------------------------------------------------------------------------------------------ */
5819 /// <reference path="../../typings/thenable.d.ts" />
5820 function __export(m) {
5821     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
5822 }
5823 Object.defineProperty(exports, "__esModule", ({ value: true }));
5824 const Is = __webpack_require__(45);
5825 const server_1 = __webpack_require__(46);
5826 const fm = __webpack_require__(52);
5827 const node_1 = __webpack_require__(56);
5828 __export(__webpack_require__(57));
5829 var Files;
5830 (function (Files) {
5831     Files.uriToFilePath = fm.uriToFilePath;
5832     Files.resolveGlobalNodePath = fm.resolveGlobalNodePath;
5833     Files.resolveGlobalYarnPath = fm.resolveGlobalYarnPath;
5834     Files.resolve = fm.resolve;
5835     Files.resolveModulePath = fm.resolveModulePath;
5836 })(Files = exports.Files || (exports.Files = {}));
5837 let _shutdownReceived = false;
5838 let exitTimer = undefined;
5839 function setupExitTimer() {
5840     const argName = '--clientProcessId';
5841     function runTimer(value) {
5842         try {
5843             let processId = parseInt(value);
5844             if (!isNaN(processId)) {
5845                 exitTimer = setInterval(() => {
5846                     try {
5847                         process.kill(processId, 0);
5848                     }
5849                     catch (ex) {
5850                         // Parent process doesn't exist anymore. Exit the server.
5851                         process.exit(_shutdownReceived ? 0 : 1);
5852                     }
5853                 }, 3000);
5854             }
5855         }
5856         catch (e) {
5857             // Ignore errors;
5858         }
5859     }
5860     for (let i = 2; i < process.argv.length; i++) {
5861         let arg = process.argv[i];
5862         if (arg === argName && i + 1 < process.argv.length) {
5863             runTimer(process.argv[i + 1]);
5864             return;
5865         }
5866         else {
5867             let args = arg.split('=');
5868             if (args[0] === argName) {
5869                 runTimer(args[1]);
5870             }
5871         }
5872     }
5873 }
5874 setupExitTimer();
5875 const watchDog = {
5876     initialize: (params) => {
5877         const processId = params.processId;
5878         if (Is.number(processId) && exitTimer === undefined) {
5879             // We received a parent process id. Set up a timer to periodically check
5880             // if the parent is still alive.
5881             setInterval(() => {
5882                 try {
5883                     process.kill(processId, 0);
5884                 }
5885                 catch (ex) {
5886                     // Parent process doesn't exist anymore. Exit the server.
5887                     process.exit(_shutdownReceived ? 0 : 1);
5888                 }
5889             }, 3000);
5890         }
5891     },
5892     get shutdownReceived() {
5893         return _shutdownReceived;
5894     },
5895     set shutdownReceived(value) {
5896         _shutdownReceived = value;
5897     },
5898     exit: (code) => {
5899         process.exit(code);
5900     }
5901 };
5902 function createConnection(arg1, arg2, arg3, arg4) {
5903     let factories;
5904     let input;
5905     let output;
5906     let options;
5907     if (arg1 !== void 0 && arg1.__brand === 'features') {
5908         factories = arg1;
5909         arg1 = arg2;
5910         arg2 = arg3;
5911         arg3 = arg4;
5912     }
5913     if (node_1.ConnectionStrategy.is(arg1) || node_1.ConnectionOptions.is(arg1)) {
5914         options = arg1;
5915     }
5916     else {
5917         input = arg1;
5918         output = arg2;
5919         options = arg3;
5920     }
5921     return _createConnection(input, output, options, factories);
5922 }
5923 exports.createConnection = createConnection;
5924 function _createConnection(input, output, options, factories) {
5925     if (!input && !output && process.argv.length > 2) {
5926         let port = void 0;
5927         let pipeName = void 0;
5928         let argv = process.argv.slice(2);
5929         for (let i = 0; i < argv.length; i++) {
5930             let arg = argv[i];
5931             if (arg === '--node-ipc') {
5932                 input = new node_1.IPCMessageReader(process);
5933                 output = new node_1.IPCMessageWriter(process);
5934                 break;
5935             }
5936             else if (arg === '--stdio') {
5937                 input = process.stdin;
5938                 output = process.stdout;
5939                 break;
5940             }
5941             else if (arg === '--socket') {
5942                 port = parseInt(argv[i + 1]);
5943                 break;
5944             }
5945             else if (arg === '--pipe') {
5946                 pipeName = argv[i + 1];
5947                 break;
5948             }
5949             else {
5950                 var args = arg.split('=');
5951                 if (args[0] === '--socket') {
5952                     port = parseInt(args[1]);
5953                     break;
5954                 }
5955                 else if (args[0] === '--pipe') {
5956                     pipeName = args[1];
5957                     break;
5958                 }
5959             }
5960         }
5961         if (port) {
5962             let transport = node_1.createServerSocketTransport(port);
5963             input = transport[0];
5964             output = transport[1];
5965         }
5966         else if (pipeName) {
5967             let transport = node_1.createServerPipeTransport(pipeName);
5968             input = transport[0];
5969             output = transport[1];
5970         }
5971     }
5972     var commandLineMessage = 'Use arguments of createConnection or set command line parameters: \'--node-ipc\', \'--stdio\' or \'--socket={number}\'';
5973     if (!input) {
5974         throw new Error('Connection input stream is not set. ' + commandLineMessage);
5975     }
5976     if (!output) {
5977         throw new Error('Connection output stream is not set. ' + commandLineMessage);
5978     }
5979     // Backwards compatibility
5980     if (Is.func(input.read) && Is.func(input.on)) {
5981         let inputStream = input;
5982         inputStream.on('end', () => {
5983             process.exit(_shutdownReceived ? 0 : 1);
5984         });
5985         inputStream.on('close', () => {
5986             process.exit(_shutdownReceived ? 0 : 1);
5987         });
5988     }
5989     const connectionFactory = (logger) => {
5990         return node_1.createProtocolConnection(input, output, logger, options);
5991     };
5992     return server_1.createConnection(connectionFactory, watchDog, factories);
5993 }
5994 //# sourceMappingURL=main.js.map
5995
5996 /***/ }),
5997 /* 45 */
5998 /***/ ((__unused_webpack_module, exports) => {
5999
6000
6001 /* --------------------------------------------------------------------------------------------
6002  * Copyright (c) Microsoft Corporation. All rights reserved.
6003  * Licensed under the MIT License. See License.txt in the project root for license information.
6004  * ------------------------------------------------------------------------------------------ */
6005 Object.defineProperty(exports, "__esModule", ({ value: true }));
6006 function boolean(value) {
6007     return value === true || value === false;
6008 }
6009 exports.boolean = boolean;
6010 function string(value) {
6011     return typeof value === 'string' || value instanceof String;
6012 }
6013 exports.string = string;
6014 function number(value) {
6015     return typeof value === 'number' || value instanceof Number;
6016 }
6017 exports.number = number;
6018 function error(value) {
6019     return value instanceof Error;
6020 }
6021 exports.error = error;
6022 function func(value) {
6023     return typeof value === 'function';
6024 }
6025 exports.func = func;
6026 function array(value) {
6027     return Array.isArray(value);
6028 }
6029 exports.array = array;
6030 function stringArray(value) {
6031     return array(value) && value.every(elem => string(elem));
6032 }
6033 exports.stringArray = stringArray;
6034 function typedArray(value, check) {
6035     return Array.isArray(value) && value.every(check);
6036 }
6037 exports.typedArray = typedArray;
6038 function thenable(value) {
6039     return value && func(value.then);
6040 }
6041 exports.thenable = thenable;
6042 //# sourceMappingURL=is.js.map
6043
6044 /***/ }),
6045 /* 46 */
6046 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6047
6048
6049 /* --------------------------------------------------------------------------------------------
6050  * Copyright (c) Microsoft Corporation. All rights reserved.
6051  * Licensed under the MIT License. See License.txt in the project root for license information.
6052  * ------------------------------------------------------------------------------------------ */
6053 Object.defineProperty(exports, "__esModule", ({ value: true }));
6054 const vscode_languageserver_protocol_1 = __webpack_require__(4);
6055 const Is = __webpack_require__(45);
6056 const UUID = __webpack_require__(47);
6057 const progress_1 = __webpack_require__(48);
6058 const configuration_1 = __webpack_require__(49);
6059 const workspaceFolders_1 = __webpack_require__(50);
6060 const callHierarchy_1 = __webpack_require__(51);
6061 function null2Undefined(value) {
6062     if (value === null) {
6063         return undefined;
6064     }
6065     return value;
6066 }
6067 /**
6068  * A manager for simple text documents
6069  */
6070 class TextDocuments {
6071     /**
6072      * Create a new text document manager.
6073      */
6074     constructor(configuration) {
6075         this._documents = Object.create(null);
6076         this._configuration = configuration;
6077         this._onDidChangeContent = new vscode_languageserver_protocol_1.Emitter();
6078         this._onDidOpen = new vscode_languageserver_protocol_1.Emitter();
6079         this._onDidClose = new vscode_languageserver_protocol_1.Emitter();
6080         this._onDidSave = new vscode_languageserver_protocol_1.Emitter();
6081         this._onWillSave = new vscode_languageserver_protocol_1.Emitter();
6082     }
6083     /**
6084      * An event that fires when a text document managed by this manager
6085      * has been opened or the content changes.
6086      */
6087     get onDidChangeContent() {
6088         return this._onDidChangeContent.event;
6089     }
6090     /**
6091      * An event that fires when a text document managed by this manager
6092      * has been opened.
6093      */
6094     get onDidOpen() {
6095         return this._onDidOpen.event;
6096     }
6097     /**
6098      * An event that fires when a text document managed by this manager
6099      * will be saved.
6100      */
6101     get onWillSave() {
6102         return this._onWillSave.event;
6103     }
6104     /**
6105      * Sets a handler that will be called if a participant wants to provide
6106      * edits during a text document save.
6107      */
6108     onWillSaveWaitUntil(handler) {
6109         this._willSaveWaitUntil = handler;
6110     }
6111     /**
6112      * An event that fires when a text document managed by this manager
6113      * has been saved.
6114      */
6115     get onDidSave() {
6116         return this._onDidSave.event;
6117     }
6118     /**
6119      * An event that fires when a text document managed by this manager
6120      * has been closed.
6121      */
6122     get onDidClose() {
6123         return this._onDidClose.event;
6124     }
6125     /**
6126      * Returns the document for the given URI. Returns undefined if
6127      * the document is not mananged by this instance.
6128      *
6129      * @param uri The text document's URI to retrieve.
6130      * @return the text document or `undefined`.
6131      */
6132     get(uri) {
6133         return this._documents[uri];
6134     }
6135     /**
6136      * Returns all text documents managed by this instance.
6137      *
6138      * @return all text documents.
6139      */
6140     all() {
6141         return Object.keys(this._documents).map(key => this._documents[key]);
6142     }
6143     /**
6144      * Returns the URIs of all text documents managed by this instance.
6145      *
6146      * @return the URI's of all text documents.
6147      */
6148     keys() {
6149         return Object.keys(this._documents);
6150     }
6151     /**
6152      * Listens for `low level` notification on the given connection to
6153      * update the text documents managed by this instance.
6154      *
6155      * Please note that the connection only provides handlers not an event model. Therefore
6156      * listening on a connection will overwrite the following handlers on a connection:
6157      * `onDidOpenTextDocument`, `onDidChangeTextDocument`, `onDidCloseTextDocument`,
6158      * `onWillSaveTextDocument`, `onWillSaveTextDocumentWaitUntil` and `onDidSaveTextDocument`.
6159      *
6160      * Use the correspnding events on the TextDocuments instance instead.
6161      *
6162      * @param connection The connection to listen on.
6163      */
6164     listen(connection) {
6165         connection.__textDocumentSync = vscode_languageserver_protocol_1.TextDocumentSyncKind.Full;
6166         connection.onDidOpenTextDocument((event) => {
6167             let td = event.textDocument;
6168             let document = this._configuration.create(td.uri, td.languageId, td.version, td.text);
6169             this._documents[td.uri] = document;
6170             let toFire = Object.freeze({ document });
6171             this._onDidOpen.fire(toFire);
6172             this._onDidChangeContent.fire(toFire);
6173         });
6174         connection.onDidChangeTextDocument((event) => {
6175             let td = event.textDocument;
6176             let changes = event.contentChanges;
6177             if (changes.length === 0) {
6178                 return;
6179             }
6180             let document = this._documents[td.uri];
6181             const { version } = td;
6182             if (version === null || version === undefined) {
6183                 throw new Error(`Received document change event for ${td.uri} without valid version identifier`);
6184             }
6185             document = this._configuration.update(document, changes, version);
6186             this._documents[td.uri] = document;
6187             this._onDidChangeContent.fire(Object.freeze({ document }));
6188         });
6189         connection.onDidCloseTextDocument((event) => {
6190             let document = this._documents[event.textDocument.uri];
6191             if (document) {
6192                 delete this._documents[event.textDocument.uri];
6193                 this._onDidClose.fire(Object.freeze({ document }));
6194             }
6195         });
6196         connection.onWillSaveTextDocument((event) => {
6197             let document = this._documents[event.textDocument.uri];
6198             if (document) {
6199                 this._onWillSave.fire(Object.freeze({ document, reason: event.reason }));
6200             }
6201         });
6202         connection.onWillSaveTextDocumentWaitUntil((event, token) => {
6203             let document = this._documents[event.textDocument.uri];
6204             if (document && this._willSaveWaitUntil) {
6205                 return this._willSaveWaitUntil(Object.freeze({ document, reason: event.reason }), token);
6206             }
6207             else {
6208                 return [];
6209             }
6210         });
6211         connection.onDidSaveTextDocument((event) => {
6212             let document = this._documents[event.textDocument.uri];
6213             if (document) {
6214                 this._onDidSave.fire(Object.freeze({ document }));
6215             }
6216         });
6217     }
6218 }
6219 exports.TextDocuments = TextDocuments;
6220 /**
6221  * Helps tracking error message. Equal occurences of the same
6222  * message are only stored once. This class is for example
6223  * useful if text documents are validated in a loop and equal
6224  * error message should be folded into one.
6225  */
6226 class ErrorMessageTracker {
6227     constructor() {
6228         this._messages = Object.create(null);
6229     }
6230     /**
6231      * Add a message to the tracker.
6232      *
6233      * @param message The message to add.
6234      */
6235     add(message) {
6236         let count = this._messages[message];
6237         if (!count) {
6238             count = 0;
6239         }
6240         count++;
6241         this._messages[message] = count;
6242     }
6243     /**
6244      * Send all tracked messages to the connection's window.
6245      *
6246      * @param connection The connection established between client and server.
6247      */
6248     sendErrors(connection) {
6249         Object.keys(this._messages).forEach(message => {
6250             connection.window.showErrorMessage(message);
6251         });
6252     }
6253 }
6254 exports.ErrorMessageTracker = ErrorMessageTracker;
6255 class RemoteConsoleImpl {
6256     constructor() {
6257     }
6258     rawAttach(connection) {
6259         this._rawConnection = connection;
6260     }
6261     attach(connection) {
6262         this._connection = connection;
6263     }
6264     get connection() {
6265         if (!this._connection) {
6266             throw new Error('Remote is not attached to a connection yet.');
6267         }
6268         return this._connection;
6269     }
6270     fillServerCapabilities(_capabilities) {
6271     }
6272     initialize(_capabilities) {
6273     }
6274     error(message) {
6275         this.send(vscode_languageserver_protocol_1.MessageType.Error, message);
6276     }
6277     warn(message) {
6278         this.send(vscode_languageserver_protocol_1.MessageType.Warning, message);
6279     }
6280     info(message) {
6281         this.send(vscode_languageserver_protocol_1.MessageType.Info, message);
6282     }
6283     log(message) {
6284         this.send(vscode_languageserver_protocol_1.MessageType.Log, message);
6285     }
6286     send(type, message) {
6287         if (this._rawConnection) {
6288             this._rawConnection.sendNotification(vscode_languageserver_protocol_1.LogMessageNotification.type, { type, message });
6289         }
6290     }
6291 }
6292 class _RemoteWindowImpl {
6293     constructor() {
6294     }
6295     attach(connection) {
6296         this._connection = connection;
6297     }
6298     get connection() {
6299         if (!this._connection) {
6300             throw new Error('Remote is not attached to a connection yet.');
6301         }
6302         return this._connection;
6303     }
6304     initialize(_capabilities) {
6305     }
6306     fillServerCapabilities(_capabilities) {
6307     }
6308     showErrorMessage(message, ...actions) {
6309         let params = { type: vscode_languageserver_protocol_1.MessageType.Error, message, actions };
6310         return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);
6311     }
6312     showWarningMessage(message, ...actions) {
6313         let params = { type: vscode_languageserver_protocol_1.MessageType.Warning, message, actions };
6314         return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);
6315     }
6316     showInformationMessage(message, ...actions) {
6317         let params = { type: vscode_languageserver_protocol_1.MessageType.Info, message, actions };
6318         return this.connection.sendRequest(vscode_languageserver_protocol_1.ShowMessageRequest.type, params).then(null2Undefined);
6319     }
6320 }
6321 const RemoteWindowImpl = progress_1.ProgressFeature(_RemoteWindowImpl);
6322 var BulkRegistration;
6323 (function (BulkRegistration) {
6324     /**
6325      * Creates a new bulk registration.
6326      * @return an empty bulk registration.
6327      */
6328     function create() {
6329         return new BulkRegistrationImpl();
6330     }
6331     BulkRegistration.create = create;
6332 })(BulkRegistration = exports.BulkRegistration || (exports.BulkRegistration = {}));
6333 class BulkRegistrationImpl {
6334     constructor() {
6335         this._registrations = [];
6336         this._registered = new Set();
6337     }
6338     add(type, registerOptions) {
6339         const method = Is.string(type) ? type : type.method;
6340         if (this._registered.has(method)) {
6341             throw new Error(`${method} is already added to this registration`);
6342         }
6343         const id = UUID.generateUuid();
6344         this._registrations.push({
6345             id: id,
6346             method: method,
6347             registerOptions: registerOptions || {}
6348         });
6349         this._registered.add(method);
6350     }
6351     asRegistrationParams() {
6352         return {
6353             registrations: this._registrations
6354         };
6355     }
6356 }
6357 var BulkUnregistration;
6358 (function (BulkUnregistration) {
6359     function create() {
6360         return new BulkUnregistrationImpl(undefined, []);
6361     }
6362     BulkUnregistration.create = create;
6363 })(BulkUnregistration = exports.BulkUnregistration || (exports.BulkUnregistration = {}));
6364 class BulkUnregistrationImpl {
6365     constructor(_connection, unregistrations) {
6366         this._connection = _connection;
6367         this._unregistrations = new Map();
6368         unregistrations.forEach(unregistration => {
6369             this._unregistrations.set(unregistration.method, unregistration);
6370         });
6371     }
6372     get isAttached() {
6373         return !!this._connection;
6374     }
6375     attach(connection) {
6376         this._connection = connection;
6377     }
6378     add(unregistration) {
6379         this._unregistrations.set(unregistration.method, unregistration);
6380     }
6381     dispose() {
6382         let unregistrations = [];
6383         for (let unregistration of this._unregistrations.values()) {
6384             unregistrations.push(unregistration);
6385         }
6386         let params = {
6387             unregisterations: unregistrations
6388         };
6389         this._connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(undefined, (_error) => {
6390             this._connection.console.info(`Bulk unregistration failed.`);
6391         });
6392     }
6393     disposeSingle(arg) {
6394         const method = Is.string(arg) ? arg : arg.method;
6395         const unregistration = this._unregistrations.get(method);
6396         if (!unregistration) {
6397             return false;
6398         }
6399         let params = {
6400             unregisterations: [unregistration]
6401         };
6402         this._connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(() => {
6403             this._unregistrations.delete(method);
6404         }, (_error) => {
6405             this._connection.console.info(`Unregistering request handler for ${unregistration.id} failed.`);
6406         });
6407         return true;
6408     }
6409 }
6410 class RemoteClientImpl {
6411     attach(connection) {
6412         this._connection = connection;
6413     }
6414     get connection() {
6415         if (!this._connection) {
6416             throw new Error('Remote is not attached to a connection yet.');
6417         }
6418         return this._connection;
6419     }
6420     initialize(_capabilities) {
6421     }
6422     fillServerCapabilities(_capabilities) {
6423     }
6424     register(typeOrRegistrations, registerOptionsOrType, registerOptions) {
6425         if (typeOrRegistrations instanceof BulkRegistrationImpl) {
6426             return this.registerMany(typeOrRegistrations);
6427         }
6428         else if (typeOrRegistrations instanceof BulkUnregistrationImpl) {
6429             return this.registerSingle1(typeOrRegistrations, registerOptionsOrType, registerOptions);
6430         }
6431         else {
6432             return this.registerSingle2(typeOrRegistrations, registerOptionsOrType);
6433         }
6434     }
6435     registerSingle1(unregistration, type, registerOptions) {
6436         const method = Is.string(type) ? type : type.method;
6437         const id = UUID.generateUuid();
6438         let params = {
6439             registrations: [{ id, method, registerOptions: registerOptions || {} }]
6440         };
6441         if (!unregistration.isAttached) {
6442             unregistration.attach(this.connection);
6443         }
6444         return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then((_result) => {
6445             unregistration.add({ id: id, method: method });
6446             return unregistration;
6447         }, (_error) => {
6448             this.connection.console.info(`Registering request handler for ${method} failed.`);
6449             return Promise.reject(_error);
6450         });
6451     }
6452     registerSingle2(type, registerOptions) {
6453         const method = Is.string(type) ? type : type.method;
6454         const id = UUID.generateUuid();
6455         let params = {
6456             registrations: [{ id, method, registerOptions: registerOptions || {} }]
6457         };
6458         return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then((_result) => {
6459             return vscode_languageserver_protocol_1.Disposable.create(() => {
6460                 this.unregisterSingle(id, method);
6461             });
6462         }, (_error) => {
6463             this.connection.console.info(`Registering request handler for ${method} failed.`);
6464             return Promise.reject(_error);
6465         });
6466     }
6467     unregisterSingle(id, method) {
6468         let params = {
6469             unregisterations: [{ id, method }]
6470         };
6471         return this.connection.sendRequest(vscode_languageserver_protocol_1.UnregistrationRequest.type, params).then(undefined, (_error) => {
6472             this.connection.console.info(`Unregistering request handler for ${id} failed.`);
6473         });
6474     }
6475     registerMany(registrations) {
6476         let params = registrations.asRegistrationParams();
6477         return this.connection.sendRequest(vscode_languageserver_protocol_1.RegistrationRequest.type, params).then(() => {
6478             return new BulkUnregistrationImpl(this._connection, params.registrations.map(registration => { return { id: registration.id, method: registration.method }; }));
6479         }, (_error) => {
6480             this.connection.console.info(`Bulk registration failed.`);
6481             return Promise.reject(_error);
6482         });
6483     }
6484 }
6485 class _RemoteWorkspaceImpl {
6486     constructor() {
6487     }
6488     attach(connection) {
6489         this._connection = connection;
6490     }
6491     get connection() {
6492         if (!this._connection) {
6493             throw new Error('Remote is not attached to a connection yet.');
6494         }
6495         return this._connection;
6496     }
6497     initialize(_capabilities) {
6498     }
6499     fillServerCapabilities(_capabilities) {
6500     }
6501     applyEdit(paramOrEdit) {
6502         function isApplyWorkspaceEditParams(value) {
6503             return value && !!value.edit;
6504         }
6505         let params = isApplyWorkspaceEditParams(paramOrEdit) ? paramOrEdit : { edit: paramOrEdit };
6506         return this.connection.sendRequest(vscode_languageserver_protocol_1.ApplyWorkspaceEditRequest.type, params);
6507     }
6508 }
6509 const RemoteWorkspaceImpl = workspaceFolders_1.WorkspaceFoldersFeature(configuration_1.ConfigurationFeature(_RemoteWorkspaceImpl));
6510 class TracerImpl {
6511     constructor() {
6512         this._trace = vscode_languageserver_protocol_1.Trace.Off;
6513     }
6514     attach(connection) {
6515         this._connection = connection;
6516     }
6517     get connection() {
6518         if (!this._connection) {
6519             throw new Error('Remote is not attached to a connection yet.');
6520         }
6521         return this._connection;
6522     }
6523     initialize(_capabilities) {
6524     }
6525     fillServerCapabilities(_capabilities) {
6526     }
6527     set trace(value) {
6528         this._trace = value;
6529     }
6530     log(message, verbose) {
6531         if (this._trace === vscode_languageserver_protocol_1.Trace.Off) {
6532             return;
6533         }
6534         this.connection.sendNotification(vscode_languageserver_protocol_1.LogTraceNotification.type, {
6535             message: message,
6536             verbose: this._trace === vscode_languageserver_protocol_1.Trace.Verbose ? verbose : undefined
6537         });
6538     }
6539 }
6540 class TelemetryImpl {
6541     constructor() {
6542     }
6543     attach(connection) {
6544         this._connection = connection;
6545     }
6546     get connection() {
6547         if (!this._connection) {
6548             throw new Error('Remote is not attached to a connection yet.');
6549         }
6550         return this._connection;
6551     }
6552     initialize(_capabilities) {
6553     }
6554     fillServerCapabilities(_capabilities) {
6555     }
6556     logEvent(data) {
6557         this.connection.sendNotification(vscode_languageserver_protocol_1.TelemetryEventNotification.type, data);
6558     }
6559 }
6560 class _LanguagesImpl {
6561     constructor() {
6562     }
6563     attach(connection) {
6564         this._connection = connection;
6565     }
6566     get connection() {
6567         if (!this._connection) {
6568             throw new Error('Remote is not attached to a connection yet.');
6569         }
6570         return this._connection;
6571     }
6572     initialize(_capabilities) {
6573     }
6574     fillServerCapabilities(_capabilities) {
6575     }
6576     attachWorkDoneProgress(params) {
6577         return progress_1.attachWorkDone(this.connection, params);
6578     }
6579     attachPartialResultProgress(_type, params) {
6580         return progress_1.attachPartialResult(this.connection, params);
6581     }
6582 }
6583 exports._LanguagesImpl = _LanguagesImpl;
6584 const LanguagesImpl = callHierarchy_1.CallHierarchyFeature(_LanguagesImpl);
6585 function combineConsoleFeatures(one, two) {
6586     return function (Base) {
6587         return two(one(Base));
6588     };
6589 }
6590 exports.combineConsoleFeatures = combineConsoleFeatures;
6591 function combineTelemetryFeatures(one, two) {
6592     return function (Base) {
6593         return two(one(Base));
6594     };
6595 }
6596 exports.combineTelemetryFeatures = combineTelemetryFeatures;
6597 function combineTracerFeatures(one, two) {
6598     return function (Base) {
6599         return two(one(Base));
6600     };
6601 }
6602 exports.combineTracerFeatures = combineTracerFeatures;
6603 function combineClientFeatures(one, two) {
6604     return function (Base) {
6605         return two(one(Base));
6606     };
6607 }
6608 exports.combineClientFeatures = combineClientFeatures;
6609 function combineWindowFeatures(one, two) {
6610     return function (Base) {
6611         return two(one(Base));
6612     };
6613 }
6614 exports.combineWindowFeatures = combineWindowFeatures;
6615 function combineWorkspaceFeatures(one, two) {
6616     return function (Base) {
6617         return two(one(Base));
6618     };
6619 }
6620 exports.combineWorkspaceFeatures = combineWorkspaceFeatures;
6621 function combineLanguagesFeatures(one, two) {
6622     return function (Base) {
6623         return two(one(Base));
6624     };
6625 }
6626 exports.combineLanguagesFeatures = combineLanguagesFeatures;
6627 function combineFeatures(one, two) {
6628     function combine(one, two, func) {
6629         if (one && two) {
6630             return func(one, two);
6631         }
6632         else if (one) {
6633             return one;
6634         }
6635         else {
6636             return two;
6637         }
6638     }
6639     let result = {
6640         __brand: 'features',
6641         console: combine(one.console, two.console, combineConsoleFeatures),
6642         tracer: combine(one.tracer, two.tracer, combineTracerFeatures),
6643         telemetry: combine(one.telemetry, two.telemetry, combineTelemetryFeatures),
6644         client: combine(one.client, two.client, combineClientFeatures),
6645         window: combine(one.window, two.window, combineWindowFeatures),
6646         workspace: combine(one.workspace, two.workspace, combineWorkspaceFeatures)
6647     };
6648     return result;
6649 }
6650 exports.combineFeatures = combineFeatures;
6651 function createConnection(connectionFactory, watchDog, factories) {
6652     const logger = (factories && factories.console ? new (factories.console(RemoteConsoleImpl))() : new RemoteConsoleImpl());
6653     const connection = connectionFactory(logger);
6654     logger.rawAttach(connection);
6655     const tracer = (factories && factories.tracer ? new (factories.tracer(TracerImpl))() : new TracerImpl());
6656     const telemetry = (factories && factories.telemetry ? new (factories.telemetry(TelemetryImpl))() : new TelemetryImpl());
6657     const client = (factories && factories.client ? new (factories.client(RemoteClientImpl))() : new RemoteClientImpl());
6658     const remoteWindow = (factories && factories.window ? new (factories.window(RemoteWindowImpl))() : new RemoteWindowImpl());
6659     const workspace = (factories && factories.workspace ? new (factories.workspace(RemoteWorkspaceImpl))() : new RemoteWorkspaceImpl());
6660     const languages = (factories && factories.languages ? new (factories.languages(LanguagesImpl))() : new LanguagesImpl());
6661     const allRemotes = [logger, tracer, telemetry, client, remoteWindow, workspace, languages];
6662     function asPromise(value) {
6663         if (value instanceof Promise) {
6664             return value;
6665         }
6666         else if (Is.thenable(value)) {
6667             return new Promise((resolve, reject) => {
6668                 value.then((resolved) => resolve(resolved), (error) => reject(error));
6669             });
6670         }
6671         else {
6672             return Promise.resolve(value);
6673         }
6674     }
6675     let shutdownHandler = undefined;
6676     let initializeHandler = undefined;
6677     let exitHandler = undefined;
6678     let protocolConnection = {
6679         listen: () => connection.listen(),
6680         sendRequest: (type, ...params) => connection.sendRequest(Is.string(type) ? type : type.method, ...params),
6681         onRequest: (type, handler) => connection.onRequest(type, handler),
6682         sendNotification: (type, param) => {
6683             const method = Is.string(type) ? type : type.method;
6684             if (arguments.length === 1) {
6685                 connection.sendNotification(method);
6686             }
6687             else {
6688                 connection.sendNotification(method, param);
6689             }
6690         },
6691         onNotification: (type, handler) => connection.onNotification(type, handler),
6692         onProgress: connection.onProgress,
6693         sendProgress: connection.sendProgress,
6694         onInitialize: (handler) => initializeHandler = handler,
6695         onInitialized: (handler) => connection.onNotification(vscode_languageserver_protocol_1.InitializedNotification.type, handler),
6696         onShutdown: (handler) => shutdownHandler = handler,
6697         onExit: (handler) => exitHandler = handler,
6698         get console() { return logger; },
6699         get telemetry() { return telemetry; },
6700         get tracer() { return tracer; },
6701         get client() { return client; },
6702         get window() { return remoteWindow; },
6703         get workspace() { return workspace; },
6704         get languages() { return languages; },
6705         onDidChangeConfiguration: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeConfigurationNotification.type, handler),
6706         onDidChangeWatchedFiles: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeWatchedFilesNotification.type, handler),
6707         __textDocumentSync: undefined,
6708         onDidOpenTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidOpenTextDocumentNotification.type, handler),
6709         onDidChangeTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidChangeTextDocumentNotification.type, handler),
6710         onDidCloseTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidCloseTextDocumentNotification.type, handler),
6711         onWillSaveTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.WillSaveTextDocumentNotification.type, handler),
6712         onWillSaveTextDocumentWaitUntil: (handler) => connection.onRequest(vscode_languageserver_protocol_1.WillSaveTextDocumentWaitUntilRequest.type, handler),
6713         onDidSaveTextDocument: (handler) => connection.onNotification(vscode_languageserver_protocol_1.DidSaveTextDocumentNotification.type, handler),
6714         sendDiagnostics: (params) => connection.sendNotification(vscode_languageserver_protocol_1.PublishDiagnosticsNotification.type, params),
6715         onHover: (handler) => connection.onRequest(vscode_languageserver_protocol_1.HoverRequest.type, (params, cancel) => {
6716             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6717         }),
6718         onCompletion: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CompletionRequest.type, (params, cancel) => {
6719             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6720         }),
6721         onCompletionResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CompletionResolveRequest.type, handler),
6722         onSignatureHelp: (handler) => connection.onRequest(vscode_languageserver_protocol_1.SignatureHelpRequest.type, (params, cancel) => {
6723             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6724         }),
6725         onDeclaration: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DeclarationRequest.type, (params, cancel) => {
6726             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6727         }),
6728         onDefinition: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DefinitionRequest.type, (params, cancel) => {
6729             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6730         }),
6731         onTypeDefinition: (handler) => connection.onRequest(vscode_languageserver_protocol_1.TypeDefinitionRequest.type, (params, cancel) => {
6732             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6733         }),
6734         onImplementation: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ImplementationRequest.type, (params, cancel) => {
6735             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6736         }),
6737         onReferences: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ReferencesRequest.type, (params, cancel) => {
6738             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6739         }),
6740         onDocumentHighlight: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentHighlightRequest.type, (params, cancel) => {
6741             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6742         }),
6743         onDocumentSymbol: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentSymbolRequest.type, (params, cancel) => {
6744             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6745         }),
6746         onWorkspaceSymbol: (handler) => connection.onRequest(vscode_languageserver_protocol_1.WorkspaceSymbolRequest.type, (params, cancel) => {
6747             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6748         }),
6749         onCodeAction: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeActionRequest.type, (params, cancel) => {
6750             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6751         }),
6752         onCodeLens: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeLensRequest.type, (params, cancel) => {
6753             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6754         }),
6755         onCodeLensResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.CodeLensResolveRequest.type, (params, cancel) => {
6756             return handler(params, cancel);
6757         }),
6758         onDocumentFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentFormattingRequest.type, (params, cancel) => {
6759             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6760         }),
6761         onDocumentRangeFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentRangeFormattingRequest.type, (params, cancel) => {
6762             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6763         }),
6764         onDocumentOnTypeFormatting: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentOnTypeFormattingRequest.type, (params, cancel) => {
6765             return handler(params, cancel);
6766         }),
6767         onRenameRequest: (handler) => connection.onRequest(vscode_languageserver_protocol_1.RenameRequest.type, (params, cancel) => {
6768             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6769         }),
6770         onPrepareRename: (handler) => connection.onRequest(vscode_languageserver_protocol_1.PrepareRenameRequest.type, (params, cancel) => {
6771             return handler(params, cancel);
6772         }),
6773         onDocumentLinks: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentLinkRequest.type, (params, cancel) => {
6774             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6775         }),
6776         onDocumentLinkResolve: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentLinkResolveRequest.type, (params, cancel) => {
6777             return handler(params, cancel);
6778         }),
6779         onDocumentColor: (handler) => connection.onRequest(vscode_languageserver_protocol_1.DocumentColorRequest.type, (params, cancel) => {
6780             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6781         }),
6782         onColorPresentation: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ColorPresentationRequest.type, (params, cancel) => {
6783             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6784         }),
6785         onFoldingRanges: (handler) => connection.onRequest(vscode_languageserver_protocol_1.FoldingRangeRequest.type, (params, cancel) => {
6786             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6787         }),
6788         onSelectionRanges: (handler) => connection.onRequest(vscode_languageserver_protocol_1.SelectionRangeRequest.type, (params, cancel) => {
6789             return handler(params, cancel, progress_1.attachWorkDone(connection, params), progress_1.attachPartialResult(connection, params));
6790         }),
6791         onExecuteCommand: (handler) => connection.onRequest(vscode_languageserver_protocol_1.ExecuteCommandRequest.type, (params, cancel) => {
6792             return handler(params, cancel, progress_1.attachWorkDone(connection, params), undefined);
6793         }),
6794         dispose: () => connection.dispose()
6795     };
6796     for (let remote of allRemotes) {
6797         remote.attach(protocolConnection);
6798     }
6799     connection.onRequest(vscode_languageserver_protocol_1.InitializeRequest.type, (params) => {
6800         watchDog.initialize(params);
6801         if (Is.string(params.trace)) {
6802             tracer.trace = vscode_languageserver_protocol_1.Trace.fromString(params.trace);
6803         }
6804         for (let remote of allRemotes) {
6805             remote.initialize(params.capabilities);
6806         }
6807         if (initializeHandler) {
6808             let result = initializeHandler(params, new vscode_languageserver_protocol_1.CancellationTokenSource().token, progress_1.attachWorkDone(connection, params), undefined);
6809             return asPromise(result).then((value) => {
6810                 if (value instanceof vscode_languageserver_protocol_1.ResponseError) {
6811                     return value;
6812                 }
6813                 let result = value;
6814                 if (!result) {
6815                     result = { capabilities: {} };
6816                 }
6817                 let capabilities = result.capabilities;
6818                 if (!capabilities) {
6819                     capabilities = {};
6820                     result.capabilities = capabilities;
6821                 }
6822                 if (capabilities.textDocumentSync === undefined || capabilities.textDocumentSync === null) {
6823                     capabilities.textDocumentSync = Is.number(protocolConnection.__textDocumentSync) ? protocolConnection.__textDocumentSync : vscode_languageserver_protocol_1.TextDocumentSyncKind.None;
6824                 }
6825                 else if (!Is.number(capabilities.textDocumentSync) && !Is.number(capabilities.textDocumentSync.change)) {
6826                     capabilities.textDocumentSync.change = Is.number(protocolConnection.__textDocumentSync) ? protocolConnection.__textDocumentSync : vscode_languageserver_protocol_1.TextDocumentSyncKind.None;
6827                 }
6828                 for (let remote of allRemotes) {
6829                     remote.fillServerCapabilities(capabilities);
6830                 }
6831                 return result;
6832             });
6833         }
6834         else {
6835             let result = { capabilities: { textDocumentSync: vscode_languageserver_protocol_1.TextDocumentSyncKind.None } };
6836             for (let remote of allRemotes) {
6837                 remote.fillServerCapabilities(result.capabilities);
6838             }
6839             return result;
6840         }
6841     });
6842     connection.onRequest(vscode_languageserver_protocol_1.ShutdownRequest.type, () => {
6843         watchDog.shutdownReceived = true;
6844         if (shutdownHandler) {
6845             return shutdownHandler(new vscode_languageserver_protocol_1.CancellationTokenSource().token);
6846         }
6847         else {
6848             return undefined;
6849         }
6850     });
6851     connection.onNotification(vscode_languageserver_protocol_1.ExitNotification.type, () => {
6852         try {
6853             if (exitHandler) {
6854                 exitHandler();
6855             }
6856         }
6857         finally {
6858             if (watchDog.shutdownReceived) {
6859                 watchDog.exit(0);
6860             }
6861             else {
6862                 watchDog.exit(1);
6863             }
6864         }
6865     });
6866     connection.onNotification(vscode_languageserver_protocol_1.SetTraceNotification.type, (params) => {
6867         tracer.trace = vscode_languageserver_protocol_1.Trace.fromString(params.value);
6868     });
6869     return protocolConnection;
6870 }
6871 exports.createConnection = createConnection;
6872 //# sourceMappingURL=server.js.map
6873
6874 /***/ }),
6875 /* 47 */
6876 /***/ ((__unused_webpack_module, exports) => {
6877
6878
6879 /*---------------------------------------------------------------------------------------------
6880  *  Copyright (c) Microsoft Corporation. All rights reserved.
6881  *  Licensed under the MIT License. See License.txt in the project root for license information.
6882  *--------------------------------------------------------------------------------------------*/
6883 Object.defineProperty(exports, "__esModule", ({ value: true }));
6884 class ValueUUID {
6885     constructor(_value) {
6886         this._value = _value;
6887         // empty
6888     }
6889     asHex() {
6890         return this._value;
6891     }
6892     equals(other) {
6893         return this.asHex() === other.asHex();
6894     }
6895 }
6896 class V4UUID extends ValueUUID {
6897     constructor() {
6898         super([
6899             V4UUID._randomHex(),
6900             V4UUID._randomHex(),
6901             V4UUID._randomHex(),
6902             V4UUID._randomHex(),
6903             V4UUID._randomHex(),
6904             V4UUID._randomHex(),
6905             V4UUID._randomHex(),
6906             V4UUID._randomHex(),
6907             '-',
6908             V4UUID._randomHex(),
6909             V4UUID._randomHex(),
6910             V4UUID._randomHex(),
6911             V4UUID._randomHex(),
6912             '-',
6913             '4',
6914             V4UUID._randomHex(),
6915             V4UUID._randomHex(),
6916             V4UUID._randomHex(),
6917             '-',
6918             V4UUID._oneOf(V4UUID._timeHighBits),
6919             V4UUID._randomHex(),
6920             V4UUID._randomHex(),
6921             V4UUID._randomHex(),
6922             '-',
6923             V4UUID._randomHex(),
6924             V4UUID._randomHex(),
6925             V4UUID._randomHex(),
6926             V4UUID._randomHex(),
6927             V4UUID._randomHex(),
6928             V4UUID._randomHex(),
6929             V4UUID._randomHex(),
6930             V4UUID._randomHex(),
6931             V4UUID._randomHex(),
6932             V4UUID._randomHex(),
6933             V4UUID._randomHex(),
6934             V4UUID._randomHex(),
6935         ].join(''));
6936     }
6937     static _oneOf(array) {
6938         return array[Math.floor(array.length * Math.random())];
6939     }
6940     static _randomHex() {
6941         return V4UUID._oneOf(V4UUID._chars);
6942     }
6943 }
6944 V4UUID._chars = ['0', '1', '2', '3', '4', '5', '6', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
6945 V4UUID._timeHighBits = ['8', '9', 'a', 'b'];
6946 /**
6947  * An empty UUID that contains only zeros.
6948  */
6949 exports.empty = new ValueUUID('00000000-0000-0000-0000-000000000000');
6950 function v4() {
6951     return new V4UUID();
6952 }
6953 exports.v4 = v4;
6954 const _UUIDPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
6955 function isUUID(value) {
6956     return _UUIDPattern.test(value);
6957 }
6958 exports.isUUID = isUUID;
6959 /**
6960  * Parses a UUID that is of the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
6961  * @param value A uuid string.
6962  */
6963 function parse(value) {
6964     if (!isUUID(value)) {
6965         throw new Error('invalid uuid');
6966     }
6967     return new ValueUUID(value);
6968 }
6969 exports.parse = parse;
6970 function generateUuid() {
6971     return v4().asHex();
6972 }
6973 exports.generateUuid = generateUuid;
6974 //# sourceMappingURL=uuid.js.map
6975
6976 /***/ }),
6977 /* 48 */
6978 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
6979
6980
6981 /* --------------------------------------------------------------------------------------------
6982  * Copyright (c) Microsoft Corporation. All rights reserved.
6983  * Licensed under the MIT License. See License.txt in the project root for license information.
6984  * ------------------------------------------------------------------------------------------ */
6985 Object.defineProperty(exports, "__esModule", ({ value: true }));
6986 const vscode_languageserver_protocol_1 = __webpack_require__(4);
6987 const uuid_1 = __webpack_require__(47);
6988 class WorkDoneProgressReporterImpl {
6989     constructor(_connection, _token) {
6990         this._connection = _connection;
6991         this._token = _token;
6992         WorkDoneProgressReporterImpl.Instances.set(this._token, this);
6993     }
6994     begin(title, percentage, message, cancellable) {
6995         let param = {
6996             kind: 'begin',
6997             title,
6998             percentage,
6999             message,
7000             cancellable
7001         };
7002         this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param);
7003     }
7004     report(arg0, arg1) {
7005         let param = {
7006             kind: 'report'
7007         };
7008         if (typeof arg0 === 'number') {
7009             param.percentage = arg0;
7010             if (arg1 !== undefined) {
7011                 param.message = arg1;
7012             }
7013         }
7014         else {
7015             param.message = arg0;
7016         }
7017         this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, param);
7018     }
7019     done() {
7020         WorkDoneProgressReporterImpl.Instances.delete(this._token);
7021         this._connection.sendProgress(vscode_languageserver_protocol_1.WorkDoneProgress.type, this._token, { kind: 'end' });
7022     }
7023 }
7024 WorkDoneProgressReporterImpl.Instances = new Map();
7025 class WorkDoneProgressServerReporterImpl extends WorkDoneProgressReporterImpl {
7026     constructor(connection, token) {
7027         super(connection, token);
7028         this._source = new vscode_languageserver_protocol_1.CancellationTokenSource();
7029     }
7030     get token() {
7031         return this._source.token;
7032     }
7033     done() {
7034         this._source.dispose();
7035         super.done();
7036     }
7037     cancel() {
7038         this._source.cancel();
7039     }
7040 }
7041 class NullProgressReporter {
7042     constructor() {
7043     }
7044     begin() {
7045     }
7046     report() {
7047     }
7048     done() {
7049     }
7050 }
7051 class NullProgressServerReporter extends NullProgressReporter {
7052     constructor() {
7053         super();
7054         this._source = new vscode_languageserver_protocol_1.CancellationTokenSource();
7055     }
7056     get token() {
7057         return this._source.token;
7058     }
7059     done() {
7060         this._source.dispose();
7061     }
7062     cancel() {
7063         this._source.cancel();
7064     }
7065 }
7066 function attachWorkDone(connection, params) {
7067     if (params === undefined || params.workDoneToken === undefined) {
7068         return new NullProgressReporter();
7069     }
7070     const token = params.workDoneToken;
7071     delete params.workDoneToken;
7072     return new WorkDoneProgressReporterImpl(connection, token);
7073 }
7074 exports.attachWorkDone = attachWorkDone;
7075 exports.ProgressFeature = (Base) => {
7076     return class extends Base {
7077         constructor() {
7078             super();
7079             this._progressSupported = false;
7080         }
7081         initialize(capabilities) {
7082             var _a;
7083             if (((_a = capabilities === null || capabilities === void 0 ? void 0 : capabilities.window) === null || _a === void 0 ? void 0 : _a.workDoneProgress) === true) {
7084                 this._progressSupported = true;
7085                 this.connection.onNotification(vscode_languageserver_protocol_1.WorkDoneProgressCancelNotification.type, (params) => {
7086                     let progress = WorkDoneProgressReporterImpl.Instances.get(params.token);
7087                     if (progress instanceof WorkDoneProgressServerReporterImpl || progress instanceof NullProgressServerReporter) {
7088                         progress.cancel();
7089                     }
7090                 });
7091             }
7092         }
7093         attachWorkDoneProgress(token) {
7094             if (token === undefined) {
7095                 return new NullProgressReporter();
7096             }
7097             else {
7098                 return new WorkDoneProgressReporterImpl(this.connection, token);
7099             }
7100         }
7101         createWorkDoneProgress() {
7102             if (this._progressSupported) {
7103                 const token = uuid_1.generateUuid();
7104                 return this.connection.sendRequest(vscode_languageserver_protocol_1.WorkDoneProgressCreateRequest.type, { token }).then(() => {
7105                     const result = new WorkDoneProgressServerReporterImpl(this.connection, token);
7106                     return result;
7107                 });
7108             }
7109             else {
7110                 return Promise.resolve(new NullProgressServerReporter());
7111             }
7112         }
7113     };
7114 };
7115 var ResultProgress;
7116 (function (ResultProgress) {
7117     ResultProgress.type = new vscode_languageserver_protocol_1.ProgressType();
7118 })(ResultProgress || (ResultProgress = {}));
7119 class ResultProgressReporterImpl {
7120     constructor(_connection, _token) {
7121         this._connection = _connection;
7122         this._token = _token;
7123     }
7124     report(data) {
7125         this._connection.sendProgress(ResultProgress.type, this._token, data);
7126     }
7127 }
7128 function attachPartialResult(connection, params) {
7129     if (params === undefined || params.partialResultToken === undefined) {
7130         return undefined;
7131     }
7132     const token = params.partialResultToken;
7133     delete params.partialResultToken;
7134     return new ResultProgressReporterImpl(connection, token);
7135 }
7136 exports.attachPartialResult = attachPartialResult;
7137 //# sourceMappingURL=progress.js.map
7138
7139 /***/ }),
7140 /* 49 */
7141 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7142
7143 /* --------------------------------------------------------------------------------------------
7144  * Copyright (c) Microsoft Corporation. All rights reserved.
7145  * Licensed under the MIT License. See License.txt in the project root for license information.
7146  * ------------------------------------------------------------------------------------------ */
7147
7148 Object.defineProperty(exports, "__esModule", ({ value: true }));
7149 const vscode_languageserver_protocol_1 = __webpack_require__(4);
7150 const Is = __webpack_require__(45);
7151 exports.ConfigurationFeature = (Base) => {
7152     return class extends Base {
7153         getConfiguration(arg) {
7154             if (!arg) {
7155                 return this._getConfiguration({});
7156             }
7157             else if (Is.string(arg)) {
7158                 return this._getConfiguration({ section: arg });
7159             }
7160             else {
7161                 return this._getConfiguration(arg);
7162             }
7163         }
7164         _getConfiguration(arg) {
7165             let params = {
7166                 items: Array.isArray(arg) ? arg : [arg]
7167             };
7168             return this.connection.sendRequest(vscode_languageserver_protocol_1.ConfigurationRequest.type, params).then((result) => {
7169                 return Array.isArray(arg) ? result : result[0];
7170             });
7171         }
7172     };
7173 };
7174 //# sourceMappingURL=configuration.js.map
7175
7176 /***/ }),
7177 /* 50 */
7178 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7179
7180 /* --------------------------------------------------------------------------------------------
7181  * Copyright (c) Microsoft Corporation. All rights reserved.
7182  * Licensed under the MIT License. See License.txt in the project root for license information.
7183  * ------------------------------------------------------------------------------------------ */
7184
7185 Object.defineProperty(exports, "__esModule", ({ value: true }));
7186 const vscode_languageserver_protocol_1 = __webpack_require__(4);
7187 exports.WorkspaceFoldersFeature = (Base) => {
7188     return class extends Base {
7189         initialize(capabilities) {
7190             let workspaceCapabilities = capabilities.workspace;
7191             if (workspaceCapabilities && workspaceCapabilities.workspaceFolders) {
7192                 this._onDidChangeWorkspaceFolders = new vscode_languageserver_protocol_1.Emitter();
7193                 this.connection.onNotification(vscode_languageserver_protocol_1.DidChangeWorkspaceFoldersNotification.type, (params) => {
7194                     this._onDidChangeWorkspaceFolders.fire(params.event);
7195                 });
7196             }
7197         }
7198         getWorkspaceFolders() {
7199             return this.connection.sendRequest(vscode_languageserver_protocol_1.WorkspaceFoldersRequest.type);
7200         }
7201         get onDidChangeWorkspaceFolders() {
7202             if (!this._onDidChangeWorkspaceFolders) {
7203                 throw new Error('Client doesn\'t support sending workspace folder change events.');
7204             }
7205             if (!this._unregistration) {
7206                 this._unregistration = this.connection.client.register(vscode_languageserver_protocol_1.DidChangeWorkspaceFoldersNotification.type);
7207             }
7208             return this._onDidChangeWorkspaceFolders.event;
7209         }
7210     };
7211 };
7212 //# sourceMappingURL=workspaceFolders.js.map
7213
7214 /***/ }),
7215 /* 51 */
7216 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7217
7218 /* --------------------------------------------------------------------------------------------
7219  * Copyright (c) Microsoft Corporation. All rights reserved.
7220  * Licensed under the MIT License. See License.txt in the project root for license information.
7221  * ------------------------------------------------------------------------------------------ */
7222
7223 Object.defineProperty(exports, "__esModule", ({ value: true }));
7224 const vscode_languageserver_protocol_1 = __webpack_require__(4);
7225 exports.CallHierarchyFeature = (Base) => {
7226     return class extends Base {
7227         get callHierarchy() {
7228             return {
7229                 onPrepare: (handler) => {
7230                     this.connection.onRequest(vscode_languageserver_protocol_1.CallHierarchyPrepareRequest.type, (params, cancel) => {
7231                         return handler(params, cancel, this.attachWorkDoneProgress(params), undefined);
7232                     });
7233                 },
7234                 onIncomingCalls: (handler) => {
7235                     const type = vscode_languageserver_protocol_1.CallHierarchyIncomingCallsRequest.type;
7236                     this.connection.onRequest(type, (params, cancel) => {
7237                         return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
7238                     });
7239                 },
7240                 onOutgoingCalls: (handler) => {
7241                     const type = vscode_languageserver_protocol_1.CallHierarchyOutgoingCallsRequest.type;
7242                     this.connection.onRequest(type, (params, cancel) => {
7243                         return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
7244                     });
7245                 }
7246             };
7247         }
7248     };
7249 };
7250 //# sourceMappingURL=callHierarchy.js.map
7251
7252 /***/ }),
7253 /* 52 */
7254 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7255
7256
7257 /* --------------------------------------------------------------------------------------------
7258  * Copyright (c) Microsoft Corporation. All rights reserved.
7259  * Licensed under the MIT License. See License.txt in the project root for license information.
7260  * ------------------------------------------------------------------------------------------ */
7261 Object.defineProperty(exports, "__esModule", ({ value: true }));
7262 const url = __webpack_require__(53);
7263 const path = __webpack_require__(3);
7264 const fs = __webpack_require__(54);
7265 const child_process_1 = __webpack_require__(55);
7266 /**
7267  * @deprecated Use the `vscode-uri` npm module which provides a more
7268  * complete implementation of handling VS Code URIs.
7269  */
7270 function uriToFilePath(uri) {
7271     let parsed = url.parse(uri);
7272     if (parsed.protocol !== 'file:' || !parsed.path) {
7273         return undefined;
7274     }
7275     let segments = parsed.path.split('/');
7276     for (var i = 0, len = segments.length; i < len; i++) {
7277         segments[i] = decodeURIComponent(segments[i]);
7278     }
7279     if (process.platform === 'win32' && segments.length > 1) {
7280         let first = segments[0];
7281         let second = segments[1];
7282         // Do we have a drive letter and we started with a / which is the
7283         // case if the first segement is empty (see split above)
7284         if (first.length === 0 && second.length > 1 && second[1] === ':') {
7285             // Remove first slash
7286             segments.shift();
7287         }
7288     }
7289     return path.normalize(segments.join('/'));
7290 }
7291 exports.uriToFilePath = uriToFilePath;
7292 function isWindows() {
7293     return process.platform === 'win32';
7294 }
7295 function resolve(moduleName, nodePath, cwd, tracer) {
7296     const nodePathKey = 'NODE_PATH';
7297     const app = [
7298         'var p = process;',
7299         'p.on(\'message\',function(m){',
7300         'if(m.c===\'e\'){',
7301         'p.exit(0);',
7302         '}',
7303         'else if(m.c===\'rs\'){',
7304         'try{',
7305         'var r=require.resolve(m.a);',
7306         'p.send({c:\'r\',s:true,r:r});',
7307         '}',
7308         'catch(err){',
7309         'p.send({c:\'r\',s:false});',
7310         '}',
7311         '}',
7312         '});'
7313     ].join('');
7314     return new Promise((resolve, reject) => {
7315         let env = process.env;
7316         let newEnv = Object.create(null);
7317         Object.keys(env).forEach(key => newEnv[key] = env[key]);
7318         if (nodePath && fs.existsSync(nodePath) /* see issue 545 */) {
7319             if (newEnv[nodePathKey]) {
7320                 newEnv[nodePathKey] = nodePath + path.delimiter + newEnv[nodePathKey];
7321             }
7322             else {
7323                 newEnv[nodePathKey] = nodePath;
7324             }
7325             if (tracer) {
7326                 tracer(`NODE_PATH value is: ${newEnv[nodePathKey]}`);
7327             }
7328         }
7329         newEnv['ELECTRON_RUN_AS_NODE'] = '1';
7330         try {
7331             let cp = child_process_1.fork('', [], {
7332                 cwd: cwd,
7333                 env: newEnv,
7334                 execArgv: ['-e', app]
7335             });
7336             if (cp.pid === void 0) {
7337                 reject(new Error(`Starting process to resolve node module  ${moduleName} failed`));
7338                 return;
7339             }
7340             cp.on('error', (error) => {
7341                 reject(error);
7342             });
7343             cp.on('message', (message) => {
7344                 if (message.c === 'r') {
7345                     cp.send({ c: 'e' });
7346                     if (message.s) {
7347                         resolve(message.r);
7348                     }
7349                     else {
7350                         reject(new Error(`Failed to resolve module: ${moduleName}`));
7351                     }
7352                 }
7353             });
7354             let message = {
7355                 c: 'rs',
7356                 a: moduleName
7357             };
7358             cp.send(message);
7359         }
7360         catch (error) {
7361             reject(error);
7362         }
7363     });
7364 }
7365 exports.resolve = resolve;
7366 /**
7367  * Resolve the global npm package path.
7368  * @deprecated Since this depends on the used package manager and their version the best is that servers
7369  * implement this themselves since they know best what kind of package managers to support.
7370  * @param tracer the tracer to use
7371  */
7372 function resolveGlobalNodePath(tracer) {
7373     let npmCommand = 'npm';
7374     const env = Object.create(null);
7375     Object.keys(process.env).forEach(key => env[key] = process.env[key]);
7376     env['NO_UPDATE_NOTIFIER'] = 'true';
7377     const options = {
7378         encoding: 'utf8',
7379         env
7380     };
7381     if (isWindows()) {
7382         npmCommand = 'npm.cmd';
7383         options.shell = true;
7384     }
7385     let handler = () => { };
7386     try {
7387         process.on('SIGPIPE', handler);
7388         let stdout = child_process_1.spawnSync(npmCommand, ['config', 'get', 'prefix'], options).stdout;
7389         if (!stdout) {
7390             if (tracer) {
7391                 tracer(`'npm config get prefix' didn't return a value.`);
7392             }
7393             return undefined;
7394         }
7395         let prefix = stdout.trim();
7396         if (tracer) {
7397             tracer(`'npm config get prefix' value is: ${prefix}`);
7398         }
7399         if (prefix.length > 0) {
7400             if (isWindows()) {
7401                 return path.join(prefix, 'node_modules');
7402             }
7403             else {
7404                 return path.join(prefix, 'lib', 'node_modules');
7405             }
7406         }
7407         return undefined;
7408     }
7409     catch (err) {
7410         return undefined;
7411     }
7412     finally {
7413         process.removeListener('SIGPIPE', handler);
7414     }
7415 }
7416 exports.resolveGlobalNodePath = resolveGlobalNodePath;
7417 /*
7418  * Resolve the global yarn pakage path.
7419  * @deprecated Since this depends on the used package manager and their version the best is that servers
7420  * implement this themselves since they know best what kind of package managers to support.
7421  * @param tracer the tracer to use
7422  */
7423 function resolveGlobalYarnPath(tracer) {
7424     let yarnCommand = 'yarn';
7425     let options = {
7426         encoding: 'utf8'
7427     };
7428     if (isWindows()) {
7429         yarnCommand = 'yarn.cmd';
7430         options.shell = true;
7431     }
7432     let handler = () => { };
7433     try {
7434         process.on('SIGPIPE', handler);
7435         let results = child_process_1.spawnSync(yarnCommand, ['global', 'dir', '--json'], options);
7436         let stdout = results.stdout;
7437         if (!stdout) {
7438             if (tracer) {
7439                 tracer(`'yarn global dir' didn't return a value.`);
7440                 if (results.stderr) {
7441                     tracer(results.stderr);
7442                 }
7443             }
7444             return undefined;
7445         }
7446         let lines = stdout.trim().split(/\r?\n/);
7447         for (let line of lines) {
7448             try {
7449                 let yarn = JSON.parse(line);
7450                 if (yarn.type === 'log') {
7451                     return path.join(yarn.data, 'node_modules');
7452                 }
7453             }
7454             catch (e) {
7455                 // Do nothing. Ignore the line
7456             }
7457         }
7458         return undefined;
7459     }
7460     catch (err) {
7461         return undefined;
7462     }
7463     finally {
7464         process.removeListener('SIGPIPE', handler);
7465     }
7466 }
7467 exports.resolveGlobalYarnPath = resolveGlobalYarnPath;
7468 var FileSystem;
7469 (function (FileSystem) {
7470     let _isCaseSensitive = undefined;
7471     function isCaseSensitive() {
7472         if (_isCaseSensitive !== void 0) {
7473             return _isCaseSensitive;
7474         }
7475         if (process.platform === 'win32') {
7476             _isCaseSensitive = false;
7477         }
7478         else {
7479             // convert current file name to upper case / lower case and check if file exists
7480             // (guards against cases when name is already all uppercase or lowercase)
7481             _isCaseSensitive = !fs.existsSync(__filename.toUpperCase()) || !fs.existsSync(__filename.toLowerCase());
7482         }
7483         return _isCaseSensitive;
7484     }
7485     FileSystem.isCaseSensitive = isCaseSensitive;
7486     function isParent(parent, child) {
7487         if (isCaseSensitive()) {
7488             return path.normalize(child).indexOf(path.normalize(parent)) === 0;
7489         }
7490         else {
7491             return path.normalize(child).toLowerCase().indexOf(path.normalize(parent).toLowerCase()) === 0;
7492         }
7493     }
7494     FileSystem.isParent = isParent;
7495 })(FileSystem = exports.FileSystem || (exports.FileSystem = {}));
7496 function resolveModulePath(workspaceRoot, moduleName, nodePath, tracer) {
7497     if (nodePath) {
7498         if (!path.isAbsolute(nodePath)) {
7499             nodePath = path.join(workspaceRoot, nodePath);
7500         }
7501         return resolve(moduleName, nodePath, nodePath, tracer).then((value) => {
7502             if (FileSystem.isParent(nodePath, value)) {
7503                 return value;
7504             }
7505             else {
7506                 return Promise.reject(new Error(`Failed to load ${moduleName} from node path location.`));
7507             }
7508         }).then(undefined, (_error) => {
7509             return resolve(moduleName, resolveGlobalNodePath(tracer), workspaceRoot, tracer);
7510         });
7511     }
7512     else {
7513         return resolve(moduleName, resolveGlobalNodePath(tracer), workspaceRoot, tracer);
7514     }
7515 }
7516 exports.resolveModulePath = resolveModulePath;
7517 //# sourceMappingURL=files.js.map
7518
7519 /***/ }),
7520 /* 53 */
7521 /***/ ((module) => {
7522
7523 module.exports = require("url");;
7524
7525 /***/ }),
7526 /* 54 */
7527 /***/ ((module) => {
7528
7529 module.exports = require("fs");;
7530
7531 /***/ }),
7532 /* 55 */
7533 /***/ ((module) => {
7534
7535 module.exports = require("child_process");;
7536
7537 /***/ }),
7538 /* 56 */
7539 /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
7540
7541 /* --------------------------------------------------------------------------------------------
7542  * Copyright (c) Microsoft Corporation. All rights reserved.
7543  * Licensed under the MIT License. See License.txt in the project root for license information.
7544  * ----------------------------------------------------------------------------------------- */
7545
7546
7547 module.exports = __webpack_require__(4);
7548
7549 /***/ }),
7550 /* 57 */
7551 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7552
7553
7554 /* --------------------------------------------------------------------------------------------
7555  * Copyright (c) Microsoft Corporation. All rights reserved.
7556  * Licensed under the MIT License. See License.txt in the project root for license information.
7557  * ------------------------------------------------------------------------------------------ */
7558 function __export(m) {
7559     for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
7560 }
7561 Object.defineProperty(exports, "__esModule", ({ value: true }));
7562 const st = __webpack_require__(58);
7563 __export(__webpack_require__(4));
7564 __export(__webpack_require__(46));
7565 var ProposedFeatures;
7566 (function (ProposedFeatures) {
7567     ProposedFeatures.all = {
7568         __brand: 'features',
7569         languages: st.SemanticTokensFeature
7570     };
7571     ProposedFeatures.SemanticTokensBuilder = st.SemanticTokensBuilder;
7572 })(ProposedFeatures = exports.ProposedFeatures || (exports.ProposedFeatures = {}));
7573 //# sourceMappingURL=api.js.map
7574
7575 /***/ }),
7576 /* 58 */
7577 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7578
7579
7580 /* --------------------------------------------------------------------------------------------
7581  * Copyright (c) Microsoft Corporation. All rights reserved.
7582  * Licensed under the MIT License. See License.txt in the project root for license information.
7583  * ------------------------------------------------------------------------------------------ */
7584 Object.defineProperty(exports, "__esModule", ({ value: true }));
7585 const vscode_languageserver_protocol_1 = __webpack_require__(4);
7586 exports.SemanticTokensFeature = (Base) => {
7587     return class extends Base {
7588         get semanticTokens() {
7589             return {
7590                 on: (handler) => {
7591                     const type = vscode_languageserver_protocol_1.Proposed.SemanticTokensRequest.type;
7592                     this.connection.onRequest(type, (params, cancel) => {
7593                         return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
7594                     });
7595                 },
7596                 onEdits: (handler) => {
7597                     const type = vscode_languageserver_protocol_1.Proposed.SemanticTokensEditsRequest.type;
7598                     this.connection.onRequest(type, (params, cancel) => {
7599                         return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
7600                     });
7601                 },
7602                 onRange: (handler) => {
7603                     const type = vscode_languageserver_protocol_1.Proposed.SemanticTokensRangeRequest.type;
7604                     this.connection.onRequest(type, (params, cancel) => {
7605                         return handler(params, cancel, this.attachWorkDoneProgress(params), this.attachPartialResultProgress(type, params));
7606                     });
7607                 }
7608             };
7609         }
7610     };
7611 };
7612 class SemanticTokensBuilder {
7613     constructor() {
7614         this._prevData = undefined;
7615         this.initialize();
7616     }
7617     initialize() {
7618         this._id = Date.now();
7619         this._prevLine = 0;
7620         this._prevChar = 0;
7621         this._data = [];
7622         this._dataLen = 0;
7623     }
7624     push(line, char, length, tokenType, tokenModifiers) {
7625         let pushLine = line;
7626         let pushChar = char;
7627         if (this._dataLen > 0) {
7628             pushLine -= this._prevLine;
7629             if (pushLine === 0) {
7630                 pushChar -= this._prevChar;
7631             }
7632         }
7633         this._data[this._dataLen++] = pushLine;
7634         this._data[this._dataLen++] = pushChar;
7635         this._data[this._dataLen++] = length;
7636         this._data[this._dataLen++] = tokenType;
7637         this._data[this._dataLen++] = tokenModifiers;
7638         this._prevLine = line;
7639         this._prevChar = char;
7640     }
7641     get id() {
7642         return this._id.toString();
7643     }
7644     previousResult(id) {
7645         if (this.id === id) {
7646             this._prevData = this._data;
7647         }
7648         this.initialize();
7649     }
7650     build() {
7651         this._prevData = undefined;
7652         return {
7653             resultId: this.id,
7654             data: this._data
7655         };
7656     }
7657     canBuildEdits() {
7658         return this._prevData !== undefined;
7659     }
7660     buildEdits() {
7661         if (this._prevData !== undefined) {
7662             const prevDataLength = this._prevData.length;
7663             const dataLength = this._data.length;
7664             let startIndex = 0;
7665             while (startIndex < dataLength && startIndex < prevDataLength && this._prevData[startIndex] === this._data[startIndex]) {
7666                 startIndex++;
7667             }
7668             if (startIndex < dataLength && startIndex < prevDataLength) {
7669                 // Find end index
7670                 let endIndex = 0;
7671                 while (endIndex < dataLength && endIndex < prevDataLength && this._prevData[prevDataLength - 1 - endIndex] === this._data[dataLength - 1 - endIndex]) {
7672                     endIndex++;
7673                 }
7674                 const newData = this._data.slice(startIndex, dataLength - endIndex);
7675                 const result = {
7676                     resultId: this.id,
7677                     edits: [
7678                         { start: startIndex, deleteCount: prevDataLength - endIndex - startIndex, data: newData }
7679                     ]
7680                 };
7681                 return result;
7682             }
7683             else if (startIndex < dataLength) {
7684                 return { resultId: this.id, edits: [
7685                         { start: startIndex, deleteCount: 0, data: this._data.slice(startIndex) }
7686                     ] };
7687             }
7688             else if (startIndex < prevDataLength) {
7689                 return { resultId: this.id, edits: [
7690                         { start: startIndex, deleteCount: prevDataLength - startIndex }
7691                     ] };
7692             }
7693             else {
7694                 return { resultId: this.id, edits: [] };
7695             }
7696         }
7697         else {
7698             return this.build();
7699         }
7700     }
7701 }
7702 exports.SemanticTokensBuilder = SemanticTokensBuilder;
7703 //# sourceMappingURL=semanticTokens.proposed.js.map
7704
7705 /***/ }),
7706 /* 59 */
7707 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7708
7709
7710 /*---------------------------------------------------------------------------------------------
7711  *  Copyright (c) Microsoft Corporation. All rights reserved.
7712  *  Licensed under the MIT License. See License.txt in the project root for license information.
7713  *--------------------------------------------------------------------------------------------*/
7714 Object.defineProperty(exports, "__esModule", ({ value: true }));
7715 exports.runSafe = exports.formatError = void 0;
7716 const vscode_languageserver_1 = __webpack_require__(44);
7717 function formatError(message, err) {
7718     if (err instanceof Error) {
7719         let error = err;
7720         return `${message}: ${error.message}\n${error.stack}`;
7721     }
7722     else if (typeof err === 'string') {
7723         return `${message}: ${err}`;
7724     }
7725     else if (err) {
7726         return `${message}: ${err.toString()}`;
7727     }
7728     return message;
7729 }
7730 exports.formatError = formatError;
7731 function runSafe(func, errorVal, errorMessage, token) {
7732     return new Promise((resolve) => {
7733         setImmediate(() => {
7734             if (token.isCancellationRequested) {
7735                 resolve(cancelValue());
7736             }
7737             return func().then(result => {
7738                 if (token.isCancellationRequested) {
7739                     resolve(cancelValue());
7740                     return;
7741                 }
7742                 else {
7743                     resolve(result);
7744                 }
7745             }, e => {
7746                 console.error(formatError(errorMessage, e));
7747                 resolve(errorVal);
7748             });
7749         });
7750     });
7751 }
7752 exports.runSafe = runSafe;
7753 function cancelValue() {
7754     return new vscode_languageserver_1.ResponseError(vscode_languageserver_1.ErrorCodes.RequestCancelled, 'Request cancelled');
7755 }
7756
7757
7758 /***/ }),
7759 /* 60 */
7760 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
7761
7762
7763 /*---------------------------------------------------------------------------------------------
7764  *  Copyright (c) Microsoft Corporation. All rights reserved.
7765  *  Licensed under the MIT License. See License.txt in the project root for license information.
7766  *--------------------------------------------------------------------------------------------*/
7767 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7768     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7769     return new (P || (P = Promise))(function (resolve, reject) {
7770         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
7771         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7772         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7773         step((generator = generator.apply(thisArg, _arguments || [])).next());
7774     });
7775 };
7776 Object.defineProperty(exports, "__esModule", ({ value: true }));
7777 exports.startServer = void 0;
7778 const vscode_languageserver_1 = __webpack_require__(44);
7779 const languageModes_1 = __webpack_require__(61);
7780 const formatting_1 = __webpack_require__(144);
7781 const arrays_1 = __webpack_require__(145);
7782 const documentContext_1 = __webpack_require__(146);
7783 const vscode_uri_1 = __webpack_require__(84);
7784 const runner_1 = __webpack_require__(59);
7785 const htmlFolding_1 = __webpack_require__(148);
7786 const customData_1 = __webpack_require__(149);
7787 const selectionRanges_1 = __webpack_require__(150);
7788 const semanticTokens_1 = __webpack_require__(152);
7789 const requests_1 = __webpack_require__(147);
7790 var CustomDataChangedNotification;
7791 (function (CustomDataChangedNotification) {
7792     CustomDataChangedNotification.type = new vscode_languageserver_1.NotificationType('html/customDataChanged');
7793 })(CustomDataChangedNotification || (CustomDataChangedNotification = {}));
7794 var TagCloseRequest;
7795 (function (TagCloseRequest) {
7796     TagCloseRequest.type = new vscode_languageserver_1.RequestType('html/tag');
7797 })(TagCloseRequest || (TagCloseRequest = {}));
7798 var OnTypeRenameRequest;
7799 (function (OnTypeRenameRequest) {
7800     OnTypeRenameRequest.type = new vscode_languageserver_1.RequestType('html/onTypeRename');
7801 })(OnTypeRenameRequest || (OnTypeRenameRequest = {}));
7802 var SemanticTokenRequest;
7803 (function (SemanticTokenRequest) {
7804     SemanticTokenRequest.type = new vscode_languageserver_1.RequestType('html/semanticTokens');
7805 })(SemanticTokenRequest || (SemanticTokenRequest = {}));
7806 var SemanticTokenLegendRequest;
7807 (function (SemanticTokenLegendRequest) {
7808     SemanticTokenLegendRequest.type = new vscode_languageserver_1.RequestType('html/semanticTokenLegend');
7809 })(SemanticTokenLegendRequest || (SemanticTokenLegendRequest = {}));
7810 function startServer(connection, runtime) {
7811     // Create a text document manager.
7812     const documents = new vscode_languageserver_1.TextDocuments(languageModes_1.TextDocument);
7813     // Make the text document manager listen on the connection
7814     // for open, change and close text document events
7815     documents.listen(connection);
7816     let workspaceFolders = [];
7817     let languageModes;
7818     let clientSnippetSupport = false;
7819     let dynamicFormatterRegistration = false;
7820     let scopedSettingsSupport = false;
7821     let workspaceFoldersSupport = false;
7822     let foldingRangeLimit = Number.MAX_VALUE;
7823     const notReady = () => Promise.reject('Not Ready');
7824     let requestService = { getContent: notReady, stat: notReady, readDirectory: notReady };
7825     let globalSettings = {};
7826     let documentSettings = {};
7827     // remove document settings on close
7828     documents.onDidClose(e => {
7829         delete documentSettings[e.document.uri];
7830     });
7831     function getDocumentSettings(textDocument, needsDocumentSettings) {
7832         if (scopedSettingsSupport && needsDocumentSettings()) {
7833             let promise = documentSettings[textDocument.uri];
7834             if (!promise) {
7835                 const scopeUri = textDocument.uri;
7836                 const configRequestParam = { items: [{ scopeUri, section: 'css' }, { scopeUri, section: 'html' }, { scopeUri, section: 'javascript' }] };
7837                 promise = connection.sendRequest(vscode_languageserver_1.ConfigurationRequest.type, configRequestParam).then(s => ({ css: s[0], html: s[1], javascript: s[2] }));
7838                 documentSettings[textDocument.uri] = promise;
7839             }
7840             return promise;
7841         }
7842         return Promise.resolve(undefined);
7843     }
7844     // After the server has started the client sends an initialize request. The server receives
7845     // in the passed params the rootPath of the workspace plus the client capabilities
7846     connection.onInitialize((params) => {
7847         const initializationOptions = params.initializationOptions;
7848         workspaceFolders = params.workspaceFolders;
7849         if (!Array.isArray(workspaceFolders)) {
7850             workspaceFolders = [];
7851             if (params.rootPath) {
7852                 workspaceFolders.push({ name: '', uri: vscode_uri_1.URI.file(params.rootPath).toString() });
7853             }
7854         }
7855         requestService = requests_1.getRequestService((initializationOptions === null || initializationOptions === void 0 ? void 0 : initializationOptions.handledSchemas) || ['file'], connection, runtime);
7856         const workspace = {
7857             get settings() { return globalSettings; },
7858             get folders() { return workspaceFolders; }
7859         };
7860         languageModes = languageModes_1.getLanguageModes((initializationOptions === null || initializationOptions === void 0 ? void 0 : initializationOptions.embeddedLanguages) || { css: true, javascript: true }, workspace, params.capabilities, requestService);
7861         const dataPaths = (initializationOptions === null || initializationOptions === void 0 ? void 0 : initializationOptions.dataPaths) || [];
7862         customData_1.fetchHTMLDataProviders(dataPaths, requestService).then(dataProviders => {
7863             languageModes.updateDataProviders(dataProviders);
7864         });
7865         documents.onDidClose(e => {
7866             languageModes.onDocumentRemoved(e.document);
7867         });
7868         connection.onShutdown(() => {
7869             languageModes.dispose();
7870         });
7871         function getClientCapability(name, def) {
7872             const keys = name.split('.');
7873             let c = params.capabilities;
7874             for (let i = 0; c && i < keys.length; i++) {
7875                 if (!c.hasOwnProperty(keys[i])) {
7876                     return def;
7877                 }
7878                 c = c[keys[i]];
7879             }
7880             return c;
7881         }
7882         clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false);
7883         dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof (initializationOptions === null || initializationOptions === void 0 ? void 0 : initializationOptions.provideFormatter) !== 'boolean');
7884         scopedSettingsSupport = getClientCapability('workspace.configuration', false);
7885         workspaceFoldersSupport = getClientCapability('workspace.workspaceFolders', false);
7886         foldingRangeLimit = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE);
7887         const capabilities = {
7888             textDocumentSync: vscode_languageserver_1.TextDocumentSyncKind.Incremental,
7889             completionProvider: clientSnippetSupport ? { resolveProvider: true, triggerCharacters: ['.', ':', '<', '"', '=', '/'] } : undefined,
7890             hoverProvider: true,
7891             documentHighlightProvider: true,
7892             documentRangeFormattingProvider: (initializationOptions === null || initializationOptions === void 0 ? void 0 : initializationOptions.provideFormatter) === true,
7893             documentLinkProvider: { resolveProvider: false },
7894             documentSymbolProvider: true,
7895             definitionProvider: true,
7896             signatureHelpProvider: { triggerCharacters: ['('] },
7897             referencesProvider: true,
7898             colorProvider: {},
7899             foldingRangeProvider: true,
7900             selectionRangeProvider: true,
7901             renameProvider: true
7902         };
7903         return { capabilities };
7904     });
7905     connection.onInitialized(() => {
7906         if (workspaceFoldersSupport) {
7907             connection.client.register(vscode_languageserver_1.DidChangeWorkspaceFoldersNotification.type);
7908             connection.onNotification(vscode_languageserver_1.DidChangeWorkspaceFoldersNotification.type, e => {
7909                 const toAdd = e.event.added;
7910                 const toRemove = e.event.removed;
7911                 const updatedFolders = [];
7912                 if (workspaceFolders) {
7913                     for (const folder of workspaceFolders) {
7914                         if (!toRemove.some(r => r.uri === folder.uri) && !toAdd.some(r => r.uri === folder.uri)) {
7915                             updatedFolders.push(folder);
7916                         }
7917                     }
7918                 }
7919                 workspaceFolders = updatedFolders.concat(toAdd);
7920                 documents.all().forEach(triggerValidation);
7921             });
7922         }
7923     });
7924     let formatterRegistration = null;
7925     // The settings have changed. Is send on server activation as well.
7926     connection.onDidChangeConfiguration((change) => {
7927         globalSettings = change.settings;
7928         documentSettings = {}; // reset all document settings
7929         documents.all().forEach(triggerValidation);
7930         // dynamically enable & disable the formatter
7931         if (dynamicFormatterRegistration) {
7932             const enableFormatter = globalSettings && globalSettings.html && globalSettings.html.format && globalSettings.html.format.enable;
7933             if (enableFormatter) {
7934                 if (!formatterRegistration) {
7935                     const documentSelector = [{ language: 'html' }, { language: 'handlebars' }, { language: 'htmldjango' }, { language: 'blade' }];
7936                     formatterRegistration = connection.client.register(vscode_languageserver_1.DocumentRangeFormattingRequest.type, { documentSelector });
7937                 }
7938             }
7939             else if (formatterRegistration) {
7940                 formatterRegistration.then(r => r.dispose());
7941                 formatterRegistration = null;
7942             }
7943         }
7944     });
7945     const pendingValidationRequests = {};
7946     const validationDelayMs = 500;
7947     // The content of a text document has changed. This event is emitted
7948     // when the text document first opened or when its content has changed.
7949     documents.onDidChangeContent(change => {
7950         triggerValidation(change.document);
7951     });
7952     // a document has closed: clear all diagnostics
7953     documents.onDidClose(event => {
7954         cleanPendingValidation(event.document);
7955         connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] });
7956     });
7957     function cleanPendingValidation(textDocument) {
7958         const request = pendingValidationRequests[textDocument.uri];
7959         if (request) {
7960             clearTimeout(request);
7961             delete pendingValidationRequests[textDocument.uri];
7962         }
7963     }
7964     function triggerValidation(textDocument) {
7965         cleanPendingValidation(textDocument);
7966         pendingValidationRequests[textDocument.uri] = setTimeout(() => {
7967             delete pendingValidationRequests[textDocument.uri];
7968             validateTextDocument(textDocument);
7969         }, validationDelayMs);
7970     }
7971     function isValidationEnabled(languageId, settings = globalSettings) {
7972         const validationSettings = settings && settings.html && settings.html.validate;
7973         if (validationSettings) {
7974             return languageId === 'css' && validationSettings.styles !== false || languageId === 'javascript' && validationSettings.scripts !== false;
7975         }
7976         return true;
7977     }
7978     function validateTextDocument(textDocument) {
7979         return __awaiter(this, void 0, void 0, function* () {
7980             try {
7981                 const version = textDocument.version;
7982                 const diagnostics = [];
7983                 if (textDocument.languageId === 'html') {
7984                     const modes = languageModes.getAllModesInDocument(textDocument);
7985                     const settings = yield getDocumentSettings(textDocument, () => modes.some(m => !!m.doValidation));
7986                     const latestTextDocument = documents.get(textDocument.uri);
7987                     if (latestTextDocument && latestTextDocument.version === version) { // check no new version has come in after in after the async op
7988                         for (const mode of modes) {
7989                             if (mode.doValidation && isValidationEnabled(mode.getId(), settings)) {
7990                                 arrays_1.pushAll(diagnostics, yield mode.doValidation(latestTextDocument, settings));
7991                             }
7992                         }
7993                         connection.sendDiagnostics({ uri: latestTextDocument.uri, diagnostics });
7994                     }
7995                 }
7996             }
7997             catch (e) {
7998                 connection.console.error(runner_1.formatError(`Error while validating ${textDocument.uri}`, e));
7999             }
8000         });
8001     }
8002     connection.onCompletion((textDocumentPosition, token) => __awaiter(this, void 0, void 0, function* () {
8003         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8004             const document = documents.get(textDocumentPosition.textDocument.uri);
8005             if (!document) {
8006                 return null;
8007             }
8008             const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position);
8009             if (!mode || !mode.doComplete) {
8010                 return { isIncomplete: true, items: [] };
8011             }
8012             const doComplete = mode.doComplete;
8013             if (mode.getId() !== 'html') {
8014                 /* __GDPR__
8015                     "html.embbedded.complete" : {
8016                         "languageId" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
8017                     }
8018                  */
8019                 connection.telemetry.logEvent({ key: 'html.embbedded.complete', value: { languageId: mode.getId() } });
8020             }
8021             const settings = yield getDocumentSettings(document, () => doComplete.length > 2);
8022             const documentContext = documentContext_1.getDocumentContext(document.uri, workspaceFolders);
8023             return doComplete(document, textDocumentPosition.position, documentContext, settings);
8024         }), null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token);
8025     }));
8026     connection.onCompletionResolve((item, token) => {
8027         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8028             const data = item.data;
8029             if (data && data.languageId && data.uri) {
8030                 const mode = languageModes.getMode(data.languageId);
8031                 const document = documents.get(data.uri);
8032                 if (mode && mode.doResolve && document) {
8033                     return mode.doResolve(document, item);
8034                 }
8035             }
8036             return item;
8037         }), item, `Error while resolving completion proposal`, token);
8038     });
8039     connection.onHover((textDocumentPosition, token) => {
8040         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8041             const document = documents.get(textDocumentPosition.textDocument.uri);
8042             if (document) {
8043                 const mode = languageModes.getModeAtPosition(document, textDocumentPosition.position);
8044                 if (mode && mode.doHover) {
8045                     return mode.doHover(document, textDocumentPosition.position);
8046                 }
8047             }
8048             return null;
8049         }), null, `Error while computing hover for ${textDocumentPosition.textDocument.uri}`, token);
8050     });
8051     connection.onDocumentHighlight((documentHighlightParams, token) => {
8052         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8053             const document = documents.get(documentHighlightParams.textDocument.uri);
8054             if (document) {
8055                 const mode = languageModes.getModeAtPosition(document, documentHighlightParams.position);
8056                 if (mode && mode.findDocumentHighlight) {
8057                     return mode.findDocumentHighlight(document, documentHighlightParams.position);
8058                 }
8059             }
8060             return [];
8061         }), [], `Error while computing document highlights for ${documentHighlightParams.textDocument.uri}`, token);
8062     });
8063     connection.onDefinition((definitionParams, token) => {
8064         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8065             const document = documents.get(definitionParams.textDocument.uri);
8066             if (document) {
8067                 const mode = languageModes.getModeAtPosition(document, definitionParams.position);
8068                 if (mode && mode.findDefinition) {
8069                     return mode.findDefinition(document, definitionParams.position);
8070                 }
8071             }
8072             return [];
8073         }), null, `Error while computing definitions for ${definitionParams.textDocument.uri}`, token);
8074     });
8075     connection.onReferences((referenceParams, token) => {
8076         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8077             const document = documents.get(referenceParams.textDocument.uri);
8078             if (document) {
8079                 const mode = languageModes.getModeAtPosition(document, referenceParams.position);
8080                 if (mode && mode.findReferences) {
8081                     return mode.findReferences(document, referenceParams.position);
8082                 }
8083             }
8084             return [];
8085         }), [], `Error while computing references for ${referenceParams.textDocument.uri}`, token);
8086     });
8087     connection.onSignatureHelp((signatureHelpParms, token) => {
8088         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8089             const document = documents.get(signatureHelpParms.textDocument.uri);
8090             if (document) {
8091                 const mode = languageModes.getModeAtPosition(document, signatureHelpParms.position);
8092                 if (mode && mode.doSignatureHelp) {
8093                     return mode.doSignatureHelp(document, signatureHelpParms.position);
8094                 }
8095             }
8096             return null;
8097         }), null, `Error while computing signature help for ${signatureHelpParms.textDocument.uri}`, token);
8098     });
8099     connection.onDocumentRangeFormatting((formatParams, token) => __awaiter(this, void 0, void 0, function* () {
8100         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8101             const document = documents.get(formatParams.textDocument.uri);
8102             if (document) {
8103                 let settings = yield getDocumentSettings(document, () => true);
8104                 if (!settings) {
8105                     settings = globalSettings;
8106                 }
8107                 const unformattedTags = settings && settings.html && settings.html.format && settings.html.format.unformatted || '';
8108                 const enabledModes = { css: !unformattedTags.match(/\bstyle\b/), javascript: !unformattedTags.match(/\bscript\b/) };
8109                 return formatting_1.format(languageModes, document, formatParams.range, formatParams.options, settings, enabledModes);
8110             }
8111             return [];
8112         }), [], `Error while formatting range for ${formatParams.textDocument.uri}`, token);
8113     }));
8114     connection.onDocumentLinks((documentLinkParam, token) => {
8115         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8116             const document = documents.get(documentLinkParam.textDocument.uri);
8117             const links = [];
8118             if (document) {
8119                 const documentContext = documentContext_1.getDocumentContext(document.uri, workspaceFolders);
8120                 for (const m of languageModes.getAllModesInDocument(document)) {
8121                     if (m.findDocumentLinks) {
8122                         arrays_1.pushAll(links, yield m.findDocumentLinks(document, documentContext));
8123                     }
8124                 }
8125             }
8126             return links;
8127         }), [], `Error while document links for ${documentLinkParam.textDocument.uri}`, token);
8128     });
8129     connection.onDocumentSymbol((documentSymbolParms, token) => {
8130         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8131             const document = documents.get(documentSymbolParms.textDocument.uri);
8132             const symbols = [];
8133             if (document) {
8134                 for (const m of languageModes.getAllModesInDocument(document)) {
8135                     if (m.findDocumentSymbols) {
8136                         arrays_1.pushAll(symbols, yield m.findDocumentSymbols(document));
8137                     }
8138                 }
8139             }
8140             return symbols;
8141         }), [], `Error while computing document symbols for ${documentSymbolParms.textDocument.uri}`, token);
8142     });
8143     connection.onRequest(vscode_languageserver_1.DocumentColorRequest.type, (params, token) => {
8144         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8145             const infos = [];
8146             const document = documents.get(params.textDocument.uri);
8147             if (document) {
8148                 for (const m of languageModes.getAllModesInDocument(document)) {
8149                     if (m.findDocumentColors) {
8150                         arrays_1.pushAll(infos, yield m.findDocumentColors(document));
8151                     }
8152                 }
8153             }
8154             return infos;
8155         }), [], `Error while computing document colors for ${params.textDocument.uri}`, token);
8156     });
8157     connection.onRequest(vscode_languageserver_1.ColorPresentationRequest.type, (params, token) => {
8158         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8159             const document = documents.get(params.textDocument.uri);
8160             if (document) {
8161                 const mode = languageModes.getModeAtPosition(document, params.range.start);
8162                 if (mode && mode.getColorPresentations) {
8163                     return mode.getColorPresentations(document, params.color, params.range);
8164                 }
8165             }
8166             return [];
8167         }), [], `Error while computing color presentations for ${params.textDocument.uri}`, token);
8168     });
8169     connection.onRequest(TagCloseRequest.type, (params, token) => {
8170         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8171             const document = documents.get(params.textDocument.uri);
8172             if (document) {
8173                 const pos = params.position;
8174                 if (pos.character > 0) {
8175                     const mode = languageModes.getModeAtPosition(document, languageModes_1.Position.create(pos.line, pos.character - 1));
8176                     if (mode && mode.doAutoClose) {
8177                         return mode.doAutoClose(document, pos);
8178                     }
8179                 }
8180             }
8181             return null;
8182         }), null, `Error while computing tag close actions for ${params.textDocument.uri}`, token);
8183     });
8184     connection.onFoldingRanges((params, token) => {
8185         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8186             const document = documents.get(params.textDocument.uri);
8187             if (document) {
8188                 return htmlFolding_1.getFoldingRanges(languageModes, document, foldingRangeLimit, token);
8189             }
8190             return null;
8191         }), null, `Error while computing folding regions for ${params.textDocument.uri}`, token);
8192     });
8193     connection.onSelectionRanges((params, token) => {
8194         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8195             const document = documents.get(params.textDocument.uri);
8196             if (document) {
8197                 return selectionRanges_1.getSelectionRanges(languageModes, document, params.positions);
8198             }
8199             return [];
8200         }), [], `Error while computing selection ranges for ${params.textDocument.uri}`, token);
8201     });
8202     connection.onRenameRequest((params, token) => {
8203         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8204             const document = documents.get(params.textDocument.uri);
8205             const position = params.position;
8206             if (document) {
8207                 const htmlMode = languageModes.getMode('html');
8208                 if (htmlMode && htmlMode.doRename) {
8209                     return htmlMode.doRename(document, position, params.newName);
8210                 }
8211             }
8212             return null;
8213         }), null, `Error while computing rename for ${params.textDocument.uri}`, token);
8214     });
8215     connection.onRequest(OnTypeRenameRequest.type, (params, token) => {
8216         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8217             const document = documents.get(params.textDocument.uri);
8218             if (document) {
8219                 const pos = params.position;
8220                 if (pos.character > 0) {
8221                     const mode = languageModes.getModeAtPosition(document, languageModes_1.Position.create(pos.line, pos.character - 1));
8222                     if (mode && mode.doOnTypeRename) {
8223                         return mode.doOnTypeRename(document, pos);
8224                     }
8225                 }
8226             }
8227             return null;
8228         }), null, `Error while computing synced regions for ${params.textDocument.uri}`, token);
8229     });
8230     let semanticTokensProvider;
8231     function getSemanticTokenProvider() {
8232         if (!semanticTokensProvider) {
8233             semanticTokensProvider = semanticTokens_1.newSemanticTokenProvider(languageModes);
8234         }
8235         return semanticTokensProvider;
8236     }
8237     connection.onRequest(SemanticTokenRequest.type, (params, token) => {
8238         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8239             const document = documents.get(params.textDocument.uri);
8240             if (document) {
8241                 return getSemanticTokenProvider().getSemanticTokens(document, params.ranges);
8242             }
8243             return null;
8244         }), null, `Error while computing semantic tokens for ${params.textDocument.uri}`, token);
8245     });
8246     connection.onRequest(SemanticTokenLegendRequest.type, (_params, token) => {
8247         return runner_1.runSafe(() => __awaiter(this, void 0, void 0, function* () {
8248             return getSemanticTokenProvider().legend;
8249         }), null, `Error while computing semantic tokens legend`, token);
8250     });
8251     connection.onNotification(CustomDataChangedNotification.type, dataPaths => {
8252         customData_1.fetchHTMLDataProviders(dataPaths, requestService).then(dataProviders => {
8253             languageModes.updateDataProviders(dataProviders);
8254         });
8255     });
8256     // Listen on the connection
8257     connection.listen();
8258 }
8259 exports.startServer = startServer;
8260
8261
8262 /***/ }),
8263 /* 61 */
8264 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
8265
8266
8267 /*---------------------------------------------------------------------------------------------
8268  *  Copyright (c) Microsoft Corporation. All rights reserved.
8269  *  Licensed under the MIT License. See License.txt in the project root for license information.
8270  *--------------------------------------------------------------------------------------------*/
8271 var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8272     if (k2 === undefined) k2 = k;
8273     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
8274 }) : (function(o, m, k, k2) {
8275     if (k2 === undefined) k2 = k;
8276     o[k2] = m[k];
8277 }));
8278 var __exportStar = (this && this.__exportStar) || function(m, exports) {
8279     for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
8280 };
8281 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8282     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8283     return new (P || (P = Promise))(function (resolve, reject) {
8284         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
8285         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
8286         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8287         step((generator = generator.apply(thisArg, _arguments || [])).next());
8288     });
8289 };
8290 Object.defineProperty(exports, "__esModule", ({ value: true }));
8291 exports.getLanguageModes = void 0;
8292 const vscode_css_languageservice_1 = __webpack_require__(62);
8293 const vscode_html_languageservice_1 = __webpack_require__(106);
8294 const languageModelCache_1 = __webpack_require__(135);
8295 const cssMode_1 = __webpack_require__(136);
8296 const embeddedSupport_1 = __webpack_require__(137);
8297 const htmlMode_1 = __webpack_require__(138);
8298 const javascriptMode_1 = __webpack_require__(139);
8299 __exportStar(__webpack_require__(106), exports);
8300 function getLanguageModes(supportedLanguages, workspace, clientCapabilities, requestService) {
8301     const htmlLanguageService = vscode_html_languageservice_1.getLanguageService({ clientCapabilities, fileSystemProvider: requestService });
8302     const cssLanguageService = vscode_css_languageservice_1.getCSSLanguageService({ clientCapabilities, fileSystemProvider: requestService });
8303     let documentRegions = languageModelCache_1.getLanguageModelCache(10, 60, document => embeddedSupport_1.getDocumentRegions(htmlLanguageService, document));
8304     let modelCaches = [];
8305     modelCaches.push(documentRegions);
8306     let modes = Object.create(null);
8307     modes['html'] = htmlMode_1.getHTMLMode(htmlLanguageService, workspace);
8308     if (supportedLanguages['css']) {
8309         modes['css'] = cssMode_1.getCSSMode(cssLanguageService, documentRegions, workspace);
8310     }
8311     if (supportedLanguages['javascript']) {
8312         modes['javascript'] = javascriptMode_1.getJavaScriptMode(documentRegions, 'javascript', workspace);
8313         modes['typescript'] = javascriptMode_1.getJavaScriptMode(documentRegions, 'typescript', workspace);
8314     }
8315     return {
8316         updateDataProviders(dataProviders) {
8317             return __awaiter(this, void 0, void 0, function* () {
8318                 htmlLanguageService.setDataProviders(true, dataProviders);
8319             });
8320         },
8321         getModeAtPosition(document, position) {
8322             let languageId = documentRegions.get(document).getLanguageAtPosition(position);
8323             if (languageId) {
8324                 return modes[languageId];
8325             }
8326             return undefined;
8327         },
8328         getModesInRange(document, range) {
8329             return documentRegions.get(document).getLanguageRanges(range).map(r => {
8330                 return {
8331                     start: r.start,
8332                     end: r.end,
8333                     mode: r.languageId && modes[r.languageId],
8334                     attributeValue: r.attributeValue
8335                 };
8336             });
8337         },
8338         getAllModesInDocument(document) {
8339             let result = [];
8340             for (let languageId of documentRegions.get(document).getLanguagesInDocument()) {
8341                 let mode = modes[languageId];
8342                 if (mode) {
8343                     result.push(mode);
8344                 }
8345             }
8346             return result;
8347         },
8348         getAllModes() {
8349             let result = [];
8350             for (let languageId in modes) {
8351                 let mode = modes[languageId];
8352                 if (mode) {
8353                     result.push(mode);
8354                 }
8355             }
8356             return result;
8357         },
8358         getMode(languageId) {
8359             return modes[languageId];
8360         },
8361         onDocumentRemoved(document) {
8362             modelCaches.forEach(mc => mc.onDocumentRemoved(document));
8363             for (let mode in modes) {
8364                 modes[mode].onDocumentRemoved(document);
8365             }
8366         },
8367         dispose() {
8368             modelCaches.forEach(mc => mc.dispose());
8369             modelCaches = [];
8370             for (let mode in modes) {
8371                 modes[mode].dispose();
8372             }
8373             modes = {};
8374         }
8375     };
8376 }
8377 exports.getLanguageModes = getLanguageModes;
8378
8379
8380 /***/ }),
8381 /* 62 */
8382 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8383
8384 __webpack_require__.r(__webpack_exports__);
8385 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8386 /* harmony export */   "ClientCapabilities": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.ClientCapabilities,
8387 /* harmony export */   "CodeAction": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CodeAction,
8388 /* harmony export */   "CodeActionContext": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CodeActionContext,
8389 /* harmony export */   "CodeActionKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CodeActionKind,
8390 /* harmony export */   "CodeLens": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CodeLens,
8391 /* harmony export */   "Color": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Color,
8392 /* harmony export */   "ColorInformation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.ColorInformation,
8393 /* harmony export */   "ColorPresentation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.ColorPresentation,
8394 /* harmony export */   "Command": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Command,
8395 /* harmony export */   "CompletionItem": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CompletionItem,
8396 /* harmony export */   "CompletionItemKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CompletionItemKind,
8397 /* harmony export */   "CompletionItemTag": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CompletionItemTag,
8398 /* harmony export */   "CompletionList": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CompletionList,
8399 /* harmony export */   "CreateFile": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.CreateFile,
8400 /* harmony export */   "DeleteFile": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DeleteFile,
8401 /* harmony export */   "Diagnostic": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Diagnostic,
8402 /* harmony export */   "DiagnosticCode": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DiagnosticCode,
8403 /* harmony export */   "DiagnosticRelatedInformation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DiagnosticRelatedInformation,
8404 /* harmony export */   "DiagnosticSeverity": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DiagnosticSeverity,
8405 /* harmony export */   "DiagnosticTag": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DiagnosticTag,
8406 /* harmony export */   "DocumentHighlight": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DocumentHighlight,
8407 /* harmony export */   "DocumentHighlightKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DocumentHighlightKind,
8408 /* harmony export */   "DocumentLink": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DocumentLink,
8409 /* harmony export */   "DocumentSymbol": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.DocumentSymbol,
8410 /* harmony export */   "EOL": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.EOL,
8411 /* harmony export */   "FileType": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.FileType,
8412 /* harmony export */   "FoldingRange": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.FoldingRange,
8413 /* harmony export */   "FoldingRangeKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.FoldingRangeKind,
8414 /* harmony export */   "FormattingOptions": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.FormattingOptions,
8415 /* harmony export */   "Hover": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Hover,
8416 /* harmony export */   "InsertReplaceEdit": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.InsertReplaceEdit,
8417 /* harmony export */   "InsertTextFormat": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.InsertTextFormat,
8418 /* harmony export */   "Location": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Location,
8419 /* harmony export */   "LocationLink": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.LocationLink,
8420 /* harmony export */   "MarkedString": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.MarkedString,
8421 /* harmony export */   "MarkupContent": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.MarkupContent,
8422 /* harmony export */   "MarkupKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.MarkupKind,
8423 /* harmony export */   "ParameterInformation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.ParameterInformation,
8424 /* harmony export */   "Position": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Position,
8425 /* harmony export */   "Range": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.Range,
8426 /* harmony export */   "RenameFile": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.RenameFile,
8427 /* harmony export */   "SelectionRange": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.SelectionRange,
8428 /* harmony export */   "SignatureInformation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.SignatureInformation,
8429 /* harmony export */   "SymbolInformation": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.SymbolInformation,
8430 /* harmony export */   "SymbolKind": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.SymbolKind,
8431 /* harmony export */   "SymbolTag": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.SymbolTag,
8432 /* harmony export */   "TextDocument": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.TextDocument,
8433 /* harmony export */   "TextDocumentEdit": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.TextDocumentEdit,
8434 /* harmony export */   "TextDocumentIdentifier": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.TextDocumentIdentifier,
8435 /* harmony export */   "TextDocumentItem": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.TextDocumentItem,
8436 /* harmony export */   "TextEdit": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.TextEdit,
8437 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.VersionedTextDocumentIdentifier,
8438 /* harmony export */   "WorkspaceChange": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.WorkspaceChange,
8439 /* harmony export */   "WorkspaceEdit": () => /* reexport safe */ _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__.WorkspaceEdit,
8440 /* harmony export */   "getDefaultCSSDataProvider": () => /* binding */ getDefaultCSSDataProvider,
8441 /* harmony export */   "newCSSDataProvider": () => /* binding */ newCSSDataProvider,
8442 /* harmony export */   "getCSSLanguageService": () => /* binding */ getCSSLanguageService,
8443 /* harmony export */   "getSCSSLanguageService": () => /* binding */ getSCSSLanguageService,
8444 /* harmony export */   "getLESSLanguageService": () => /* binding */ getLESSLanguageService
8445 /* harmony export */ });
8446 /* harmony import */ var _parser_cssParser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63);
8447 /* harmony import */ var _services_cssCompletion__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(76);
8448 /* harmony import */ var _services_cssHover__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(85);
8449 /* harmony import */ var _services_cssNavigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(87);
8450 /* harmony import */ var _services_cssCodeActions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(88);
8451 /* harmony import */ var _services_cssValidation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(90);
8452 /* harmony import */ var _parser_scssParser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(93);
8453 /* harmony import */ var _services_scssCompletion__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(96);
8454 /* harmony import */ var _parser_lessParser__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(97);
8455 /* harmony import */ var _services_lessCompletion__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(99);
8456 /* harmony import */ var _services_cssFolding__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(100);
8457 /* harmony import */ var _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(101);
8458 /* harmony import */ var _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(103);
8459 /* harmony import */ var _services_cssSelectionRange__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(104);
8460 /* harmony import */ var _services_scssNavigation__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(105);
8461 /* harmony import */ var _data_webCustomData__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(102);
8462 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(79);
8463 /*---------------------------------------------------------------------------------------------
8464  *  Copyright (c) Microsoft Corporation. All rights reserved.
8465  *  Licensed under the MIT License. See License.txt in the project root for license information.
8466  *--------------------------------------------------------------------------------------------*/
8467
8468
8469
8470
8471
8472
8473
8474
8475
8476
8477
8478
8479
8480
8481
8482
8483
8484
8485 function getDefaultCSSDataProvider() {
8486     return newCSSDataProvider(_data_webCustomData__WEBPACK_IMPORTED_MODULE_15__.cssData);
8487 }
8488 function newCSSDataProvider(data) {
8489     return new _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_12__.CSSDataProvider(data);
8490 }
8491 function createFacade(parser, completion, hover, navigation, codeActions, validation, cssDataManager) {
8492     return {
8493         configure: function (settings) {
8494             validation.configure(settings);
8495             completion.configure(settings);
8496         },
8497         setDataProviders: cssDataManager.setDataProviders.bind(cssDataManager),
8498         doValidation: validation.doValidation.bind(validation),
8499         parseStylesheet: parser.parseStylesheet.bind(parser),
8500         doComplete: completion.doComplete.bind(completion),
8501         doComplete2: completion.doComplete2.bind(completion),
8502         setCompletionParticipants: completion.setCompletionParticipants.bind(completion),
8503         doHover: hover.doHover.bind(hover),
8504         findDefinition: navigation.findDefinition.bind(navigation),
8505         findReferences: navigation.findReferences.bind(navigation),
8506         findDocumentHighlights: navigation.findDocumentHighlights.bind(navigation),
8507         findDocumentLinks: navigation.findDocumentLinks.bind(navigation),
8508         findDocumentLinks2: navigation.findDocumentLinks2.bind(navigation),
8509         findDocumentSymbols: navigation.findDocumentSymbols.bind(navigation),
8510         doCodeActions: codeActions.doCodeActions.bind(codeActions),
8511         doCodeActions2: codeActions.doCodeActions2.bind(codeActions),
8512         findColorSymbols: function (d, s) { return navigation.findDocumentColors(d, s).map(function (s) { return s.range; }); },
8513         findDocumentColors: navigation.findDocumentColors.bind(navigation),
8514         getColorPresentations: navigation.getColorPresentations.bind(navigation),
8515         doRename: navigation.doRename.bind(navigation),
8516         getFoldingRanges: _services_cssFolding__WEBPACK_IMPORTED_MODULE_10__.getFoldingRanges,
8517         getSelectionRanges: _services_cssSelectionRange__WEBPACK_IMPORTED_MODULE_13__.getSelectionRanges
8518     };
8519 }
8520 var defaultLanguageServiceOptions = {};
8521 function getCSSLanguageService(options) {
8522     if (options === void 0) { options = defaultLanguageServiceOptions; }
8523     var cssDataManager = new _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_11__.CSSDataManager(options);
8524     return createFacade(new _parser_cssParser__WEBPACK_IMPORTED_MODULE_0__.Parser(), new _services_cssCompletion__WEBPACK_IMPORTED_MODULE_1__.CSSCompletion(null, options, cssDataManager), new _services_cssHover__WEBPACK_IMPORTED_MODULE_2__.CSSHover(options && options.clientCapabilities, cssDataManager), new _services_cssNavigation__WEBPACK_IMPORTED_MODULE_3__.CSSNavigation(options && options.fileSystemProvider), new _services_cssCodeActions__WEBPACK_IMPORTED_MODULE_4__.CSSCodeActions(cssDataManager), new _services_cssValidation__WEBPACK_IMPORTED_MODULE_5__.CSSValidation(cssDataManager), cssDataManager);
8525 }
8526 function getSCSSLanguageService(options) {
8527     if (options === void 0) { options = defaultLanguageServiceOptions; }
8528     var cssDataManager = new _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_11__.CSSDataManager(options);
8529     return createFacade(new _parser_scssParser__WEBPACK_IMPORTED_MODULE_6__.SCSSParser(), new _services_scssCompletion__WEBPACK_IMPORTED_MODULE_7__.SCSSCompletion(options, cssDataManager), new _services_cssHover__WEBPACK_IMPORTED_MODULE_2__.CSSHover(options && options.clientCapabilities, cssDataManager), new _services_scssNavigation__WEBPACK_IMPORTED_MODULE_14__.SCSSNavigation(options && options.fileSystemProvider), new _services_cssCodeActions__WEBPACK_IMPORTED_MODULE_4__.CSSCodeActions(cssDataManager), new _services_cssValidation__WEBPACK_IMPORTED_MODULE_5__.CSSValidation(cssDataManager), cssDataManager);
8530 }
8531 function getLESSLanguageService(options) {
8532     if (options === void 0) { options = defaultLanguageServiceOptions; }
8533     var cssDataManager = new _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_11__.CSSDataManager(options);
8534     return createFacade(new _parser_lessParser__WEBPACK_IMPORTED_MODULE_8__.LESSParser(), new _services_lessCompletion__WEBPACK_IMPORTED_MODULE_9__.LESSCompletion(options, cssDataManager), new _services_cssHover__WEBPACK_IMPORTED_MODULE_2__.CSSHover(options && options.clientCapabilities, cssDataManager), new _services_cssNavigation__WEBPACK_IMPORTED_MODULE_3__.CSSNavigation(options && options.fileSystemProvider), new _services_cssCodeActions__WEBPACK_IMPORTED_MODULE_4__.CSSCodeActions(cssDataManager), new _services_cssValidation__WEBPACK_IMPORTED_MODULE_5__.CSSValidation(cssDataManager), cssDataManager);
8535 }
8536
8537
8538 /***/ }),
8539 /* 63 */
8540 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
8541
8542 __webpack_require__.r(__webpack_exports__);
8543 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8544 /* harmony export */   "Parser": () => /* binding */ Parser
8545 /* harmony export */ });
8546 /* harmony import */ var _cssScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64);
8547 /* harmony import */ var _cssNodes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65);
8548 /* harmony import */ var _cssErrors__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(67);
8549 /* harmony import */ var _languageFacts_facts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(71);
8550 /* harmony import */ var _utils_objects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75);
8551 /*---------------------------------------------------------------------------------------------
8552  *  Copyright (c) Microsoft Corporation. All rights reserved.
8553  *  Licensed under the MIT License. See License.txt in the project root for license information.
8554  *--------------------------------------------------------------------------------------------*/
8555
8556 var __spreadArrays = (undefined && undefined.__spreadArrays) || function () {
8557     for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
8558     for (var r = Array(s), k = 0, i = 0; i < il; i++)
8559         for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
8560             r[k] = a[j];
8561     return r;
8562 };
8563
8564
8565
8566
8567
8568 /// <summary>
8569 /// A parser for the css core specification. See for reference:
8570 /// https://www.w3.org/TR/CSS21/grammar.html
8571 /// http://www.w3.org/TR/CSS21/syndata.html#tokenization
8572 /// </summary>
8573 var Parser = /** @class */ (function () {
8574     function Parser(scnr) {
8575         if (scnr === void 0) { scnr = new _cssScanner__WEBPACK_IMPORTED_MODULE_0__.Scanner(); }
8576         this.keyframeRegex = /^@(\-(webkit|ms|moz|o)\-)?keyframes$/i;
8577         this.scanner = scnr;
8578         this.token = { type: _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF, offset: -1, len: 0, text: '' };
8579         this.prevToken = undefined;
8580     }
8581     Parser.prototype.peekIdent = function (text) {
8582         return _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident === this.token.type && text.length === this.token.text.length && text === this.token.text.toLowerCase();
8583     };
8584     Parser.prototype.peekKeyword = function (text) {
8585         return _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword === this.token.type && text.length === this.token.text.length && text === this.token.text.toLowerCase();
8586     };
8587     Parser.prototype.peekDelim = function (text) {
8588         return _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Delim === this.token.type && text === this.token.text;
8589     };
8590     Parser.prototype.peek = function (type) {
8591         return type === this.token.type;
8592     };
8593     Parser.prototype.peekRegExp = function (type, regEx) {
8594         if (type !== this.token.type) {
8595             return false;
8596         }
8597         return regEx.test(this.token.text);
8598     };
8599     Parser.prototype.hasWhitespace = function () {
8600         return !!this.prevToken && (this.prevToken.offset + this.prevToken.len !== this.token.offset);
8601     };
8602     Parser.prototype.consumeToken = function () {
8603         this.prevToken = this.token;
8604         this.token = this.scanner.scan();
8605     };
8606     Parser.prototype.mark = function () {
8607         return {
8608             prev: this.prevToken,
8609             curr: this.token,
8610             pos: this.scanner.pos()
8611         };
8612     };
8613     Parser.prototype.restoreAtMark = function (mark) {
8614         this.prevToken = mark.prev;
8615         this.token = mark.curr;
8616         this.scanner.goBackTo(mark.pos);
8617     };
8618     Parser.prototype.try = function (func) {
8619         var pos = this.mark();
8620         var node = func();
8621         if (!node) {
8622             this.restoreAtMark(pos);
8623             return null;
8624         }
8625         return node;
8626     };
8627     Parser.prototype.acceptOneKeyword = function (keywords) {
8628         if (_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword === this.token.type) {
8629             for (var _i = 0, keywords_1 = keywords; _i < keywords_1.length; _i++) {
8630                 var keyword = keywords_1[_i];
8631                 if (keyword.length === this.token.text.length && keyword === this.token.text.toLowerCase()) {
8632                     this.consumeToken();
8633                     return true;
8634                 }
8635             }
8636         }
8637         return false;
8638     };
8639     Parser.prototype.accept = function (type) {
8640         if (type === this.token.type) {
8641             this.consumeToken();
8642             return true;
8643         }
8644         return false;
8645     };
8646     Parser.prototype.acceptIdent = function (text) {
8647         if (this.peekIdent(text)) {
8648             this.consumeToken();
8649             return true;
8650         }
8651         return false;
8652     };
8653     Parser.prototype.acceptKeyword = function (text) {
8654         if (this.peekKeyword(text)) {
8655             this.consumeToken();
8656             return true;
8657         }
8658         return false;
8659     };
8660     Parser.prototype.acceptDelim = function (text) {
8661         if (this.peekDelim(text)) {
8662             this.consumeToken();
8663             return true;
8664         }
8665         return false;
8666     };
8667     Parser.prototype.acceptRegexp = function (regEx) {
8668         if (regEx.test(this.token.text)) {
8669             this.consumeToken();
8670             return true;
8671         }
8672         return false;
8673     };
8674     Parser.prototype._parseRegexp = function (regEx) {
8675         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Identifier);
8676         do { } while (this.acceptRegexp(regEx));
8677         return this.finish(node);
8678     };
8679     Parser.prototype.acceptUnquotedString = function () {
8680         var pos = this.scanner.pos();
8681         this.scanner.goBackTo(this.token.offset);
8682         var unquoted = this.scanner.scanUnquotedString();
8683         if (unquoted) {
8684             this.token = unquoted;
8685             this.consumeToken();
8686             return true;
8687         }
8688         this.scanner.goBackTo(pos);
8689         return false;
8690     };
8691     Parser.prototype.resync = function (resyncTokens, resyncStopTokens) {
8692         while (true) {
8693             if (resyncTokens && resyncTokens.indexOf(this.token.type) !== -1) {
8694                 this.consumeToken();
8695                 return true;
8696             }
8697             else if (resyncStopTokens && resyncStopTokens.indexOf(this.token.type) !== -1) {
8698                 return true;
8699             }
8700             else {
8701                 if (this.token.type === _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF) {
8702                     return false;
8703                 }
8704                 this.token = this.scanner.scan();
8705             }
8706         }
8707     };
8708     Parser.prototype.createNode = function (nodeType) {
8709         return new _cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node(this.token.offset, this.token.len, nodeType);
8710     };
8711     Parser.prototype.create = function (ctor) {
8712         return new ctor(this.token.offset, this.token.len);
8713     };
8714     Parser.prototype.finish = function (node, error, resyncTokens, resyncStopTokens) {
8715         // parseNumeric misuses error for boolean flagging (however the real error mustn't be a false)
8716         // + nodelist offsets mustn't be modified, because there is a offset hack in rulesets for smartselection
8717         if (!(node instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_1__.Nodelist)) {
8718             if (error) {
8719                 this.markError(node, error, resyncTokens, resyncStopTokens);
8720             }
8721             // set the node end position
8722             if (this.prevToken) {
8723                 // length with more elements belonging together
8724                 var prevEnd = this.prevToken.offset + this.prevToken.len;
8725                 node.length = prevEnd > node.offset ? prevEnd - node.offset : 0; // offset is taken from current token, end from previous: Use 0 for empty nodes
8726             }
8727         }
8728         return node;
8729     };
8730     Parser.prototype.markError = function (node, error, resyncTokens, resyncStopTokens) {
8731         if (this.token !== this.lastErrorToken) { // do not report twice on the same token
8732             node.addIssue(new _cssNodes__WEBPACK_IMPORTED_MODULE_1__.Marker(node, error, _cssNodes__WEBPACK_IMPORTED_MODULE_1__.Level.Error, undefined, this.token.offset, this.token.len));
8733             this.lastErrorToken = this.token;
8734         }
8735         if (resyncTokens || resyncStopTokens) {
8736             this.resync(resyncTokens, resyncStopTokens);
8737         }
8738     };
8739     Parser.prototype.parseStylesheet = function (textDocument) {
8740         var versionId = textDocument.version;
8741         var text = textDocument.getText();
8742         var textProvider = function (offset, length) {
8743             if (textDocument.version !== versionId) {
8744                 throw new Error('Underlying model has changed, AST is no longer valid');
8745             }
8746             return text.substr(offset, length);
8747         };
8748         return this.internalParse(text, this._parseStylesheet, textProvider);
8749     };
8750     Parser.prototype.internalParse = function (input, parseFunc, textProvider) {
8751         this.scanner.setSource(input);
8752         this.token = this.scanner.scan();
8753         var node = parseFunc.bind(this)();
8754         if (node) {
8755             if (textProvider) {
8756                 node.textProvider = textProvider;
8757             }
8758             else {
8759                 node.textProvider = function (offset, length) { return input.substr(offset, length); };
8760             }
8761         }
8762         return node;
8763     };
8764     Parser.prototype._parseStylesheet = function () {
8765         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Stylesheet);
8766         while (node.addChild(this._parseStylesheetStart())) {
8767             // Parse statements only valid at the beginning of stylesheets.
8768         }
8769         var inRecovery = false;
8770         do {
8771             var hasMatch = false;
8772             do {
8773                 hasMatch = false;
8774                 var statement = this._parseStylesheetStatement();
8775                 if (statement) {
8776                     node.addChild(statement);
8777                     hasMatch = true;
8778                     inRecovery = false;
8779                     if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF) && this._needsSemicolonAfter(statement) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
8780                         this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.SemiColonExpected);
8781                     }
8782                 }
8783                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CDO) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CDC)) {
8784                     // accept empty statements
8785                     hasMatch = true;
8786                     inRecovery = false;
8787                 }
8788             } while (hasMatch);
8789             if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF)) {
8790                 break;
8791             }
8792             if (!inRecovery) {
8793                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
8794                     this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.UnknownAtRule);
8795                 }
8796                 else {
8797                     this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RuleOrSelectorExpected);
8798                 }
8799                 inRecovery = true;
8800             }
8801             this.consumeToken();
8802         } while (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF));
8803         return this.finish(node);
8804     };
8805     Parser.prototype._parseStylesheetStart = function () {
8806         return this._parseCharset();
8807     };
8808     Parser.prototype._parseStylesheetStatement = function (isNested) {
8809         if (isNested === void 0) { isNested = false; }
8810         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
8811             return this._parseStylesheetAtStatement(isNested);
8812         }
8813         return this._parseRuleset(isNested);
8814     };
8815     Parser.prototype._parseStylesheetAtStatement = function (isNested) {
8816         if (isNested === void 0) { isNested = false; }
8817         return this._parseImport()
8818             || this._parseMedia(isNested)
8819             || this._parsePage()
8820             || this._parseFontFace()
8821             || this._parseKeyframe()
8822             || this._parseSupports(isNested)
8823             || this._parseViewPort()
8824             || this._parseNamespace()
8825             || this._parseDocument()
8826             || this._parseUnknownAtRule();
8827     };
8828     Parser.prototype._tryParseRuleset = function (isNested) {
8829         var mark = this.mark();
8830         if (this._parseSelector(isNested)) {
8831             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma) && this._parseSelector(isNested)) {
8832                 // loop
8833             }
8834             if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL)) {
8835                 this.restoreAtMark(mark);
8836                 return this._parseRuleset(isNested);
8837             }
8838         }
8839         this.restoreAtMark(mark);
8840         return null;
8841     };
8842     Parser.prototype._parseRuleset = function (isNested) {
8843         if (isNested === void 0) { isNested = false; }
8844         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.RuleSet);
8845         var selectors = node.getSelectors();
8846         if (!selectors.addChild(this._parseSelector(isNested))) {
8847             return null;
8848         }
8849         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
8850             if (!selectors.addChild(this._parseSelector(isNested))) {
8851                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.SelectorExpected);
8852             }
8853         }
8854         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
8855     };
8856     Parser.prototype._parseRuleSetDeclarationAtStatement = function () {
8857         return this._parseAtApply()
8858             || this._parseUnknownAtRule();
8859     };
8860     Parser.prototype._parseRuleSetDeclaration = function () {
8861         // https://www.w3.org/TR/css-syntax-3/#consume-a-list-of-declarations0
8862         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
8863             return this._parseRuleSetDeclarationAtStatement();
8864         }
8865         return this._tryParseCustomPropertyDeclaration()
8866             || this._parseDeclaration();
8867     };
8868     /**
8869      * Parses declarations like:
8870      *   @apply --my-theme;
8871      *
8872      * Follows https://tabatkins.github.io/specs/css-apply-rule/#using
8873      */
8874     Parser.prototype._parseAtApply = function () {
8875         if (!this.peekKeyword('@apply')) {
8876             return null;
8877         }
8878         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.AtApplyRule);
8879         this.consumeToken();
8880         if (!node.setIdentifier(this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_1__.ReferenceType.Variable]))) {
8881             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
8882         }
8883         return this.finish(node);
8884     };
8885     Parser.prototype._needsSemicolonAfter = function (node) {
8886         switch (node.type) {
8887             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Keyframe:
8888             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.ViewPort:
8889             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Media:
8890             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Ruleset:
8891             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Namespace:
8892             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.If:
8893             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.For:
8894             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Each:
8895             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.While:
8896             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.MixinDeclaration:
8897             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.FunctionDeclaration:
8898             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.MixinContentDeclaration:
8899                 return false;
8900             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.ExtendsReference:
8901             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.MixinContentReference:
8902             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.ReturnStatement:
8903             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.MediaQuery:
8904             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Debug:
8905             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Import:
8906             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.AtApplyRule:
8907             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.CustomPropertyDeclaration:
8908                 return true;
8909             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.VariableDeclaration:
8910                 return node.needsSemicolon;
8911             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.MixinReference:
8912                 return !node.getContent();
8913             case _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Declaration:
8914                 return !node.getNestedProperties();
8915         }
8916         return false;
8917     };
8918     Parser.prototype._parseDeclarations = function (parseDeclaration) {
8919         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Declarations);
8920         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL)) {
8921             return null;
8922         }
8923         var decl = parseDeclaration();
8924         while (node.addChild(decl)) {
8925             if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR)) {
8926                 break;
8927             }
8928             if (this._needsSemicolonAfter(decl) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
8929                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.SemiColonExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon, _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR]);
8930             }
8931             // We accepted semicolon token. Link it to declaration.
8932             if (decl && this.prevToken && this.prevToken.type === _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon) {
8933                 decl.semicolonPosition = this.prevToken.offset;
8934             }
8935             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
8936                 // accept empty statements
8937             }
8938             decl = parseDeclaration();
8939         }
8940         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR)) {
8941             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightCurlyExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR, _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon]);
8942         }
8943         return this.finish(node);
8944     };
8945     Parser.prototype._parseBody = function (node, parseDeclaration) {
8946         if (!node.setDeclarations(this._parseDeclarations(parseDeclaration))) {
8947             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftCurlyExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR, _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon]);
8948         }
8949         return this.finish(node);
8950     };
8951     Parser.prototype._parseSelector = function (isNested) {
8952         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Selector);
8953         var hasContent = false;
8954         if (isNested) {
8955             // nested selectors can start with a combinator
8956             hasContent = node.addChild(this._parseCombinator());
8957         }
8958         while (node.addChild(this._parseSimpleSelector())) {
8959             hasContent = true;
8960             node.addChild(this._parseCombinator()); // optional
8961         }
8962         return hasContent ? this.finish(node) : null;
8963     };
8964     Parser.prototype._parseDeclaration = function (resyncStopTokens) {
8965         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Declaration);
8966         if (!node.setProperty(this._parseProperty())) {
8967             return null;
8968         }
8969         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
8970             var stopTokens = resyncStopTokens ? __spreadArrays(resyncStopTokens, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon]) : [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon];
8971             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.ColonExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon], stopTokens);
8972         }
8973         if (this.prevToken) {
8974             node.colonPosition = this.prevToken.offset;
8975         }
8976         if (!node.setValue(this._parseExpr())) {
8977             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.PropertyValueExpected);
8978         }
8979         node.addChild(this._parsePrio());
8980         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
8981             node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
8982         }
8983         return this.finish(node);
8984     };
8985     Parser.prototype._tryParseCustomPropertyDeclaration = function () {
8986         if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident, /^--/)) {
8987             return null;
8988         }
8989         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.CustomPropertyDeclaration);
8990         if (!node.setProperty(this._parseProperty())) {
8991             return null;
8992         }
8993         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
8994             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.ColonExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon]);
8995         }
8996         if (this.prevToken) {
8997             node.colonPosition = this.prevToken.offset;
8998         }
8999         var mark = this.mark();
9000         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL)) {
9001             // try to parse it as nested declaration
9002             var propertySet = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.CustomPropertySet);
9003             var declarations = this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));
9004             if (propertySet.setDeclarations(declarations) && !declarations.isErroneous(true)) {
9005                 propertySet.addChild(this._parsePrio());
9006                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
9007                     this.finish(propertySet);
9008                     node.setPropertySet(propertySet);
9009                     node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
9010                     return this.finish(node);
9011                 }
9012             }
9013             this.restoreAtMark(mark);
9014         }
9015         // try tp parse as expression
9016         var expression = this._parseExpr();
9017         if (expression && !expression.isErroneous(true)) {
9018             this._parsePrio();
9019             if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
9020                 node.setValue(expression);
9021                 node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
9022                 return this.finish(node);
9023             }
9024         }
9025         this.restoreAtMark(mark);
9026         node.addChild(this._parseCustomPropertyValue());
9027         node.addChild(this._parsePrio());
9028         if ((0,_utils_objects__WEBPACK_IMPORTED_MODULE_4__.isDefined)(node.colonPosition) && this.token.offset === node.colonPosition + 1) {
9029             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.PropertyValueExpected);
9030         }
9031         return this.finish(node);
9032     };
9033     /**
9034      * Parse custom property values.
9035      *
9036      * Based on https://www.w3.org/TR/css-variables/#syntax
9037      *
9038      * This code is somewhat unusual, as the allowed syntax is incredibly broad,
9039      * parsing almost any sequence of tokens, save for a small set of exceptions.
9040      * Unbalanced delimitors, invalid tokens, and declaration
9041      * terminators like semicolons and !important directives (when not inside
9042      * of delimitors).
9043      */
9044     Parser.prototype._parseCustomPropertyValue = function () {
9045         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9046         var isTopLevel = function () { return curlyDepth === 0 && parensDepth === 0 && bracketsDepth === 0; };
9047         var curlyDepth = 0;
9048         var parensDepth = 0;
9049         var bracketsDepth = 0;
9050         done: while (true) {
9051             switch (this.token.type) {
9052                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon:
9053                     // A semicolon only ends things if we're not inside a delimitor.
9054                     if (isTopLevel()) {
9055                         break done;
9056                     }
9057                     break;
9058                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Exclamation:
9059                     // An exclamation ends the value if we're not inside delims.
9060                     if (isTopLevel()) {
9061                         break done;
9062                     }
9063                     break;
9064                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL:
9065                     curlyDepth++;
9066                     break;
9067                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR:
9068                     curlyDepth--;
9069                     if (curlyDepth < 0) {
9070                         // The property value has been terminated without a semicolon, and
9071                         // this is the last declaration in the ruleset.
9072                         if (parensDepth === 0 && bracketsDepth === 0) {
9073                             break done;
9074                         }
9075                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftCurlyExpected);
9076                     }
9077                     break;
9078                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL:
9079                     parensDepth++;
9080                     break;
9081                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR:
9082                     parensDepth--;
9083                     if (parensDepth < 0) {
9084                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftParenthesisExpected);
9085                     }
9086                     break;
9087                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketL:
9088                     bracketsDepth++;
9089                     break;
9090                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketR:
9091                     bracketsDepth--;
9092                     if (bracketsDepth < 0) {
9093                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftSquareBracketExpected);
9094                     }
9095                     break;
9096                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BadString: // fall through
9097                     break done;
9098                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF:
9099                     // We shouldn't have reached the end of input, something is
9100                     // unterminated.
9101                     var error = _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightCurlyExpected;
9102                     if (bracketsDepth > 0) {
9103                         error = _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightSquareBracketExpected;
9104                     }
9105                     else if (parensDepth > 0) {
9106                         error = _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected;
9107                     }
9108                     return this.finish(node, error);
9109             }
9110             this.consumeToken();
9111         }
9112         return this.finish(node);
9113     };
9114     Parser.prototype._tryToParseDeclaration = function () {
9115         var mark = this.mark();
9116         if (this._parseProperty() && this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9117             // looks like a declaration, go ahead
9118             this.restoreAtMark(mark);
9119             return this._parseDeclaration();
9120         }
9121         this.restoreAtMark(mark);
9122         return null;
9123     };
9124     Parser.prototype._parseProperty = function () {
9125         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Property);
9126         var mark = this.mark();
9127         if (this.acceptDelim('*') || this.acceptDelim('_')) {
9128             // support for  IE 5.x, 6 and 7 star hack: see http://en.wikipedia.org/wiki/CSS_filter#Star_hack
9129             if (this.hasWhitespace()) {
9130                 this.restoreAtMark(mark);
9131                 return null;
9132             }
9133         }
9134         if (node.setIdentifier(this._parsePropertyIdentifier())) {
9135             return this.finish(node);
9136         }
9137         return null;
9138     };
9139     Parser.prototype._parsePropertyIdentifier = function () {
9140         return this._parseIdent();
9141     };
9142     Parser.prototype._parseCharset = function () {
9143         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Charset)) {
9144             return null;
9145         }
9146         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9147         this.consumeToken(); // charset
9148         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.String)) {
9149             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9150         }
9151         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
9152             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.SemiColonExpected);
9153         }
9154         return this.finish(node);
9155     };
9156     Parser.prototype._parseImport = function () {
9157         if (!this.peekKeyword('@import')) {
9158             return null;
9159         }
9160         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Import);
9161         this.consumeToken(); // @import
9162         if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {
9163             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.URIOrStringExpected);
9164         }
9165         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF)) {
9166             node.setMedialist(this._parseMediaQueryList());
9167         }
9168         return this.finish(node);
9169     };
9170     Parser.prototype._parseNamespace = function () {
9171         // http://www.w3.org/TR/css3-namespace/
9172         // namespace  : NAMESPACE_SYM S* [IDENT S*]? [STRING|URI] S* ';' S*
9173         if (!this.peekKeyword('@namespace')) {
9174             return null;
9175         }
9176         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Namespace);
9177         this.consumeToken(); // @namespace
9178         if (!node.addChild(this._parseURILiteral())) { // url literal also starts with ident
9179             node.addChild(this._parseIdent()); // optional prefix
9180             if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {
9181                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.URIExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon]);
9182             }
9183         }
9184         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon)) {
9185             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.SemiColonExpected);
9186         }
9187         return this.finish(node);
9188     };
9189     Parser.prototype._parseFontFace = function () {
9190         if (!this.peekKeyword('@font-face')) {
9191             return null;
9192         }
9193         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.FontFace);
9194         this.consumeToken(); // @font-face
9195         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
9196     };
9197     Parser.prototype._parseViewPort = function () {
9198         if (!this.peekKeyword('@-ms-viewport') &&
9199             !this.peekKeyword('@-o-viewport') &&
9200             !this.peekKeyword('@viewport')) {
9201             return null;
9202         }
9203         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.ViewPort);
9204         this.consumeToken(); // @-ms-viewport
9205         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
9206     };
9207     Parser.prototype._parseKeyframe = function () {
9208         if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword, this.keyframeRegex)) {
9209             return null;
9210         }
9211         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Keyframe);
9212         var atNode = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9213         this.consumeToken(); // atkeyword
9214         node.setKeyword(this.finish(atNode));
9215         if (atNode.matches('@-ms-keyframes')) { // -ms-keyframes never existed
9216             this.markError(atNode, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.UnknownKeyword);
9217         }
9218         if (!node.setIdentifier(this._parseKeyframeIdent())) {
9219             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR]);
9220         }
9221         return this._parseBody(node, this._parseKeyframeSelector.bind(this));
9222     };
9223     Parser.prototype._parseKeyframeIdent = function () {
9224         return this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_1__.ReferenceType.Keyframe]);
9225     };
9226     Parser.prototype._parseKeyframeSelector = function () {
9227         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.KeyframeSelector);
9228         if (!node.addChild(this._parseIdent()) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Percentage)) {
9229             return null;
9230         }
9231         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
9232             if (!node.addChild(this._parseIdent()) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Percentage)) {
9233                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.PercentageExpected);
9234             }
9235         }
9236         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
9237     };
9238     Parser.prototype._tryParseKeyframeSelector = function () {
9239         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.KeyframeSelector);
9240         var pos = this.mark();
9241         if (!node.addChild(this._parseIdent()) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Percentage)) {
9242             return null;
9243         }
9244         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
9245             if (!node.addChild(this._parseIdent()) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Percentage)) {
9246                 this.restoreAtMark(pos);
9247                 return null;
9248             }
9249         }
9250         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL)) {
9251             this.restoreAtMark(pos);
9252             return null;
9253         }
9254         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
9255     };
9256     Parser.prototype._parseSupports = function (isNested) {
9257         if (isNested === void 0) { isNested = false; }
9258         // SUPPORTS_SYM S* supports_condition '{' S* ruleset* '}' S*
9259         if (!this.peekKeyword('@supports')) {
9260             return null;
9261         }
9262         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Supports);
9263         this.consumeToken(); // @supports
9264         node.addChild(this._parseSupportsCondition());
9265         return this._parseBody(node, this._parseSupportsDeclaration.bind(this, isNested));
9266     };
9267     Parser.prototype._parseSupportsDeclaration = function (isNested) {
9268         if (isNested === void 0) { isNested = false; }
9269         if (isNested) {
9270             // if nested, the body can contain rulesets, but also declarations
9271             return this._tryParseRuleset(true)
9272                 || this._tryToParseDeclaration()
9273                 || this._parseStylesheetStatement(true);
9274         }
9275         return this._parseStylesheetStatement(false);
9276     };
9277     Parser.prototype._parseSupportsCondition = function () {
9278         // supports_condition : supports_negation | supports_conjunction | supports_disjunction | supports_condition_in_parens ;
9279         // supports_condition_in_parens: ( '(' S* supports_condition S* ')' ) | supports_declaration_condition | general_enclosed ;
9280         // supports_negation: NOT S+ supports_condition_in_parens ;
9281         // supports_conjunction: supports_condition_in_parens ( S+ AND S+ supports_condition_in_parens )+;
9282         // supports_disjunction: supports_condition_in_parens ( S+ OR S+ supports_condition_in_parens )+;
9283         // supports_declaration_condition: '(' S* declaration ')';
9284         // general_enclosed: ( FUNCTION | '(' ) ( any | unused )* ')' ;
9285         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.SupportsCondition);
9286         if (this.acceptIdent('not')) {
9287             node.addChild(this._parseSupportsConditionInParens());
9288         }
9289         else {
9290             node.addChild(this._parseSupportsConditionInParens());
9291             if (this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident, /^(and|or)$/i)) {
9292                 var text = this.token.text.toLowerCase();
9293                 while (this.acceptIdent(text)) {
9294                     node.addChild(this._parseSupportsConditionInParens());
9295                 }
9296             }
9297         }
9298         return this.finish(node);
9299     };
9300     Parser.prototype._parseSupportsConditionInParens = function () {
9301         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.SupportsCondition);
9302         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9303             if (this.prevToken) {
9304                 node.lParent = this.prevToken.offset;
9305             }
9306             if (!node.addChild(this._tryToParseDeclaration())) {
9307                 if (!this._parseSupportsCondition()) {
9308                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.ConditionExpected);
9309                 }
9310             }
9311             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9312                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR], []);
9313             }
9314             if (this.prevToken) {
9315                 node.rParent = this.prevToken.offset;
9316             }
9317             return this.finish(node);
9318         }
9319         else if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident)) {
9320             var pos = this.mark();
9321             this.consumeToken();
9322             if (!this.hasWhitespace() && this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9323                 var openParentCount = 1;
9324                 while (this.token.type !== _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF && openParentCount !== 0) {
9325                     if (this.token.type === _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL) {
9326                         openParentCount++;
9327                     }
9328                     else if (this.token.type === _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR) {
9329                         openParentCount--;
9330                     }
9331                     this.consumeToken();
9332                 }
9333                 return this.finish(node);
9334             }
9335             else {
9336                 this.restoreAtMark(pos);
9337             }
9338         }
9339         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftParenthesisExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL]);
9340     };
9341     Parser.prototype._parseMediaDeclaration = function (isNested) {
9342         if (isNested === void 0) { isNested = false; }
9343         if (isNested) {
9344             // if nested, the body can contain rulesets, but also declarations
9345             return this._tryParseRuleset(true)
9346                 || this._tryToParseDeclaration()
9347                 || this._parseStylesheetStatement(true);
9348         }
9349         return this._parseStylesheetStatement(false);
9350     };
9351     Parser.prototype._parseMedia = function (isNested) {
9352         if (isNested === void 0) { isNested = false; }
9353         // MEDIA_SYM S* media_query_list '{' S* ruleset* '}' S*
9354         // media_query_list : S* [media_query [ ',' S* media_query ]* ]?
9355         if (!this.peekKeyword('@media')) {
9356             return null;
9357         }
9358         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Media);
9359         this.consumeToken(); // @media
9360         if (!node.addChild(this._parseMediaQueryList())) {
9361             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.MediaQueryExpected);
9362         }
9363         return this._parseBody(node, this._parseMediaDeclaration.bind(this, isNested));
9364     };
9365     Parser.prototype._parseMediaQueryList = function () {
9366         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Medialist);
9367         if (!node.addChild(this._parseMediaQuery([_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL]))) {
9368             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.MediaQueryExpected);
9369         }
9370         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
9371             if (!node.addChild(this._parseMediaQuery([_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL]))) {
9372                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.MediaQueryExpected);
9373             }
9374         }
9375         return this.finish(node);
9376     };
9377     Parser.prototype._parseMediaQuery = function (resyncStopToken) {
9378         // http://www.w3.org/TR/css3-mediaqueries/
9379         // media_query : [ONLY | NOT]? S* IDENT S* [ AND S* expression ]* | expression [ AND S* expression ]*
9380         // expression : '(' S* IDENT S* [ ':' S* expr ]? ')' S*
9381         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.MediaQuery);
9382         var parseExpression = true;
9383         var hasContent = false;
9384         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9385             if (this.acceptIdent('only') || this.acceptIdent('not')) {
9386                 // optional
9387             }
9388             if (!node.addChild(this._parseIdent())) {
9389                 return null;
9390             }
9391             hasContent = true;
9392             parseExpression = this.acceptIdent('and');
9393         }
9394         while (parseExpression) {
9395             // Allow short-circuting for other language constructs.
9396             if (node.addChild(this._parseMediaContentStart())) {
9397                 parseExpression = this.acceptIdent('and');
9398                 continue;
9399             }
9400             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9401                 if (hasContent) {
9402                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftParenthesisExpected, [], resyncStopToken);
9403                 }
9404                 return null;
9405             }
9406             if (!node.addChild(this._parseMediaFeatureName())) {
9407                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected, [], resyncStopToken);
9408             }
9409             if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9410                 if (!node.addChild(this._parseExpr())) {
9411                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.TermExpected, [], resyncStopToken);
9412                 }
9413             }
9414             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9415                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected, [], resyncStopToken);
9416             }
9417             parseExpression = this.acceptIdent('and');
9418         }
9419         return this.finish(node);
9420     };
9421     Parser.prototype._parseMediaContentStart = function () {
9422         return null;
9423     };
9424     Parser.prototype._parseMediaFeatureName = function () {
9425         return this._parseIdent();
9426     };
9427     Parser.prototype._parseMedium = function () {
9428         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9429         if (node.addChild(this._parseIdent())) {
9430             return this.finish(node);
9431         }
9432         else {
9433             return null;
9434         }
9435     };
9436     Parser.prototype._parsePageDeclaration = function () {
9437         return this._parsePageMarginBox() || this._parseRuleSetDeclaration();
9438     };
9439     Parser.prototype._parsePage = function () {
9440         // http://www.w3.org/TR/css3-page/
9441         // page_rule : PAGE_SYM S* page_selector_list '{' S* page_body '}' S*
9442         // page_body :  /* Can be empty */ declaration? [ ';' S* page_body ]? | page_margin_box page_body
9443         if (!this.peekKeyword('@page')) {
9444             return null;
9445         }
9446         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Page);
9447         this.consumeToken();
9448         if (node.addChild(this._parsePageSelector())) {
9449             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
9450                 if (!node.addChild(this._parsePageSelector())) {
9451                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9452                 }
9453             }
9454         }
9455         return this._parseBody(node, this._parsePageDeclaration.bind(this));
9456     };
9457     Parser.prototype._parsePageMarginBox = function () {
9458         // page_margin_box :  margin_sym S* '{' S* declaration? [ ';' S* declaration? ]* '}' S*
9459         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
9460             return null;
9461         }
9462         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.PageBoxMarginBox);
9463         if (!this.acceptOneKeyword(_languageFacts_facts__WEBPACK_IMPORTED_MODULE_3__.pageBoxDirectives)) {
9464             this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.UnknownAtRule, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL]);
9465         }
9466         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
9467     };
9468     Parser.prototype._parsePageSelector = function () {
9469         // page_selector : pseudo_page+ | IDENT pseudo_page*
9470         // pseudo_page :  ':' [ "left" | "right" | "first" | "blank" ];
9471         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9472             return null;
9473         }
9474         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9475         node.addChild(this._parseIdent()); // optional ident
9476         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9477             if (!node.addChild(this._parseIdent())) { // optional ident
9478                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9479             }
9480         }
9481         return this.finish(node);
9482     };
9483     Parser.prototype._parseDocument = function () {
9484         // -moz-document is experimental but has been pushed to css4
9485         if (!this.peekKeyword('@-moz-document')) {
9486             return null;
9487         }
9488         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Document);
9489         this.consumeToken(); // @-moz-document
9490         this.resync([], [_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL]); // ignore all the rules
9491         return this._parseBody(node, this._parseStylesheetStatement.bind(this));
9492     };
9493     // https://www.w3.org/TR/css-syntax-3/#consume-an-at-rule
9494     Parser.prototype._parseUnknownAtRule = function () {
9495         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
9496             return null;
9497         }
9498         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.UnknownAtRule);
9499         node.addChild(this._parseUnknownAtRuleName());
9500         var isTopLevel = function () { return curlyDepth === 0 && parensDepth === 0 && bracketsDepth === 0; };
9501         var curlyLCount = 0;
9502         var curlyDepth = 0;
9503         var parensDepth = 0;
9504         var bracketsDepth = 0;
9505         done: while (true) {
9506             switch (this.token.type) {
9507                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SemiColon:
9508                     if (isTopLevel()) {
9509                         break done;
9510                     }
9511                     break;
9512                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF:
9513                     if (curlyDepth > 0) {
9514                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightCurlyExpected);
9515                     }
9516                     else if (bracketsDepth > 0) {
9517                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightSquareBracketExpected);
9518                     }
9519                     else if (parensDepth > 0) {
9520                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9521                     }
9522                     else {
9523                         return this.finish(node);
9524                     }
9525                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL:
9526                     curlyLCount++;
9527                     curlyDepth++;
9528                     break;
9529                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR:
9530                     curlyDepth--;
9531                     // End of at-rule, consume CurlyR and return node
9532                     if (curlyLCount > 0 && curlyDepth === 0) {
9533                         this.consumeToken();
9534                         if (bracketsDepth > 0) {
9535                             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightSquareBracketExpected);
9536                         }
9537                         else if (parensDepth > 0) {
9538                             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9539                         }
9540                         break done;
9541                     }
9542                     if (curlyDepth < 0) {
9543                         // The property value has been terminated without a semicolon, and
9544                         // this is the last declaration in the ruleset.
9545                         if (parensDepth === 0 && bracketsDepth === 0) {
9546                             break done;
9547                         }
9548                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftCurlyExpected);
9549                     }
9550                     break;
9551                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL:
9552                     parensDepth++;
9553                     break;
9554                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR:
9555                     parensDepth--;
9556                     if (parensDepth < 0) {
9557                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftParenthesisExpected);
9558                     }
9559                     break;
9560                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketL:
9561                     bracketsDepth++;
9562                     break;
9563                 case _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketR:
9564                     bracketsDepth--;
9565                     if (bracketsDepth < 0) {
9566                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.LeftSquareBracketExpected);
9567                     }
9568                     break;
9569             }
9570             this.consumeToken();
9571         }
9572         return node;
9573     };
9574     Parser.prototype._parseUnknownAtRuleName = function () {
9575         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9576         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.AtKeyword)) {
9577             return this.finish(node);
9578         }
9579         return node;
9580     };
9581     Parser.prototype._parseOperator = function () {
9582         // these are operators for binary expressions
9583         if (this.peekDelim('/') ||
9584             this.peekDelim('*') ||
9585             this.peekDelim('+') ||
9586             this.peekDelim('-') ||
9587             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Dashmatch) ||
9588             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Includes) ||
9589             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SubstringOperator) ||
9590             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.PrefixOperator) ||
9591             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.SuffixOperator) ||
9592             this.peekDelim('=')) { // doesn't stick to the standard here
9593             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Operator);
9594             this.consumeToken();
9595             return this.finish(node);
9596         }
9597         else {
9598             return null;
9599         }
9600     };
9601     Parser.prototype._parseUnaryOperator = function () {
9602         if (!this.peekDelim('+') && !this.peekDelim('-')) {
9603             return null;
9604         }
9605         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9606         this.consumeToken();
9607         return this.finish(node);
9608     };
9609     Parser.prototype._parseCombinator = function () {
9610         if (this.peekDelim('>')) {
9611             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9612             this.consumeToken();
9613             var mark = this.mark();
9614             if (!this.hasWhitespace() && this.acceptDelim('>')) {
9615                 if (!this.hasWhitespace() && this.acceptDelim('>')) {
9616                     node.type = _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.SelectorCombinatorShadowPiercingDescendant;
9617                     return this.finish(node);
9618                 }
9619                 this.restoreAtMark(mark);
9620             }
9621             node.type = _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.SelectorCombinatorParent;
9622             return this.finish(node);
9623         }
9624         else if (this.peekDelim('+')) {
9625             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9626             this.consumeToken();
9627             node.type = _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.SelectorCombinatorSibling;
9628             return this.finish(node);
9629         }
9630         else if (this.peekDelim('~')) {
9631             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9632             this.consumeToken();
9633             node.type = _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.SelectorCombinatorAllSiblings;
9634             return this.finish(node);
9635         }
9636         else if (this.peekDelim('/')) {
9637             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9638             this.consumeToken();
9639             var mark = this.mark();
9640             if (!this.hasWhitespace() && this.acceptIdent('deep') && !this.hasWhitespace() && this.acceptDelim('/')) {
9641                 node.type = _cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.SelectorCombinatorShadowPiercingDescendant;
9642                 return this.finish(node);
9643             }
9644             this.restoreAtMark(mark);
9645         }
9646         return null;
9647     };
9648     Parser.prototype._parseSimpleSelector = function () {
9649         // simple_selector
9650         //  : element_name [ HASH | class | attrib | pseudo ]* | [ HASH | class | attrib | pseudo ]+ ;
9651         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.SimpleSelector);
9652         var c = 0;
9653         if (node.addChild(this._parseElementName())) {
9654             c++;
9655         }
9656         while ((c === 0 || !this.hasWhitespace()) && node.addChild(this._parseSimpleSelectorBody())) {
9657             c++;
9658         }
9659         return c > 0 ? this.finish(node) : null;
9660     };
9661     Parser.prototype._parseSimpleSelectorBody = function () {
9662         return this._parsePseudo() || this._parseHash() || this._parseClass() || this._parseAttrib();
9663     };
9664     Parser.prototype._parseSelectorIdent = function () {
9665         return this._parseIdent();
9666     };
9667     Parser.prototype._parseHash = function () {
9668         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Hash) && !this.peekDelim('#')) {
9669             return null;
9670         }
9671         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.IdentifierSelector);
9672         if (this.acceptDelim('#')) {
9673             if (this.hasWhitespace() || !node.addChild(this._parseSelectorIdent())) {
9674                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9675             }
9676         }
9677         else {
9678             this.consumeToken(); // TokenType.Hash
9679         }
9680         return this.finish(node);
9681     };
9682     Parser.prototype._parseClass = function () {
9683         // class: '.' IDENT ;
9684         if (!this.peekDelim('.')) {
9685             return null;
9686         }
9687         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.ClassSelector);
9688         this.consumeToken(); // '.'
9689         if (this.hasWhitespace() || !node.addChild(this._parseSelectorIdent())) {
9690             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9691         }
9692         return this.finish(node);
9693     };
9694     Parser.prototype._parseElementName = function () {
9695         // element_name: (ns? '|')? IDENT | '*';
9696         var pos = this.mark();
9697         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.ElementNameSelector);
9698         node.addChild(this._parseNamespacePrefix());
9699         if (!node.addChild(this._parseSelectorIdent()) && !this.acceptDelim('*')) {
9700             this.restoreAtMark(pos);
9701             return null;
9702         }
9703         return this.finish(node);
9704     };
9705     Parser.prototype._parseNamespacePrefix = function () {
9706         var pos = this.mark();
9707         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.NamespacePrefix);
9708         if (!node.addChild(this._parseIdent()) && !this.acceptDelim('*')) {
9709             // ns is optional
9710         }
9711         if (!this.acceptDelim('|')) {
9712             this.restoreAtMark(pos);
9713             return null;
9714         }
9715         return this.finish(node);
9716     };
9717     Parser.prototype._parseAttrib = function () {
9718         // attrib : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*   [ IDENT | STRING ] S* ]? ']'
9719         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketL)) {
9720             return null;
9721         }
9722         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.AttributeSelector);
9723         this.consumeToken(); // BracketL
9724         // Optional attrib namespace
9725         node.setNamespacePrefix(this._parseNamespacePrefix());
9726         if (!node.setIdentifier(this._parseIdent())) {
9727             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9728         }
9729         if (node.setOperator(this._parseOperator())) {
9730             node.setValue(this._parseBinaryExpr());
9731             this.acceptIdent('i'); // case insensitive matching
9732         }
9733         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketR)) {
9734             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightSquareBracketExpected);
9735         }
9736         return this.finish(node);
9737     };
9738     Parser.prototype._parsePseudo = function () {
9739         var _this = this;
9740         // pseudo: ':' [ IDENT | FUNCTION S* [IDENT S*]? ')' ]
9741         var node = this._tryParsePseudoIdentifier();
9742         if (node) {
9743             if (!this.hasWhitespace() && this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9744                 var tryAsSelector = function () {
9745                     var selectors = _this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9746                     if (!selectors.addChild(_this._parseSelector(false))) {
9747                         return null;
9748                     }
9749                     while (_this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma) && selectors.addChild(_this._parseSelector(false))) {
9750                         // loop
9751                     }
9752                     if (_this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9753                         return _this.finish(selectors);
9754                     }
9755                     return null;
9756                 };
9757                 node.addChild(this.try(tryAsSelector) || this._parseBinaryExpr());
9758                 if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9759                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9760                 }
9761             }
9762             return this.finish(node);
9763         }
9764         return null;
9765     };
9766     Parser.prototype._tryParsePseudoIdentifier = function () {
9767         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9768             return null;
9769         }
9770         var pos = this.mark();
9771         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.PseudoSelector);
9772         this.consumeToken(); // Colon
9773         if (this.hasWhitespace()) {
9774             this.restoreAtMark(pos);
9775             return null;
9776         }
9777         // optional, support ::
9778         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon) && this.hasWhitespace()) {
9779             this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9780         }
9781         if (!node.addChild(this._parseIdent())) {
9782             this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.IdentifierExpected);
9783         }
9784         return node;
9785     };
9786     Parser.prototype._tryParsePrio = function () {
9787         var mark = this.mark();
9788         var prio = this._parsePrio();
9789         if (prio) {
9790             return prio;
9791         }
9792         this.restoreAtMark(mark);
9793         return null;
9794     };
9795     Parser.prototype._parsePrio = function () {
9796         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Exclamation)) {
9797             return null;
9798         }
9799         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Prio);
9800         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Exclamation) && this.acceptIdent('important')) {
9801             return this.finish(node);
9802         }
9803         return null;
9804     };
9805     Parser.prototype._parseExpr = function (stopOnComma) {
9806         if (stopOnComma === void 0) { stopOnComma = false; }
9807         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Expression);
9808         if (!node.addChild(this._parseBinaryExpr())) {
9809             return null;
9810         }
9811         while (true) {
9812             if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) { // optional
9813                 if (stopOnComma) {
9814                     return this.finish(node);
9815                 }
9816                 this.consumeToken();
9817             }
9818             if (!node.addChild(this._parseBinaryExpr())) {
9819                 break;
9820             }
9821         }
9822         return this.finish(node);
9823     };
9824     Parser.prototype._parseNamedLine = function () {
9825         // https://www.w3.org/TR/css-grid-1/#named-lines
9826         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketL)) {
9827             return null;
9828         }
9829         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.GridLine);
9830         this.consumeToken();
9831         while (node.addChild(this._parseIdent())) {
9832             // repeat
9833         }
9834         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BracketR)) {
9835             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightSquareBracketExpected);
9836         }
9837         return this.finish(node);
9838     };
9839     Parser.prototype._parseBinaryExpr = function (preparsedLeft, preparsedOper) {
9840         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.BinaryExpression);
9841         if (!node.setLeft((preparsedLeft || this._parseTerm()))) {
9842             return null;
9843         }
9844         if (!node.setOperator(preparsedOper || this._parseOperator())) {
9845             return this.finish(node);
9846         }
9847         if (!node.setRight(this._parseTerm())) {
9848             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.TermExpected);
9849         }
9850         // things needed for multiple binary expressions
9851         node = this.finish(node);
9852         var operator = this._parseOperator();
9853         if (operator) {
9854             node = this._parseBinaryExpr(node, operator);
9855         }
9856         return this.finish(node);
9857     };
9858     Parser.prototype._parseTerm = function () {
9859         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Term);
9860         node.setOperator(this._parseUnaryOperator()); // optional
9861         if (node.setExpression(this._parseTermExpression())) {
9862             return this.finish(node);
9863         }
9864         return null;
9865     };
9866     Parser.prototype._parseTermExpression = function () {
9867         return this._parseURILiteral() || // url before function
9868             this._parseFunction() || // function before ident
9869             this._parseIdent() ||
9870             this._parseStringLiteral() ||
9871             this._parseNumeric() ||
9872             this._parseHexColor() ||
9873             this._parseOperation() ||
9874             this._parseNamedLine();
9875     };
9876     Parser.prototype._parseOperation = function () {
9877         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9878             return null;
9879         }
9880         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9881         this.consumeToken(); // ParenthesisL
9882         node.addChild(this._parseExpr());
9883         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9884             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9885         }
9886         return this.finish(node);
9887     };
9888     Parser.prototype._parseNumeric = function () {
9889         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Num) ||
9890             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Percentage) ||
9891             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Resolution) ||
9892             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Length) ||
9893             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EMS) ||
9894             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EXS) ||
9895             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Angle) ||
9896             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Time) ||
9897             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Dimension) ||
9898             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Freq)) {
9899             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NumericValue);
9900             this.consumeToken();
9901             return this.finish(node);
9902         }
9903         return null;
9904     };
9905     Parser.prototype._parseStringLiteral = function () {
9906         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.String) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BadString)) {
9907             return null;
9908         }
9909         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.StringLiteral);
9910         this.consumeToken();
9911         return this.finish(node);
9912     };
9913     Parser.prototype._parseURILiteral = function () {
9914         if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident, /^url(-prefix)?$/i)) {
9915             return null;
9916         }
9917         var pos = this.mark();
9918         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.URILiteral);
9919         this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident);
9920         if (this.hasWhitespace() || !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9921             this.restoreAtMark(pos);
9922             return null;
9923         }
9924         this.scanner.inURL = true;
9925         this.consumeToken(); // consume ()
9926         node.addChild(this._parseURLArgument()); // argument is optional
9927         this.scanner.inURL = false;
9928         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9929             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9930         }
9931         return this.finish(node);
9932     };
9933     Parser.prototype._parseURLArgument = function () {
9934         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Node);
9935         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.String) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BadString) && !this.acceptUnquotedString()) {
9936             return null;
9937         }
9938         return this.finish(node);
9939     };
9940     Parser.prototype._parseIdent = function (referenceTypes) {
9941         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident)) {
9942             return null;
9943         }
9944         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Identifier);
9945         if (referenceTypes) {
9946             node.referenceTypes = referenceTypes;
9947         }
9948         node.isCustomProperty = this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident, /^--/);
9949         this.consumeToken();
9950         return this.finish(node);
9951     };
9952     Parser.prototype._parseFunction = function () {
9953         var pos = this.mark();
9954         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Function);
9955         if (!node.setIdentifier(this._parseFunctionIdentifier())) {
9956             return null;
9957         }
9958         if (this.hasWhitespace() || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisL)) {
9959             this.restoreAtMark(pos);
9960             return null;
9961         }
9962         if (node.getArguments().addChild(this._parseFunctionArgument())) {
9963             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comma)) {
9964                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9965                     break;
9966                 }
9967                 if (!node.getArguments().addChild(this._parseFunctionArgument())) {
9968                     this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.ExpressionExpected);
9969                 }
9970             }
9971         }
9972         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.ParenthesisR)) {
9973             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_2__.ParseError.RightParenthesisExpected);
9974         }
9975         return this.finish(node);
9976     };
9977     Parser.prototype._parseFunctionIdentifier = function () {
9978         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident)) {
9979             return null;
9980         }
9981         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.Identifier);
9982         node.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_1__.ReferenceType.Function];
9983         if (this.acceptIdent('progid')) {
9984             // support for IE7 specific filters: 'progid:DXImageTransform.Microsoft.MotionBlur(strength=13, direction=310)'
9985             if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Colon)) {
9986                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Ident) && this.acceptDelim('.')) {
9987                     // loop
9988                 }
9989             }
9990             return this.finish(node);
9991         }
9992         this.consumeToken();
9993         return this.finish(node);
9994     };
9995     Parser.prototype._parseFunctionArgument = function () {
9996         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.FunctionArgument);
9997         if (node.setValue(this._parseExpr(true))) {
9998             return this.finish(node);
9999         }
10000         return null;
10001     };
10002     Parser.prototype._parseHexColor = function () {
10003         if (this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Hash, /^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)) {
10004             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_1__.HexColorValue);
10005             this.consumeToken();
10006             return this.finish(node);
10007         }
10008         else {
10009             return null;
10010         }
10011     };
10012     return Parser;
10013 }());
10014
10015
10016
10017 /***/ }),
10018 /* 64 */
10019 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10020
10021 __webpack_require__.r(__webpack_exports__);
10022 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10023 /* harmony export */   "TokenType": () => /* binding */ TokenType,
10024 /* harmony export */   "MultiLineStream": () => /* binding */ MultiLineStream,
10025 /* harmony export */   "Scanner": () => /* binding */ Scanner
10026 /* harmony export */ });
10027 /*---------------------------------------------------------------------------------------------
10028  *  Copyright (c) Microsoft Corporation. All rights reserved.
10029  *  Licensed under the MIT License. See License.txt in the project root for license information.
10030  *--------------------------------------------------------------------------------------------*/
10031
10032 var TokenType;
10033 (function (TokenType) {
10034     TokenType[TokenType["Ident"] = 0] = "Ident";
10035     TokenType[TokenType["AtKeyword"] = 1] = "AtKeyword";
10036     TokenType[TokenType["String"] = 2] = "String";
10037     TokenType[TokenType["BadString"] = 3] = "BadString";
10038     TokenType[TokenType["UnquotedString"] = 4] = "UnquotedString";
10039     TokenType[TokenType["Hash"] = 5] = "Hash";
10040     TokenType[TokenType["Num"] = 6] = "Num";
10041     TokenType[TokenType["Percentage"] = 7] = "Percentage";
10042     TokenType[TokenType["Dimension"] = 8] = "Dimension";
10043     TokenType[TokenType["UnicodeRange"] = 9] = "UnicodeRange";
10044     TokenType[TokenType["CDO"] = 10] = "CDO";
10045     TokenType[TokenType["CDC"] = 11] = "CDC";
10046     TokenType[TokenType["Colon"] = 12] = "Colon";
10047     TokenType[TokenType["SemiColon"] = 13] = "SemiColon";
10048     TokenType[TokenType["CurlyL"] = 14] = "CurlyL";
10049     TokenType[TokenType["CurlyR"] = 15] = "CurlyR";
10050     TokenType[TokenType["ParenthesisL"] = 16] = "ParenthesisL";
10051     TokenType[TokenType["ParenthesisR"] = 17] = "ParenthesisR";
10052     TokenType[TokenType["BracketL"] = 18] = "BracketL";
10053     TokenType[TokenType["BracketR"] = 19] = "BracketR";
10054     TokenType[TokenType["Whitespace"] = 20] = "Whitespace";
10055     TokenType[TokenType["Includes"] = 21] = "Includes";
10056     TokenType[TokenType["Dashmatch"] = 22] = "Dashmatch";
10057     TokenType[TokenType["SubstringOperator"] = 23] = "SubstringOperator";
10058     TokenType[TokenType["PrefixOperator"] = 24] = "PrefixOperator";
10059     TokenType[TokenType["SuffixOperator"] = 25] = "SuffixOperator";
10060     TokenType[TokenType["Delim"] = 26] = "Delim";
10061     TokenType[TokenType["EMS"] = 27] = "EMS";
10062     TokenType[TokenType["EXS"] = 28] = "EXS";
10063     TokenType[TokenType["Length"] = 29] = "Length";
10064     TokenType[TokenType["Angle"] = 30] = "Angle";
10065     TokenType[TokenType["Time"] = 31] = "Time";
10066     TokenType[TokenType["Freq"] = 32] = "Freq";
10067     TokenType[TokenType["Exclamation"] = 33] = "Exclamation";
10068     TokenType[TokenType["Resolution"] = 34] = "Resolution";
10069     TokenType[TokenType["Comma"] = 35] = "Comma";
10070     TokenType[TokenType["Charset"] = 36] = "Charset";
10071     TokenType[TokenType["EscapedJavaScript"] = 37] = "EscapedJavaScript";
10072     TokenType[TokenType["BadEscapedJavaScript"] = 38] = "BadEscapedJavaScript";
10073     TokenType[TokenType["Comment"] = 39] = "Comment";
10074     TokenType[TokenType["SingleLineComment"] = 40] = "SingleLineComment";
10075     TokenType[TokenType["EOF"] = 41] = "EOF";
10076     TokenType[TokenType["CustomToken"] = 42] = "CustomToken";
10077 })(TokenType || (TokenType = {}));
10078 var MultiLineStream = /** @class */ (function () {
10079     function MultiLineStream(source) {
10080         this.source = source;
10081         this.len = source.length;
10082         this.position = 0;
10083     }
10084     MultiLineStream.prototype.substring = function (from, to) {
10085         if (to === void 0) { to = this.position; }
10086         return this.source.substring(from, to);
10087     };
10088     MultiLineStream.prototype.eos = function () {
10089         return this.len <= this.position;
10090     };
10091     MultiLineStream.prototype.pos = function () {
10092         return this.position;
10093     };
10094     MultiLineStream.prototype.goBackTo = function (pos) {
10095         this.position = pos;
10096     };
10097     MultiLineStream.prototype.goBack = function (n) {
10098         this.position -= n;
10099     };
10100     MultiLineStream.prototype.advance = function (n) {
10101         this.position += n;
10102     };
10103     MultiLineStream.prototype.nextChar = function () {
10104         return this.source.charCodeAt(this.position++) || 0;
10105     };
10106     MultiLineStream.prototype.peekChar = function (n) {
10107         if (n === void 0) { n = 0; }
10108         return this.source.charCodeAt(this.position + n) || 0;
10109     };
10110     MultiLineStream.prototype.lookbackChar = function (n) {
10111         if (n === void 0) { n = 0; }
10112         return this.source.charCodeAt(this.position - n) || 0;
10113     };
10114     MultiLineStream.prototype.advanceIfChar = function (ch) {
10115         if (ch === this.source.charCodeAt(this.position)) {
10116             this.position++;
10117             return true;
10118         }
10119         return false;
10120     };
10121     MultiLineStream.prototype.advanceIfChars = function (ch) {
10122         if (this.position + ch.length > this.source.length) {
10123             return false;
10124         }
10125         var i = 0;
10126         for (; i < ch.length; i++) {
10127             if (this.source.charCodeAt(this.position + i) !== ch[i]) {
10128                 return false;
10129             }
10130         }
10131         this.advance(i);
10132         return true;
10133     };
10134     MultiLineStream.prototype.advanceWhileChar = function (condition) {
10135         var posNow = this.position;
10136         while (this.position < this.len && condition(this.source.charCodeAt(this.position))) {
10137             this.position++;
10138         }
10139         return this.position - posNow;
10140     };
10141     return MultiLineStream;
10142 }());
10143
10144 var _a = 'a'.charCodeAt(0);
10145 var _f = 'f'.charCodeAt(0);
10146 var _z = 'z'.charCodeAt(0);
10147 var _A = 'A'.charCodeAt(0);
10148 var _F = 'F'.charCodeAt(0);
10149 var _Z = 'Z'.charCodeAt(0);
10150 var _0 = '0'.charCodeAt(0);
10151 var _9 = '9'.charCodeAt(0);
10152 var _TLD = '~'.charCodeAt(0);
10153 var _HAT = '^'.charCodeAt(0);
10154 var _EQS = '='.charCodeAt(0);
10155 var _PIP = '|'.charCodeAt(0);
10156 var _MIN = '-'.charCodeAt(0);
10157 var _USC = '_'.charCodeAt(0);
10158 var _PRC = '%'.charCodeAt(0);
10159 var _MUL = '*'.charCodeAt(0);
10160 var _LPA = '('.charCodeAt(0);
10161 var _RPA = ')'.charCodeAt(0);
10162 var _LAN = '<'.charCodeAt(0);
10163 var _RAN = '>'.charCodeAt(0);
10164 var _ATS = '@'.charCodeAt(0);
10165 var _HSH = '#'.charCodeAt(0);
10166 var _DLR = '$'.charCodeAt(0);
10167 var _BSL = '\\'.charCodeAt(0);
10168 var _FSL = '/'.charCodeAt(0);
10169 var _NWL = '\n'.charCodeAt(0);
10170 var _CAR = '\r'.charCodeAt(0);
10171 var _LFD = '\f'.charCodeAt(0);
10172 var _DQO = '"'.charCodeAt(0);
10173 var _SQO = '\''.charCodeAt(0);
10174 var _WSP = ' '.charCodeAt(0);
10175 var _TAB = '\t'.charCodeAt(0);
10176 var _SEM = ';'.charCodeAt(0);
10177 var _COL = ':'.charCodeAt(0);
10178 var _CUL = '{'.charCodeAt(0);
10179 var _CUR = '}'.charCodeAt(0);
10180 var _BRL = '['.charCodeAt(0);
10181 var _BRR = ']'.charCodeAt(0);
10182 var _CMA = ','.charCodeAt(0);
10183 var _DOT = '.'.charCodeAt(0);
10184 var _BNG = '!'.charCodeAt(0);
10185 var staticTokenTable = {};
10186 staticTokenTable[_SEM] = TokenType.SemiColon;
10187 staticTokenTable[_COL] = TokenType.Colon;
10188 staticTokenTable[_CUL] = TokenType.CurlyL;
10189 staticTokenTable[_CUR] = TokenType.CurlyR;
10190 staticTokenTable[_BRR] = TokenType.BracketR;
10191 staticTokenTable[_BRL] = TokenType.BracketL;
10192 staticTokenTable[_LPA] = TokenType.ParenthesisL;
10193 staticTokenTable[_RPA] = TokenType.ParenthesisR;
10194 staticTokenTable[_CMA] = TokenType.Comma;
10195 var staticUnitTable = {};
10196 staticUnitTable['em'] = TokenType.EMS;
10197 staticUnitTable['ex'] = TokenType.EXS;
10198 staticUnitTable['px'] = TokenType.Length;
10199 staticUnitTable['cm'] = TokenType.Length;
10200 staticUnitTable['mm'] = TokenType.Length;
10201 staticUnitTable['in'] = TokenType.Length;
10202 staticUnitTable['pt'] = TokenType.Length;
10203 staticUnitTable['pc'] = TokenType.Length;
10204 staticUnitTable['deg'] = TokenType.Angle;
10205 staticUnitTable['rad'] = TokenType.Angle;
10206 staticUnitTable['grad'] = TokenType.Angle;
10207 staticUnitTable['ms'] = TokenType.Time;
10208 staticUnitTable['s'] = TokenType.Time;
10209 staticUnitTable['hz'] = TokenType.Freq;
10210 staticUnitTable['khz'] = TokenType.Freq;
10211 staticUnitTable['%'] = TokenType.Percentage;
10212 staticUnitTable['fr'] = TokenType.Percentage;
10213 staticUnitTable['dpi'] = TokenType.Resolution;
10214 staticUnitTable['dpcm'] = TokenType.Resolution;
10215 var Scanner = /** @class */ (function () {
10216     function Scanner() {
10217         this.stream = new MultiLineStream('');
10218         this.ignoreComment = true;
10219         this.ignoreWhitespace = true;
10220         this.inURL = false;
10221     }
10222     Scanner.prototype.setSource = function (input) {
10223         this.stream = new MultiLineStream(input);
10224     };
10225     Scanner.prototype.finishToken = function (offset, type, text) {
10226         return {
10227             offset: offset,
10228             len: this.stream.pos() - offset,
10229             type: type,
10230             text: text || this.stream.substring(offset)
10231         };
10232     };
10233     Scanner.prototype.substring = function (offset, len) {
10234         return this.stream.substring(offset, offset + len);
10235     };
10236     Scanner.prototype.pos = function () {
10237         return this.stream.pos();
10238     };
10239     Scanner.prototype.goBackTo = function (pos) {
10240         this.stream.goBackTo(pos);
10241     };
10242     Scanner.prototype.scanUnquotedString = function () {
10243         var offset = this.stream.pos();
10244         var content = [];
10245         if (this._unquotedString(content)) {
10246             return this.finishToken(offset, TokenType.UnquotedString, content.join(''));
10247         }
10248         return null;
10249     };
10250     Scanner.prototype.scan = function () {
10251         // processes all whitespaces and comments
10252         var triviaToken = this.trivia();
10253         if (triviaToken !== null) {
10254             return triviaToken;
10255         }
10256         var offset = this.stream.pos();
10257         // End of file/input
10258         if (this.stream.eos()) {
10259             return this.finishToken(offset, TokenType.EOF);
10260         }
10261         return this.scanNext(offset);
10262     };
10263     Scanner.prototype.scanNext = function (offset) {
10264         // CDO <!--
10265         if (this.stream.advanceIfChars([_LAN, _BNG, _MIN, _MIN])) {
10266             return this.finishToken(offset, TokenType.CDO);
10267         }
10268         // CDC -->
10269         if (this.stream.advanceIfChars([_MIN, _MIN, _RAN])) {
10270             return this.finishToken(offset, TokenType.CDC);
10271         }
10272         var content = [];
10273         if (this.ident(content)) {
10274             return this.finishToken(offset, TokenType.Ident, content.join(''));
10275         }
10276         // at-keyword
10277         if (this.stream.advanceIfChar(_ATS)) {
10278             content = ['@'];
10279             if (this._name(content)) {
10280                 var keywordText = content.join('');
10281                 if (keywordText === '@charset') {
10282                     return this.finishToken(offset, TokenType.Charset, keywordText);
10283                 }
10284                 return this.finishToken(offset, TokenType.AtKeyword, keywordText);
10285             }
10286             else {
10287                 return this.finishToken(offset, TokenType.Delim);
10288             }
10289         }
10290         // hash
10291         if (this.stream.advanceIfChar(_HSH)) {
10292             content = ['#'];
10293             if (this._name(content)) {
10294                 return this.finishToken(offset, TokenType.Hash, content.join(''));
10295             }
10296             else {
10297                 return this.finishToken(offset, TokenType.Delim);
10298             }
10299         }
10300         // Important
10301         if (this.stream.advanceIfChar(_BNG)) {
10302             return this.finishToken(offset, TokenType.Exclamation);
10303         }
10304         // Numbers
10305         if (this._number()) {
10306             var pos = this.stream.pos();
10307             content = [this.stream.substring(offset, pos)];
10308             if (this.stream.advanceIfChar(_PRC)) {
10309                 // Percentage 43%
10310                 return this.finishToken(offset, TokenType.Percentage);
10311             }
10312             else if (this.ident(content)) {
10313                 var dim = this.stream.substring(pos).toLowerCase();
10314                 var tokenType_1 = staticUnitTable[dim];
10315                 if (typeof tokenType_1 !== 'undefined') {
10316                     // Known dimension 43px
10317                     return this.finishToken(offset, tokenType_1, content.join(''));
10318                 }
10319                 else {
10320                     // Unknown dimension 43ft
10321                     return this.finishToken(offset, TokenType.Dimension, content.join(''));
10322                 }
10323             }
10324             return this.finishToken(offset, TokenType.Num);
10325         }
10326         // String, BadString
10327         content = [];
10328         var tokenType = this._string(content);
10329         if (tokenType !== null) {
10330             return this.finishToken(offset, tokenType, content.join(''));
10331         }
10332         // single character tokens
10333         tokenType = staticTokenTable[this.stream.peekChar()];
10334         if (typeof tokenType !== 'undefined') {
10335             this.stream.advance(1);
10336             return this.finishToken(offset, tokenType);
10337         }
10338         // includes ~=
10339         if (this.stream.peekChar(0) === _TLD && this.stream.peekChar(1) === _EQS) {
10340             this.stream.advance(2);
10341             return this.finishToken(offset, TokenType.Includes);
10342         }
10343         // DashMatch |=
10344         if (this.stream.peekChar(0) === _PIP && this.stream.peekChar(1) === _EQS) {
10345             this.stream.advance(2);
10346             return this.finishToken(offset, TokenType.Dashmatch);
10347         }
10348         // Substring operator *=
10349         if (this.stream.peekChar(0) === _MUL && this.stream.peekChar(1) === _EQS) {
10350             this.stream.advance(2);
10351             return this.finishToken(offset, TokenType.SubstringOperator);
10352         }
10353         // Substring operator ^=
10354         if (this.stream.peekChar(0) === _HAT && this.stream.peekChar(1) === _EQS) {
10355             this.stream.advance(2);
10356             return this.finishToken(offset, TokenType.PrefixOperator);
10357         }
10358         // Substring operator $=
10359         if (this.stream.peekChar(0) === _DLR && this.stream.peekChar(1) === _EQS) {
10360             this.stream.advance(2);
10361             return this.finishToken(offset, TokenType.SuffixOperator);
10362         }
10363         // Delim
10364         this.stream.nextChar();
10365         return this.finishToken(offset, TokenType.Delim);
10366     };
10367     Scanner.prototype.trivia = function () {
10368         while (true) {
10369             var offset = this.stream.pos();
10370             if (this._whitespace()) {
10371                 if (!this.ignoreWhitespace) {
10372                     return this.finishToken(offset, TokenType.Whitespace);
10373                 }
10374             }
10375             else if (this.comment()) {
10376                 if (!this.ignoreComment) {
10377                     return this.finishToken(offset, TokenType.Comment);
10378                 }
10379             }
10380             else {
10381                 return null;
10382             }
10383         }
10384     };
10385     Scanner.prototype.comment = function () {
10386         if (this.stream.advanceIfChars([_FSL, _MUL])) {
10387             var success_1 = false, hot_1 = false;
10388             this.stream.advanceWhileChar(function (ch) {
10389                 if (hot_1 && ch === _FSL) {
10390                     success_1 = true;
10391                     return false;
10392                 }
10393                 hot_1 = ch === _MUL;
10394                 return true;
10395             });
10396             if (success_1) {
10397                 this.stream.advance(1);
10398             }
10399             return true;
10400         }
10401         return false;
10402     };
10403     Scanner.prototype._number = function () {
10404         var npeek = 0, ch;
10405         if (this.stream.peekChar() === _DOT) {
10406             npeek = 1;
10407         }
10408         ch = this.stream.peekChar(npeek);
10409         if (ch >= _0 && ch <= _9) {
10410             this.stream.advance(npeek + 1);
10411             this.stream.advanceWhileChar(function (ch) {
10412                 return ch >= _0 && ch <= _9 || npeek === 0 && ch === _DOT;
10413             });
10414             return true;
10415         }
10416         return false;
10417     };
10418     Scanner.prototype._newline = function (result) {
10419         var ch = this.stream.peekChar();
10420         switch (ch) {
10421             case _CAR:
10422             case _LFD:
10423             case _NWL:
10424                 this.stream.advance(1);
10425                 result.push(String.fromCharCode(ch));
10426                 if (ch === _CAR && this.stream.advanceIfChar(_NWL)) {
10427                     result.push('\n');
10428                 }
10429                 return true;
10430         }
10431         return false;
10432     };
10433     Scanner.prototype._escape = function (result, includeNewLines) {
10434         var ch = this.stream.peekChar();
10435         if (ch === _BSL) {
10436             this.stream.advance(1);
10437             ch = this.stream.peekChar();
10438             var hexNumCount = 0;
10439             while (hexNumCount < 6 && (ch >= _0 && ch <= _9 || ch >= _a && ch <= _f || ch >= _A && ch <= _F)) {
10440                 this.stream.advance(1);
10441                 ch = this.stream.peekChar();
10442                 hexNumCount++;
10443             }
10444             if (hexNumCount > 0) {
10445                 try {
10446                     var hexVal = parseInt(this.stream.substring(this.stream.pos() - hexNumCount), 16);
10447                     if (hexVal) {
10448                         result.push(String.fromCharCode(hexVal));
10449                     }
10450                 }
10451                 catch (e) {
10452                     // ignore
10453                 }
10454                 // optional whitespace or new line, not part of result text
10455                 if (ch === _WSP || ch === _TAB) {
10456                     this.stream.advance(1);
10457                 }
10458                 else {
10459                     this._newline([]);
10460                 }
10461                 return true;
10462             }
10463             if (ch !== _CAR && ch !== _LFD && ch !== _NWL) {
10464                 this.stream.advance(1);
10465                 result.push(String.fromCharCode(ch));
10466                 return true;
10467             }
10468             else if (includeNewLines) {
10469                 return this._newline(result);
10470             }
10471         }
10472         return false;
10473     };
10474     Scanner.prototype._stringChar = function (closeQuote, result) {
10475         // not closeQuote, not backslash, not newline
10476         var ch = this.stream.peekChar();
10477         if (ch !== 0 && ch !== closeQuote && ch !== _BSL && ch !== _CAR && ch !== _LFD && ch !== _NWL) {
10478             this.stream.advance(1);
10479             result.push(String.fromCharCode(ch));
10480             return true;
10481         }
10482         return false;
10483     };
10484     Scanner.prototype._string = function (result) {
10485         if (this.stream.peekChar() === _SQO || this.stream.peekChar() === _DQO) {
10486             var closeQuote = this.stream.nextChar();
10487             result.push(String.fromCharCode(closeQuote));
10488             while (this._stringChar(closeQuote, result) || this._escape(result, true)) {
10489                 // loop
10490             }
10491             if (this.stream.peekChar() === closeQuote) {
10492                 this.stream.nextChar();
10493                 result.push(String.fromCharCode(closeQuote));
10494                 return TokenType.String;
10495             }
10496             else {
10497                 return TokenType.BadString;
10498             }
10499         }
10500         return null;
10501     };
10502     Scanner.prototype._unquotedChar = function (result) {
10503         // not closeQuote, not backslash, not newline
10504         var ch = this.stream.peekChar();
10505         if (ch !== 0 && ch !== _BSL && ch !== _SQO && ch !== _DQO && ch !== _LPA && ch !== _RPA && ch !== _WSP && ch !== _TAB && ch !== _NWL && ch !== _LFD && ch !== _CAR) {
10506             this.stream.advance(1);
10507             result.push(String.fromCharCode(ch));
10508             return true;
10509         }
10510         return false;
10511     };
10512     Scanner.prototype._unquotedString = function (result) {
10513         var hasContent = false;
10514         while (this._unquotedChar(result) || this._escape(result)) {
10515             hasContent = true;
10516         }
10517         return hasContent;
10518     };
10519     Scanner.prototype._whitespace = function () {
10520         var n = this.stream.advanceWhileChar(function (ch) {
10521             return ch === _WSP || ch === _TAB || ch === _NWL || ch === _LFD || ch === _CAR;
10522         });
10523         return n > 0;
10524     };
10525     Scanner.prototype._name = function (result) {
10526         var matched = false;
10527         while (this._identChar(result) || this._escape(result)) {
10528             matched = true;
10529         }
10530         return matched;
10531     };
10532     Scanner.prototype.ident = function (result) {
10533         var pos = this.stream.pos();
10534         var hasMinus = this._minus(result);
10535         if (hasMinus && this._minus(result) /* -- */) {
10536             if (this._identFirstChar(result) || this._escape(result)) {
10537                 while (this._identChar(result) || this._escape(result)) {
10538                     // loop
10539                 }
10540                 return true;
10541             }
10542         }
10543         else if (this._identFirstChar(result) || this._escape(result)) {
10544             while (this._identChar(result) || this._escape(result)) {
10545                 // loop
10546             }
10547             return true;
10548         }
10549         this.stream.goBackTo(pos);
10550         return false;
10551     };
10552     Scanner.prototype._identFirstChar = function (result) {
10553         var ch = this.stream.peekChar();
10554         if (ch === _USC || // _
10555             ch >= _a && ch <= _z || // a-z
10556             ch >= _A && ch <= _Z || // A-Z
10557             ch >= 0x80 && ch <= 0xFFFF) { // nonascii
10558             this.stream.advance(1);
10559             result.push(String.fromCharCode(ch));
10560             return true;
10561         }
10562         return false;
10563     };
10564     Scanner.prototype._minus = function (result) {
10565         var ch = this.stream.peekChar();
10566         if (ch === _MIN) {
10567             this.stream.advance(1);
10568             result.push(String.fromCharCode(ch));
10569             return true;
10570         }
10571         return false;
10572     };
10573     Scanner.prototype._identChar = function (result) {
10574         var ch = this.stream.peekChar();
10575         if (ch === _USC || // _
10576             ch === _MIN || // -
10577             ch >= _a && ch <= _z || // a-z
10578             ch >= _A && ch <= _Z || // A-Z
10579             ch >= _0 && ch <= _9 || // 0/9
10580             ch >= 0x80 && ch <= 0xFFFF) { // nonascii
10581             this.stream.advance(1);
10582             result.push(String.fromCharCode(ch));
10583             return true;
10584         }
10585         return false;
10586     };
10587     return Scanner;
10588 }());
10589
10590
10591
10592 /***/ }),
10593 /* 65 */
10594 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10595
10596 __webpack_require__.r(__webpack_exports__);
10597 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
10598 /* harmony export */   "NodeType": () => /* binding */ NodeType,
10599 /* harmony export */   "ReferenceType": () => /* binding */ ReferenceType,
10600 /* harmony export */   "getNodeAtOffset": () => /* binding */ getNodeAtOffset,
10601 /* harmony export */   "getNodePath": () => /* binding */ getNodePath,
10602 /* harmony export */   "getParentDeclaration": () => /* binding */ getParentDeclaration,
10603 /* harmony export */   "Node": () => /* binding */ Node,
10604 /* harmony export */   "Nodelist": () => /* binding */ Nodelist,
10605 /* harmony export */   "Identifier": () => /* binding */ Identifier,
10606 /* harmony export */   "Stylesheet": () => /* binding */ Stylesheet,
10607 /* harmony export */   "Declarations": () => /* binding */ Declarations,
10608 /* harmony export */   "BodyDeclaration": () => /* binding */ BodyDeclaration,
10609 /* harmony export */   "RuleSet": () => /* binding */ RuleSet,
10610 /* harmony export */   "Selector": () => /* binding */ Selector,
10611 /* harmony export */   "SimpleSelector": () => /* binding */ SimpleSelector,
10612 /* harmony export */   "AtApplyRule": () => /* binding */ AtApplyRule,
10613 /* harmony export */   "AbstractDeclaration": () => /* binding */ AbstractDeclaration,
10614 /* harmony export */   "CustomPropertyDeclaration": () => /* binding */ CustomPropertyDeclaration,
10615 /* harmony export */   "CustomPropertySet": () => /* binding */ CustomPropertySet,
10616 /* harmony export */   "Declaration": () => /* binding */ Declaration,
10617 /* harmony export */   "Property": () => /* binding */ Property,
10618 /* harmony export */   "Invocation": () => /* binding */ Invocation,
10619 /* harmony export */   "Function": () => /* binding */ Function,
10620 /* harmony export */   "FunctionParameter": () => /* binding */ FunctionParameter,
10621 /* harmony export */   "FunctionArgument": () => /* binding */ FunctionArgument,
10622 /* harmony export */   "IfStatement": () => /* binding */ IfStatement,
10623 /* harmony export */   "ForStatement": () => /* binding */ ForStatement,
10624 /* harmony export */   "EachStatement": () => /* binding */ EachStatement,
10625 /* harmony export */   "WhileStatement": () => /* binding */ WhileStatement,
10626 /* harmony export */   "ElseStatement": () => /* binding */ ElseStatement,
10627 /* harmony export */   "FunctionDeclaration": () => /* binding */ FunctionDeclaration,
10628 /* harmony export */   "ViewPort": () => /* binding */ ViewPort,
10629 /* harmony export */   "FontFace": () => /* binding */ FontFace,
10630 /* harmony export */   "NestedProperties": () => /* binding */ NestedProperties,
10631 /* harmony export */   "Keyframe": () => /* binding */ Keyframe,
10632 /* harmony export */   "KeyframeSelector": () => /* binding */ KeyframeSelector,
10633 /* harmony export */   "Import": () => /* binding */ Import,
10634 /* harmony export */   "Use": () => /* binding */ Use,
10635 /* harmony export */   "ModuleConfiguration": () => /* binding */ ModuleConfiguration,
10636 /* harmony export */   "Forward": () => /* binding */ Forward,
10637 /* harmony export */   "ForwardVisibility": () => /* binding */ ForwardVisibility,
10638 /* harmony export */   "Namespace": () => /* binding */ Namespace,
10639 /* harmony export */   "Media": () => /* binding */ Media,
10640 /* harmony export */   "Supports": () => /* binding */ Supports,
10641 /* harmony export */   "Document": () => /* binding */ Document,
10642 /* harmony export */   "Medialist": () => /* binding */ Medialist,
10643 /* harmony export */   "MediaQuery": () => /* binding */ MediaQuery,
10644 /* harmony export */   "SupportsCondition": () => /* binding */ SupportsCondition,
10645 /* harmony export */   "Page": () => /* binding */ Page,
10646 /* harmony export */   "PageBoxMarginBox": () => /* binding */ PageBoxMarginBox,
10647 /* harmony export */   "Expression": () => /* binding */ Expression,
10648 /* harmony export */   "BinaryExpression": () => /* binding */ BinaryExpression,
10649 /* harmony export */   "Term": () => /* binding */ Term,
10650 /* harmony export */   "AttributeSelector": () => /* binding */ AttributeSelector,
10651 /* harmony export */   "Operator": () => /* binding */ Operator,
10652 /* harmony export */   "HexColorValue": () => /* binding */ HexColorValue,
10653 /* harmony export */   "NumericValue": () => /* binding */ NumericValue,
10654 /* harmony export */   "VariableDeclaration": () => /* binding */ VariableDeclaration,
10655 /* harmony export */   "Interpolation": () => /* binding */ Interpolation,
10656 /* harmony export */   "Variable": () => /* binding */ Variable,
10657 /* harmony export */   "ExtendsReference": () => /* binding */ ExtendsReference,
10658 /* harmony export */   "MixinContentReference": () => /* binding */ MixinContentReference,
10659 /* harmony export */   "MixinContentDeclaration": () => /* binding */ MixinContentDeclaration,
10660 /* harmony export */   "MixinReference": () => /* binding */ MixinReference,
10661 /* harmony export */   "MixinDeclaration": () => /* binding */ MixinDeclaration,
10662 /* harmony export */   "UnknownAtRule": () => /* binding */ UnknownAtRule,
10663 /* harmony export */   "ListEntry": () => /* binding */ ListEntry,
10664 /* harmony export */   "LessGuard": () => /* binding */ LessGuard,
10665 /* harmony export */   "GuardCondition": () => /* binding */ GuardCondition,
10666 /* harmony export */   "Module": () => /* binding */ Module,
10667 /* harmony export */   "Level": () => /* binding */ Level,
10668 /* harmony export */   "Marker": () => /* binding */ Marker,
10669 /* harmony export */   "ParseErrorCollector": () => /* binding */ ParseErrorCollector
10670 /* harmony export */ });
10671 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66);
10672 /*---------------------------------------------------------------------------------------------
10673  *  Copyright (c) Microsoft Corporation. All rights reserved.
10674  *  Licensed under the MIT License. See License.txt in the project root for license information.
10675  *--------------------------------------------------------------------------------------------*/
10676
10677 var __extends = (undefined && undefined.__extends) || (function () {
10678     var extendStatics = function (d, b) {
10679         extendStatics = Object.setPrototypeOf ||
10680             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
10681             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
10682         return extendStatics(d, b);
10683     };
10684     return function (d, b) {
10685         extendStatics(d, b);
10686         function __() { this.constructor = d; }
10687         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
10688     };
10689 })();
10690
10691 /// <summary>
10692 /// Nodes for the css 2.1 specification. See for reference:
10693 /// http://www.w3.org/TR/CSS21/grammar.html#grammar
10694 /// </summary>
10695 var NodeType;
10696 (function (NodeType) {
10697     NodeType[NodeType["Undefined"] = 0] = "Undefined";
10698     NodeType[NodeType["Identifier"] = 1] = "Identifier";
10699     NodeType[NodeType["Stylesheet"] = 2] = "Stylesheet";
10700     NodeType[NodeType["Ruleset"] = 3] = "Ruleset";
10701     NodeType[NodeType["Selector"] = 4] = "Selector";
10702     NodeType[NodeType["SimpleSelector"] = 5] = "SimpleSelector";
10703     NodeType[NodeType["SelectorInterpolation"] = 6] = "SelectorInterpolation";
10704     NodeType[NodeType["SelectorCombinator"] = 7] = "SelectorCombinator";
10705     NodeType[NodeType["SelectorCombinatorParent"] = 8] = "SelectorCombinatorParent";
10706     NodeType[NodeType["SelectorCombinatorSibling"] = 9] = "SelectorCombinatorSibling";
10707     NodeType[NodeType["SelectorCombinatorAllSiblings"] = 10] = "SelectorCombinatorAllSiblings";
10708     NodeType[NodeType["SelectorCombinatorShadowPiercingDescendant"] = 11] = "SelectorCombinatorShadowPiercingDescendant";
10709     NodeType[NodeType["Page"] = 12] = "Page";
10710     NodeType[NodeType["PageBoxMarginBox"] = 13] = "PageBoxMarginBox";
10711     NodeType[NodeType["ClassSelector"] = 14] = "ClassSelector";
10712     NodeType[NodeType["IdentifierSelector"] = 15] = "IdentifierSelector";
10713     NodeType[NodeType["ElementNameSelector"] = 16] = "ElementNameSelector";
10714     NodeType[NodeType["PseudoSelector"] = 17] = "PseudoSelector";
10715     NodeType[NodeType["AttributeSelector"] = 18] = "AttributeSelector";
10716     NodeType[NodeType["Declaration"] = 19] = "Declaration";
10717     NodeType[NodeType["Declarations"] = 20] = "Declarations";
10718     NodeType[NodeType["Property"] = 21] = "Property";
10719     NodeType[NodeType["Expression"] = 22] = "Expression";
10720     NodeType[NodeType["BinaryExpression"] = 23] = "BinaryExpression";
10721     NodeType[NodeType["Term"] = 24] = "Term";
10722     NodeType[NodeType["Operator"] = 25] = "Operator";
10723     NodeType[NodeType["Value"] = 26] = "Value";
10724     NodeType[NodeType["StringLiteral"] = 27] = "StringLiteral";
10725     NodeType[NodeType["URILiteral"] = 28] = "URILiteral";
10726     NodeType[NodeType["EscapedValue"] = 29] = "EscapedValue";
10727     NodeType[NodeType["Function"] = 30] = "Function";
10728     NodeType[NodeType["NumericValue"] = 31] = "NumericValue";
10729     NodeType[NodeType["HexColorValue"] = 32] = "HexColorValue";
10730     NodeType[NodeType["MixinDeclaration"] = 33] = "MixinDeclaration";
10731     NodeType[NodeType["MixinReference"] = 34] = "MixinReference";
10732     NodeType[NodeType["VariableName"] = 35] = "VariableName";
10733     NodeType[NodeType["VariableDeclaration"] = 36] = "VariableDeclaration";
10734     NodeType[NodeType["Prio"] = 37] = "Prio";
10735     NodeType[NodeType["Interpolation"] = 38] = "Interpolation";
10736     NodeType[NodeType["NestedProperties"] = 39] = "NestedProperties";
10737     NodeType[NodeType["ExtendsReference"] = 40] = "ExtendsReference";
10738     NodeType[NodeType["SelectorPlaceholder"] = 41] = "SelectorPlaceholder";
10739     NodeType[NodeType["Debug"] = 42] = "Debug";
10740     NodeType[NodeType["If"] = 43] = "If";
10741     NodeType[NodeType["Else"] = 44] = "Else";
10742     NodeType[NodeType["For"] = 45] = "For";
10743     NodeType[NodeType["Each"] = 46] = "Each";
10744     NodeType[NodeType["While"] = 47] = "While";
10745     NodeType[NodeType["MixinContentReference"] = 48] = "MixinContentReference";
10746     NodeType[NodeType["MixinContentDeclaration"] = 49] = "MixinContentDeclaration";
10747     NodeType[NodeType["Media"] = 50] = "Media";
10748     NodeType[NodeType["Keyframe"] = 51] = "Keyframe";
10749     NodeType[NodeType["FontFace"] = 52] = "FontFace";
10750     NodeType[NodeType["Import"] = 53] = "Import";
10751     NodeType[NodeType["Namespace"] = 54] = "Namespace";
10752     NodeType[NodeType["Invocation"] = 55] = "Invocation";
10753     NodeType[NodeType["FunctionDeclaration"] = 56] = "FunctionDeclaration";
10754     NodeType[NodeType["ReturnStatement"] = 57] = "ReturnStatement";
10755     NodeType[NodeType["MediaQuery"] = 58] = "MediaQuery";
10756     NodeType[NodeType["FunctionParameter"] = 59] = "FunctionParameter";
10757     NodeType[NodeType["FunctionArgument"] = 60] = "FunctionArgument";
10758     NodeType[NodeType["KeyframeSelector"] = 61] = "KeyframeSelector";
10759     NodeType[NodeType["ViewPort"] = 62] = "ViewPort";
10760     NodeType[NodeType["Document"] = 63] = "Document";
10761     NodeType[NodeType["AtApplyRule"] = 64] = "AtApplyRule";
10762     NodeType[NodeType["CustomPropertyDeclaration"] = 65] = "CustomPropertyDeclaration";
10763     NodeType[NodeType["CustomPropertySet"] = 66] = "CustomPropertySet";
10764     NodeType[NodeType["ListEntry"] = 67] = "ListEntry";
10765     NodeType[NodeType["Supports"] = 68] = "Supports";
10766     NodeType[NodeType["SupportsCondition"] = 69] = "SupportsCondition";
10767     NodeType[NodeType["NamespacePrefix"] = 70] = "NamespacePrefix";
10768     NodeType[NodeType["GridLine"] = 71] = "GridLine";
10769     NodeType[NodeType["Plugin"] = 72] = "Plugin";
10770     NodeType[NodeType["UnknownAtRule"] = 73] = "UnknownAtRule";
10771     NodeType[NodeType["Use"] = 74] = "Use";
10772     NodeType[NodeType["ModuleConfiguration"] = 75] = "ModuleConfiguration";
10773     NodeType[NodeType["Forward"] = 76] = "Forward";
10774     NodeType[NodeType["ForwardVisibility"] = 77] = "ForwardVisibility";
10775     NodeType[NodeType["Module"] = 78] = "Module";
10776 })(NodeType || (NodeType = {}));
10777 var ReferenceType;
10778 (function (ReferenceType) {
10779     ReferenceType[ReferenceType["Mixin"] = 0] = "Mixin";
10780     ReferenceType[ReferenceType["Rule"] = 1] = "Rule";
10781     ReferenceType[ReferenceType["Variable"] = 2] = "Variable";
10782     ReferenceType[ReferenceType["Function"] = 3] = "Function";
10783     ReferenceType[ReferenceType["Keyframe"] = 4] = "Keyframe";
10784     ReferenceType[ReferenceType["Unknown"] = 5] = "Unknown";
10785     ReferenceType[ReferenceType["Module"] = 6] = "Module";
10786     ReferenceType[ReferenceType["Forward"] = 7] = "Forward";
10787     ReferenceType[ReferenceType["ForwardVisibility"] = 8] = "ForwardVisibility";
10788 })(ReferenceType || (ReferenceType = {}));
10789 function getNodeAtOffset(node, offset) {
10790     var candidate = null;
10791     if (!node || offset < node.offset || offset > node.end) {
10792         return null;
10793     }
10794     // Find the shortest node at the position
10795     node.accept(function (node) {
10796         if (node.offset === -1 && node.length === -1) {
10797             return true;
10798         }
10799         if (node.offset <= offset && node.end >= offset) {
10800             if (!candidate) {
10801                 candidate = node;
10802             }
10803             else if (node.length <= candidate.length) {
10804                 candidate = node;
10805             }
10806             return true;
10807         }
10808         return false;
10809     });
10810     return candidate;
10811 }
10812 function getNodePath(node, offset) {
10813     var candidate = getNodeAtOffset(node, offset);
10814     var path = [];
10815     while (candidate) {
10816         path.unshift(candidate);
10817         candidate = candidate.parent;
10818     }
10819     return path;
10820 }
10821 function getParentDeclaration(node) {
10822     var decl = node.findParent(NodeType.Declaration);
10823     var value = decl && decl.getValue();
10824     if (value && value.encloses(node)) {
10825         return decl;
10826     }
10827     return null;
10828 }
10829 var Node = /** @class */ (function () {
10830     function Node(offset, len, nodeType) {
10831         if (offset === void 0) { offset = -1; }
10832         if (len === void 0) { len = -1; }
10833         this.parent = null;
10834         this.offset = offset;
10835         this.length = len;
10836         if (nodeType) {
10837             this.nodeType = nodeType;
10838         }
10839     }
10840     Object.defineProperty(Node.prototype, "end", {
10841         get: function () { return this.offset + this.length; },
10842         enumerable: false,
10843         configurable: true
10844     });
10845     Object.defineProperty(Node.prototype, "type", {
10846         get: function () {
10847             return this.nodeType || NodeType.Undefined;
10848         },
10849         set: function (type) {
10850             this.nodeType = type;
10851         },
10852         enumerable: false,
10853         configurable: true
10854     });
10855     Node.prototype.getTextProvider = function () {
10856         var node = this;
10857         while (node && !node.textProvider) {
10858             node = node.parent;
10859         }
10860         if (node) {
10861             return node.textProvider;
10862         }
10863         return function () { return 'unknown'; };
10864     };
10865     Node.prototype.getText = function () {
10866         return this.getTextProvider()(this.offset, this.length);
10867     };
10868     Node.prototype.matches = function (str) {
10869         return this.length === str.length && this.getTextProvider()(this.offset, this.length) === str;
10870     };
10871     Node.prototype.startsWith = function (str) {
10872         return this.length >= str.length && this.getTextProvider()(this.offset, str.length) === str;
10873     };
10874     Node.prototype.endsWith = function (str) {
10875         return this.length >= str.length && this.getTextProvider()(this.end - str.length, str.length) === str;
10876     };
10877     Node.prototype.accept = function (visitor) {
10878         if (visitor(this) && this.children) {
10879             for (var _i = 0, _a = this.children; _i < _a.length; _i++) {
10880                 var child = _a[_i];
10881                 child.accept(visitor);
10882             }
10883         }
10884     };
10885     Node.prototype.acceptVisitor = function (visitor) {
10886         this.accept(visitor.visitNode.bind(visitor));
10887     };
10888     Node.prototype.adoptChild = function (node, index) {
10889         if (index === void 0) { index = -1; }
10890         if (node.parent && node.parent.children) {
10891             var idx = node.parent.children.indexOf(node);
10892             if (idx >= 0) {
10893                 node.parent.children.splice(idx, 1);
10894             }
10895         }
10896         node.parent = this;
10897         var children = this.children;
10898         if (!children) {
10899             children = this.children = [];
10900         }
10901         if (index !== -1) {
10902             children.splice(index, 0, node);
10903         }
10904         else {
10905             children.push(node);
10906         }
10907         return node;
10908     };
10909     Node.prototype.attachTo = function (parent, index) {
10910         if (index === void 0) { index = -1; }
10911         if (parent) {
10912             parent.adoptChild(this, index);
10913         }
10914         return this;
10915     };
10916     Node.prototype.collectIssues = function (results) {
10917         if (this.issues) {
10918             results.push.apply(results, this.issues);
10919         }
10920     };
10921     Node.prototype.addIssue = function (issue) {
10922         if (!this.issues) {
10923             this.issues = [];
10924         }
10925         this.issues.push(issue);
10926     };
10927     Node.prototype.hasIssue = function (rule) {
10928         return Array.isArray(this.issues) && this.issues.some(function (i) { return i.getRule() === rule; });
10929     };
10930     Node.prototype.isErroneous = function (recursive) {
10931         if (recursive === void 0) { recursive = false; }
10932         if (this.issues && this.issues.length > 0) {
10933             return true;
10934         }
10935         return recursive && Array.isArray(this.children) && this.children.some(function (c) { return c.isErroneous(true); });
10936     };
10937     Node.prototype.setNode = function (field, node, index) {
10938         if (index === void 0) { index = -1; }
10939         if (node) {
10940             node.attachTo(this, index);
10941             this[field] = node;
10942             return true;
10943         }
10944         return false;
10945     };
10946     Node.prototype.addChild = function (node) {
10947         if (node) {
10948             if (!this.children) {
10949                 this.children = [];
10950             }
10951             node.attachTo(this);
10952             this.updateOffsetAndLength(node);
10953             return true;
10954         }
10955         return false;
10956     };
10957     Node.prototype.updateOffsetAndLength = function (node) {
10958         if (node.offset < this.offset || this.offset === -1) {
10959             this.offset = node.offset;
10960         }
10961         var nodeEnd = node.end;
10962         if ((nodeEnd > this.end) || this.length === -1) {
10963             this.length = nodeEnd - this.offset;
10964         }
10965     };
10966     Node.prototype.hasChildren = function () {
10967         return !!this.children && this.children.length > 0;
10968     };
10969     Node.prototype.getChildren = function () {
10970         return this.children ? this.children.slice(0) : [];
10971     };
10972     Node.prototype.getChild = function (index) {
10973         if (this.children && index < this.children.length) {
10974             return this.children[index];
10975         }
10976         return null;
10977     };
10978     Node.prototype.addChildren = function (nodes) {
10979         for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
10980             var node = nodes_1[_i];
10981             this.addChild(node);
10982         }
10983     };
10984     Node.prototype.findFirstChildBeforeOffset = function (offset) {
10985         if (this.children) {
10986             var current = null;
10987             for (var i = this.children.length - 1; i >= 0; i--) {
10988                 // iterate until we find a child that has a start offset smaller than the input offset
10989                 current = this.children[i];
10990                 if (current.offset <= offset) {
10991                     return current;
10992                 }
10993             }
10994         }
10995         return null;
10996     };
10997     Node.prototype.findChildAtOffset = function (offset, goDeep) {
10998         var current = this.findFirstChildBeforeOffset(offset);
10999         if (current && current.end >= offset) {
11000             if (goDeep) {
11001                 return current.findChildAtOffset(offset, true) || current;
11002             }
11003             return current;
11004         }
11005         return null;
11006     };
11007     Node.prototype.encloses = function (candidate) {
11008         return this.offset <= candidate.offset && this.offset + this.length >= candidate.offset + candidate.length;
11009     };
11010     Node.prototype.getParent = function () {
11011         var result = this.parent;
11012         while (result instanceof Nodelist) {
11013             result = result.parent;
11014         }
11015         return result;
11016     };
11017     Node.prototype.findParent = function (type) {
11018         var result = this;
11019         while (result && result.type !== type) {
11020             result = result.parent;
11021         }
11022         return result;
11023     };
11024     Node.prototype.findAParent = function () {
11025         var types = [];
11026         for (var _i = 0; _i < arguments.length; _i++) {
11027             types[_i] = arguments[_i];
11028         }
11029         var result = this;
11030         while (result && !types.some(function (t) { return result.type === t; })) {
11031             result = result.parent;
11032         }
11033         return result;
11034     };
11035     Node.prototype.setData = function (key, value) {
11036         if (!this.options) {
11037             this.options = {};
11038         }
11039         this.options[key] = value;
11040     };
11041     Node.prototype.getData = function (key) {
11042         if (!this.options || !this.options.hasOwnProperty(key)) {
11043             return null;
11044         }
11045         return this.options[key];
11046     };
11047     return Node;
11048 }());
11049
11050 var Nodelist = /** @class */ (function (_super) {
11051     __extends(Nodelist, _super);
11052     function Nodelist(parent, index) {
11053         if (index === void 0) { index = -1; }
11054         var _this = _super.call(this, -1, -1) || this;
11055         _this.attachTo(parent, index);
11056         _this.offset = -1;
11057         _this.length = -1;
11058         return _this;
11059     }
11060     return Nodelist;
11061 }(Node));
11062
11063 var Identifier = /** @class */ (function (_super) {
11064     __extends(Identifier, _super);
11065     function Identifier(offset, length) {
11066         var _this = _super.call(this, offset, length) || this;
11067         _this.isCustomProperty = false;
11068         return _this;
11069     }
11070     Object.defineProperty(Identifier.prototype, "type", {
11071         get: function () {
11072             return NodeType.Identifier;
11073         },
11074         enumerable: false,
11075         configurable: true
11076     });
11077     Identifier.prototype.containsInterpolation = function () {
11078         return this.hasChildren();
11079     };
11080     return Identifier;
11081 }(Node));
11082
11083 var Stylesheet = /** @class */ (function (_super) {
11084     __extends(Stylesheet, _super);
11085     function Stylesheet(offset, length) {
11086         return _super.call(this, offset, length) || this;
11087     }
11088     Object.defineProperty(Stylesheet.prototype, "type", {
11089         get: function () {
11090             return NodeType.Stylesheet;
11091         },
11092         enumerable: false,
11093         configurable: true
11094     });
11095     return Stylesheet;
11096 }(Node));
11097
11098 var Declarations = /** @class */ (function (_super) {
11099     __extends(Declarations, _super);
11100     function Declarations(offset, length) {
11101         return _super.call(this, offset, length) || this;
11102     }
11103     Object.defineProperty(Declarations.prototype, "type", {
11104         get: function () {
11105             return NodeType.Declarations;
11106         },
11107         enumerable: false,
11108         configurable: true
11109     });
11110     return Declarations;
11111 }(Node));
11112
11113 var BodyDeclaration = /** @class */ (function (_super) {
11114     __extends(BodyDeclaration, _super);
11115     function BodyDeclaration(offset, length) {
11116         return _super.call(this, offset, length) || this;
11117     }
11118     BodyDeclaration.prototype.getDeclarations = function () {
11119         return this.declarations;
11120     };
11121     BodyDeclaration.prototype.setDeclarations = function (decls) {
11122         return this.setNode('declarations', decls);
11123     };
11124     return BodyDeclaration;
11125 }(Node));
11126
11127 var RuleSet = /** @class */ (function (_super) {
11128     __extends(RuleSet, _super);
11129     function RuleSet(offset, length) {
11130         return _super.call(this, offset, length) || this;
11131     }
11132     Object.defineProperty(RuleSet.prototype, "type", {
11133         get: function () {
11134             return NodeType.Ruleset;
11135         },
11136         enumerable: false,
11137         configurable: true
11138     });
11139     RuleSet.prototype.getSelectors = function () {
11140         if (!this.selectors) {
11141             this.selectors = new Nodelist(this);
11142         }
11143         return this.selectors;
11144     };
11145     RuleSet.prototype.isNested = function () {
11146         return !!this.parent && this.parent.findParent(NodeType.Declarations) !== null;
11147     };
11148     return RuleSet;
11149 }(BodyDeclaration));
11150
11151 var Selector = /** @class */ (function (_super) {
11152     __extends(Selector, _super);
11153     function Selector(offset, length) {
11154         return _super.call(this, offset, length) || this;
11155     }
11156     Object.defineProperty(Selector.prototype, "type", {
11157         get: function () {
11158             return NodeType.Selector;
11159         },
11160         enumerable: false,
11161         configurable: true
11162     });
11163     return Selector;
11164 }(Node));
11165
11166 var SimpleSelector = /** @class */ (function (_super) {
11167     __extends(SimpleSelector, _super);
11168     function SimpleSelector(offset, length) {
11169         return _super.call(this, offset, length) || this;
11170     }
11171     Object.defineProperty(SimpleSelector.prototype, "type", {
11172         get: function () {
11173             return NodeType.SimpleSelector;
11174         },
11175         enumerable: false,
11176         configurable: true
11177     });
11178     return SimpleSelector;
11179 }(Node));
11180
11181 var AtApplyRule = /** @class */ (function (_super) {
11182     __extends(AtApplyRule, _super);
11183     function AtApplyRule(offset, length) {
11184         return _super.call(this, offset, length) || this;
11185     }
11186     Object.defineProperty(AtApplyRule.prototype, "type", {
11187         get: function () {
11188             return NodeType.AtApplyRule;
11189         },
11190         enumerable: false,
11191         configurable: true
11192     });
11193     AtApplyRule.prototype.setIdentifier = function (node) {
11194         return this.setNode('identifier', node, 0);
11195     };
11196     AtApplyRule.prototype.getIdentifier = function () {
11197         return this.identifier;
11198     };
11199     AtApplyRule.prototype.getName = function () {
11200         return this.identifier ? this.identifier.getText() : '';
11201     };
11202     return AtApplyRule;
11203 }(Node));
11204
11205 var AbstractDeclaration = /** @class */ (function (_super) {
11206     __extends(AbstractDeclaration, _super);
11207     function AbstractDeclaration(offset, length) {
11208         return _super.call(this, offset, length) || this;
11209     }
11210     return AbstractDeclaration;
11211 }(Node));
11212
11213 var CustomPropertyDeclaration = /** @class */ (function (_super) {
11214     __extends(CustomPropertyDeclaration, _super);
11215     function CustomPropertyDeclaration(offset, length) {
11216         return _super.call(this, offset, length) || this;
11217     }
11218     Object.defineProperty(CustomPropertyDeclaration.prototype, "type", {
11219         get: function () {
11220             return NodeType.CustomPropertyDeclaration;
11221         },
11222         enumerable: false,
11223         configurable: true
11224     });
11225     CustomPropertyDeclaration.prototype.setProperty = function (node) {
11226         return this.setNode('property', node);
11227     };
11228     CustomPropertyDeclaration.prototype.getProperty = function () {
11229         return this.property;
11230     };
11231     CustomPropertyDeclaration.prototype.setValue = function (value) {
11232         return this.setNode('value', value);
11233     };
11234     CustomPropertyDeclaration.prototype.getValue = function () {
11235         return this.value;
11236     };
11237     CustomPropertyDeclaration.prototype.setPropertySet = function (value) {
11238         return this.setNode('propertySet', value);
11239     };
11240     CustomPropertyDeclaration.prototype.getPropertySet = function () {
11241         return this.propertySet;
11242     };
11243     return CustomPropertyDeclaration;
11244 }(AbstractDeclaration));
11245
11246 var CustomPropertySet = /** @class */ (function (_super) {
11247     __extends(CustomPropertySet, _super);
11248     function CustomPropertySet(offset, length) {
11249         return _super.call(this, offset, length) || this;
11250     }
11251     Object.defineProperty(CustomPropertySet.prototype, "type", {
11252         get: function () {
11253             return NodeType.CustomPropertySet;
11254         },
11255         enumerable: false,
11256         configurable: true
11257     });
11258     return CustomPropertySet;
11259 }(BodyDeclaration));
11260
11261 var Declaration = /** @class */ (function (_super) {
11262     __extends(Declaration, _super);
11263     function Declaration(offset, length) {
11264         var _this = _super.call(this, offset, length) || this;
11265         _this.property = null;
11266         return _this;
11267     }
11268     Object.defineProperty(Declaration.prototype, "type", {
11269         get: function () {
11270             return NodeType.Declaration;
11271         },
11272         enumerable: false,
11273         configurable: true
11274     });
11275     Declaration.prototype.setProperty = function (node) {
11276         return this.setNode('property', node);
11277     };
11278     Declaration.prototype.getProperty = function () {
11279         return this.property;
11280     };
11281     Declaration.prototype.getFullPropertyName = function () {
11282         var propertyName = this.property ? this.property.getName() : 'unknown';
11283         if (this.parent instanceof Declarations && this.parent.getParent() instanceof NestedProperties) {
11284             var parentDecl = this.parent.getParent().getParent();
11285             if (parentDecl instanceof Declaration) {
11286                 return parentDecl.getFullPropertyName() + propertyName;
11287             }
11288         }
11289         return propertyName;
11290     };
11291     Declaration.prototype.getNonPrefixedPropertyName = function () {
11292         var propertyName = this.getFullPropertyName();
11293         if (propertyName && propertyName.charAt(0) === '-') {
11294             var vendorPrefixEnd = propertyName.indexOf('-', 1);
11295             if (vendorPrefixEnd !== -1) {
11296                 return propertyName.substring(vendorPrefixEnd + 1);
11297             }
11298         }
11299         return propertyName;
11300     };
11301     Declaration.prototype.setValue = function (value) {
11302         return this.setNode('value', value);
11303     };
11304     Declaration.prototype.getValue = function () {
11305         return this.value;
11306     };
11307     Declaration.prototype.setNestedProperties = function (value) {
11308         return this.setNode('nestedProperties', value);
11309     };
11310     Declaration.prototype.getNestedProperties = function () {
11311         return this.nestedProperties;
11312     };
11313     return Declaration;
11314 }(AbstractDeclaration));
11315
11316 var Property = /** @class */ (function (_super) {
11317     __extends(Property, _super);
11318     function Property(offset, length) {
11319         return _super.call(this, offset, length) || this;
11320     }
11321     Object.defineProperty(Property.prototype, "type", {
11322         get: function () {
11323             return NodeType.Property;
11324         },
11325         enumerable: false,
11326         configurable: true
11327     });
11328     Property.prototype.setIdentifier = function (value) {
11329         return this.setNode('identifier', value);
11330     };
11331     Property.prototype.getIdentifier = function () {
11332         return this.identifier;
11333     };
11334     Property.prototype.getName = function () {
11335         return (0,_utils_strings__WEBPACK_IMPORTED_MODULE_0__.trim)(this.getText(), /[_\+]+$/); /* +_: less merge */
11336     };
11337     Property.prototype.isCustomProperty = function () {
11338         return !!this.identifier && this.identifier.isCustomProperty;
11339     };
11340     return Property;
11341 }(Node));
11342
11343 var Invocation = /** @class */ (function (_super) {
11344     __extends(Invocation, _super);
11345     function Invocation(offset, length) {
11346         return _super.call(this, offset, length) || this;
11347     }
11348     Object.defineProperty(Invocation.prototype, "type", {
11349         get: function () {
11350             return NodeType.Invocation;
11351         },
11352         enumerable: false,
11353         configurable: true
11354     });
11355     Invocation.prototype.getArguments = function () {
11356         if (!this.arguments) {
11357             this.arguments = new Nodelist(this);
11358         }
11359         return this.arguments;
11360     };
11361     return Invocation;
11362 }(Node));
11363
11364 var Function = /** @class */ (function (_super) {
11365     __extends(Function, _super);
11366     function Function(offset, length) {
11367         return _super.call(this, offset, length) || this;
11368     }
11369     Object.defineProperty(Function.prototype, "type", {
11370         get: function () {
11371             return NodeType.Function;
11372         },
11373         enumerable: false,
11374         configurable: true
11375     });
11376     Function.prototype.setIdentifier = function (node) {
11377         return this.setNode('identifier', node, 0);
11378     };
11379     Function.prototype.getIdentifier = function () {
11380         return this.identifier;
11381     };
11382     Function.prototype.getName = function () {
11383         return this.identifier ? this.identifier.getText() : '';
11384     };
11385     return Function;
11386 }(Invocation));
11387
11388 var FunctionParameter = /** @class */ (function (_super) {
11389     __extends(FunctionParameter, _super);
11390     function FunctionParameter(offset, length) {
11391         return _super.call(this, offset, length) || this;
11392     }
11393     Object.defineProperty(FunctionParameter.prototype, "type", {
11394         get: function () {
11395             return NodeType.FunctionParameter;
11396         },
11397         enumerable: false,
11398         configurable: true
11399     });
11400     FunctionParameter.prototype.setIdentifier = function (node) {
11401         return this.setNode('identifier', node, 0);
11402     };
11403     FunctionParameter.prototype.getIdentifier = function () {
11404         return this.identifier;
11405     };
11406     FunctionParameter.prototype.getName = function () {
11407         return this.identifier ? this.identifier.getText() : '';
11408     };
11409     FunctionParameter.prototype.setDefaultValue = function (node) {
11410         return this.setNode('defaultValue', node, 0);
11411     };
11412     FunctionParameter.prototype.getDefaultValue = function () {
11413         return this.defaultValue;
11414     };
11415     return FunctionParameter;
11416 }(Node));
11417
11418 var FunctionArgument = /** @class */ (function (_super) {
11419     __extends(FunctionArgument, _super);
11420     function FunctionArgument(offset, length) {
11421         return _super.call(this, offset, length) || this;
11422     }
11423     Object.defineProperty(FunctionArgument.prototype, "type", {
11424         get: function () {
11425             return NodeType.FunctionArgument;
11426         },
11427         enumerable: false,
11428         configurable: true
11429     });
11430     FunctionArgument.prototype.setIdentifier = function (node) {
11431         return this.setNode('identifier', node, 0);
11432     };
11433     FunctionArgument.prototype.getIdentifier = function () {
11434         return this.identifier;
11435     };
11436     FunctionArgument.prototype.getName = function () {
11437         return this.identifier ? this.identifier.getText() : '';
11438     };
11439     FunctionArgument.prototype.setValue = function (node) {
11440         return this.setNode('value', node, 0);
11441     };
11442     FunctionArgument.prototype.getValue = function () {
11443         return this.value;
11444     };
11445     return FunctionArgument;
11446 }(Node));
11447
11448 var IfStatement = /** @class */ (function (_super) {
11449     __extends(IfStatement, _super);
11450     function IfStatement(offset, length) {
11451         return _super.call(this, offset, length) || this;
11452     }
11453     Object.defineProperty(IfStatement.prototype, "type", {
11454         get: function () {
11455             return NodeType.If;
11456         },
11457         enumerable: false,
11458         configurable: true
11459     });
11460     IfStatement.prototype.setExpression = function (node) {
11461         return this.setNode('expression', node, 0);
11462     };
11463     IfStatement.prototype.setElseClause = function (elseClause) {
11464         return this.setNode('elseClause', elseClause);
11465     };
11466     return IfStatement;
11467 }(BodyDeclaration));
11468
11469 var ForStatement = /** @class */ (function (_super) {
11470     __extends(ForStatement, _super);
11471     function ForStatement(offset, length) {
11472         return _super.call(this, offset, length) || this;
11473     }
11474     Object.defineProperty(ForStatement.prototype, "type", {
11475         get: function () {
11476             return NodeType.For;
11477         },
11478         enumerable: false,
11479         configurable: true
11480     });
11481     ForStatement.prototype.setVariable = function (node) {
11482         return this.setNode('variable', node, 0);
11483     };
11484     return ForStatement;
11485 }(BodyDeclaration));
11486
11487 var EachStatement = /** @class */ (function (_super) {
11488     __extends(EachStatement, _super);
11489     function EachStatement(offset, length) {
11490         return _super.call(this, offset, length) || this;
11491     }
11492     Object.defineProperty(EachStatement.prototype, "type", {
11493         get: function () {
11494             return NodeType.Each;
11495         },
11496         enumerable: false,
11497         configurable: true
11498     });
11499     EachStatement.prototype.getVariables = function () {
11500         if (!this.variables) {
11501             this.variables = new Nodelist(this);
11502         }
11503         return this.variables;
11504     };
11505     return EachStatement;
11506 }(BodyDeclaration));
11507
11508 var WhileStatement = /** @class */ (function (_super) {
11509     __extends(WhileStatement, _super);
11510     function WhileStatement(offset, length) {
11511         return _super.call(this, offset, length) || this;
11512     }
11513     Object.defineProperty(WhileStatement.prototype, "type", {
11514         get: function () {
11515             return NodeType.While;
11516         },
11517         enumerable: false,
11518         configurable: true
11519     });
11520     return WhileStatement;
11521 }(BodyDeclaration));
11522
11523 var ElseStatement = /** @class */ (function (_super) {
11524     __extends(ElseStatement, _super);
11525     function ElseStatement(offset, length) {
11526         return _super.call(this, offset, length) || this;
11527     }
11528     Object.defineProperty(ElseStatement.prototype, "type", {
11529         get: function () {
11530             return NodeType.Else;
11531         },
11532         enumerable: false,
11533         configurable: true
11534     });
11535     return ElseStatement;
11536 }(BodyDeclaration));
11537
11538 var FunctionDeclaration = /** @class */ (function (_super) {
11539     __extends(FunctionDeclaration, _super);
11540     function FunctionDeclaration(offset, length) {
11541         return _super.call(this, offset, length) || this;
11542     }
11543     Object.defineProperty(FunctionDeclaration.prototype, "type", {
11544         get: function () {
11545             return NodeType.FunctionDeclaration;
11546         },
11547         enumerable: false,
11548         configurable: true
11549     });
11550     FunctionDeclaration.prototype.setIdentifier = function (node) {
11551         return this.setNode('identifier', node, 0);
11552     };
11553     FunctionDeclaration.prototype.getIdentifier = function () {
11554         return this.identifier;
11555     };
11556     FunctionDeclaration.prototype.getName = function () {
11557         return this.identifier ? this.identifier.getText() : '';
11558     };
11559     FunctionDeclaration.prototype.getParameters = function () {
11560         if (!this.parameters) {
11561             this.parameters = new Nodelist(this);
11562         }
11563         return this.parameters;
11564     };
11565     return FunctionDeclaration;
11566 }(BodyDeclaration));
11567
11568 var ViewPort = /** @class */ (function (_super) {
11569     __extends(ViewPort, _super);
11570     function ViewPort(offset, length) {
11571         return _super.call(this, offset, length) || this;
11572     }
11573     Object.defineProperty(ViewPort.prototype, "type", {
11574         get: function () {
11575             return NodeType.ViewPort;
11576         },
11577         enumerable: false,
11578         configurable: true
11579     });
11580     return ViewPort;
11581 }(BodyDeclaration));
11582
11583 var FontFace = /** @class */ (function (_super) {
11584     __extends(FontFace, _super);
11585     function FontFace(offset, length) {
11586         return _super.call(this, offset, length) || this;
11587     }
11588     Object.defineProperty(FontFace.prototype, "type", {
11589         get: function () {
11590             return NodeType.FontFace;
11591         },
11592         enumerable: false,
11593         configurable: true
11594     });
11595     return FontFace;
11596 }(BodyDeclaration));
11597
11598 var NestedProperties = /** @class */ (function (_super) {
11599     __extends(NestedProperties, _super);
11600     function NestedProperties(offset, length) {
11601         return _super.call(this, offset, length) || this;
11602     }
11603     Object.defineProperty(NestedProperties.prototype, "type", {
11604         get: function () {
11605             return NodeType.NestedProperties;
11606         },
11607         enumerable: false,
11608         configurable: true
11609     });
11610     return NestedProperties;
11611 }(BodyDeclaration));
11612
11613 var Keyframe = /** @class */ (function (_super) {
11614     __extends(Keyframe, _super);
11615     function Keyframe(offset, length) {
11616         return _super.call(this, offset, length) || this;
11617     }
11618     Object.defineProperty(Keyframe.prototype, "type", {
11619         get: function () {
11620             return NodeType.Keyframe;
11621         },
11622         enumerable: false,
11623         configurable: true
11624     });
11625     Keyframe.prototype.setKeyword = function (keyword) {
11626         return this.setNode('keyword', keyword, 0);
11627     };
11628     Keyframe.prototype.getKeyword = function () {
11629         return this.keyword;
11630     };
11631     Keyframe.prototype.setIdentifier = function (node) {
11632         return this.setNode('identifier', node, 0);
11633     };
11634     Keyframe.prototype.getIdentifier = function () {
11635         return this.identifier;
11636     };
11637     Keyframe.prototype.getName = function () {
11638         return this.identifier ? this.identifier.getText() : '';
11639     };
11640     return Keyframe;
11641 }(BodyDeclaration));
11642
11643 var KeyframeSelector = /** @class */ (function (_super) {
11644     __extends(KeyframeSelector, _super);
11645     function KeyframeSelector(offset, length) {
11646         return _super.call(this, offset, length) || this;
11647     }
11648     Object.defineProperty(KeyframeSelector.prototype, "type", {
11649         get: function () {
11650             return NodeType.KeyframeSelector;
11651         },
11652         enumerable: false,
11653         configurable: true
11654     });
11655     return KeyframeSelector;
11656 }(BodyDeclaration));
11657
11658 var Import = /** @class */ (function (_super) {
11659     __extends(Import, _super);
11660     function Import(offset, length) {
11661         return _super.call(this, offset, length) || this;
11662     }
11663     Object.defineProperty(Import.prototype, "type", {
11664         get: function () {
11665             return NodeType.Import;
11666         },
11667         enumerable: false,
11668         configurable: true
11669     });
11670     Import.prototype.setMedialist = function (node) {
11671         if (node) {
11672             node.attachTo(this);
11673             return true;
11674         }
11675         return false;
11676     };
11677     return Import;
11678 }(Node));
11679
11680 var Use = /** @class */ (function (_super) {
11681     __extends(Use, _super);
11682     function Use() {
11683         return _super !== null && _super.apply(this, arguments) || this;
11684     }
11685     Object.defineProperty(Use.prototype, "type", {
11686         get: function () {
11687             return NodeType.Use;
11688         },
11689         enumerable: false,
11690         configurable: true
11691     });
11692     Use.prototype.getParameters = function () {
11693         if (!this.parameters) {
11694             this.parameters = new Nodelist(this);
11695         }
11696         return this.parameters;
11697     };
11698     Use.prototype.setIdentifier = function (node) {
11699         return this.setNode('identifier', node, 0);
11700     };
11701     Use.prototype.getIdentifier = function () {
11702         return this.identifier;
11703     };
11704     return Use;
11705 }(Node));
11706
11707 var ModuleConfiguration = /** @class */ (function (_super) {
11708     __extends(ModuleConfiguration, _super);
11709     function ModuleConfiguration() {
11710         return _super !== null && _super.apply(this, arguments) || this;
11711     }
11712     Object.defineProperty(ModuleConfiguration.prototype, "type", {
11713         get: function () {
11714             return NodeType.ModuleConfiguration;
11715         },
11716         enumerable: false,
11717         configurable: true
11718     });
11719     ModuleConfiguration.prototype.setIdentifier = function (node) {
11720         return this.setNode('identifier', node, 0);
11721     };
11722     ModuleConfiguration.prototype.getIdentifier = function () {
11723         return this.identifier;
11724     };
11725     ModuleConfiguration.prototype.getName = function () {
11726         return this.identifier ? this.identifier.getText() : '';
11727     };
11728     ModuleConfiguration.prototype.setValue = function (node) {
11729         return this.setNode('value', node, 0);
11730     };
11731     ModuleConfiguration.prototype.getValue = function () {
11732         return this.value;
11733     };
11734     return ModuleConfiguration;
11735 }(Node));
11736
11737 var Forward = /** @class */ (function (_super) {
11738     __extends(Forward, _super);
11739     function Forward() {
11740         return _super !== null && _super.apply(this, arguments) || this;
11741     }
11742     Object.defineProperty(Forward.prototype, "type", {
11743         get: function () {
11744             return NodeType.Forward;
11745         },
11746         enumerable: false,
11747         configurable: true
11748     });
11749     Forward.prototype.setIdentifier = function (node) {
11750         return this.setNode('identifier', node, 0);
11751     };
11752     Forward.prototype.getIdentifier = function () {
11753         return this.identifier;
11754     };
11755     return Forward;
11756 }(Node));
11757
11758 var ForwardVisibility = /** @class */ (function (_super) {
11759     __extends(ForwardVisibility, _super);
11760     function ForwardVisibility() {
11761         return _super !== null && _super.apply(this, arguments) || this;
11762     }
11763     Object.defineProperty(ForwardVisibility.prototype, "type", {
11764         get: function () {
11765             return NodeType.ForwardVisibility;
11766         },
11767         enumerable: false,
11768         configurable: true
11769     });
11770     ForwardVisibility.prototype.setIdentifier = function (node) {
11771         return this.setNode('identifier', node, 0);
11772     };
11773     ForwardVisibility.prototype.getIdentifier = function () {
11774         return this.identifier;
11775     };
11776     return ForwardVisibility;
11777 }(Node));
11778
11779 var Namespace = /** @class */ (function (_super) {
11780     __extends(Namespace, _super);
11781     function Namespace(offset, length) {
11782         return _super.call(this, offset, length) || this;
11783     }
11784     Object.defineProperty(Namespace.prototype, "type", {
11785         get: function () {
11786             return NodeType.Namespace;
11787         },
11788         enumerable: false,
11789         configurable: true
11790     });
11791     return Namespace;
11792 }(Node));
11793
11794 var Media = /** @class */ (function (_super) {
11795     __extends(Media, _super);
11796     function Media(offset, length) {
11797         return _super.call(this, offset, length) || this;
11798     }
11799     Object.defineProperty(Media.prototype, "type", {
11800         get: function () {
11801             return NodeType.Media;
11802         },
11803         enumerable: false,
11804         configurable: true
11805     });
11806     return Media;
11807 }(BodyDeclaration));
11808
11809 var Supports = /** @class */ (function (_super) {
11810     __extends(Supports, _super);
11811     function Supports(offset, length) {
11812         return _super.call(this, offset, length) || this;
11813     }
11814     Object.defineProperty(Supports.prototype, "type", {
11815         get: function () {
11816             return NodeType.Supports;
11817         },
11818         enumerable: false,
11819         configurable: true
11820     });
11821     return Supports;
11822 }(BodyDeclaration));
11823
11824 var Document = /** @class */ (function (_super) {
11825     __extends(Document, _super);
11826     function Document(offset, length) {
11827         return _super.call(this, offset, length) || this;
11828     }
11829     Object.defineProperty(Document.prototype, "type", {
11830         get: function () {
11831             return NodeType.Document;
11832         },
11833         enumerable: false,
11834         configurable: true
11835     });
11836     return Document;
11837 }(BodyDeclaration));
11838
11839 var Medialist = /** @class */ (function (_super) {
11840     __extends(Medialist, _super);
11841     function Medialist(offset, length) {
11842         return _super.call(this, offset, length) || this;
11843     }
11844     Medialist.prototype.getMediums = function () {
11845         if (!this.mediums) {
11846             this.mediums = new Nodelist(this);
11847         }
11848         return this.mediums;
11849     };
11850     return Medialist;
11851 }(Node));
11852
11853 var MediaQuery = /** @class */ (function (_super) {
11854     __extends(MediaQuery, _super);
11855     function MediaQuery(offset, length) {
11856         return _super.call(this, offset, length) || this;
11857     }
11858     Object.defineProperty(MediaQuery.prototype, "type", {
11859         get: function () {
11860             return NodeType.MediaQuery;
11861         },
11862         enumerable: false,
11863         configurable: true
11864     });
11865     return MediaQuery;
11866 }(Node));
11867
11868 var SupportsCondition = /** @class */ (function (_super) {
11869     __extends(SupportsCondition, _super);
11870     function SupportsCondition(offset, length) {
11871         return _super.call(this, offset, length) || this;
11872     }
11873     Object.defineProperty(SupportsCondition.prototype, "type", {
11874         get: function () {
11875             return NodeType.SupportsCondition;
11876         },
11877         enumerable: false,
11878         configurable: true
11879     });
11880     return SupportsCondition;
11881 }(Node));
11882
11883 var Page = /** @class */ (function (_super) {
11884     __extends(Page, _super);
11885     function Page(offset, length) {
11886         return _super.call(this, offset, length) || this;
11887     }
11888     Object.defineProperty(Page.prototype, "type", {
11889         get: function () {
11890             return NodeType.Page;
11891         },
11892         enumerable: false,
11893         configurable: true
11894     });
11895     return Page;
11896 }(BodyDeclaration));
11897
11898 var PageBoxMarginBox = /** @class */ (function (_super) {
11899     __extends(PageBoxMarginBox, _super);
11900     function PageBoxMarginBox(offset, length) {
11901         return _super.call(this, offset, length) || this;
11902     }
11903     Object.defineProperty(PageBoxMarginBox.prototype, "type", {
11904         get: function () {
11905             return NodeType.PageBoxMarginBox;
11906         },
11907         enumerable: false,
11908         configurable: true
11909     });
11910     return PageBoxMarginBox;
11911 }(BodyDeclaration));
11912
11913 var Expression = /** @class */ (function (_super) {
11914     __extends(Expression, _super);
11915     function Expression(offset, length) {
11916         return _super.call(this, offset, length) || this;
11917     }
11918     Object.defineProperty(Expression.prototype, "type", {
11919         get: function () {
11920             return NodeType.Expression;
11921         },
11922         enumerable: false,
11923         configurable: true
11924     });
11925     return Expression;
11926 }(Node));
11927
11928 var BinaryExpression = /** @class */ (function (_super) {
11929     __extends(BinaryExpression, _super);
11930     function BinaryExpression(offset, length) {
11931         return _super.call(this, offset, length) || this;
11932     }
11933     Object.defineProperty(BinaryExpression.prototype, "type", {
11934         get: function () {
11935             return NodeType.BinaryExpression;
11936         },
11937         enumerable: false,
11938         configurable: true
11939     });
11940     BinaryExpression.prototype.setLeft = function (left) {
11941         return this.setNode('left', left);
11942     };
11943     BinaryExpression.prototype.getLeft = function () {
11944         return this.left;
11945     };
11946     BinaryExpression.prototype.setRight = function (right) {
11947         return this.setNode('right', right);
11948     };
11949     BinaryExpression.prototype.getRight = function () {
11950         return this.right;
11951     };
11952     BinaryExpression.prototype.setOperator = function (value) {
11953         return this.setNode('operator', value);
11954     };
11955     BinaryExpression.prototype.getOperator = function () {
11956         return this.operator;
11957     };
11958     return BinaryExpression;
11959 }(Node));
11960
11961 var Term = /** @class */ (function (_super) {
11962     __extends(Term, _super);
11963     function Term(offset, length) {
11964         return _super.call(this, offset, length) || this;
11965     }
11966     Object.defineProperty(Term.prototype, "type", {
11967         get: function () {
11968             return NodeType.Term;
11969         },
11970         enumerable: false,
11971         configurable: true
11972     });
11973     Term.prototype.setOperator = function (value) {
11974         return this.setNode('operator', value);
11975     };
11976     Term.prototype.getOperator = function () {
11977         return this.operator;
11978     };
11979     Term.prototype.setExpression = function (value) {
11980         return this.setNode('expression', value);
11981     };
11982     Term.prototype.getExpression = function () {
11983         return this.expression;
11984     };
11985     return Term;
11986 }(Node));
11987
11988 var AttributeSelector = /** @class */ (function (_super) {
11989     __extends(AttributeSelector, _super);
11990     function AttributeSelector(offset, length) {
11991         return _super.call(this, offset, length) || this;
11992     }
11993     Object.defineProperty(AttributeSelector.prototype, "type", {
11994         get: function () {
11995             return NodeType.AttributeSelector;
11996         },
11997         enumerable: false,
11998         configurable: true
11999     });
12000     AttributeSelector.prototype.setNamespacePrefix = function (value) {
12001         return this.setNode('namespacePrefix', value);
12002     };
12003     AttributeSelector.prototype.getNamespacePrefix = function () {
12004         return this.namespacePrefix;
12005     };
12006     AttributeSelector.prototype.setIdentifier = function (value) {
12007         return this.setNode('identifier', value);
12008     };
12009     AttributeSelector.prototype.getIdentifier = function () {
12010         return this.identifier;
12011     };
12012     AttributeSelector.prototype.setOperator = function (operator) {
12013         return this.setNode('operator', operator);
12014     };
12015     AttributeSelector.prototype.getOperator = function () {
12016         return this.operator;
12017     };
12018     AttributeSelector.prototype.setValue = function (value) {
12019         return this.setNode('value', value);
12020     };
12021     AttributeSelector.prototype.getValue = function () {
12022         return this.value;
12023     };
12024     return AttributeSelector;
12025 }(Node));
12026
12027 var Operator = /** @class */ (function (_super) {
12028     __extends(Operator, _super);
12029     function Operator(offset, length) {
12030         return _super.call(this, offset, length) || this;
12031     }
12032     Object.defineProperty(Operator.prototype, "type", {
12033         get: function () {
12034             return NodeType.Operator;
12035         },
12036         enumerable: false,
12037         configurable: true
12038     });
12039     return Operator;
12040 }(Node));
12041
12042 var HexColorValue = /** @class */ (function (_super) {
12043     __extends(HexColorValue, _super);
12044     function HexColorValue(offset, length) {
12045         return _super.call(this, offset, length) || this;
12046     }
12047     Object.defineProperty(HexColorValue.prototype, "type", {
12048         get: function () {
12049             return NodeType.HexColorValue;
12050         },
12051         enumerable: false,
12052         configurable: true
12053     });
12054     return HexColorValue;
12055 }(Node));
12056
12057 var _dot = '.'.charCodeAt(0), _0 = '0'.charCodeAt(0), _9 = '9'.charCodeAt(0);
12058 var NumericValue = /** @class */ (function (_super) {
12059     __extends(NumericValue, _super);
12060     function NumericValue(offset, length) {
12061         return _super.call(this, offset, length) || this;
12062     }
12063     Object.defineProperty(NumericValue.prototype, "type", {
12064         get: function () {
12065             return NodeType.NumericValue;
12066         },
12067         enumerable: false,
12068         configurable: true
12069     });
12070     NumericValue.prototype.getValue = function () {
12071         var raw = this.getText();
12072         var unitIdx = 0;
12073         var code;
12074         for (var i = 0, len = raw.length; i < len; i++) {
12075             code = raw.charCodeAt(i);
12076             if (!(_0 <= code && code <= _9 || code === _dot)) {
12077                 break;
12078             }
12079             unitIdx += 1;
12080         }
12081         return {
12082             value: raw.substring(0, unitIdx),
12083             unit: unitIdx < raw.length ? raw.substring(unitIdx) : undefined
12084         };
12085     };
12086     return NumericValue;
12087 }(Node));
12088
12089 var VariableDeclaration = /** @class */ (function (_super) {
12090     __extends(VariableDeclaration, _super);
12091     function VariableDeclaration(offset, length) {
12092         var _this = _super.call(this, offset, length) || this;
12093         _this.variable = null;
12094         _this.value = null;
12095         _this.needsSemicolon = true;
12096         return _this;
12097     }
12098     Object.defineProperty(VariableDeclaration.prototype, "type", {
12099         get: function () {
12100             return NodeType.VariableDeclaration;
12101         },
12102         enumerable: false,
12103         configurable: true
12104     });
12105     VariableDeclaration.prototype.setVariable = function (node) {
12106         if (node) {
12107             node.attachTo(this);
12108             this.variable = node;
12109             return true;
12110         }
12111         return false;
12112     };
12113     VariableDeclaration.prototype.getVariable = function () {
12114         return this.variable;
12115     };
12116     VariableDeclaration.prototype.getName = function () {
12117         return this.variable ? this.variable.getName() : '';
12118     };
12119     VariableDeclaration.prototype.setValue = function (node) {
12120         if (node) {
12121             node.attachTo(this);
12122             this.value = node;
12123             return true;
12124         }
12125         return false;
12126     };
12127     VariableDeclaration.prototype.getValue = function () {
12128         return this.value;
12129     };
12130     return VariableDeclaration;
12131 }(AbstractDeclaration));
12132
12133 var Interpolation = /** @class */ (function (_super) {
12134     __extends(Interpolation, _super);
12135     // private _interpolations: void; // workaround for https://github.com/Microsoft/TypeScript/issues/18276
12136     function Interpolation(offset, length) {
12137         return _super.call(this, offset, length) || this;
12138     }
12139     Object.defineProperty(Interpolation.prototype, "type", {
12140         get: function () {
12141             return NodeType.Interpolation;
12142         },
12143         enumerable: false,
12144         configurable: true
12145     });
12146     return Interpolation;
12147 }(Node));
12148
12149 var Variable = /** @class */ (function (_super) {
12150     __extends(Variable, _super);
12151     function Variable(offset, length) {
12152         return _super.call(this, offset, length) || this;
12153     }
12154     Object.defineProperty(Variable.prototype, "type", {
12155         get: function () {
12156             return NodeType.VariableName;
12157         },
12158         enumerable: false,
12159         configurable: true
12160     });
12161     Variable.prototype.getName = function () {
12162         return this.getText();
12163     };
12164     return Variable;
12165 }(Node));
12166
12167 var ExtendsReference = /** @class */ (function (_super) {
12168     __extends(ExtendsReference, _super);
12169     function ExtendsReference(offset, length) {
12170         return _super.call(this, offset, length) || this;
12171     }
12172     Object.defineProperty(ExtendsReference.prototype, "type", {
12173         get: function () {
12174             return NodeType.ExtendsReference;
12175         },
12176         enumerable: false,
12177         configurable: true
12178     });
12179     ExtendsReference.prototype.getSelectors = function () {
12180         if (!this.selectors) {
12181             this.selectors = new Nodelist(this);
12182         }
12183         return this.selectors;
12184     };
12185     return ExtendsReference;
12186 }(Node));
12187
12188 var MixinContentReference = /** @class */ (function (_super) {
12189     __extends(MixinContentReference, _super);
12190     function MixinContentReference(offset, length) {
12191         return _super.call(this, offset, length) || this;
12192     }
12193     Object.defineProperty(MixinContentReference.prototype, "type", {
12194         get: function () {
12195             return NodeType.MixinContentReference;
12196         },
12197         enumerable: false,
12198         configurable: true
12199     });
12200     MixinContentReference.prototype.getArguments = function () {
12201         if (!this.arguments) {
12202             this.arguments = new Nodelist(this);
12203         }
12204         return this.arguments;
12205     };
12206     return MixinContentReference;
12207 }(Node));
12208
12209 var MixinContentDeclaration = /** @class */ (function (_super) {
12210     __extends(MixinContentDeclaration, _super);
12211     function MixinContentDeclaration(offset, length) {
12212         return _super.call(this, offset, length) || this;
12213     }
12214     Object.defineProperty(MixinContentDeclaration.prototype, "type", {
12215         get: function () {
12216             return NodeType.MixinContentReference;
12217         },
12218         enumerable: false,
12219         configurable: true
12220     });
12221     MixinContentDeclaration.prototype.getParameters = function () {
12222         if (!this.parameters) {
12223             this.parameters = new Nodelist(this);
12224         }
12225         return this.parameters;
12226     };
12227     return MixinContentDeclaration;
12228 }(BodyDeclaration));
12229
12230 var MixinReference = /** @class */ (function (_super) {
12231     __extends(MixinReference, _super);
12232     function MixinReference(offset, length) {
12233         return _super.call(this, offset, length) || this;
12234     }
12235     Object.defineProperty(MixinReference.prototype, "type", {
12236         get: function () {
12237             return NodeType.MixinReference;
12238         },
12239         enumerable: false,
12240         configurable: true
12241     });
12242     MixinReference.prototype.getNamespaces = function () {
12243         if (!this.namespaces) {
12244             this.namespaces = new Nodelist(this);
12245         }
12246         return this.namespaces;
12247     };
12248     MixinReference.prototype.setIdentifier = function (node) {
12249         return this.setNode('identifier', node, 0);
12250     };
12251     MixinReference.prototype.getIdentifier = function () {
12252         return this.identifier;
12253     };
12254     MixinReference.prototype.getName = function () {
12255         return this.identifier ? this.identifier.getText() : '';
12256     };
12257     MixinReference.prototype.getArguments = function () {
12258         if (!this.arguments) {
12259             this.arguments = new Nodelist(this);
12260         }
12261         return this.arguments;
12262     };
12263     MixinReference.prototype.setContent = function (node) {
12264         return this.setNode('content', node);
12265     };
12266     MixinReference.prototype.getContent = function () {
12267         return this.content;
12268     };
12269     return MixinReference;
12270 }(Node));
12271
12272 var MixinDeclaration = /** @class */ (function (_super) {
12273     __extends(MixinDeclaration, _super);
12274     function MixinDeclaration(offset, length) {
12275         return _super.call(this, offset, length) || this;
12276     }
12277     Object.defineProperty(MixinDeclaration.prototype, "type", {
12278         get: function () {
12279             return NodeType.MixinDeclaration;
12280         },
12281         enumerable: false,
12282         configurable: true
12283     });
12284     MixinDeclaration.prototype.setIdentifier = function (node) {
12285         return this.setNode('identifier', node, 0);
12286     };
12287     MixinDeclaration.prototype.getIdentifier = function () {
12288         return this.identifier;
12289     };
12290     MixinDeclaration.prototype.getName = function () {
12291         return this.identifier ? this.identifier.getText() : '';
12292     };
12293     MixinDeclaration.prototype.getParameters = function () {
12294         if (!this.parameters) {
12295             this.parameters = new Nodelist(this);
12296         }
12297         return this.parameters;
12298     };
12299     MixinDeclaration.prototype.setGuard = function (node) {
12300         if (node) {
12301             node.attachTo(this);
12302             this.guard = node;
12303         }
12304         return false;
12305     };
12306     return MixinDeclaration;
12307 }(BodyDeclaration));
12308
12309 var UnknownAtRule = /** @class */ (function (_super) {
12310     __extends(UnknownAtRule, _super);
12311     function UnknownAtRule(offset, length) {
12312         return _super.call(this, offset, length) || this;
12313     }
12314     Object.defineProperty(UnknownAtRule.prototype, "type", {
12315         get: function () {
12316             return NodeType.UnknownAtRule;
12317         },
12318         enumerable: false,
12319         configurable: true
12320     });
12321     UnknownAtRule.prototype.setAtRuleName = function (atRuleName) {
12322         this.atRuleName = atRuleName;
12323     };
12324     UnknownAtRule.prototype.getAtRuleName = function () {
12325         return this.atRuleName;
12326     };
12327     return UnknownAtRule;
12328 }(BodyDeclaration));
12329
12330 var ListEntry = /** @class */ (function (_super) {
12331     __extends(ListEntry, _super);
12332     function ListEntry() {
12333         return _super !== null && _super.apply(this, arguments) || this;
12334     }
12335     Object.defineProperty(ListEntry.prototype, "type", {
12336         get: function () {
12337             return NodeType.ListEntry;
12338         },
12339         enumerable: false,
12340         configurable: true
12341     });
12342     ListEntry.prototype.setKey = function (node) {
12343         return this.setNode('key', node, 0);
12344     };
12345     ListEntry.prototype.setValue = function (node) {
12346         return this.setNode('value', node, 1);
12347     };
12348     return ListEntry;
12349 }(Node));
12350
12351 var LessGuard = /** @class */ (function (_super) {
12352     __extends(LessGuard, _super);
12353     function LessGuard() {
12354         return _super !== null && _super.apply(this, arguments) || this;
12355     }
12356     LessGuard.prototype.getConditions = function () {
12357         if (!this.conditions) {
12358             this.conditions = new Nodelist(this);
12359         }
12360         return this.conditions;
12361     };
12362     return LessGuard;
12363 }(Node));
12364
12365 var GuardCondition = /** @class */ (function (_super) {
12366     __extends(GuardCondition, _super);
12367     function GuardCondition() {
12368         return _super !== null && _super.apply(this, arguments) || this;
12369     }
12370     GuardCondition.prototype.setVariable = function (node) {
12371         return this.setNode('variable', node);
12372     };
12373     return GuardCondition;
12374 }(Node));
12375
12376 var Module = /** @class */ (function (_super) {
12377     __extends(Module, _super);
12378     function Module() {
12379         return _super !== null && _super.apply(this, arguments) || this;
12380     }
12381     Object.defineProperty(Module.prototype, "type", {
12382         get: function () {
12383             return NodeType.Module;
12384         },
12385         enumerable: false,
12386         configurable: true
12387     });
12388     Module.prototype.setIdentifier = function (node) {
12389         return this.setNode('identifier', node, 0);
12390     };
12391     Module.prototype.getIdentifier = function () {
12392         return this.identifier;
12393     };
12394     return Module;
12395 }(Node));
12396
12397 var Level;
12398 (function (Level) {
12399     Level[Level["Ignore"] = 1] = "Ignore";
12400     Level[Level["Warning"] = 2] = "Warning";
12401     Level[Level["Error"] = 4] = "Error";
12402 })(Level || (Level = {}));
12403 var Marker = /** @class */ (function () {
12404     function Marker(node, rule, level, message, offset, length) {
12405         if (offset === void 0) { offset = node.offset; }
12406         if (length === void 0) { length = node.length; }
12407         this.node = node;
12408         this.rule = rule;
12409         this.level = level;
12410         this.message = message || rule.message;
12411         this.offset = offset;
12412         this.length = length;
12413     }
12414     Marker.prototype.getRule = function () {
12415         return this.rule;
12416     };
12417     Marker.prototype.getLevel = function () {
12418         return this.level;
12419     };
12420     Marker.prototype.getOffset = function () {
12421         return this.offset;
12422     };
12423     Marker.prototype.getLength = function () {
12424         return this.length;
12425     };
12426     Marker.prototype.getNode = function () {
12427         return this.node;
12428     };
12429     Marker.prototype.getMessage = function () {
12430         return this.message;
12431     };
12432     return Marker;
12433 }());
12434
12435 /*
12436 export class DefaultVisitor implements IVisitor {
12437
12438     public visitNode(node:Node):boolean {
12439         switch (node.type) {
12440             case NodeType.Stylesheet:
12441                 return this.visitStylesheet(<Stylesheet> node);
12442             case NodeType.FontFace:
12443                 return this.visitFontFace(<FontFace> node);
12444             case NodeType.Ruleset:
12445                 return this.visitRuleSet(<RuleSet> node);
12446             case NodeType.Selector:
12447                 return this.visitSelector(<Selector> node);
12448             case NodeType.SimpleSelector:
12449                 return this.visitSimpleSelector(<SimpleSelector> node);
12450             case NodeType.Declaration:
12451                 return this.visitDeclaration(<Declaration> node);
12452             case NodeType.Function:
12453                 return this.visitFunction(<Function> node);
12454             case NodeType.FunctionDeclaration:
12455                 return this.visitFunctionDeclaration(<FunctionDeclaration> node);
12456             case NodeType.FunctionParameter:
12457                 return this.visitFunctionParameter(<FunctionParameter> node);
12458             case NodeType.FunctionArgument:
12459                 return this.visitFunctionArgument(<FunctionArgument> node);
12460             case NodeType.Term:
12461                 return this.visitTerm(<Term> node);
12462             case NodeType.Declaration:
12463                 return this.visitExpression(<Expression> node);
12464             case NodeType.NumericValue:
12465                 return this.visitNumericValue(<NumericValue> node);
12466             case NodeType.Page:
12467                 return this.visitPage(<Page> node);
12468             case NodeType.PageBoxMarginBox:
12469                 return this.visitPageBoxMarginBox(<PageBoxMarginBox> node);
12470             case NodeType.Property:
12471                 return this.visitProperty(<Property> node);
12472             case NodeType.NumericValue:
12473                 return this.visitNodelist(<Nodelist> node);
12474             case NodeType.Import:
12475                 return this.visitImport(<Import> node);
12476             case NodeType.Namespace:
12477                 return this.visitNamespace(<Namespace> node);
12478             case NodeType.Keyframe:
12479                 return this.visitKeyframe(<Keyframe> node);
12480             case NodeType.KeyframeSelector:
12481                 return this.visitKeyframeSelector(<KeyframeSelector> node);
12482             case NodeType.MixinDeclaration:
12483                 return this.visitMixinDeclaration(<MixinDeclaration> node);
12484             case NodeType.MixinReference:
12485                 return this.visitMixinReference(<MixinReference> node);
12486             case NodeType.Variable:
12487                 return this.visitVariable(<Variable> node);
12488             case NodeType.VariableDeclaration:
12489                 return this.visitVariableDeclaration(<VariableDeclaration> node);
12490         }
12491         return this.visitUnknownNode(node);
12492     }
12493
12494     public visitFontFace(node:FontFace):boolean {
12495         return true;
12496     }
12497
12498     public visitKeyframe(node:Keyframe):boolean {
12499         return true;
12500     }
12501
12502     public visitKeyframeSelector(node:KeyframeSelector):boolean {
12503         return true;
12504     }
12505
12506     public visitStylesheet(node:Stylesheet):boolean {
12507         return true;
12508     }
12509
12510     public visitProperty(Node:Property):boolean {
12511         return true;
12512     }
12513
12514     public visitRuleSet(node:RuleSet):boolean {
12515         return true;
12516     }
12517
12518     public visitSelector(node:Selector):boolean {
12519         return true;
12520     }
12521
12522     public visitSimpleSelector(node:SimpleSelector):boolean {
12523         return true;
12524     }
12525
12526     public visitDeclaration(node:Declaration):boolean {
12527         return true;
12528     }
12529
12530     public visitFunction(node:Function):boolean {
12531         return true;
12532     }
12533
12534     public visitFunctionDeclaration(node:FunctionDeclaration):boolean {
12535         return true;
12536     }
12537
12538     public visitInvocation(node:Invocation):boolean {
12539         return true;
12540     }
12541
12542     public visitTerm(node:Term):boolean {
12543         return true;
12544     }
12545
12546     public visitImport(node:Import):boolean {
12547         return true;
12548     }
12549
12550     public visitNamespace(node:Namespace):boolean {
12551         return true;
12552     }
12553
12554     public visitExpression(node:Expression):boolean {
12555         return true;
12556     }
12557
12558     public visitNumericValue(node:NumericValue):boolean {
12559         return true;
12560     }
12561
12562     public visitPage(node:Page):boolean {
12563         return true;
12564     }
12565
12566     public visitPageBoxMarginBox(node:PageBoxMarginBox):boolean {
12567         return true;
12568     }
12569
12570     public visitNodelist(node:Nodelist):boolean {
12571         return true;
12572     }
12573
12574     public visitVariableDeclaration(node:VariableDeclaration):boolean {
12575         return true;
12576     }
12577
12578     public visitVariable(node:Variable):boolean {
12579         return true;
12580     }
12581
12582     public visitMixinDeclaration(node:MixinDeclaration):boolean {
12583         return true;
12584     }
12585
12586     public visitMixinReference(node:MixinReference):boolean {
12587         return true;
12588     }
12589
12590     public visitUnknownNode(node:Node):boolean {
12591         return true;
12592     }
12593 }
12594 */
12595 var ParseErrorCollector = /** @class */ (function () {
12596     function ParseErrorCollector() {
12597         this.entries = [];
12598     }
12599     ParseErrorCollector.entries = function (node) {
12600         var visitor = new ParseErrorCollector();
12601         node.acceptVisitor(visitor);
12602         return visitor.entries;
12603     };
12604     ParseErrorCollector.prototype.visitNode = function (node) {
12605         if (node.isErroneous()) {
12606             node.collectIssues(this.entries);
12607         }
12608         return true;
12609     };
12610     return ParseErrorCollector;
12611 }());
12612
12613
12614
12615 /***/ }),
12616 /* 66 */
12617 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
12618
12619 __webpack_require__.r(__webpack_exports__);
12620 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12621 /* harmony export */   "startsWith": () => /* binding */ startsWith,
12622 /* harmony export */   "endsWith": () => /* binding */ endsWith,
12623 /* harmony export */   "difference": () => /* binding */ difference,
12624 /* harmony export */   "getLimitedString": () => /* binding */ getLimitedString,
12625 /* harmony export */   "trim": () => /* binding */ trim
12626 /* harmony export */ });
12627 /*---------------------------------------------------------------------------------------------
12628  *  Copyright (c) Microsoft Corporation. All rights reserved.
12629  *  Licensed under the MIT License. See License.txt in the project root for license information.
12630  *--------------------------------------------------------------------------------------------*/
12631
12632 function startsWith(haystack, needle) {
12633     if (haystack.length < needle.length) {
12634         return false;
12635     }
12636     for (var i = 0; i < needle.length; i++) {
12637         if (haystack[i] !== needle[i]) {
12638             return false;
12639         }
12640     }
12641     return true;
12642 }
12643 /**
12644  * Determines if haystack ends with needle.
12645  */
12646 function endsWith(haystack, needle) {
12647     var diff = haystack.length - needle.length;
12648     if (diff > 0) {
12649         return haystack.lastIndexOf(needle) === diff;
12650     }
12651     else if (diff === 0) {
12652         return haystack === needle;
12653     }
12654     else {
12655         return false;
12656     }
12657 }
12658 /**
12659  * Computes the difference score for two strings. More similar strings have a higher score.
12660  * We use largest common subsequence dynamic programming approach but penalize in the end for length differences.
12661  * Strings that have a large length difference will get a bad default score 0.
12662  * Complexity - both time and space O(first.length * second.length)
12663  * Dynamic programming LCS computation http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
12664  *
12665  * @param first a string
12666  * @param second a string
12667  */
12668 function difference(first, second, maxLenDelta) {
12669     if (maxLenDelta === void 0) { maxLenDelta = 4; }
12670     var lengthDifference = Math.abs(first.length - second.length);
12671     // We only compute score if length of the currentWord and length of entry.name are similar.
12672     if (lengthDifference > maxLenDelta) {
12673         return 0;
12674     }
12675     // Initialize LCS (largest common subsequence) matrix.
12676     var LCS = [];
12677     var zeroArray = [];
12678     var i, j;
12679     for (i = 0; i < second.length + 1; ++i) {
12680         zeroArray.push(0);
12681     }
12682     for (i = 0; i < first.length + 1; ++i) {
12683         LCS.push(zeroArray);
12684     }
12685     for (i = 1; i < first.length + 1; ++i) {
12686         for (j = 1; j < second.length + 1; ++j) {
12687             if (first[i - 1] === second[j - 1]) {
12688                 LCS[i][j] = LCS[i - 1][j - 1] + 1;
12689             }
12690             else {
12691                 LCS[i][j] = Math.max(LCS[i - 1][j], LCS[i][j - 1]);
12692             }
12693         }
12694     }
12695     return LCS[first.length][second.length] - Math.sqrt(lengthDifference);
12696 }
12697 /**
12698  * Limit of string length.
12699  */
12700 function getLimitedString(str, ellipsis) {
12701     if (ellipsis === void 0) { ellipsis = true; }
12702     if (!str) {
12703         return '';
12704     }
12705     if (str.length < 140) {
12706         return str;
12707     }
12708     return str.slice(0, 140) + (ellipsis ? '\u2026' : '');
12709 }
12710 /**
12711  * Limit of string length.
12712  */
12713 function trim(str, regexp) {
12714     var m = regexp.exec(str);
12715     if (m && m[0].length) {
12716         return str.substr(0, str.length - m[0].length);
12717     }
12718     return str;
12719 }
12720
12721
12722 /***/ }),
12723 /* 67 */
12724 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
12725
12726 __webpack_require__.r(__webpack_exports__);
12727 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12728 /* harmony export */   "CSSIssueType": () => /* binding */ CSSIssueType,
12729 /* harmony export */   "ParseError": () => /* binding */ ParseError
12730 /* harmony export */ });
12731 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);
12732 /*---------------------------------------------------------------------------------------------
12733  *  Copyright (c) Microsoft Corporation. All rights reserved.
12734  *  Licensed under the MIT License. See License.txt in the project root for license information.
12735  *--------------------------------------------------------------------------------------------*/
12736
12737
12738 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_0__.loadMessageBundle();
12739 var CSSIssueType = /** @class */ (function () {
12740     function CSSIssueType(id, message) {
12741         this.id = id;
12742         this.message = message;
12743     }
12744     return CSSIssueType;
12745 }());
12746
12747 var ParseError = {
12748     NumberExpected: new CSSIssueType('css-numberexpected', localize('expected.number', "number expected")),
12749     ConditionExpected: new CSSIssueType('css-conditionexpected', localize('expected.condt', "condition expected")),
12750     RuleOrSelectorExpected: new CSSIssueType('css-ruleorselectorexpected', localize('expected.ruleorselector', "at-rule or selector expected")),
12751     DotExpected: new CSSIssueType('css-dotexpected', localize('expected.dot', "dot expected")),
12752     ColonExpected: new CSSIssueType('css-colonexpected', localize('expected.colon', "colon expected")),
12753     SemiColonExpected: new CSSIssueType('css-semicolonexpected', localize('expected.semicolon', "semi-colon expected")),
12754     TermExpected: new CSSIssueType('css-termexpected', localize('expected.term', "term expected")),
12755     ExpressionExpected: new CSSIssueType('css-expressionexpected', localize('expected.expression', "expression expected")),
12756     OperatorExpected: new CSSIssueType('css-operatorexpected', localize('expected.operator', "operator expected")),
12757     IdentifierExpected: new CSSIssueType('css-identifierexpected', localize('expected.ident', "identifier expected")),
12758     PercentageExpected: new CSSIssueType('css-percentageexpected', localize('expected.percentage', "percentage expected")),
12759     URIOrStringExpected: new CSSIssueType('css-uriorstringexpected', localize('expected.uriorstring', "uri or string expected")),
12760     URIExpected: new CSSIssueType('css-uriexpected', localize('expected.uri', "URI expected")),
12761     VariableNameExpected: new CSSIssueType('css-varnameexpected', localize('expected.varname', "variable name expected")),
12762     VariableValueExpected: new CSSIssueType('css-varvalueexpected', localize('expected.varvalue', "variable value expected")),
12763     PropertyValueExpected: new CSSIssueType('css-propertyvalueexpected', localize('expected.propvalue', "property value expected")),
12764     LeftCurlyExpected: new CSSIssueType('css-lcurlyexpected', localize('expected.lcurly', "{ expected")),
12765     RightCurlyExpected: new CSSIssueType('css-rcurlyexpected', localize('expected.rcurly', "} expected")),
12766     LeftSquareBracketExpected: new CSSIssueType('css-rbracketexpected', localize('expected.lsquare', "[ expected")),
12767     RightSquareBracketExpected: new CSSIssueType('css-lbracketexpected', localize('expected.rsquare', "] expected")),
12768     LeftParenthesisExpected: new CSSIssueType('css-lparentexpected', localize('expected.lparen', "( expected")),
12769     RightParenthesisExpected: new CSSIssueType('css-rparentexpected', localize('expected.rparent', ") expected")),
12770     CommaExpected: new CSSIssueType('css-commaexpected', localize('expected.comma', "comma expected")),
12771     PageDirectiveOrDeclarationExpected: new CSSIssueType('css-pagedirordeclexpected', localize('expected.pagedirordecl', "page directive or declaraton expected")),
12772     UnknownAtRule: new CSSIssueType('css-unknownatrule', localize('unknown.atrule', "at-rule unknown")),
12773     UnknownKeyword: new CSSIssueType('css-unknownkeyword', localize('unknown.keyword', "unknown keyword")),
12774     SelectorExpected: new CSSIssueType('css-selectorexpected', localize('expected.selector', "selector expected")),
12775     StringLiteralExpected: new CSSIssueType('css-stringliteralexpected', localize('expected.stringliteral', "string literal expected")),
12776     WhitespaceExpected: new CSSIssueType('css-whitespaceexpected', localize('expected.whitespace', "whitespace expected")),
12777     MediaQueryExpected: new CSSIssueType('css-mediaqueryexpected', localize('expected.mediaquery', "media query expected")),
12778     IdentifierOrWildcardExpected: new CSSIssueType('css-idorwildcardexpected', localize('expected.idorwildcard', "identifier or wildcard expected")),
12779     WildcardExpected: new CSSIssueType('css-wildcardexpected', localize('expected.wildcard', "wildcard expected")),
12780     IdentifierOrVariableExpected: new CSSIssueType('css-idorvarexpected', localize('expected.idorvar', "identifier or variable expected")),
12781 };
12782
12783
12784 /***/ }),
12785 /* 68 */
12786 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
12787
12788
12789 /* --------------------------------------------------------------------------------------------
12790  * Copyright (c) Microsoft Corporation. All rights reserved.
12791  * Licensed under the MIT License. See License.txt in the project root for license information.
12792  * ------------------------------------------------------------------------------------------ */
12793 Object.defineProperty(exports, "__esModule", ({ value: true }));
12794 exports.config = exports.loadMessageBundle = void 0;
12795 var path = __webpack_require__(3);
12796 var fs = __webpack_require__(54);
12797 var ral_1 = __webpack_require__(69);
12798 var common_1 = __webpack_require__(70);
12799 var common_2 = __webpack_require__(70);
12800 Object.defineProperty(exports, "MessageFormat", ({ enumerable: true, get: function () { return common_2.MessageFormat; } }));
12801 Object.defineProperty(exports, "BundleFormat", ({ enumerable: true, get: function () { return common_2.BundleFormat; } }));
12802 var toString = Object.prototype.toString;
12803 function isNumber(value) {
12804     return toString.call(value) === '[object Number]';
12805 }
12806 function isString(value) {
12807     return toString.call(value) === '[object String]';
12808 }
12809 function isBoolean(value) {
12810     return value === true || value === false;
12811 }
12812 function readJsonFileSync(filename) {
12813     return JSON.parse(fs.readFileSync(filename, 'utf8'));
12814 }
12815 var resolvedBundles;
12816 var options;
12817 function initializeSettings() {
12818     options = { locale: undefined, language: undefined, languagePackSupport: false, cacheLanguageResolution: true, messageFormat: common_1.MessageFormat.bundle };
12819     if (isString(process.env.VSCODE_NLS_CONFIG)) {
12820         try {
12821             var vscodeOptions_1 = JSON.parse(process.env.VSCODE_NLS_CONFIG);
12822             var language = void 0;
12823             if (vscodeOptions_1.availableLanguages) {
12824                 var value = vscodeOptions_1.availableLanguages['*'];
12825                 if (isString(value)) {
12826                     language = value;
12827                 }
12828             }
12829             if (isString(vscodeOptions_1.locale)) {
12830                 options.locale = vscodeOptions_1.locale.toLowerCase();
12831             }
12832             if (language === undefined) {
12833                 options.language = options.locale;
12834             }
12835             else if (language !== 'en') {
12836                 options.language = language;
12837             }
12838             if (isBoolean(vscodeOptions_1._languagePackSupport)) {
12839                 options.languagePackSupport = vscodeOptions_1._languagePackSupport;
12840             }
12841             if (isString(vscodeOptions_1._cacheRoot)) {
12842                 options.cacheRoot = vscodeOptions_1._cacheRoot;
12843             }
12844             if (isString(vscodeOptions_1._languagePackId)) {
12845                 options.languagePackId = vscodeOptions_1._languagePackId;
12846             }
12847             if (isString(vscodeOptions_1._translationsConfigFile)) {
12848                 options.translationsConfigFile = vscodeOptions_1._translationsConfigFile;
12849                 try {
12850                     options.translationsConfig = readJsonFileSync(options.translationsConfigFile);
12851                 }
12852                 catch (error) {
12853                     // We can't read the translation config file. Mark the cache as corrupted.
12854                     if (vscodeOptions_1._corruptedFile) {
12855                         var dirname = path.dirname(vscodeOptions_1._corruptedFile);
12856                         fs.exists(dirname, function (exists) {
12857                             if (exists) {
12858                                 fs.writeFile(vscodeOptions_1._corruptedFile, 'corrupted', 'utf8', function (err) {
12859                                     console.error(err);
12860                                 });
12861                             }
12862                         });
12863                     }
12864                 }
12865             }
12866         }
12867         catch (_a) {
12868             // Do nothing.
12869         }
12870     }
12871     common_1.setPseudo(options.locale === 'pseudo');
12872     resolvedBundles = Object.create(null);
12873 }
12874 initializeSettings();
12875 function supportsLanguagePack() {
12876     return options.languagePackSupport === true && options.cacheRoot !== undefined && options.languagePackId !== undefined && options.translationsConfigFile !== undefined
12877         && options.translationsConfig !== undefined;
12878 }
12879 function createScopedLocalizeFunction(messages) {
12880     return function (key, message) {
12881         var args = [];
12882         for (var _i = 2; _i < arguments.length; _i++) {
12883             args[_i - 2] = arguments[_i];
12884         }
12885         if (isNumber(key)) {
12886             if (key >= messages.length) {
12887                 console.error("Broken localize call found. Index out of bounds. Stacktrace is\n: " + new Error('').stack);
12888                 return;
12889             }
12890             return common_1.format(messages[key], args);
12891         }
12892         else {
12893             if (isString(message)) {
12894                 console.warn("Message " + message + " didn't get externalized correctly.");
12895                 return common_1.format(message, args);
12896             }
12897             else {
12898                 console.error("Broken localize call found. Stacktrace is\n: " + new Error('').stack);
12899             }
12900         }
12901     };
12902 }
12903 function resolveLanguage(file) {
12904     var resolvedLanguage;
12905     if (options.cacheLanguageResolution && resolvedLanguage) {
12906         resolvedLanguage = resolvedLanguage;
12907     }
12908     else {
12909         if (common_1.isPseudo || !options.language) {
12910             resolvedLanguage = '.nls.json';
12911         }
12912         else {
12913             var locale = options.language;
12914             while (locale) {
12915                 var candidate = '.nls.' + locale + '.json';
12916                 if (fs.existsSync(file + candidate)) {
12917                     resolvedLanguage = candidate;
12918                     break;
12919                 }
12920                 else {
12921                     var index = locale.lastIndexOf('-');
12922                     if (index > 0) {
12923                         locale = locale.substring(0, index);
12924                     }
12925                     else {
12926                         resolvedLanguage = '.nls.json';
12927                         locale = null;
12928                     }
12929                 }
12930             }
12931         }
12932         if (options.cacheLanguageResolution) {
12933             resolvedLanguage = resolvedLanguage;
12934         }
12935     }
12936     return file + resolvedLanguage;
12937 }
12938 function findInTheBoxBundle(root) {
12939     var language = options.language;
12940     while (language) {
12941         var candidate = path.join(root, "nls.bundle." + language + ".json");
12942         if (fs.existsSync(candidate)) {
12943             return candidate;
12944         }
12945         else {
12946             var index = language.lastIndexOf('-');
12947             if (index > 0) {
12948                 language = language.substring(0, index);
12949             }
12950             else {
12951                 language = undefined;
12952             }
12953         }
12954     }
12955     // Test if we can reslove the default bundle.
12956     if (language === undefined) {
12957         var candidate = path.join(root, 'nls.bundle.json');
12958         if (fs.existsSync(candidate)) {
12959             return candidate;
12960         }
12961     }
12962     return undefined;
12963 }
12964 function mkdir(directory) {
12965     try {
12966         fs.mkdirSync(directory);
12967     }
12968     catch (err) {
12969         if (err.code === 'EEXIST') {
12970             return;
12971         }
12972         else if (err.code === 'ENOENT') {
12973             var parent = path.dirname(directory);
12974             if (parent !== directory) {
12975                 mkdir(parent);
12976                 fs.mkdirSync(directory);
12977             }
12978         }
12979         else {
12980             throw err;
12981         }
12982     }
12983 }
12984 function createDefaultNlsBundle(folder) {
12985     var metaData = readJsonFileSync(path.join(folder, 'nls.metadata.json'));
12986     var result = Object.create(null);
12987     for (var module_1 in metaData) {
12988         var entry = metaData[module_1];
12989         result[module_1] = entry.messages;
12990     }
12991     return result;
12992 }
12993 function createNLSBundle(header, metaDataPath) {
12994     var languagePackLocation = options.translationsConfig[header.id];
12995     if (!languagePackLocation) {
12996         return undefined;
12997     }
12998     var languagePack = readJsonFileSync(languagePackLocation).contents;
12999     var metaData = readJsonFileSync(path.join(metaDataPath, 'nls.metadata.json'));
13000     var result = Object.create(null);
13001     for (var module_2 in metaData) {
13002         var entry = metaData[module_2];
13003         var translations = languagePack[header.outDir + "/" + module_2];
13004         if (translations) {
13005             var resultMessages = [];
13006             for (var i = 0; i < entry.keys.length; i++) {
13007                 var messageKey = entry.keys[i];
13008                 var key = isString(messageKey) ? messageKey : messageKey.key;
13009                 var translatedMessage = translations[key];
13010                 if (translatedMessage === undefined) {
13011                     translatedMessage = entry.messages[i];
13012                 }
13013                 resultMessages.push(translatedMessage);
13014             }
13015             result[module_2] = resultMessages;
13016         }
13017         else {
13018             result[module_2] = entry.messages;
13019         }
13020     }
13021     return result;
13022 }
13023 function touch(file) {
13024     var d = new Date();
13025     fs.utimes(file, d, d, function () {
13026         // Do nothing. Ignore
13027     });
13028 }
13029 function cacheBundle(key, bundle) {
13030     resolvedBundles[key] = bundle;
13031     return bundle;
13032 }
13033 function loadNlsBundleOrCreateFromI18n(header, bundlePath) {
13034     var result;
13035     var bundle = path.join(options.cacheRoot, header.id + "-" + header.hash + ".json");
13036     var useMemoryOnly = false;
13037     var writeBundle = false;
13038     try {
13039         result = JSON.parse(fs.readFileSync(bundle, { encoding: 'utf8', flag: 'r' }));
13040         touch(bundle);
13041         return result;
13042     }
13043     catch (err) {
13044         if (err.code === 'ENOENT') {
13045             writeBundle = true;
13046         }
13047         else if (err instanceof SyntaxError) {
13048             // We have a syntax error. So no valid JSON. Use
13049             console.log("Syntax error parsing message bundle: " + err.message + ".");
13050             fs.unlink(bundle, function (err) {
13051                 if (err) {
13052                     console.error("Deleting corrupted bundle " + bundle + " failed.");
13053                 }
13054             });
13055             useMemoryOnly = true;
13056         }
13057         else {
13058             throw err;
13059         }
13060     }
13061     result = createNLSBundle(header, bundlePath);
13062     if (!result || useMemoryOnly) {
13063         return result;
13064     }
13065     if (writeBundle) {
13066         try {
13067             fs.writeFileSync(bundle, JSON.stringify(result), { encoding: 'utf8', flag: 'wx' });
13068         }
13069         catch (err) {
13070             if (err.code === 'EEXIST') {
13071                 return result;
13072             }
13073             throw err;
13074         }
13075     }
13076     return result;
13077 }
13078 function loadDefaultNlsBundle(bundlePath) {
13079     try {
13080         return createDefaultNlsBundle(bundlePath);
13081     }
13082     catch (err) {
13083         console.log("Generating default bundle from meta data failed.", err);
13084         return undefined;
13085     }
13086 }
13087 function loadNlsBundle(header, bundlePath) {
13088     var result;
13089     // Core decided to use a language pack. Do the same in the extension
13090     if (supportsLanguagePack()) {
13091         try {
13092             result = loadNlsBundleOrCreateFromI18n(header, bundlePath);
13093         }
13094         catch (err) {
13095             console.log("Load or create bundle failed ", err);
13096         }
13097     }
13098     if (!result) {
13099         // No language pack found, but core is running in language pack mode
13100         // Don't try to use old in the box bundles since the might be stale
13101         // Fall right back to the default bundle.
13102         if (options.languagePackSupport) {
13103             return loadDefaultNlsBundle(bundlePath);
13104         }
13105         var candidate = findInTheBoxBundle(bundlePath);
13106         if (candidate) {
13107             try {
13108                 return readJsonFileSync(candidate);
13109             }
13110             catch (err) {
13111                 console.log("Loading in the box message bundle failed.", err);
13112             }
13113         }
13114         result = loadDefaultNlsBundle(bundlePath);
13115     }
13116     return result;
13117 }
13118 function tryFindMetaDataHeaderFile(file) {
13119     var result;
13120     var dirname = path.dirname(file);
13121     while (true) {
13122         result = path.join(dirname, 'nls.metadata.header.json');
13123         if (fs.existsSync(result)) {
13124             break;
13125         }
13126         var parent = path.dirname(dirname);
13127         if (parent === dirname) {
13128             result = undefined;
13129             break;
13130         }
13131         else {
13132             dirname = parent;
13133         }
13134     }
13135     return result;
13136 }
13137 function loadMessageBundle(file) {
13138     if (!file) {
13139         // No file. We are in dev mode. Return the default
13140         // localize function.
13141         return common_1.localize;
13142     }
13143     // Remove extension since we load json files.
13144     var ext = path.extname(file);
13145     if (ext) {
13146         file = file.substr(0, file.length - ext.length);
13147     }
13148     if (options.messageFormat === common_1.MessageFormat.both || options.messageFormat === common_1.MessageFormat.bundle) {
13149         var headerFile = tryFindMetaDataHeaderFile(file);
13150         if (headerFile) {
13151             var bundlePath = path.dirname(headerFile);
13152             var bundle = resolvedBundles[bundlePath];
13153             if (bundle === undefined) {
13154                 try {
13155                     var header = JSON.parse(fs.readFileSync(headerFile, 'utf8'));
13156                     try {
13157                         var nlsBundle = loadNlsBundle(header, bundlePath);
13158                         bundle = cacheBundle(bundlePath, nlsBundle ? { header: header, nlsBundle: nlsBundle } : null);
13159                     }
13160                     catch (err) {
13161                         console.error('Failed to load nls bundle', err);
13162                         bundle = cacheBundle(bundlePath, null);
13163                     }
13164                 }
13165                 catch (err) {
13166                     console.error('Failed to read header file', err);
13167                     bundle = cacheBundle(bundlePath, null);
13168                 }
13169             }
13170             if (bundle) {
13171                 var module_3 = file.substr(bundlePath.length + 1).replace(/\\/g, '/');
13172                 var messages = bundle.nlsBundle[module_3];
13173                 if (messages === undefined) {
13174                     console.error("Messages for file " + file + " not found. See console for details.");
13175                     return function () {
13176                         return 'Messages not found.';
13177                     };
13178                 }
13179                 return createScopedLocalizeFunction(messages);
13180             }
13181         }
13182     }
13183     if (options.messageFormat === common_1.MessageFormat.both || options.messageFormat === common_1.MessageFormat.file) {
13184         // Try to load a single file bundle
13185         try {
13186             var json = readJsonFileSync(resolveLanguage(file));
13187             if (Array.isArray(json)) {
13188                 return createScopedLocalizeFunction(json);
13189             }
13190             else {
13191                 if (common_1.isDefined(json.messages) && common_1.isDefined(json.keys)) {
13192                     return createScopedLocalizeFunction(json.messages);
13193                 }
13194                 else {
13195                     console.error("String bundle '" + file + "' uses an unsupported format.");
13196                     return function () {
13197                         return 'File bundle has unsupported format. See console for details';
13198                     };
13199                 }
13200             }
13201         }
13202         catch (err) {
13203             if (err.code !== 'ENOENT') {
13204                 console.error('Failed to load single file bundle', err);
13205             }
13206         }
13207     }
13208     console.error("Failed to load message bundle for file " + file);
13209     return function () {
13210         return 'Failed to load message bundle. See console for details.';
13211     };
13212 }
13213 exports.loadMessageBundle = loadMessageBundle;
13214 function config(opts) {
13215     if (opts) {
13216         if (isString(opts.locale)) {
13217             options.locale = opts.locale.toLowerCase();
13218             options.language = options.locale;
13219             resolvedBundles = Object.create(null);
13220         }
13221         if (opts.messageFormat !== undefined) {
13222             options.messageFormat = opts.messageFormat;
13223         }
13224         if (opts.bundleFormat === common_1.BundleFormat.standalone && options.languagePackSupport === true) {
13225             options.languagePackSupport = false;
13226         }
13227     }
13228     common_1.setPseudo(options.locale === 'pseudo');
13229     return loadMessageBundle;
13230 }
13231 exports.config = config;
13232 ral_1.default.install(Object.freeze({
13233     loadMessageBundle: loadMessageBundle,
13234     config: config
13235 }));
13236 //# sourceMappingURL=main.js.map
13237
13238 /***/ }),
13239 /* 69 */
13240 /***/ ((__unused_webpack_module, exports) => {
13241
13242
13243 Object.defineProperty(exports, "__esModule", ({ value: true }));
13244 var _ral;
13245 function RAL() {
13246     if (_ral === undefined) {
13247         throw new Error("No runtime abstraction layer installed");
13248     }
13249     return _ral;
13250 }
13251 (function (RAL) {
13252     function install(ral) {
13253         if (ral === undefined) {
13254             throw new Error("No runtime abstraction layer provided");
13255         }
13256         _ral = ral;
13257     }
13258     RAL.install = install;
13259 })(RAL || (RAL = {}));
13260 exports.default = RAL;
13261 //# sourceMappingURL=ral.js.map
13262
13263 /***/ }),
13264 /* 70 */
13265 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
13266
13267
13268 /* --------------------------------------------------------------------------------------------
13269  * Copyright (c) Microsoft Corporation. All rights reserved.
13270  * Licensed under the MIT License. See License.txt in the project root for license information.
13271  * ------------------------------------------------------------------------------------------ */
13272 Object.defineProperty(exports, "__esModule", ({ value: true }));
13273 exports.config = exports.loadMessageBundle = exports.localize = exports.format = exports.setPseudo = exports.isPseudo = exports.isDefined = exports.BundleFormat = exports.MessageFormat = void 0;
13274 var ral_1 = __webpack_require__(69);
13275 var MessageFormat;
13276 (function (MessageFormat) {
13277     MessageFormat["file"] = "file";
13278     MessageFormat["bundle"] = "bundle";
13279     MessageFormat["both"] = "both";
13280 })(MessageFormat = exports.MessageFormat || (exports.MessageFormat = {}));
13281 var BundleFormat;
13282 (function (BundleFormat) {
13283     // the nls.bundle format
13284     BundleFormat["standalone"] = "standalone";
13285     BundleFormat["languagePack"] = "languagePack";
13286 })(BundleFormat = exports.BundleFormat || (exports.BundleFormat = {}));
13287 var LocalizeInfo;
13288 (function (LocalizeInfo) {
13289     function is(value) {
13290         var candidate = value;
13291         return candidate && isDefined(candidate.key) && isDefined(candidate.comment);
13292     }
13293     LocalizeInfo.is = is;
13294 })(LocalizeInfo || (LocalizeInfo = {}));
13295 function isDefined(value) {
13296     return typeof value !== 'undefined';
13297 }
13298 exports.isDefined = isDefined;
13299 exports.isPseudo = false;
13300 function setPseudo(pseudo) {
13301     exports.isPseudo = pseudo;
13302 }
13303 exports.setPseudo = setPseudo;
13304 function format(message, args) {
13305     var result;
13306     if (exports.isPseudo) {
13307         // FF3B and FF3D is the Unicode zenkaku representation for [ and ]
13308         message = '\uFF3B' + message.replace(/[aouei]/g, '$&$&') + '\uFF3D';
13309     }
13310     if (args.length === 0) {
13311         result = message;
13312     }
13313     else {
13314         result = message.replace(/\{(\d+)\}/g, function (match, rest) {
13315             var index = rest[0];
13316             var arg = args[index];
13317             var replacement = match;
13318             if (typeof arg === 'string') {
13319                 replacement = arg;
13320             }
13321             else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {
13322                 replacement = String(arg);
13323             }
13324             return replacement;
13325         });
13326     }
13327     return result;
13328 }
13329 exports.format = format;
13330 function localize(_key, message) {
13331     var args = [];
13332     for (var _i = 2; _i < arguments.length; _i++) {
13333         args[_i - 2] = arguments[_i];
13334     }
13335     return format(message, args);
13336 }
13337 exports.localize = localize;
13338 function loadMessageBundle(file) {
13339     return ral_1.default().loadMessageBundle(file);
13340 }
13341 exports.loadMessageBundle = loadMessageBundle;
13342 function config(opts) {
13343     return ral_1.default().config(opts);
13344 }
13345 exports.config = config;
13346 //# sourceMappingURL=common.js.map
13347
13348 /***/ }),
13349 /* 71 */
13350 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13351
13352 __webpack_require__.r(__webpack_exports__);
13353 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13354 /* harmony export */   "browserNames": () => /* reexport safe */ _entry__WEBPACK_IMPORTED_MODULE_0__.browserNames,
13355 /* harmony export */   "getBrowserLabel": () => /* reexport safe */ _entry__WEBPACK_IMPORTED_MODULE_0__.getBrowserLabel,
13356 /* harmony export */   "getEntryDescription": () => /* reexport safe */ _entry__WEBPACK_IMPORTED_MODULE_0__.getEntryDescription,
13357 /* harmony export */   "textToMarkedString": () => /* reexport safe */ _entry__WEBPACK_IMPORTED_MODULE_0__.textToMarkedString,
13358 /* harmony export */   "colorFrom256RGB": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colorFrom256RGB,
13359 /* harmony export */   "colorFromHSL": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colorFromHSL,
13360 /* harmony export */   "colorFromHex": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colorFromHex,
13361 /* harmony export */   "colorFunctions": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colorFunctions,
13362 /* harmony export */   "colorKeywords": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colorKeywords,
13363 /* harmony export */   "colors": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.colors,
13364 /* harmony export */   "getColorValue": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.getColorValue,
13365 /* harmony export */   "hexDigit": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.hexDigit,
13366 /* harmony export */   "hslFromColor": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.hslFromColor,
13367 /* harmony export */   "isColorConstructor": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.isColorConstructor,
13368 /* harmony export */   "isColorValue": () => /* reexport safe */ _colors__WEBPACK_IMPORTED_MODULE_1__.isColorValue,
13369 /* harmony export */   "basicShapeFunctions": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.basicShapeFunctions,
13370 /* harmony export */   "boxKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.boxKeywords,
13371 /* harmony export */   "cssWideKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.cssWideKeywords,
13372 /* harmony export */   "geometryBoxKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.geometryBoxKeywords,
13373 /* harmony export */   "html5Tags": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.html5Tags,
13374 /* harmony export */   "imageFunctions": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.imageFunctions,
13375 /* harmony export */   "lineStyleKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.lineStyleKeywords,
13376 /* harmony export */   "lineWidthKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.lineWidthKeywords,
13377 /* harmony export */   "pageBoxDirectives": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.pageBoxDirectives,
13378 /* harmony export */   "positionKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.positionKeywords,
13379 /* harmony export */   "repeatStyleKeywords": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.repeatStyleKeywords,
13380 /* harmony export */   "svgElements": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.svgElements,
13381 /* harmony export */   "transitionTimingFunctions": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.transitionTimingFunctions,
13382 /* harmony export */   "units": () => /* reexport safe */ _builtinData__WEBPACK_IMPORTED_MODULE_2__.units
13383 /* harmony export */ });
13384 /* harmony import */ var _entry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72);
13385 /* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(73);
13386 /* harmony import */ var _builtinData__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(74);
13387 /*---------------------------------------------------------------------------------------------
13388  *  Copyright (c) Microsoft Corporation. All rights reserved.
13389  *  Licensed under the MIT License. See License.txt in the project root for license information.
13390  *--------------------------------------------------------------------------------------------*/
13391
13392
13393
13394
13395
13396
13397 /***/ }),
13398 /* 72 */
13399 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13400
13401 __webpack_require__.r(__webpack_exports__);
13402 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13403 /* harmony export */   "browserNames": () => /* binding */ browserNames,
13404 /* harmony export */   "getEntryDescription": () => /* binding */ getEntryDescription,
13405 /* harmony export */   "textToMarkedString": () => /* binding */ textToMarkedString,
13406 /* harmony export */   "getBrowserLabel": () => /* binding */ getBrowserLabel
13407 /* harmony export */ });
13408 /*---------------------------------------------------------------------------------------------
13409  *  Copyright (c) Microsoft Corporation. All rights reserved.
13410  *  Licensed under the MIT License. See License.txt in the project root for license information.
13411  *--------------------------------------------------------------------------------------------*/
13412
13413 var browserNames = {
13414     E: 'Edge',
13415     FF: 'Firefox',
13416     S: 'Safari',
13417     C: 'Chrome',
13418     IE: 'IE',
13419     O: 'Opera'
13420 };
13421 function getEntryStatus(status) {
13422     switch (status) {
13423         case 'experimental':
13424             return '⚠️ Property is experimental. Be cautious when using it.️\n\n';
13425         case 'nonstandard':
13426             return '🚨️ Property is nonstandard. Avoid using it.\n\n';
13427         case 'obsolete':
13428             return '🚨️️️ Property is obsolete. Avoid using it.\n\n';
13429         default:
13430             return '';
13431     }
13432 }
13433 function getEntryDescription(entry, doesSupportMarkdown) {
13434     var result;
13435     if (doesSupportMarkdown) {
13436         result = {
13437             kind: 'markdown',
13438             value: getEntryMarkdownDescription(entry)
13439         };
13440     }
13441     else {
13442         result = {
13443             kind: 'plaintext',
13444             value: getEntryStringDescription(entry)
13445         };
13446     }
13447     if (result.value === '') {
13448         return undefined;
13449     }
13450     return result;
13451 }
13452 function textToMarkedString(text) {
13453     text = text.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
13454     return text.replace(/</g, '&lt;').replace(/>/g, '&gt;');
13455 }
13456 function getEntryStringDescription(entry) {
13457     if (!entry.description || entry.description === '') {
13458         return '';
13459     }
13460     if (typeof entry.description !== 'string') {
13461         return entry.description.value;
13462     }
13463     var result = '';
13464     if (entry.status) {
13465         result += getEntryStatus(entry.status);
13466     }
13467     result += entry.description;
13468     var browserLabel = getBrowserLabel(entry.browsers);
13469     if (browserLabel) {
13470         result += '\n(' + browserLabel + ')';
13471     }
13472     if ('syntax' in entry) {
13473         result += "\n\nSyntax: " + entry.syntax;
13474     }
13475     if (entry.references && entry.references.length > 0) {
13476         result += '\n\n';
13477         result += entry.references.map(function (r) {
13478             return r.name + ": " + r.url;
13479         }).join(' | ');
13480     }
13481     return result;
13482 }
13483 function getEntryMarkdownDescription(entry) {
13484     if (!entry.description || entry.description === '') {
13485         return '';
13486     }
13487     var result = '';
13488     if (entry.status) {
13489         result += getEntryStatus(entry.status);
13490     }
13491     var description = typeof entry.description === 'string' ? entry.description : entry.description.value;
13492     result += textToMarkedString(description);
13493     var browserLabel = getBrowserLabel(entry.browsers);
13494     if (browserLabel) {
13495         result += '\n\n(' + textToMarkedString(browserLabel) + ')';
13496     }
13497     if ('syntax' in entry && entry.syntax) {
13498         result += "\n\nSyntax: " + textToMarkedString(entry.syntax);
13499     }
13500     if (entry.references && entry.references.length > 0) {
13501         result += '\n\n';
13502         result += entry.references.map(function (r) {
13503             return "[" + r.name + "](" + r.url + ")";
13504         }).join(' | ');
13505     }
13506     return result;
13507 }
13508 /**
13509  * Input is like `["E12","FF49","C47","IE","O"]`
13510  * Output is like `Edge 12, Firefox 49, Chrome 47, IE, Opera`
13511  */
13512 function getBrowserLabel(browsers) {
13513     if (browsers === void 0) { browsers = []; }
13514     if (browsers.length === 0) {
13515         return null;
13516     }
13517     return browsers
13518         .map(function (b) {
13519         var result = '';
13520         var matches = b.match(/([A-Z]+)(\d+)?/);
13521         var name = matches[1];
13522         var version = matches[2];
13523         if (name in browserNames) {
13524             result += browserNames[name];
13525         }
13526         if (version) {
13527             result += ' ' + version;
13528         }
13529         return result;
13530     })
13531         .join(', ');
13532 }
13533
13534
13535 /***/ }),
13536 /* 73 */
13537 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13538
13539 __webpack_require__.r(__webpack_exports__);
13540 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13541 /* harmony export */   "colorFunctions": () => /* binding */ colorFunctions,
13542 /* harmony export */   "colors": () => /* binding */ colors,
13543 /* harmony export */   "colorKeywords": () => /* binding */ colorKeywords,
13544 /* harmony export */   "isColorConstructor": () => /* binding */ isColorConstructor,
13545 /* harmony export */   "isColorValue": () => /* binding */ isColorValue,
13546 /* harmony export */   "hexDigit": () => /* binding */ hexDigit,
13547 /* harmony export */   "colorFromHex": () => /* binding */ colorFromHex,
13548 /* harmony export */   "colorFrom256RGB": () => /* binding */ colorFrom256RGB,
13549 /* harmony export */   "colorFromHSL": () => /* binding */ colorFromHSL,
13550 /* harmony export */   "hslFromColor": () => /* binding */ hslFromColor,
13551 /* harmony export */   "getColorValue": () => /* binding */ getColorValue
13552 /* harmony export */ });
13553 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
13554 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68);
13555 /*---------------------------------------------------------------------------------------------
13556  *  Copyright (c) Microsoft Corporation. All rights reserved.
13557  *  Licensed under the MIT License. See License.txt in the project root for license information.
13558  *--------------------------------------------------------------------------------------------*/
13559
13560
13561 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_1__.loadMessageBundle();
13562 var colorFunctions = [
13563     { func: 'rgb($red, $green, $blue)', desc: localize('css.builtin.rgb', 'Creates a Color from red, green, and blue values.') },
13564     { func: 'rgba($red, $green, $blue, $alpha)', desc: localize('css.builtin.rgba', 'Creates a Color from red, green, blue, and alpha values.') },
13565     { func: 'hsl($hue, $saturation, $lightness)', desc: localize('css.builtin.hsl', 'Creates a Color from hue, saturation, and lightness values.') },
13566     { func: 'hsla($hue, $saturation, $lightness, $alpha)', desc: localize('css.builtin.hsla', 'Creates a Color from hue, saturation, lightness, and alpha values.') }
13567 ];
13568 var colors = {
13569     aliceblue: '#f0f8ff',
13570     antiquewhite: '#faebd7',
13571     aqua: '#00ffff',
13572     aquamarine: '#7fffd4',
13573     azure: '#f0ffff',
13574     beige: '#f5f5dc',
13575     bisque: '#ffe4c4',
13576     black: '#000000',
13577     blanchedalmond: '#ffebcd',
13578     blue: '#0000ff',
13579     blueviolet: '#8a2be2',
13580     brown: '#a52a2a',
13581     burlywood: '#deb887',
13582     cadetblue: '#5f9ea0',
13583     chartreuse: '#7fff00',
13584     chocolate: '#d2691e',
13585     coral: '#ff7f50',
13586     cornflowerblue: '#6495ed',
13587     cornsilk: '#fff8dc',
13588     crimson: '#dc143c',
13589     cyan: '#00ffff',
13590     darkblue: '#00008b',
13591     darkcyan: '#008b8b',
13592     darkgoldenrod: '#b8860b',
13593     darkgray: '#a9a9a9',
13594     darkgrey: '#a9a9a9',
13595     darkgreen: '#006400',
13596     darkkhaki: '#bdb76b',
13597     darkmagenta: '#8b008b',
13598     darkolivegreen: '#556b2f',
13599     darkorange: '#ff8c00',
13600     darkorchid: '#9932cc',
13601     darkred: '#8b0000',
13602     darksalmon: '#e9967a',
13603     darkseagreen: '#8fbc8f',
13604     darkslateblue: '#483d8b',
13605     darkslategray: '#2f4f4f',
13606     darkslategrey: '#2f4f4f',
13607     darkturquoise: '#00ced1',
13608     darkviolet: '#9400d3',
13609     deeppink: '#ff1493',
13610     deepskyblue: '#00bfff',
13611     dimgray: '#696969',
13612     dimgrey: '#696969',
13613     dodgerblue: '#1e90ff',
13614     firebrick: '#b22222',
13615     floralwhite: '#fffaf0',
13616     forestgreen: '#228b22',
13617     fuchsia: '#ff00ff',
13618     gainsboro: '#dcdcdc',
13619     ghostwhite: '#f8f8ff',
13620     gold: '#ffd700',
13621     goldenrod: '#daa520',
13622     gray: '#808080',
13623     grey: '#808080',
13624     green: '#008000',
13625     greenyellow: '#adff2f',
13626     honeydew: '#f0fff0',
13627     hotpink: '#ff69b4',
13628     indianred: '#cd5c5c',
13629     indigo: '#4b0082',
13630     ivory: '#fffff0',
13631     khaki: '#f0e68c',
13632     lavender: '#e6e6fa',
13633     lavenderblush: '#fff0f5',
13634     lawngreen: '#7cfc00',
13635     lemonchiffon: '#fffacd',
13636     lightblue: '#add8e6',
13637     lightcoral: '#f08080',
13638     lightcyan: '#e0ffff',
13639     lightgoldenrodyellow: '#fafad2',
13640     lightgray: '#d3d3d3',
13641     lightgrey: '#d3d3d3',
13642     lightgreen: '#90ee90',
13643     lightpink: '#ffb6c1',
13644     lightsalmon: '#ffa07a',
13645     lightseagreen: '#20b2aa',
13646     lightskyblue: '#87cefa',
13647     lightslategray: '#778899',
13648     lightslategrey: '#778899',
13649     lightsteelblue: '#b0c4de',
13650     lightyellow: '#ffffe0',
13651     lime: '#00ff00',
13652     limegreen: '#32cd32',
13653     linen: '#faf0e6',
13654     magenta: '#ff00ff',
13655     maroon: '#800000',
13656     mediumaquamarine: '#66cdaa',
13657     mediumblue: '#0000cd',
13658     mediumorchid: '#ba55d3',
13659     mediumpurple: '#9370d8',
13660     mediumseagreen: '#3cb371',
13661     mediumslateblue: '#7b68ee',
13662     mediumspringgreen: '#00fa9a',
13663     mediumturquoise: '#48d1cc',
13664     mediumvioletred: '#c71585',
13665     midnightblue: '#191970',
13666     mintcream: '#f5fffa',
13667     mistyrose: '#ffe4e1',
13668     moccasin: '#ffe4b5',
13669     navajowhite: '#ffdead',
13670     navy: '#000080',
13671     oldlace: '#fdf5e6',
13672     olive: '#808000',
13673     olivedrab: '#6b8e23',
13674     orange: '#ffa500',
13675     orangered: '#ff4500',
13676     orchid: '#da70d6',
13677     palegoldenrod: '#eee8aa',
13678     palegreen: '#98fb98',
13679     paleturquoise: '#afeeee',
13680     palevioletred: '#d87093',
13681     papayawhip: '#ffefd5',
13682     peachpuff: '#ffdab9',
13683     peru: '#cd853f',
13684     pink: '#ffc0cb',
13685     plum: '#dda0dd',
13686     powderblue: '#b0e0e6',
13687     purple: '#800080',
13688     red: '#ff0000',
13689     rebeccapurple: '#663399',
13690     rosybrown: '#bc8f8f',
13691     royalblue: '#4169e1',
13692     saddlebrown: '#8b4513',
13693     salmon: '#fa8072',
13694     sandybrown: '#f4a460',
13695     seagreen: '#2e8b57',
13696     seashell: '#fff5ee',
13697     sienna: '#a0522d',
13698     silver: '#c0c0c0',
13699     skyblue: '#87ceeb',
13700     slateblue: '#6a5acd',
13701     slategray: '#708090',
13702     slategrey: '#708090',
13703     snow: '#fffafa',
13704     springgreen: '#00ff7f',
13705     steelblue: '#4682b4',
13706     tan: '#d2b48c',
13707     teal: '#008080',
13708     thistle: '#d8bfd8',
13709     tomato: '#ff6347',
13710     turquoise: '#40e0d0',
13711     violet: '#ee82ee',
13712     wheat: '#f5deb3',
13713     white: '#ffffff',
13714     whitesmoke: '#f5f5f5',
13715     yellow: '#ffff00',
13716     yellowgreen: '#9acd32'
13717 };
13718 var colorKeywords = {
13719     'currentColor': 'The value of the \'color\' property. The computed value of the \'currentColor\' keyword is the computed value of the \'color\' property. If the \'currentColor\' keyword is set on the \'color\' property itself, it is treated as \'color:inherit\' at parse time.',
13720     'transparent': 'Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value.',
13721 };
13722 function getNumericValue(node, factor) {
13723     var val = node.getText();
13724     var m = val.match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);
13725     if (m) {
13726         if (m[2]) {
13727             factor = 100.0;
13728         }
13729         var result = parseFloat(m[1]) / factor;
13730         if (result >= 0 && result <= 1) {
13731             return result;
13732         }
13733     }
13734     throw new Error();
13735 }
13736 function getAngle(node) {
13737     var val = node.getText();
13738     var m = val.match(/^([-+]?[0-9]*\.?[0-9]+)(deg)?$/);
13739     if (m) {
13740         return parseFloat(val) % 360;
13741     }
13742     throw new Error();
13743 }
13744 function isColorConstructor(node) {
13745     var name = node.getName();
13746     if (!name) {
13747         return false;
13748     }
13749     return /^(rgb|rgba|hsl|hsla)$/gi.test(name);
13750 }
13751 /**
13752  * Returns true if the node is a color value - either
13753  * defined a hex number, as rgb or rgba function, or
13754  * as color name.
13755  */
13756 function isColorValue(node) {
13757     if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.HexColorValue) {
13758         return true;
13759     }
13760     else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Function) {
13761         return isColorConstructor(node);
13762     }
13763     else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Identifier) {
13764         if (node.parent && node.parent.type !== _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Term) {
13765             return false;
13766         }
13767         var candidateColor = node.getText().toLowerCase();
13768         if (candidateColor === 'none') {
13769             return false;
13770         }
13771         if (colors[candidateColor]) {
13772             return true;
13773         }
13774     }
13775     return false;
13776 }
13777 var Digit0 = 48;
13778 var Digit9 = 57;
13779 var A = 65;
13780 var F = 70;
13781 var a = 97;
13782 var f = 102;
13783 function hexDigit(charCode) {
13784     if (charCode < Digit0) {
13785         return 0;
13786     }
13787     if (charCode <= Digit9) {
13788         return charCode - Digit0;
13789     }
13790     if (charCode < a) {
13791         charCode += (a - A);
13792     }
13793     if (charCode >= a && charCode <= f) {
13794         return charCode - a + 10;
13795     }
13796     return 0;
13797 }
13798 function colorFromHex(text) {
13799     if (text[0] !== '#') {
13800         return null;
13801     }
13802     switch (text.length) {
13803         case 4:
13804             return {
13805                 red: (hexDigit(text.charCodeAt(1)) * 0x11) / 255.0,
13806                 green: (hexDigit(text.charCodeAt(2)) * 0x11) / 255.0,
13807                 blue: (hexDigit(text.charCodeAt(3)) * 0x11) / 255.0,
13808                 alpha: 1
13809             };
13810         case 5:
13811             return {
13812                 red: (hexDigit(text.charCodeAt(1)) * 0x11) / 255.0,
13813                 green: (hexDigit(text.charCodeAt(2)) * 0x11) / 255.0,
13814                 blue: (hexDigit(text.charCodeAt(3)) * 0x11) / 255.0,
13815                 alpha: (hexDigit(text.charCodeAt(4)) * 0x11) / 255.0,
13816             };
13817         case 7:
13818             return {
13819                 red: (hexDigit(text.charCodeAt(1)) * 0x10 + hexDigit(text.charCodeAt(2))) / 255.0,
13820                 green: (hexDigit(text.charCodeAt(3)) * 0x10 + hexDigit(text.charCodeAt(4))) / 255.0,
13821                 blue: (hexDigit(text.charCodeAt(5)) * 0x10 + hexDigit(text.charCodeAt(6))) / 255.0,
13822                 alpha: 1
13823             };
13824         case 9:
13825             return {
13826                 red: (hexDigit(text.charCodeAt(1)) * 0x10 + hexDigit(text.charCodeAt(2))) / 255.0,
13827                 green: (hexDigit(text.charCodeAt(3)) * 0x10 + hexDigit(text.charCodeAt(4))) / 255.0,
13828                 blue: (hexDigit(text.charCodeAt(5)) * 0x10 + hexDigit(text.charCodeAt(6))) / 255.0,
13829                 alpha: (hexDigit(text.charCodeAt(7)) * 0x10 + hexDigit(text.charCodeAt(8))) / 255.0
13830             };
13831     }
13832     return null;
13833 }
13834 function colorFrom256RGB(red, green, blue, alpha) {
13835     if (alpha === void 0) { alpha = 1.0; }
13836     return {
13837         red: red / 255.0,
13838         green: green / 255.0,
13839         blue: blue / 255.0,
13840         alpha: alpha
13841     };
13842 }
13843 function colorFromHSL(hue, sat, light, alpha) {
13844     if (alpha === void 0) { alpha = 1.0; }
13845     hue = hue / 60.0;
13846     if (sat === 0) {
13847         return { red: light, green: light, blue: light, alpha: alpha };
13848     }
13849     else {
13850         var hueToRgb = function (t1, t2, hue) {
13851             while (hue < 0) {
13852                 hue += 6;
13853             }
13854             while (hue >= 6) {
13855                 hue -= 6;
13856             }
13857             if (hue < 1) {
13858                 return (t2 - t1) * hue + t1;
13859             }
13860             if (hue < 3) {
13861                 return t2;
13862             }
13863             if (hue < 4) {
13864                 return (t2 - t1) * (4 - hue) + t1;
13865             }
13866             return t1;
13867         };
13868         var t2 = light <= 0.5 ? (light * (sat + 1)) : (light + sat - (light * sat));
13869         var t1 = light * 2 - t2;
13870         return { red: hueToRgb(t1, t2, hue + 2), green: hueToRgb(t1, t2, hue), blue: hueToRgb(t1, t2, hue - 2), alpha: alpha };
13871     }
13872 }
13873 function hslFromColor(rgba) {
13874     var r = rgba.red;
13875     var g = rgba.green;
13876     var b = rgba.blue;
13877     var a = rgba.alpha;
13878     var max = Math.max(r, g, b);
13879     var min = Math.min(r, g, b);
13880     var h = 0;
13881     var s = 0;
13882     var l = (min + max) / 2;
13883     var chroma = max - min;
13884     if (chroma > 0) {
13885         s = Math.min((l <= 0.5 ? chroma / (2 * l) : chroma / (2 - (2 * l))), 1);
13886         switch (max) {
13887             case r:
13888                 h = (g - b) / chroma + (g < b ? 6 : 0);
13889                 break;
13890             case g:
13891                 h = (b - r) / chroma + 2;
13892                 break;
13893             case b:
13894                 h = (r - g) / chroma + 4;
13895                 break;
13896         }
13897         h *= 60;
13898         h = Math.round(h);
13899     }
13900     return { h: h, s: s, l: l, a: a };
13901 }
13902 function getColorValue(node) {
13903     if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.HexColorValue) {
13904         var text = node.getText();
13905         return colorFromHex(text);
13906     }
13907     else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Function) {
13908         var functionNode = node;
13909         var name = functionNode.getName();
13910         var colorValues = functionNode.getArguments().getChildren();
13911         if (!name || colorValues.length < 3 || colorValues.length > 4) {
13912             return null;
13913         }
13914         try {
13915             var alpha = colorValues.length === 4 ? getNumericValue(colorValues[3], 1) : 1;
13916             if (name === 'rgb' || name === 'rgba') {
13917                 return {
13918                     red: getNumericValue(colorValues[0], 255.0),
13919                     green: getNumericValue(colorValues[1], 255.0),
13920                     blue: getNumericValue(colorValues[2], 255.0),
13921                     alpha: alpha
13922                 };
13923             }
13924             else if (name === 'hsl' || name === 'hsla') {
13925                 var h = getAngle(colorValues[0]);
13926                 var s = getNumericValue(colorValues[1], 100.0);
13927                 var l = getNumericValue(colorValues[2], 100.0);
13928                 return colorFromHSL(h, s, l, alpha);
13929             }
13930         }
13931         catch (e) {
13932             // parse error on numeric value
13933             return null;
13934         }
13935     }
13936     else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Identifier) {
13937         if (node.parent && node.parent.type !== _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Term) {
13938             return null;
13939         }
13940         var term = node.parent;
13941         if (term && term.parent && term.parent.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.BinaryExpression) {
13942             var expression = term.parent;
13943             if (expression.parent && expression.parent.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ListEntry && expression.parent.key === expression) {
13944                 return null;
13945             }
13946         }
13947         var candidateColor = node.getText().toLowerCase();
13948         if (candidateColor === 'none') {
13949             return null;
13950         }
13951         var colorHex = colors[candidateColor];
13952         if (colorHex) {
13953             return colorFromHex(colorHex);
13954         }
13955     }
13956     return null;
13957 }
13958
13959
13960 /***/ }),
13961 /* 74 */
13962 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
13963
13964 __webpack_require__.r(__webpack_exports__);
13965 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13966 /* harmony export */   "positionKeywords": () => /* binding */ positionKeywords,
13967 /* harmony export */   "repeatStyleKeywords": () => /* binding */ repeatStyleKeywords,
13968 /* harmony export */   "lineStyleKeywords": () => /* binding */ lineStyleKeywords,
13969 /* harmony export */   "lineWidthKeywords": () => /* binding */ lineWidthKeywords,
13970 /* harmony export */   "boxKeywords": () => /* binding */ boxKeywords,
13971 /* harmony export */   "geometryBoxKeywords": () => /* binding */ geometryBoxKeywords,
13972 /* harmony export */   "cssWideKeywords": () => /* binding */ cssWideKeywords,
13973 /* harmony export */   "imageFunctions": () => /* binding */ imageFunctions,
13974 /* harmony export */   "transitionTimingFunctions": () => /* binding */ transitionTimingFunctions,
13975 /* harmony export */   "basicShapeFunctions": () => /* binding */ basicShapeFunctions,
13976 /* harmony export */   "units": () => /* binding */ units,
13977 /* harmony export */   "html5Tags": () => /* binding */ html5Tags,
13978 /* harmony export */   "svgElements": () => /* binding */ svgElements,
13979 /* harmony export */   "pageBoxDirectives": () => /* binding */ pageBoxDirectives
13980 /* harmony export */ });
13981 /*---------------------------------------------------------------------------------------------
13982  *  Copyright (c) Microsoft Corporation. All rights reserved.
13983  *  Licensed under the MIT License. See License.txt in the project root for license information.
13984  *--------------------------------------------------------------------------------------------*/
13985
13986 var positionKeywords = {
13987     'bottom': 'Computes to ‘100%’ for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset.',
13988     'center': 'Computes to ‘50%’ (‘left 50%’) for the horizontal position if the horizontal position is not otherwise specified, or ‘50%’ (‘top 50%’) for the vertical position if it is.',
13989     'left': 'Computes to ‘0%’ for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset.',
13990     'right': 'Computes to ‘100%’ for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset.',
13991     'top': 'Computes to ‘0%’ for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset.'
13992 };
13993 var repeatStyleKeywords = {
13994     'no-repeat': 'Placed once and not repeated in this direction.',
13995     'repeat': 'Repeated in this direction as often as needed to cover the background painting area.',
13996     'repeat-x': 'Computes to ‘repeat no-repeat’.',
13997     'repeat-y': 'Computes to ‘no-repeat repeat’.',
13998     'round': 'Repeated as often as will fit within the background positioning area. If it doesn’t fit a whole number of times, it is rescaled so that it does.',
13999     'space': 'Repeated as often as will fit within the background positioning area without being clipped and then the images are spaced out to fill the area.'
14000 };
14001 var lineStyleKeywords = {
14002     'dashed': 'A series of square-ended dashes.',
14003     'dotted': 'A series of round dots.',
14004     'double': 'Two parallel solid lines with some space between them.',
14005     'groove': 'Looks as if it were carved in the canvas.',
14006     'hidden': 'Same as ‘none’, but has different behavior in the border conflict resolution rules for border-collapsed tables.',
14007     'inset': 'Looks as if the content on the inside of the border is sunken into the canvas.',
14008     'none': 'No border. Color and width are ignored.',
14009     'outset': 'Looks as if the content on the inside of the border is coming out of the canvas.',
14010     'ridge': 'Looks as if it were coming out of the canvas.',
14011     'solid': 'A single line segment.'
14012 };
14013 var lineWidthKeywords = ['medium', 'thick', 'thin'];
14014 var boxKeywords = {
14015     'border-box': 'The background is painted within (clipped to) the border box.',
14016     'content-box': 'The background is painted within (clipped to) the content box.',
14017     'padding-box': 'The background is painted within (clipped to) the padding box.'
14018 };
14019 var geometryBoxKeywords = {
14020     'margin-box': 'Uses the margin box as reference box.',
14021     'fill-box': 'Uses the object bounding box as reference box.',
14022     'stroke-box': 'Uses the stroke bounding box as reference box.',
14023     'view-box': 'Uses the nearest SVG viewport as reference box.'
14024 };
14025 var cssWideKeywords = {
14026     'initial': 'Represents the value specified as the property’s initial value.',
14027     'inherit': 'Represents the computed value of the property on the element’s parent.',
14028     'unset': 'Acts as either `inherit` or `initial`, depending on whether the property is inherited or not.'
14029 };
14030 var imageFunctions = {
14031     'url()': 'Reference an image file by URL',
14032     'image()': 'Provide image fallbacks and annotations.',
14033     '-webkit-image-set()': 'Provide multiple resolutions. Remember to use unprefixed image-set() in addition.',
14034     'image-set()': 'Provide multiple resolutions of an image and const the UA decide which is most appropriate in a given situation.',
14035     '-moz-element()': 'Use an element in the document as an image. Remember to use unprefixed element() in addition.',
14036     'element()': 'Use an element in the document as an image.',
14037     'cross-fade()': 'Indicates the two images to be combined and how far along in the transition the combination is.',
14038     '-webkit-gradient()': 'Deprecated. Use modern linear-gradient() or radial-gradient() instead.',
14039     '-webkit-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',
14040     '-moz-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',
14041     '-o-linear-gradient()': 'Linear gradient. Remember to use unprefixed version in addition.',
14042     'linear-gradient()': 'A linear gradient is created by specifying a straight gradient line, and then several colors placed along that line.',
14043     '-webkit-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',
14044     '-moz-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',
14045     '-o-repeating-linear-gradient()': 'Repeating Linear gradient. Remember to use unprefixed version in addition.',
14046     'repeating-linear-gradient()': 'Same as linear-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position.',
14047     '-webkit-radial-gradient()': 'Radial gradient. Remember to use unprefixed version in addition.',
14048     '-moz-radial-gradient()': 'Radial gradient. Remember to use unprefixed version in addition.',
14049     'radial-gradient()': 'Colors emerge from a single point and smoothly spread outward in a circular or elliptical shape.',
14050     '-webkit-repeating-radial-gradient()': 'Repeating radial gradient. Remember to use unprefixed version in addition.',
14051     '-moz-repeating-radial-gradient()': 'Repeating radial gradient. Remember to use unprefixed version in addition.',
14052     'repeating-radial-gradient()': 'Same as radial-gradient, except the color-stops are repeated infinitely in both directions, with their positions shifted by multiples of the difference between the last specified color-stop’s position and the first specified color-stop’s position.'
14053 };
14054 var transitionTimingFunctions = {
14055     'ease': 'Equivalent to cubic-bezier(0.25, 0.1, 0.25, 1.0).',
14056     'ease-in': 'Equivalent to cubic-bezier(0.42, 0, 1.0, 1.0).',
14057     'ease-in-out': 'Equivalent to cubic-bezier(0.42, 0, 0.58, 1.0).',
14058     'ease-out': 'Equivalent to cubic-bezier(0, 0, 0.58, 1.0).',
14059     'linear': 'Equivalent to cubic-bezier(0.0, 0.0, 1.0, 1.0).',
14060     'step-end': 'Equivalent to steps(1, end).',
14061     'step-start': 'Equivalent to steps(1, start).',
14062     'steps()': 'The first parameter specifies the number of intervals in the function. The second parameter, which is optional, is either the value “start” or “end”.',
14063     'cubic-bezier()': 'Specifies a cubic-bezier curve. The four values specify points P1 and P2  of the curve as (x1, y1, x2, y2).',
14064     'cubic-bezier(0.6, -0.28, 0.735, 0.045)': 'Ease-in Back. Overshoots.',
14065     'cubic-bezier(0.68, -0.55, 0.265, 1.55)': 'Ease-in-out Back. Overshoots.',
14066     'cubic-bezier(0.175, 0.885, 0.32, 1.275)': 'Ease-out Back. Overshoots.',
14067     'cubic-bezier(0.6, 0.04, 0.98, 0.335)': 'Ease-in Circular. Based on half circle.',
14068     'cubic-bezier(0.785, 0.135, 0.15, 0.86)': 'Ease-in-out Circular. Based on half circle.',
14069     'cubic-bezier(0.075, 0.82, 0.165, 1)': 'Ease-out Circular. Based on half circle.',
14070     'cubic-bezier(0.55, 0.055, 0.675, 0.19)': 'Ease-in Cubic. Based on power of three.',
14071     'cubic-bezier(0.645, 0.045, 0.355, 1)': 'Ease-in-out Cubic. Based on power of three.',
14072     'cubic-bezier(0.215, 0.610, 0.355, 1)': 'Ease-out Cubic. Based on power of three.',
14073     'cubic-bezier(0.95, 0.05, 0.795, 0.035)': 'Ease-in Exponential. Based on two to the power ten.',
14074     'cubic-bezier(1, 0, 0, 1)': 'Ease-in-out Exponential. Based on two to the power ten.',
14075     'cubic-bezier(0.19, 1, 0.22, 1)': 'Ease-out Exponential. Based on two to the power ten.',
14076     'cubic-bezier(0.47, 0, 0.745, 0.715)': 'Ease-in Sine.',
14077     'cubic-bezier(0.445, 0.05, 0.55, 0.95)': 'Ease-in-out Sine.',
14078     'cubic-bezier(0.39, 0.575, 0.565, 1)': 'Ease-out Sine.',
14079     'cubic-bezier(0.55, 0.085, 0.68, 0.53)': 'Ease-in Quadratic. Based on power of two.',
14080     'cubic-bezier(0.455, 0.03, 0.515, 0.955)': 'Ease-in-out Quadratic. Based on power of two.',
14081     'cubic-bezier(0.25, 0.46, 0.45, 0.94)': 'Ease-out Quadratic. Based on power of two.',
14082     'cubic-bezier(0.895, 0.03, 0.685, 0.22)': 'Ease-in Quartic. Based on power of four.',
14083     'cubic-bezier(0.77, 0, 0.175, 1)': 'Ease-in-out Quartic. Based on power of four.',
14084     'cubic-bezier(0.165, 0.84, 0.44, 1)': 'Ease-out Quartic. Based on power of four.',
14085     'cubic-bezier(0.755, 0.05, 0.855, 0.06)': 'Ease-in Quintic. Based on power of five.',
14086     'cubic-bezier(0.86, 0, 0.07, 1)': 'Ease-in-out Quintic. Based on power of five.',
14087     'cubic-bezier(0.23, 1, 0.320, 1)': 'Ease-out Quintic. Based on power of five.'
14088 };
14089 var basicShapeFunctions = {
14090     'circle()': 'Defines a circle.',
14091     'ellipse()': 'Defines an ellipse.',
14092     'inset()': 'Defines an inset rectangle.',
14093     'polygon()': 'Defines a polygon.'
14094 };
14095 var units = {
14096     'length': ['em', 'rem', 'ex', 'px', 'cm', 'mm', 'in', 'pt', 'pc', 'ch', 'vw', 'vh', 'vmin', 'vmax'],
14097     'angle': ['deg', 'rad', 'grad', 'turn'],
14098     'time': ['ms', 's'],
14099     'frequency': ['Hz', 'kHz'],
14100     'resolution': ['dpi', 'dpcm', 'dppx'],
14101     'percentage': ['%', 'fr']
14102 };
14103 var html5Tags = ['a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', 'bdi', 'bdo', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption',
14104     'cite', 'code', 'col', 'colgroup', 'data', 'datalist', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dl', 'dt', 'em', 'embed', 'fieldset', 'figcaption', 'figure', 'footer',
14105     'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'iframe', 'img', 'input', 'ins', 'kbd', 'keygen', 'label', 'legend', 'li', 'link',
14106     'main', 'map', 'mark', 'menu', 'menuitem', 'meta', 'meter', 'nav', 'noscript', 'object', 'ol', 'optgroup', 'option', 'output', 'p', 'param', 'picture', 'pre', 'progress', 'q',
14107     'rb', 'rp', 'rt', 'rtc', 'ruby', 's', 'samp', 'script', 'section', 'select', 'small', 'source', 'span', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td',
14108     'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'title', 'tr', 'track', 'u', 'ul', 'const', 'video', 'wbr'];
14109 var svgElements = ['circle', 'clipPath', 'cursor', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting',
14110     'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',
14111     'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'hatch', 'hatchpath', 'image', 'line', 'linearGradient',
14112     'marker', 'mask', 'mesh', 'meshpatch', 'meshrow', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'solidcolor', 'stop', 'svg', 'switch',
14113     'symbol', 'text', 'textPath', 'tspan', 'use', 'view'];
14114 var pageBoxDirectives = [
14115     '@bottom-center', '@bottom-left', '@bottom-left-corner', '@bottom-right', '@bottom-right-corner',
14116     '@left-bottom', '@left-middle', '@left-top', '@right-bottom', '@right-middle', '@right-top',
14117     '@top-center', '@top-left', '@top-left-corner', '@top-right', '@top-right-corner'
14118 ];
14119
14120
14121 /***/ }),
14122 /* 75 */
14123 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
14124
14125 __webpack_require__.r(__webpack_exports__);
14126 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14127 /* harmony export */   "values": () => /* binding */ values,
14128 /* harmony export */   "isDefined": () => /* binding */ isDefined
14129 /* harmony export */ });
14130 /*---------------------------------------------------------------------------------------------
14131  *  Copyright (c) Microsoft Corporation. All rights reserved.
14132  *  Licensed under the MIT License. See License.txt in the project root for license information.
14133  *--------------------------------------------------------------------------------------------*/
14134
14135 function values(obj) {
14136     return Object.keys(obj).map(function (key) { return obj[key]; });
14137 }
14138 function isDefined(obj) {
14139     return typeof obj !== 'undefined';
14140 }
14141
14142
14143 /***/ }),
14144 /* 76 */
14145 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
14146
14147 __webpack_require__.r(__webpack_exports__);
14148 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14149 /* harmony export */   "CSSCompletion": () => /* binding */ CSSCompletion
14150 /* harmony export */ });
14151 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
14152 /* harmony import */ var _parser_cssSymbolScope__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(77);
14153 /* harmony import */ var _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71);
14154 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(66);
14155 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(79);
14156 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(68);
14157 /* harmony import */ var _utils_objects__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(75);
14158 /* harmony import */ var _pathCompletion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(82);
14159 /*---------------------------------------------------------------------------------------------
14160  *  Copyright (c) Microsoft Corporation. All rights reserved.
14161  *  Licensed under the MIT License. See License.txt in the project root for license information.
14162  *--------------------------------------------------------------------------------------------*/
14163
14164 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
14165     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14166     return new (P || (P = Promise))(function (resolve, reject) {
14167         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
14168         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
14169         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14170         step((generator = generator.apply(thisArg, _arguments || [])).next());
14171     });
14172 };
14173 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
14174     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
14175     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14176     function verb(n) { return function (v) { return step([n, v]); }; }
14177     function step(op) {
14178         if (f) throw new TypeError("Generator is already executing.");
14179         while (_) try {
14180             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
14181             if (y = 0, t) op = [op[0] & 2, t.value];
14182             switch (op[0]) {
14183                 case 0: case 1: t = op; break;
14184                 case 4: _.label++; return { value: op[1], done: false };
14185                 case 5: _.label++; y = op[1]; op = [0]; continue;
14186                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
14187                 default:
14188                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
14189                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
14190                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
14191                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
14192                     if (t[2]) _.ops.pop();
14193                     _.trys.pop(); continue;
14194             }
14195             op = body.call(thisArg, _);
14196         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
14197         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
14198     }
14199 };
14200
14201
14202
14203
14204
14205
14206
14207
14208 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_4__.loadMessageBundle();
14209 var SnippetFormat = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.InsertTextFormat.Snippet;
14210 var SortTexts;
14211 (function (SortTexts) {
14212     // char code 32, comes before everything
14213     SortTexts["Enums"] = " ";
14214     SortTexts["Normal"] = "d";
14215     SortTexts["VendorPrefixed"] = "x";
14216     SortTexts["Term"] = "y";
14217     SortTexts["Variable"] = "z";
14218 })(SortTexts || (SortTexts = {}));
14219 var CSSCompletion = /** @class */ (function () {
14220     function CSSCompletion(variablePrefix, lsOptions, cssDataManager) {
14221         if (variablePrefix === void 0) { variablePrefix = null; }
14222         this.variablePrefix = variablePrefix;
14223         this.lsOptions = lsOptions;
14224         this.cssDataManager = cssDataManager;
14225         this.completionParticipants = [];
14226     }
14227     CSSCompletion.prototype.configure = function (settings) {
14228         this.settings = settings;
14229     };
14230     CSSCompletion.prototype.getSymbolContext = function () {
14231         if (!this.symbolContext) {
14232             this.symbolContext = new _parser_cssSymbolScope__WEBPACK_IMPORTED_MODULE_1__.Symbols(this.styleSheet);
14233         }
14234         return this.symbolContext;
14235     };
14236     CSSCompletion.prototype.setCompletionParticipants = function (registeredCompletionParticipants) {
14237         this.completionParticipants = registeredCompletionParticipants || [];
14238     };
14239     CSSCompletion.prototype.doComplete2 = function (document, position, styleSheet, documentContext) {
14240         return __awaiter(this, void 0, void 0, function () {
14241             var participant, contributedParticipants, result, pathCompletionResult;
14242             return __generator(this, function (_a) {
14243                 switch (_a.label) {
14244                     case 0:
14245                         if (!this.lsOptions.fileSystemProvider || !this.lsOptions.fileSystemProvider.readDirectory) {
14246                             return [2 /*return*/, this.doComplete(document, position, styleSheet)];
14247                         }
14248                         participant = new _pathCompletion__WEBPACK_IMPORTED_MODULE_5__.PathCompletionParticipant(this.lsOptions.fileSystemProvider.readDirectory);
14249                         contributedParticipants = this.completionParticipants;
14250                         this.completionParticipants = [participant].concat(contributedParticipants);
14251                         result = this.doComplete(document, position, styleSheet);
14252                         _a.label = 1;
14253                     case 1:
14254                         _a.trys.push([1, , 3, 4]);
14255                         return [4 /*yield*/, participant.computeCompletions(document, documentContext)];
14256                     case 2:
14257                         pathCompletionResult = _a.sent();
14258                         return [2 /*return*/, {
14259                                 isIncomplete: result.isIncomplete || pathCompletionResult.isIncomplete,
14260                                 items: pathCompletionResult.items.concat(result.items)
14261                             }];
14262                     case 3:
14263                         this.completionParticipants = contributedParticipants;
14264                         return [7 /*endfinally*/];
14265                     case 4: return [2 /*return*/];
14266                 }
14267             });
14268         });
14269     };
14270     CSSCompletion.prototype.doComplete = function (document, position, styleSheet) {
14271         this.offset = document.offsetAt(position);
14272         this.position = position;
14273         this.currentWord = getCurrentWord(document, this.offset);
14274         this.defaultReplaceRange = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Position.create(this.position.line, this.position.character - this.currentWord.length), this.position);
14275         this.textDocument = document;
14276         this.styleSheet = styleSheet;
14277         try {
14278             var result = { isIncomplete: false, items: [] };
14279             this.nodePath = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.getNodePath(this.styleSheet, this.offset);
14280             for (var i = this.nodePath.length - 1; i >= 0; i--) {
14281                 var node = this.nodePath[i];
14282                 if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Property) {
14283                     this.getCompletionsForDeclarationProperty(node.getParent(), result);
14284                 }
14285                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Expression) {
14286                     if (node.parent instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Interpolation) {
14287                         this.getVariableProposals(null, result);
14288                     }
14289                     else {
14290                         this.getCompletionsForExpression(node, result);
14291                     }
14292                 }
14293                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SimpleSelector) {
14294                     var parentRef = node.findAParent(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ExtendsReference, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Ruleset);
14295                     if (parentRef) {
14296                         if (parentRef.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ExtendsReference) {
14297                             this.getCompletionsForExtendsReference(parentRef, node, result);
14298                         }
14299                         else {
14300                             var parentRuleSet = parentRef;
14301                             this.getCompletionsForSelector(parentRuleSet, parentRuleSet && parentRuleSet.isNested(), result);
14302                         }
14303                     }
14304                 }
14305                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionArgument) {
14306                     this.getCompletionsForFunctionArgument(node, node.getParent(), result);
14307                 }
14308                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declarations) {
14309                     this.getCompletionsForDeclarations(node, result);
14310                 }
14311                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.VariableDeclaration) {
14312                     this.getCompletionsForVariableDeclaration(node, result);
14313                 }
14314                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.RuleSet) {
14315                     this.getCompletionsForRuleSet(node, result);
14316                 }
14317                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Interpolation) {
14318                     this.getCompletionsForInterpolation(node, result);
14319                 }
14320                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionDeclaration) {
14321                     this.getCompletionsForFunctionDeclaration(node, result);
14322                 }
14323                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.MixinReference) {
14324                     this.getCompletionsForMixinReference(node, result);
14325                 }
14326                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Function) {
14327                     this.getCompletionsForFunctionArgument(null, node, result);
14328                 }
14329                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Supports) {
14330                     this.getCompletionsForSupports(node, result);
14331                 }
14332                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SupportsCondition) {
14333                     this.getCompletionsForSupportsCondition(node, result);
14334                 }
14335                 else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ExtendsReference) {
14336                     this.getCompletionsForExtendsReference(node, null, result);
14337                 }
14338                 else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.URILiteral) {
14339                     this.getCompletionForUriLiteralValue(node, result);
14340                 }
14341                 else if (node.parent === null) {
14342                     this.getCompletionForTopLevel(result);
14343                 }
14344                 else if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.StringLiteral && this.isImportPathParent(node.parent.type)) {
14345                     this.getCompletionForImportPath(node, result);
14346                     // } else if (node instanceof nodes.Variable) {
14347                     // this.getCompletionsForVariableDeclaration()
14348                 }
14349                 else {
14350                     continue;
14351                 }
14352                 if (result.items.length > 0 || this.offset > node.offset) {
14353                     return this.finalize(result);
14354                 }
14355             }
14356             this.getCompletionsForStylesheet(result);
14357             if (result.items.length === 0) {
14358                 if (this.variablePrefix && this.currentWord.indexOf(this.variablePrefix) === 0) {
14359                     this.getVariableProposals(null, result);
14360                 }
14361             }
14362             return this.finalize(result);
14363         }
14364         finally {
14365             // don't hold on any state, clear symbolContext
14366             this.position = null;
14367             this.currentWord = null;
14368             this.textDocument = null;
14369             this.styleSheet = null;
14370             this.symbolContext = null;
14371             this.defaultReplaceRange = null;
14372             this.nodePath = null;
14373         }
14374     };
14375     CSSCompletion.prototype.isImportPathParent = function (type) {
14376         return type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Import;
14377     };
14378     CSSCompletion.prototype.finalize = function (result) {
14379         return result;
14380     };
14381     CSSCompletion.prototype.findInNodePath = function () {
14382         var types = [];
14383         for (var _i = 0; _i < arguments.length; _i++) {
14384             types[_i] = arguments[_i];
14385         }
14386         for (var i = this.nodePath.length - 1; i >= 0; i--) {
14387             var node = this.nodePath[i];
14388             if (types.indexOf(node.type) !== -1) {
14389                 return node;
14390             }
14391         }
14392         return null;
14393     };
14394     CSSCompletion.prototype.getCompletionsForDeclarationProperty = function (declaration, result) {
14395         return this.getPropertyProposals(declaration, result);
14396     };
14397     CSSCompletion.prototype.getPropertyProposals = function (declaration, result) {
14398         var _this = this;
14399         var triggerPropertyValueCompletion = this.isTriggerPropertyValueCompletionEnabled;
14400         var completePropertyWithSemicolon = this.isCompletePropertyWithSemicolonEnabled;
14401         var properties = this.cssDataManager.getProperties();
14402         properties.forEach(function (entry) {
14403             var range;
14404             var insertText;
14405             var retrigger = false;
14406             if (declaration) {
14407                 range = _this.getCompletionRange(declaration.getProperty());
14408                 insertText = entry.name;
14409                 if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(declaration.colonPosition)) {
14410                     insertText += ': ';
14411                     retrigger = true;
14412                 }
14413             }
14414             else {
14415                 range = _this.getCompletionRange(null);
14416                 insertText = entry.name + ': ';
14417                 retrigger = true;
14418             }
14419             // Empty .selector { | } case
14420             if (!declaration && completePropertyWithSemicolon) {
14421                 insertText += '$0;';
14422             }
14423             // Cases such as .selector { p; } or .selector { p:; }
14424             if (declaration && !declaration.semicolonPosition) {
14425                 if (completePropertyWithSemicolon && _this.offset >= _this.textDocument.offsetAt(range.end)) {
14426                     insertText += '$0;';
14427                 }
14428             }
14429             var item = {
14430                 label: entry.name,
14431                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.getEntryDescription(entry, _this.doesSupportMarkdown()),
14432                 tags: isDeprecated(entry) ? [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemTag.Deprecated] : [],
14433                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(range, insertText),
14434                 insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.InsertTextFormat.Snippet,
14435                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Property
14436             };
14437             if (!entry.restrictions) {
14438                 retrigger = false;
14439             }
14440             if (triggerPropertyValueCompletion && retrigger) {
14441                 item.command = {
14442                     title: 'Suggest',
14443                     command: 'editor.action.triggerSuggest'
14444                 };
14445             }
14446             var relevance = typeof entry.relevance === 'number' ? Math.min(Math.max(entry.relevance, 0), 99) : 50;
14447             var sortTextSuffix = (255 - relevance).toString(16);
14448             var sortTextPrefix = _utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(entry.name, '-') ? SortTexts.VendorPrefixed : SortTexts.Normal;
14449             item.sortText = sortTextPrefix + '_' + sortTextSuffix;
14450             result.items.push(item);
14451         });
14452         this.completionParticipants.forEach(function (participant) {
14453             if (participant.onCssProperty) {
14454                 participant.onCssProperty({
14455                     propertyName: _this.currentWord,
14456                     range: _this.defaultReplaceRange
14457                 });
14458             }
14459         });
14460         return result;
14461     };
14462     Object.defineProperty(CSSCompletion.prototype, "isTriggerPropertyValueCompletionEnabled", {
14463         get: function () {
14464             if (!this.settings ||
14465                 !this.settings.completion ||
14466                 this.settings.completion.triggerPropertyValueCompletion === undefined) {
14467                 return true;
14468             }
14469             return this.settings.completion.triggerPropertyValueCompletion;
14470         },
14471         enumerable: false,
14472         configurable: true
14473     });
14474     Object.defineProperty(CSSCompletion.prototype, "isCompletePropertyWithSemicolonEnabled", {
14475         get: function () {
14476             if (!this.settings ||
14477                 !this.settings.completion ||
14478                 this.settings.completion.completePropertyWithSemicolon === undefined) {
14479                 return true;
14480             }
14481             return this.settings.completion.completePropertyWithSemicolon;
14482         },
14483         enumerable: false,
14484         configurable: true
14485     });
14486     CSSCompletion.prototype.getCompletionsForDeclarationValue = function (node, result) {
14487         var _this = this;
14488         var propertyName = node.getFullPropertyName();
14489         var entry = this.cssDataManager.getProperty(propertyName);
14490         var existingNode = node.getValue() || null;
14491         while (existingNode && existingNode.hasChildren()) {
14492             existingNode = existingNode.findChildAtOffset(this.offset, false);
14493         }
14494         this.completionParticipants.forEach(function (participant) {
14495             if (participant.onCssPropertyValue) {
14496                 participant.onCssPropertyValue({
14497                     propertyName: propertyName,
14498                     propertyValue: _this.currentWord,
14499                     range: _this.getCompletionRange(existingNode)
14500                 });
14501             }
14502         });
14503         if (entry) {
14504             if (entry.restrictions) {
14505                 for (var _i = 0, _a = entry.restrictions; _i < _a.length; _i++) {
14506                     var restriction = _a[_i];
14507                     switch (restriction) {
14508                         case 'color':
14509                             this.getColorProposals(entry, existingNode, result);
14510                             break;
14511                         case 'position':
14512                             this.getPositionProposals(entry, existingNode, result);
14513                             break;
14514                         case 'repeat':
14515                             this.getRepeatStyleProposals(entry, existingNode, result);
14516                             break;
14517                         case 'line-style':
14518                             this.getLineStyleProposals(entry, existingNode, result);
14519                             break;
14520                         case 'line-width':
14521                             this.getLineWidthProposals(entry, existingNode, result);
14522                             break;
14523                         case 'geometry-box':
14524                             this.getGeometryBoxProposals(entry, existingNode, result);
14525                             break;
14526                         case 'box':
14527                             this.getBoxProposals(entry, existingNode, result);
14528                             break;
14529                         case 'image':
14530                             this.getImageProposals(entry, existingNode, result);
14531                             break;
14532                         case 'timing-function':
14533                             this.getTimingFunctionProposals(entry, existingNode, result);
14534                             break;
14535                         case 'shape':
14536                             this.getBasicShapeProposals(entry, existingNode, result);
14537                             break;
14538                     }
14539                 }
14540             }
14541             this.getValueEnumProposals(entry, existingNode, result);
14542             this.getCSSWideKeywordProposals(entry, existingNode, result);
14543             this.getUnitProposals(entry, existingNode, result);
14544         }
14545         else {
14546             var existingValues = collectValues(this.styleSheet, node);
14547             for (var _b = 0, _c = existingValues.getEntries(); _b < _c.length; _b++) {
14548                 var existingValue = _c[_b];
14549                 result.items.push({
14550                     label: existingValue,
14551                     textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), existingValue),
14552                     kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14553                 });
14554             }
14555         }
14556         this.getVariableProposals(existingNode, result);
14557         this.getTermProposals(entry, existingNode, result);
14558         return result;
14559     };
14560     CSSCompletion.prototype.getValueEnumProposals = function (entry, existingNode, result) {
14561         if (entry.values) {
14562             for (var _i = 0, _a = entry.values; _i < _a.length; _i++) {
14563                 var value = _a[_i];
14564                 var insertString = value.name;
14565                 var insertTextFormat = void 0;
14566                 if (_utils_strings__WEBPACK_IMPORTED_MODULE_7__.endsWith(insertString, ')')) {
14567                     var from = insertString.lastIndexOf('(');
14568                     if (from !== -1) {
14569                         insertString = insertString.substr(0, from) + '($1)';
14570                         insertTextFormat = SnippetFormat;
14571                     }
14572                 }
14573                 var sortText = SortTexts.Enums;
14574                 if (_utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(value.name, '-')) {
14575                     sortText += SortTexts.VendorPrefixed;
14576                 }
14577                 var item = {
14578                     label: value.name,
14579                     documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.getEntryDescription(value, this.doesSupportMarkdown()),
14580                     tags: isDeprecated(entry) ? [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemTag.Deprecated] : [],
14581                     textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertString),
14582                     sortText: sortText,
14583                     kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value,
14584                     insertTextFormat: insertTextFormat
14585                 };
14586                 result.items.push(item);
14587             }
14588         }
14589         return result;
14590     };
14591     CSSCompletion.prototype.getCSSWideKeywordProposals = function (entry, existingNode, result) {
14592         for (var keywords in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.cssWideKeywords) {
14593             result.items.push({
14594                 label: keywords,
14595                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.cssWideKeywords[keywords],
14596                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), keywords),
14597                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14598             });
14599         }
14600         return result;
14601     };
14602     CSSCompletion.prototype.getCompletionsForInterpolation = function (node, result) {
14603         if (this.offset >= node.offset + 2) {
14604             this.getVariableProposals(null, result);
14605         }
14606         return result;
14607     };
14608     CSSCompletion.prototype.getVariableProposals = function (existingNode, result) {
14609         var symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
14610         for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
14611             var symbol = symbols_1[_i];
14612             var insertText = _utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(symbol.name, '--') ? "var(" + symbol.name + ")" : symbol.name;
14613             var completionItem = {
14614                 label: symbol.name,
14615                 documentation: symbol.value ? _utils_strings__WEBPACK_IMPORTED_MODULE_7__.getLimitedString(symbol.value) : symbol.value,
14616                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
14617                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Variable,
14618                 sortText: SortTexts.Variable
14619             };
14620             if (typeof completionItem.documentation === 'string' && isColorString(completionItem.documentation)) {
14621                 completionItem.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Color;
14622             }
14623             if (symbol.node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.FunctionParameter) {
14624                 var mixinNode = (symbol.node.getParent());
14625                 if (mixinNode.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.MixinDeclaration) {
14626                     completionItem.detail = localize('completion.argument', 'argument from \'{0}\'', mixinNode.getName());
14627                 }
14628             }
14629             result.items.push(completionItem);
14630         }
14631         return result;
14632     };
14633     CSSCompletion.prototype.getVariableProposalsForCSSVarFunction = function (result) {
14634         var symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
14635         symbols = symbols.filter(function (symbol) {
14636             return _utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(symbol.name, '--');
14637         });
14638         for (var _i = 0, symbols_2 = symbols; _i < symbols_2.length; _i++) {
14639             var symbol = symbols_2[_i];
14640             var completionItem = {
14641                 label: symbol.name,
14642                 documentation: symbol.value ? _utils_strings__WEBPACK_IMPORTED_MODULE_7__.getLimitedString(symbol.value) : symbol.value,
14643                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(null), symbol.name),
14644                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Variable
14645             };
14646             if (typeof completionItem.documentation === 'string' && isColorString(completionItem.documentation)) {
14647                 completionItem.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Color;
14648             }
14649             result.items.push(completionItem);
14650         }
14651         return result;
14652     };
14653     CSSCompletion.prototype.getUnitProposals = function (entry, existingNode, result) {
14654         var currentWord = '0';
14655         if (this.currentWord.length > 0) {
14656             var numMatch = this.currentWord.match(/^-?\d[\.\d+]*/);
14657             if (numMatch) {
14658                 currentWord = numMatch[0];
14659                 result.isIncomplete = currentWord.length === this.currentWord.length;
14660             }
14661         }
14662         else if (this.currentWord.length === 0) {
14663             result.isIncomplete = true;
14664         }
14665         if (existingNode && existingNode.parent && existingNode.parent.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Term) {
14666             existingNode = existingNode.getParent(); // include the unary operator
14667         }
14668         if (entry.restrictions) {
14669             for (var _i = 0, _a = entry.restrictions; _i < _a.length; _i++) {
14670                 var restriction = _a[_i];
14671                 var units = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.units[restriction];
14672                 if (units) {
14673                     for (var _b = 0, units_1 = units; _b < units_1.length; _b++) {
14674                         var unit = units_1[_b];
14675                         var insertText = currentWord + unit;
14676                         result.items.push({
14677                             label: insertText,
14678                             textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
14679                             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Unit
14680                         });
14681                     }
14682                 }
14683             }
14684         }
14685         return result;
14686     };
14687     CSSCompletion.prototype.getCompletionRange = function (existingNode) {
14688         if (existingNode && existingNode.offset <= this.offset && this.offset <= existingNode.end) {
14689             var end = existingNode.end !== -1 ? this.textDocument.positionAt(existingNode.end) : this.position;
14690             var start = this.textDocument.positionAt(existingNode.offset);
14691             if (start.line === end.line) {
14692                 return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(start, end); // multi line edits are not allowed
14693             }
14694         }
14695         return this.defaultReplaceRange;
14696     };
14697     CSSCompletion.prototype.getColorProposals = function (entry, existingNode, result) {
14698         for (var color in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colors) {
14699             result.items.push({
14700                 label: color,
14701                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colors[color],
14702                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), color),
14703                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Color
14704             });
14705         }
14706         for (var color in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colorKeywords) {
14707             result.items.push({
14708                 label: color,
14709                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colorKeywords[color],
14710                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), color),
14711                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14712             });
14713         }
14714         var colorValues = new Set();
14715         this.styleSheet.acceptVisitor(new ColorValueCollector(colorValues, this.offset));
14716         for (var _i = 0, _a = colorValues.getEntries(); _i < _a.length; _i++) {
14717             var color = _a[_i];
14718             result.items.push({
14719                 label: color,
14720                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), color),
14721                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Color
14722             });
14723         }
14724         var _loop_1 = function (p) {
14725             var tabStop = 1;
14726             var replaceFunction = function (_match, p1) { return '${' + tabStop++ + ':' + p1 + '}'; };
14727             var insertText = p.func.replace(/\[?\$(\w+)\]?/g, replaceFunction);
14728             result.items.push({
14729                 label: p.func.substr(0, p.func.indexOf('(')),
14730                 detail: p.func,
14731                 documentation: p.desc,
14732                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this_1.getCompletionRange(existingNode), insertText),
14733                 insertTextFormat: SnippetFormat,
14734                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function
14735             });
14736         };
14737         var this_1 = this;
14738         for (var _b = 0, _c = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colorFunctions; _b < _c.length; _b++) {
14739             var p = _c[_b];
14740             _loop_1(p);
14741         }
14742         return result;
14743     };
14744     CSSCompletion.prototype.getPositionProposals = function (entry, existingNode, result) {
14745         for (var position in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.positionKeywords) {
14746             result.items.push({
14747                 label: position,
14748                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.positionKeywords[position],
14749                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), position),
14750                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14751             });
14752         }
14753         return result;
14754     };
14755     CSSCompletion.prototype.getRepeatStyleProposals = function (entry, existingNode, result) {
14756         for (var repeat in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.repeatStyleKeywords) {
14757             result.items.push({
14758                 label: repeat,
14759                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.repeatStyleKeywords[repeat],
14760                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), repeat),
14761                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14762             });
14763         }
14764         return result;
14765     };
14766     CSSCompletion.prototype.getLineStyleProposals = function (entry, existingNode, result) {
14767         for (var lineStyle in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.lineStyleKeywords) {
14768             result.items.push({
14769                 label: lineStyle,
14770                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.lineStyleKeywords[lineStyle],
14771                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), lineStyle),
14772                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14773             });
14774         }
14775         return result;
14776     };
14777     CSSCompletion.prototype.getLineWidthProposals = function (entry, existingNode, result) {
14778         for (var _i = 0, _a = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.lineWidthKeywords; _i < _a.length; _i++) {
14779             var lineWidth = _a[_i];
14780             result.items.push({
14781                 label: lineWidth,
14782                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), lineWidth),
14783                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14784             });
14785         }
14786         return result;
14787     };
14788     CSSCompletion.prototype.getGeometryBoxProposals = function (entry, existingNode, result) {
14789         for (var box in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.geometryBoxKeywords) {
14790             result.items.push({
14791                 label: box,
14792                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.geometryBoxKeywords[box],
14793                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), box),
14794                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14795             });
14796         }
14797         return result;
14798     };
14799     CSSCompletion.prototype.getBoxProposals = function (entry, existingNode, result) {
14800         for (var box in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.boxKeywords) {
14801             result.items.push({
14802                 label: box,
14803                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.boxKeywords[box],
14804                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), box),
14805                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Value
14806             });
14807         }
14808         return result;
14809     };
14810     CSSCompletion.prototype.getImageProposals = function (entry, existingNode, result) {
14811         for (var image in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.imageFunctions) {
14812             var insertText = moveCursorInsideParenthesis(image);
14813             result.items.push({
14814                 label: image,
14815                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.imageFunctions[image],
14816                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
14817                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
14818                 insertTextFormat: image !== insertText ? SnippetFormat : void 0
14819             });
14820         }
14821         return result;
14822     };
14823     CSSCompletion.prototype.getTimingFunctionProposals = function (entry, existingNode, result) {
14824         for (var timing in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.transitionTimingFunctions) {
14825             var insertText = moveCursorInsideParenthesis(timing);
14826             result.items.push({
14827                 label: timing,
14828                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.transitionTimingFunctions[timing],
14829                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
14830                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
14831                 insertTextFormat: timing !== insertText ? SnippetFormat : void 0
14832             });
14833         }
14834         return result;
14835     };
14836     CSSCompletion.prototype.getBasicShapeProposals = function (entry, existingNode, result) {
14837         for (var shape in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.basicShapeFunctions) {
14838             var insertText = moveCursorInsideParenthesis(shape);
14839             result.items.push({
14840                 label: shape,
14841                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.basicShapeFunctions[shape],
14842                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
14843                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
14844                 insertTextFormat: shape !== insertText ? SnippetFormat : void 0
14845             });
14846         }
14847         return result;
14848     };
14849     CSSCompletion.prototype.getCompletionsForStylesheet = function (result) {
14850         var node = this.styleSheet.findFirstChildBeforeOffset(this.offset);
14851         if (!node) {
14852             return this.getCompletionForTopLevel(result);
14853         }
14854         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.RuleSet) {
14855             return this.getCompletionsForRuleSet(node, result);
14856         }
14857         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Supports) {
14858             return this.getCompletionsForSupports(node, result);
14859         }
14860         return result;
14861     };
14862     CSSCompletion.prototype.getCompletionForTopLevel = function (result) {
14863         var _this = this;
14864         this.cssDataManager.getAtDirectives().forEach(function (entry) {
14865             result.items.push({
14866                 label: entry.name,
14867                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(_this.getCompletionRange(null), entry.name),
14868                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.getEntryDescription(entry, _this.doesSupportMarkdown()),
14869                 tags: isDeprecated(entry) ? [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemTag.Deprecated] : [],
14870                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Keyword
14871             });
14872         });
14873         this.getCompletionsForSelector(null, false, result);
14874         return result;
14875     };
14876     CSSCompletion.prototype.getCompletionsForRuleSet = function (ruleSet, result) {
14877         var declarations = ruleSet.getDeclarations();
14878         var isAfter = declarations && declarations.endsWith('}') && this.offset >= declarations.end;
14879         if (isAfter) {
14880             return this.getCompletionForTopLevel(result);
14881         }
14882         var isInSelectors = !declarations || this.offset <= declarations.offset;
14883         if (isInSelectors) {
14884             return this.getCompletionsForSelector(ruleSet, ruleSet.isNested(), result);
14885         }
14886         return this.getCompletionsForDeclarations(ruleSet.getDeclarations(), result);
14887     };
14888     CSSCompletion.prototype.getCompletionsForSelector = function (ruleSet, isNested, result) {
14889         var _this = this;
14890         var existingNode = this.findInNodePath(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.PseudoSelector, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.IdentifierSelector, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ClassSelector, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ElementNameSelector);
14891         if (!existingNode && this.offset - this.currentWord.length > 0 && this.textDocument.getText()[this.offset - this.currentWord.length - 1] === ':') {
14892             // after the ':' of a pseudo selector, no node generated for just ':'
14893             this.currentWord = ':' + this.currentWord;
14894             this.defaultReplaceRange = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Position.create(this.position.line, this.position.character - this.currentWord.length), this.position);
14895         }
14896         var pseudoClasses = this.cssDataManager.getPseudoClasses();
14897         pseudoClasses.forEach(function (entry) {
14898             var insertText = moveCursorInsideParenthesis(entry.name);
14899             var item = {
14900                 label: entry.name,
14901                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(_this.getCompletionRange(existingNode), insertText),
14902                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.getEntryDescription(entry, _this.doesSupportMarkdown()),
14903                 tags: isDeprecated(entry) ? [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemTag.Deprecated] : [],
14904                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
14905                 insertTextFormat: entry.name !== insertText ? SnippetFormat : void 0
14906             };
14907             if (_utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(entry.name, ':-')) {
14908                 item.sortText = SortTexts.VendorPrefixed;
14909             }
14910             result.items.push(item);
14911         });
14912         var pseudoElements = this.cssDataManager.getPseudoElements();
14913         pseudoElements.forEach(function (entry) {
14914             var insertText = moveCursorInsideParenthesis(entry.name);
14915             var item = {
14916                 label: entry.name,
14917                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(_this.getCompletionRange(existingNode), insertText),
14918                 documentation: _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.getEntryDescription(entry, _this.doesSupportMarkdown()),
14919                 tags: isDeprecated(entry) ? [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemTag.Deprecated] : [],
14920                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
14921                 insertTextFormat: entry.name !== insertText ? SnippetFormat : void 0
14922             };
14923             if (_utils_strings__WEBPACK_IMPORTED_MODULE_7__.startsWith(entry.name, '::-')) {
14924                 item.sortText = SortTexts.VendorPrefixed;
14925             }
14926             result.items.push(item);
14927         });
14928         if (!isNested) { // show html tags only for top level
14929             for (var _i = 0, _a = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.html5Tags; _i < _a.length; _i++) {
14930                 var entry = _a[_i];
14931                 result.items.push({
14932                     label: entry,
14933                     textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), entry),
14934                     kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Keyword
14935                 });
14936             }
14937             for (var _b = 0, _c = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.svgElements; _b < _c.length; _b++) {
14938                 var entry = _c[_b];
14939                 result.items.push({
14940                     label: entry,
14941                     textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), entry),
14942                     kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Keyword
14943                 });
14944             }
14945         }
14946         var visited = {};
14947         visited[this.currentWord] = true;
14948         var docText = this.textDocument.getText();
14949         this.styleSheet.accept(function (n) {
14950             if (n.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SimpleSelector && n.length > 0) {
14951                 var selector = docText.substr(n.offset, n.length);
14952                 if (selector.charAt(0) === '.' && !visited[selector]) {
14953                     visited[selector] = true;
14954                     result.items.push({
14955                         label: selector,
14956                         textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(_this.getCompletionRange(existingNode), selector),
14957                         kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Keyword
14958                     });
14959                 }
14960                 return false;
14961             }
14962             return true;
14963         });
14964         if (ruleSet && ruleSet.isNested()) {
14965             var selector = ruleSet.getSelectors().findFirstChildBeforeOffset(this.offset);
14966             if (selector && ruleSet.getSelectors().getChildren().indexOf(selector) === 0) {
14967                 this.getPropertyProposals(null, result);
14968             }
14969         }
14970         return result;
14971     };
14972     CSSCompletion.prototype.getCompletionsForDeclarations = function (declarations, result) {
14973         if (!declarations || this.offset === declarations.offset) { // incomplete nodes
14974             return result;
14975         }
14976         var node = declarations.findFirstChildBeforeOffset(this.offset);
14977         if (!node) {
14978             return this.getCompletionsForDeclarationProperty(null, result);
14979         }
14980         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.AbstractDeclaration) {
14981             var declaration = node;
14982             if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(declaration.colonPosition) || this.offset <= declaration.colonPosition) {
14983                 // complete property
14984                 return this.getCompletionsForDeclarationProperty(declaration, result);
14985             }
14986             else if (((0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(declaration.semicolonPosition) && declaration.semicolonPosition < this.offset)) {
14987                 if (this.offset === declaration.semicolonPosition + 1) {
14988                     return result; // don't show new properties right after semicolon (see Bug 15421:[intellisense] [css] Be less aggressive when manually typing CSS)
14989                 }
14990                 // complete next property
14991                 return this.getCompletionsForDeclarationProperty(null, result);
14992             }
14993             if (declaration instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declaration) {
14994                 // complete value
14995                 return this.getCompletionsForDeclarationValue(declaration, result);
14996             }
14997         }
14998         else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ExtendsReference) {
14999             this.getCompletionsForExtendsReference(node, null, result);
15000         }
15001         else if (this.currentWord && this.currentWord[0] === '@') {
15002             this.getCompletionsForDeclarationProperty(null, result);
15003         }
15004         else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.RuleSet) {
15005             this.getCompletionsForDeclarationProperty(null, result);
15006         }
15007         return result;
15008     };
15009     CSSCompletion.prototype.getCompletionsForVariableDeclaration = function (declaration, result) {
15010         if (this.offset && (0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(declaration.colonPosition) && this.offset > declaration.colonPosition) {
15011             this.getVariableProposals(declaration.getValue(), result);
15012         }
15013         return result;
15014     };
15015     CSSCompletion.prototype.getCompletionsForExpression = function (expression, result) {
15016         var parent = expression.getParent();
15017         if (parent instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionArgument) {
15018             this.getCompletionsForFunctionArgument(parent, parent.getParent(), result);
15019             return result;
15020         }
15021         var declaration = expression.findParent(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Declaration);
15022         if (!declaration) {
15023             this.getTermProposals(undefined, null, result);
15024             return result;
15025         }
15026         var node = expression.findChildAtOffset(this.offset, true);
15027         if (!node) {
15028             return this.getCompletionsForDeclarationValue(declaration, result);
15029         }
15030         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NumericValue || node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Identifier) {
15031             return this.getCompletionsForDeclarationValue(declaration, result);
15032         }
15033         return result;
15034     };
15035     CSSCompletion.prototype.getCompletionsForFunctionArgument = function (arg, func, result) {
15036         var identifier = func.getIdentifier();
15037         if (identifier && identifier.matches('var')) {
15038             if (!func.getArguments().hasChildren() || func.getArguments().getChild(0) === arg) {
15039                 this.getVariableProposalsForCSSVarFunction(result);
15040             }
15041         }
15042         return result;
15043     };
15044     CSSCompletion.prototype.getCompletionsForFunctionDeclaration = function (decl, result) {
15045         var declarations = decl.getDeclarations();
15046         if (declarations && this.offset > declarations.offset && this.offset < declarations.end) {
15047             this.getTermProposals(undefined, null, result);
15048         }
15049         return result;
15050     };
15051     CSSCompletion.prototype.getCompletionsForMixinReference = function (ref, result) {
15052         var _this = this;
15053         var allMixins = this.getSymbolContext().findSymbolsAtOffset(this.offset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Mixin);
15054         for (var _i = 0, allMixins_1 = allMixins; _i < allMixins_1.length; _i++) {
15055             var mixinSymbol = allMixins_1[_i];
15056             if (mixinSymbol.node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.MixinDeclaration) {
15057                 result.items.push(this.makeTermProposal(mixinSymbol, mixinSymbol.node.getParameters(), null));
15058             }
15059         }
15060         var identifierNode = ref.getIdentifier() || null;
15061         this.completionParticipants.forEach(function (participant) {
15062             if (participant.onCssMixinReference) {
15063                 participant.onCssMixinReference({
15064                     mixinName: _this.currentWord,
15065                     range: _this.getCompletionRange(identifierNode)
15066                 });
15067             }
15068         });
15069         return result;
15070     };
15071     CSSCompletion.prototype.getTermProposals = function (entry, existingNode, result) {
15072         var allFunctions = this.getSymbolContext().findSymbolsAtOffset(this.offset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Function);
15073         for (var _i = 0, allFunctions_1 = allFunctions; _i < allFunctions_1.length; _i++) {
15074             var functionSymbol = allFunctions_1[_i];
15075             if (functionSymbol.node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionDeclaration) {
15076                 result.items.push(this.makeTermProposal(functionSymbol, functionSymbol.node.getParameters(), existingNode));
15077             }
15078         }
15079         return result;
15080     };
15081     CSSCompletion.prototype.makeTermProposal = function (symbol, parameters, existingNode) {
15082         var decl = symbol.node;
15083         var params = parameters.getChildren().map(function (c) {
15084             return (c instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionParameter) ? c.getName() : c.getText();
15085         });
15086         var insertText = symbol.name + '(' + params.map(function (p, index) { return '${' + (index + 1) + ':' + p + '}'; }).join(', ') + ')';
15087         return {
15088             label: symbol.name,
15089             detail: symbol.name + '(' + params.join(', ') + ')',
15090             textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
15091             insertTextFormat: SnippetFormat,
15092             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.CompletionItemKind.Function,
15093             sortText: SortTexts.Term
15094         };
15095     };
15096     CSSCompletion.prototype.getCompletionsForSupportsCondition = function (supportsCondition, result) {
15097         var child = supportsCondition.findFirstChildBeforeOffset(this.offset);
15098         if (child) {
15099             if (child instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declaration) {
15100                 if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(child.colonPosition) || this.offset <= child.colonPosition) {
15101                     return this.getCompletionsForDeclarationProperty(child, result);
15102                 }
15103                 else {
15104                     return this.getCompletionsForDeclarationValue(child, result);
15105                 }
15106             }
15107             else if (child instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SupportsCondition) {
15108                 return this.getCompletionsForSupportsCondition(child, result);
15109             }
15110         }
15111         if ((0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(supportsCondition.lParent) && this.offset > supportsCondition.lParent && (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(supportsCondition.rParent) || this.offset <= supportsCondition.rParent)) {
15112             return this.getCompletionsForDeclarationProperty(null, result);
15113         }
15114         return result;
15115     };
15116     CSSCompletion.prototype.getCompletionsForSupports = function (supports, result) {
15117         var declarations = supports.getDeclarations();
15118         var inInCondition = !declarations || this.offset <= declarations.offset;
15119         if (inInCondition) {
15120             var child = supports.findFirstChildBeforeOffset(this.offset);
15121             if (child instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SupportsCondition) {
15122                 return this.getCompletionsForSupportsCondition(child, result);
15123             }
15124             return result;
15125         }
15126         return this.getCompletionForTopLevel(result);
15127     };
15128     CSSCompletion.prototype.getCompletionsForExtendsReference = function (extendsRef, existingNode, result) {
15129         return result;
15130     };
15131     CSSCompletion.prototype.getCompletionForUriLiteralValue = function (uriLiteralNode, result) {
15132         var uriValue;
15133         var position;
15134         var range;
15135         // No children, empty value
15136         if (!uriLiteralNode.hasChildren()) {
15137             uriValue = '';
15138             position = this.position;
15139             var emptyURIValuePosition = this.textDocument.positionAt(uriLiteralNode.offset + 'url('.length);
15140             range = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(emptyURIValuePosition, emptyURIValuePosition);
15141         }
15142         else {
15143             var uriValueNode = uriLiteralNode.getChild(0);
15144             uriValue = uriValueNode.getText();
15145             position = this.position;
15146             range = this.getCompletionRange(uriValueNode);
15147         }
15148         this.completionParticipants.forEach(function (participant) {
15149             if (participant.onCssURILiteralValue) {
15150                 participant.onCssURILiteralValue({
15151                     uriValue: uriValue,
15152                     position: position,
15153                     range: range
15154                 });
15155             }
15156         });
15157         return result;
15158     };
15159     CSSCompletion.prototype.getCompletionForImportPath = function (importPathNode, result) {
15160         var _this = this;
15161         this.completionParticipants.forEach(function (participant) {
15162             if (participant.onCssImportPath) {
15163                 participant.onCssImportPath({
15164                     pathValue: importPathNode.getText(),
15165                     position: _this.position,
15166                     range: _this.getCompletionRange(importPathNode)
15167                 });
15168             }
15169         });
15170         return result;
15171     };
15172     CSSCompletion.prototype.doesSupportMarkdown = function () {
15173         var _a, _b, _c;
15174         if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(this.supportsMarkdown)) {
15175             if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_6__.isDefined)(this.lsOptions.clientCapabilities)) {
15176                 this.supportsMarkdown = true;
15177                 return this.supportsMarkdown;
15178             }
15179             var documentationFormat = (_c = (_b = (_a = this.lsOptions.clientCapabilities.textDocument) === null || _a === void 0 ? void 0 : _a.completion) === null || _b === void 0 ? void 0 : _b.completionItem) === null || _c === void 0 ? void 0 : _c.documentationFormat;
15180             this.supportsMarkdown = Array.isArray(documentationFormat) && documentationFormat.indexOf(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.MarkupKind.Markdown) !== -1;
15181         }
15182         return this.supportsMarkdown;
15183     };
15184     return CSSCompletion;
15185 }());
15186
15187 function isDeprecated(entry) {
15188     if (entry.status && (entry.status === 'nonstandard' || entry.status === 'obsolete')) {
15189         return true;
15190     }
15191     return false;
15192 }
15193 /**
15194  * Rank number should all be same length strings
15195  */
15196 function computeRankNumber(n) {
15197     var nstr = n.toString();
15198     switch (nstr.length) {
15199         case 4:
15200             return nstr;
15201         case 3:
15202             return '0' + nstr;
15203         case 2:
15204             return '00' + nstr;
15205         case 1:
15206             return '000' + nstr;
15207         default:
15208             return '0000';
15209     }
15210 }
15211 var Set = /** @class */ (function () {
15212     function Set() {
15213         this.entries = {};
15214     }
15215     Set.prototype.add = function (entry) {
15216         this.entries[entry] = true;
15217     };
15218     Set.prototype.getEntries = function () {
15219         return Object.keys(this.entries);
15220     };
15221     return Set;
15222 }());
15223 function moveCursorInsideParenthesis(text) {
15224     return text.replace(/\(\)$/, "($1)");
15225 }
15226 function collectValues(styleSheet, declaration) {
15227     var fullPropertyName = declaration.getFullPropertyName();
15228     var entries = new Set();
15229     function visitValue(node) {
15230         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Identifier || node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NumericValue || node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.HexColorValue) {
15231             entries.add(node.getText());
15232         }
15233         return true;
15234     }
15235     function matchesProperty(decl) {
15236         var propertyName = decl.getFullPropertyName();
15237         return fullPropertyName === propertyName;
15238     }
15239     function vistNode(node) {
15240         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declaration && node !== declaration) {
15241             if (matchesProperty(node)) {
15242                 var value = node.getValue();
15243                 if (value) {
15244                     value.accept(visitValue);
15245                 }
15246             }
15247         }
15248         return true;
15249     }
15250     styleSheet.accept(vistNode);
15251     return entries;
15252 }
15253 var ColorValueCollector = /** @class */ (function () {
15254     function ColorValueCollector(entries, currentOffset) {
15255         this.entries = entries;
15256         this.currentOffset = currentOffset;
15257         // nothing to do
15258     }
15259     ColorValueCollector.prototype.visitNode = function (node) {
15260         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.HexColorValue || (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Function && _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.isColorConstructor(node))) {
15261             if (this.currentOffset < node.offset || node.end < this.currentOffset) {
15262                 this.entries.add(node.getText());
15263             }
15264         }
15265         return true;
15266     };
15267     return ColorValueCollector;
15268 }());
15269 function getCurrentWord(document, offset) {
15270     var i = offset - 1;
15271     var text = document.getText();
15272     while (i >= 0 && ' \t\n\r":{[()]},*>+'.indexOf(text.charAt(i)) === -1) {
15273         i--;
15274     }
15275     return text.substring(i + 1, offset);
15276 }
15277 function isColorString(s) {
15278     // From https://stackoverflow.com/questions/8027423/how-to-check-if-a-string-is-a-valid-hex-color-representation/8027444
15279     return (s.toLowerCase() in _languageFacts_facts__WEBPACK_IMPORTED_MODULE_2__.colors) || /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(s);
15280 }
15281
15282
15283 /***/ }),
15284 /* 77 */
15285 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15286
15287 __webpack_require__.r(__webpack_exports__);
15288 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15289 /* harmony export */   "Scope": () => /* binding */ Scope,
15290 /* harmony export */   "GlobalScope": () => /* binding */ GlobalScope,
15291 /* harmony export */   "Symbol": () => /* binding */ Symbol,
15292 /* harmony export */   "ScopeBuilder": () => /* binding */ ScopeBuilder,
15293 /* harmony export */   "Symbols": () => /* binding */ Symbols
15294 /* harmony export */ });
15295 /* harmony import */ var _cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
15296 /* harmony import */ var _utils_arrays__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(78);
15297 /*---------------------------------------------------------------------------------------------
15298  *  Copyright (c) Microsoft Corporation. All rights reserved.
15299  *  Licensed under the MIT License. See License.txt in the project root for license information.
15300  *--------------------------------------------------------------------------------------------*/
15301
15302 var __extends = (undefined && undefined.__extends) || (function () {
15303     var extendStatics = function (d, b) {
15304         extendStatics = Object.setPrototypeOf ||
15305             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
15306             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
15307         return extendStatics(d, b);
15308     };
15309     return function (d, b) {
15310         extendStatics(d, b);
15311         function __() { this.constructor = d; }
15312         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15313     };
15314 })();
15315
15316
15317 var Scope = /** @class */ (function () {
15318     function Scope(offset, length) {
15319         this.offset = offset;
15320         this.length = length;
15321         this.symbols = [];
15322         this.parent = null;
15323         this.children = [];
15324     }
15325     Scope.prototype.addChild = function (scope) {
15326         this.children.push(scope);
15327         scope.setParent(this);
15328     };
15329     Scope.prototype.setParent = function (scope) {
15330         this.parent = scope;
15331     };
15332     Scope.prototype.findScope = function (offset, length) {
15333         if (length === void 0) { length = 0; }
15334         if (this.offset <= offset && this.offset + this.length > offset + length || this.offset === offset && this.length === length) {
15335             return this.findInScope(offset, length);
15336         }
15337         return null;
15338     };
15339     Scope.prototype.findInScope = function (offset, length) {
15340         if (length === void 0) { length = 0; }
15341         // find the first scope child that has an offset larger than offset + length
15342         var end = offset + length;
15343         var idx = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_1__.findFirst)(this.children, function (s) { return s.offset > end; });
15344         if (idx === 0) {
15345             // all scopes have offsets larger than our end
15346             return this;
15347         }
15348         var res = this.children[idx - 1];
15349         if (res.offset <= offset && res.offset + res.length >= offset + length) {
15350             return res.findInScope(offset, length);
15351         }
15352         return this;
15353     };
15354     Scope.prototype.addSymbol = function (symbol) {
15355         this.symbols.push(symbol);
15356     };
15357     Scope.prototype.getSymbol = function (name, type) {
15358         for (var index = 0; index < this.symbols.length; index++) {
15359             var symbol = this.symbols[index];
15360             if (symbol.name === name && symbol.type === type) {
15361                 return symbol;
15362             }
15363         }
15364         return null;
15365     };
15366     Scope.prototype.getSymbols = function () {
15367         return this.symbols;
15368     };
15369     return Scope;
15370 }());
15371
15372 var GlobalScope = /** @class */ (function (_super) {
15373     __extends(GlobalScope, _super);
15374     function GlobalScope() {
15375         return _super.call(this, 0, Number.MAX_VALUE) || this;
15376     }
15377     return GlobalScope;
15378 }(Scope));
15379
15380 var Symbol = /** @class */ (function () {
15381     function Symbol(name, value, node, type) {
15382         this.name = name;
15383         this.value = value;
15384         this.node = node;
15385         this.type = type;
15386     }
15387     return Symbol;
15388 }());
15389
15390 var ScopeBuilder = /** @class */ (function () {
15391     function ScopeBuilder(scope) {
15392         this.scope = scope;
15393     }
15394     ScopeBuilder.prototype.addSymbol = function (node, name, value, type) {
15395         if (node.offset !== -1) {
15396             var current = this.scope.findScope(node.offset, node.length);
15397             if (current) {
15398                 current.addSymbol(new Symbol(name, value, node, type));
15399             }
15400         }
15401     };
15402     ScopeBuilder.prototype.addScope = function (node) {
15403         if (node.offset !== -1) {
15404             var current = this.scope.findScope(node.offset, node.length);
15405             if (current && (current.offset !== node.offset || current.length !== node.length)) { // scope already known?
15406                 var newScope = new Scope(node.offset, node.length);
15407                 current.addChild(newScope);
15408                 return newScope;
15409             }
15410             return current;
15411         }
15412         return null;
15413     };
15414     ScopeBuilder.prototype.addSymbolToChildScope = function (scopeNode, node, name, value, type) {
15415         if (scopeNode && scopeNode.offset !== -1) {
15416             var current = this.addScope(scopeNode); // create the scope or gets the existing one
15417             if (current) {
15418                 current.addSymbol(new Symbol(name, value, node, type));
15419             }
15420         }
15421     };
15422     ScopeBuilder.prototype.visitNode = function (node) {
15423         switch (node.type) {
15424             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Keyframe:
15425                 this.addSymbol(node, node.getName(), void 0, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Keyframe);
15426                 return true;
15427             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.CustomPropertyDeclaration:
15428                 return this.visitCustomPropertyDeclarationNode(node);
15429             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.VariableDeclaration:
15430                 return this.visitVariableDeclarationNode(node);
15431             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Ruleset:
15432                 return this.visitRuleSet(node);
15433             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.MixinDeclaration:
15434                 this.addSymbol(node, node.getName(), void 0, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Mixin);
15435                 return true;
15436             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.FunctionDeclaration:
15437                 this.addSymbol(node, node.getName(), void 0, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Function);
15438                 return true;
15439             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.FunctionParameter: {
15440                 return this.visitFunctionParameterNode(node);
15441             }
15442             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Declarations:
15443                 this.addScope(node);
15444                 return true;
15445             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.For:
15446                 var forNode = node;
15447                 var scopeNode = forNode.getDeclarations();
15448                 if (scopeNode && forNode.variable) {
15449                     this.addSymbolToChildScope(scopeNode, forNode.variable, forNode.variable.getName(), void 0, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
15450                 }
15451                 return true;
15452             case _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Each: {
15453                 var eachNode = node;
15454                 var scopeNode_1 = eachNode.getDeclarations();
15455                 if (scopeNode_1) {
15456                     var variables = eachNode.getVariables().getChildren();
15457                     for (var _i = 0, variables_1 = variables; _i < variables_1.length; _i++) {
15458                         var variable = variables_1[_i];
15459                         this.addSymbolToChildScope(scopeNode_1, variable, variable.getName(), void 0, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
15460                     }
15461                 }
15462                 return true;
15463             }
15464         }
15465         return true;
15466     };
15467     ScopeBuilder.prototype.visitRuleSet = function (node) {
15468         var current = this.scope.findScope(node.offset, node.length);
15469         if (current) {
15470             for (var _i = 0, _a = node.getSelectors().getChildren(); _i < _a.length; _i++) {
15471                 var child = _a[_i];
15472                 if (child instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.Selector) {
15473                     if (child.getChildren().length === 1) { // only selectors with a single element can be extended
15474                         current.addSymbol(new Symbol(child.getChild(0).getText(), void 0, child, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Rule));
15475                     }
15476                 }
15477             }
15478         }
15479         return true;
15480     };
15481     ScopeBuilder.prototype.visitVariableDeclarationNode = function (node) {
15482         var value = node.getValue() ? node.getValue().getText() : void 0;
15483         this.addSymbol(node, node.getName(), value, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
15484         return true;
15485     };
15486     ScopeBuilder.prototype.visitFunctionParameterNode = function (node) {
15487         // parameters are part of the body scope
15488         var scopeNode = node.getParent().getDeclarations();
15489         if (scopeNode) {
15490             var valueNode = node.getDefaultValue();
15491             var value = valueNode ? valueNode.getText() : void 0;
15492             this.addSymbolToChildScope(scopeNode, node, node.getName(), value, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
15493         }
15494         return true;
15495     };
15496     ScopeBuilder.prototype.visitCustomPropertyDeclarationNode = function (node) {
15497         var value = node.getValue() ? node.getValue().getText() : '';
15498         this.addCSSVariable(node.getProperty(), node.getProperty().getName(), value, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable);
15499         return true;
15500     };
15501     ScopeBuilder.prototype.addCSSVariable = function (node, name, value, type) {
15502         if (node.offset !== -1) {
15503             this.scope.addSymbol(new Symbol(name, value, node, type));
15504         }
15505     };
15506     return ScopeBuilder;
15507 }());
15508
15509 var Symbols = /** @class */ (function () {
15510     function Symbols(node) {
15511         this.global = new GlobalScope();
15512         node.acceptVisitor(new ScopeBuilder(this.global));
15513     }
15514     Symbols.prototype.findSymbolsAtOffset = function (offset, referenceType) {
15515         var scope = this.global.findScope(offset, 0);
15516         var result = [];
15517         var names = {};
15518         while (scope) {
15519             var symbols = scope.getSymbols();
15520             for (var i = 0; i < symbols.length; i++) {
15521                 var symbol = symbols[i];
15522                 if (symbol.type === referenceType && !names[symbol.name]) {
15523                     result.push(symbol);
15524                     names[symbol.name] = true;
15525                 }
15526             }
15527             scope = scope.parent;
15528         }
15529         return result;
15530     };
15531     Symbols.prototype.internalFindSymbol = function (node, referenceTypes) {
15532         var scopeNode = node;
15533         if (node.parent instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionParameter && node.parent.getParent() instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.BodyDeclaration) {
15534             scopeNode = node.parent.getParent().getDeclarations();
15535         }
15536         if (node.parent instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.FunctionArgument && node.parent.getParent() instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.Function) {
15537             var funcId = node.parent.getParent().getIdentifier();
15538             if (funcId) {
15539                 var functionSymbol = this.internalFindSymbol(funcId, [_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Function]);
15540                 if (functionSymbol) {
15541                     scopeNode = functionSymbol.node.getDeclarations();
15542                 }
15543             }
15544         }
15545         if (!scopeNode) {
15546             return null;
15547         }
15548         var name = node.getText();
15549         var scope = this.global.findScope(scopeNode.offset, scopeNode.length);
15550         while (scope) {
15551             for (var index = 0; index < referenceTypes.length; index++) {
15552                 var type = referenceTypes[index];
15553                 var symbol = scope.getSymbol(name, type);
15554                 if (symbol) {
15555                     return symbol;
15556                 }
15557             }
15558             scope = scope.parent;
15559         }
15560         return null;
15561     };
15562     Symbols.prototype.evaluateReferenceTypes = function (node) {
15563         if (node instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.Identifier) {
15564             var referenceTypes = node.referenceTypes;
15565             if (referenceTypes) {
15566                 return referenceTypes;
15567             }
15568             else {
15569                 if (node.isCustomProperty) {
15570                     return [_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable];
15571                 }
15572                 // are a reference to a keyframe?
15573                 var decl = _cssNodes__WEBPACK_IMPORTED_MODULE_0__.getParentDeclaration(node);
15574                 if (decl) {
15575                     var propertyName = decl.getNonPrefixedPropertyName();
15576                     if ((propertyName === 'animation' || propertyName === 'animation-name')
15577                         && decl.getValue() && decl.getValue().offset === node.offset) {
15578                         return [_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Keyframe];
15579                     }
15580                 }
15581             }
15582         }
15583         else if (node instanceof _cssNodes__WEBPACK_IMPORTED_MODULE_0__.Variable) {
15584             return [_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Variable];
15585         }
15586         var selector = node.findAParent(_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Selector, _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ExtendsReference);
15587         if (selector) {
15588             return [_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ReferenceType.Rule];
15589         }
15590         return null;
15591     };
15592     Symbols.prototype.findSymbolFromNode = function (node) {
15593         if (!node) {
15594             return null;
15595         }
15596         while (node.type === _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Interpolation) {
15597             node = node.getParent();
15598         }
15599         var referenceTypes = this.evaluateReferenceTypes(node);
15600         if (referenceTypes) {
15601             return this.internalFindSymbol(node, referenceTypes);
15602         }
15603         return null;
15604     };
15605     Symbols.prototype.matchesSymbol = function (node, symbol) {
15606         if (!node) {
15607             return false;
15608         }
15609         while (node.type === _cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Interpolation) {
15610             node = node.getParent();
15611         }
15612         if (!node.matches(symbol.name)) {
15613             return false;
15614         }
15615         var referenceTypes = this.evaluateReferenceTypes(node);
15616         if (!referenceTypes || referenceTypes.indexOf(symbol.type) === -1) {
15617             return false;
15618         }
15619         var nodeSymbol = this.internalFindSymbol(node, referenceTypes);
15620         return nodeSymbol === symbol;
15621     };
15622     Symbols.prototype.findSymbol = function (name, type, offset) {
15623         var scope = this.global.findScope(offset);
15624         while (scope) {
15625             var symbol = scope.getSymbol(name, type);
15626             if (symbol) {
15627                 return symbol;
15628             }
15629             scope = scope.parent;
15630         }
15631         return null;
15632     };
15633     return Symbols;
15634 }());
15635
15636
15637
15638 /***/ }),
15639 /* 78 */
15640 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15641
15642 __webpack_require__.r(__webpack_exports__);
15643 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15644 /* harmony export */   "findFirst": () => /* binding */ findFirst,
15645 /* harmony export */   "includes": () => /* binding */ includes,
15646 /* harmony export */   "union": () => /* binding */ union
15647 /* harmony export */ });
15648 /*---------------------------------------------------------------------------------------------
15649  *  Copyright (c) Microsoft Corporation. All rights reserved.
15650  *  Licensed under the MIT License. See License.txt in the project root for license information.
15651  *--------------------------------------------------------------------------------------------*/
15652
15653 /**
15654  * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false
15655  * are located before all elements where p(x) is true.
15656  * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.
15657  */
15658 function findFirst(array, p) {
15659     var low = 0, high = array.length;
15660     if (high === 0) {
15661         return 0; // no children
15662     }
15663     while (low < high) {
15664         var mid = Math.floor((low + high) / 2);
15665         if (p(array[mid])) {
15666             high = mid;
15667         }
15668         else {
15669             low = mid + 1;
15670         }
15671     }
15672     return low;
15673 }
15674 function includes(array, item) {
15675     return array.indexOf(item) !== -1;
15676 }
15677 function union() {
15678     var arrays = [];
15679     for (var _i = 0; _i < arguments.length; _i++) {
15680         arrays[_i] = arguments[_i];
15681     }
15682     var result = [];
15683     for (var _a = 0, arrays_1 = arrays; _a < arrays_1.length; _a++) {
15684         var array = arrays_1[_a];
15685         for (var _b = 0, array_1 = array; _b < array_1.length; _b++) {
15686             var item = array_1[_b];
15687             if (!includes(result, item)) {
15688                 result.push(item);
15689             }
15690         }
15691     }
15692     return result;
15693 }
15694
15695
15696 /***/ }),
15697 /* 79 */
15698 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15699
15700 __webpack_require__.r(__webpack_exports__);
15701 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15702 /* harmony export */   "TextDocument": () => /* reexport safe */ vscode_languageserver_textdocument__WEBPACK_IMPORTED_MODULE_1__.TextDocument,
15703 /* harmony export */   "CodeAction": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeAction,
15704 /* harmony export */   "CodeActionContext": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeActionContext,
15705 /* harmony export */   "CodeActionKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeActionKind,
15706 /* harmony export */   "CodeLens": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeLens,
15707 /* harmony export */   "Color": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Color,
15708 /* harmony export */   "ColorInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ColorInformation,
15709 /* harmony export */   "ColorPresentation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ColorPresentation,
15710 /* harmony export */   "Command": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Command,
15711 /* harmony export */   "CompletionItem": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItem,
15712 /* harmony export */   "CompletionItemKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind,
15713 /* harmony export */   "CompletionItemTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemTag,
15714 /* harmony export */   "CompletionList": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionList,
15715 /* harmony export */   "CreateFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CreateFile,
15716 /* harmony export */   "DeleteFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DeleteFile,
15717 /* harmony export */   "Diagnostic": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Diagnostic,
15718 /* harmony export */   "DiagnosticCode": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticCode,
15719 /* harmony export */   "DiagnosticRelatedInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticRelatedInformation,
15720 /* harmony export */   "DiagnosticSeverity": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticSeverity,
15721 /* harmony export */   "DiagnosticTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticTag,
15722 /* harmony export */   "DocumentHighlight": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlight,
15723 /* harmony export */   "DocumentHighlightKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind,
15724 /* harmony export */   "DocumentLink": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentLink,
15725 /* harmony export */   "DocumentSymbol": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentSymbol,
15726 /* harmony export */   "EOL": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.EOL,
15727 /* harmony export */   "FoldingRange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRange,
15728 /* harmony export */   "FoldingRangeKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRangeKind,
15729 /* harmony export */   "FormattingOptions": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FormattingOptions,
15730 /* harmony export */   "Hover": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Hover,
15731 /* harmony export */   "InsertReplaceEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertReplaceEdit,
15732 /* harmony export */   "InsertTextFormat": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat,
15733 /* harmony export */   "Location": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Location,
15734 /* harmony export */   "LocationLink": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.LocationLink,
15735 /* harmony export */   "MarkedString": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkedString,
15736 /* harmony export */   "MarkupContent": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupContent,
15737 /* harmony export */   "MarkupKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind,
15738 /* harmony export */   "ParameterInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ParameterInformation,
15739 /* harmony export */   "Position": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position,
15740 /* harmony export */   "Range": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range,
15741 /* harmony export */   "RenameFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.RenameFile,
15742 /* harmony export */   "SelectionRange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SelectionRange,
15743 /* harmony export */   "SignatureInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SignatureInformation,
15744 /* harmony export */   "SymbolInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolInformation,
15745 /* harmony export */   "SymbolKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolKind,
15746 /* harmony export */   "SymbolTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolTag,
15747 /* harmony export */   "TextDocumentEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentEdit,
15748 /* harmony export */   "TextDocumentIdentifier": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentIdentifier,
15749 /* harmony export */   "TextDocumentItem": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentItem,
15750 /* harmony export */   "TextEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit,
15751 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.VersionedTextDocumentIdentifier,
15752 /* harmony export */   "WorkspaceChange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.WorkspaceChange,
15753 /* harmony export */   "WorkspaceEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.WorkspaceEdit,
15754 /* harmony export */   "ClientCapabilities": () => /* binding */ ClientCapabilities,
15755 /* harmony export */   "FileType": () => /* binding */ FileType
15756 /* harmony export */ });
15757 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(80);
15758 /* harmony import */ var vscode_languageserver_textdocument__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(81);
15759 /*---------------------------------------------------------------------------------------------
15760  *  Copyright (c) Microsoft Corporation. All rights reserved.
15761  *  Licensed under the MIT License. See License.txt in the project root for license information.
15762  *--------------------------------------------------------------------------------------------*/
15763
15764
15765
15766
15767 var ClientCapabilities;
15768 (function (ClientCapabilities) {
15769     ClientCapabilities.LATEST = {
15770         textDocument: {
15771             completion: {
15772                 completionItem: {
15773                     documentationFormat: [vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.Markdown, vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.PlainText]
15774                 }
15775             },
15776             hover: {
15777                 contentFormat: [vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.Markdown, vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.PlainText]
15778             }
15779         }
15780     };
15781 })(ClientCapabilities || (ClientCapabilities = {}));
15782 var FileType;
15783 (function (FileType) {
15784     /**
15785      * The file type is unknown.
15786      */
15787     FileType[FileType["Unknown"] = 0] = "Unknown";
15788     /**
15789      * A regular file.
15790      */
15791     FileType[FileType["File"] = 1] = "File";
15792     /**
15793      * A directory.
15794      */
15795     FileType[FileType["Directory"] = 2] = "Directory";
15796     /**
15797      * A symbolic link to a file.
15798      */
15799     FileType[FileType["SymbolicLink"] = 64] = "SymbolicLink";
15800 })(FileType || (FileType = {}));
15801
15802
15803 /***/ }),
15804 /* 80 */
15805 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15806
15807 __webpack_require__.r(__webpack_exports__);
15808 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15809 /* harmony export */   "Position": () => /* binding */ Position,
15810 /* harmony export */   "Range": () => /* binding */ Range,
15811 /* harmony export */   "Location": () => /* binding */ Location,
15812 /* harmony export */   "LocationLink": () => /* binding */ LocationLink,
15813 /* harmony export */   "Color": () => /* binding */ Color,
15814 /* harmony export */   "ColorInformation": () => /* binding */ ColorInformation,
15815 /* harmony export */   "ColorPresentation": () => /* binding */ ColorPresentation,
15816 /* harmony export */   "FoldingRangeKind": () => /* binding */ FoldingRangeKind,
15817 /* harmony export */   "FoldingRange": () => /* binding */ FoldingRange,
15818 /* harmony export */   "DiagnosticRelatedInformation": () => /* binding */ DiagnosticRelatedInformation,
15819 /* harmony export */   "DiagnosticSeverity": () => /* binding */ DiagnosticSeverity,
15820 /* harmony export */   "DiagnosticTag": () => /* binding */ DiagnosticTag,
15821 /* harmony export */   "DiagnosticCode": () => /* binding */ DiagnosticCode,
15822 /* harmony export */   "Diagnostic": () => /* binding */ Diagnostic,
15823 /* harmony export */   "Command": () => /* binding */ Command,
15824 /* harmony export */   "TextEdit": () => /* binding */ TextEdit,
15825 /* harmony export */   "TextDocumentEdit": () => /* binding */ TextDocumentEdit,
15826 /* harmony export */   "CreateFile": () => /* binding */ CreateFile,
15827 /* harmony export */   "RenameFile": () => /* binding */ RenameFile,
15828 /* harmony export */   "DeleteFile": () => /* binding */ DeleteFile,
15829 /* harmony export */   "WorkspaceEdit": () => /* binding */ WorkspaceEdit,
15830 /* harmony export */   "WorkspaceChange": () => /* binding */ WorkspaceChange,
15831 /* harmony export */   "TextDocumentIdentifier": () => /* binding */ TextDocumentIdentifier,
15832 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* binding */ VersionedTextDocumentIdentifier,
15833 /* harmony export */   "TextDocumentItem": () => /* binding */ TextDocumentItem,
15834 /* harmony export */   "MarkupKind": () => /* binding */ MarkupKind,
15835 /* harmony export */   "MarkupContent": () => /* binding */ MarkupContent,
15836 /* harmony export */   "CompletionItemKind": () => /* binding */ CompletionItemKind,
15837 /* harmony export */   "InsertTextFormat": () => /* binding */ InsertTextFormat,
15838 /* harmony export */   "CompletionItemTag": () => /* binding */ CompletionItemTag,
15839 /* harmony export */   "InsertReplaceEdit": () => /* binding */ InsertReplaceEdit,
15840 /* harmony export */   "CompletionItem": () => /* binding */ CompletionItem,
15841 /* harmony export */   "CompletionList": () => /* binding */ CompletionList,
15842 /* harmony export */   "MarkedString": () => /* binding */ MarkedString,
15843 /* harmony export */   "Hover": () => /* binding */ Hover,
15844 /* harmony export */   "ParameterInformation": () => /* binding */ ParameterInformation,
15845 /* harmony export */   "SignatureInformation": () => /* binding */ SignatureInformation,
15846 /* harmony export */   "DocumentHighlightKind": () => /* binding */ DocumentHighlightKind,
15847 /* harmony export */   "DocumentHighlight": () => /* binding */ DocumentHighlight,
15848 /* harmony export */   "SymbolKind": () => /* binding */ SymbolKind,
15849 /* harmony export */   "SymbolTag": () => /* binding */ SymbolTag,
15850 /* harmony export */   "SymbolInformation": () => /* binding */ SymbolInformation,
15851 /* harmony export */   "DocumentSymbol": () => /* binding */ DocumentSymbol,
15852 /* harmony export */   "CodeActionKind": () => /* binding */ CodeActionKind,
15853 /* harmony export */   "CodeActionContext": () => /* binding */ CodeActionContext,
15854 /* harmony export */   "CodeAction": () => /* binding */ CodeAction,
15855 /* harmony export */   "CodeLens": () => /* binding */ CodeLens,
15856 /* harmony export */   "FormattingOptions": () => /* binding */ FormattingOptions,
15857 /* harmony export */   "DocumentLink": () => /* binding */ DocumentLink,
15858 /* harmony export */   "SelectionRange": () => /* binding */ SelectionRange,
15859 /* harmony export */   "EOL": () => /* binding */ EOL,
15860 /* harmony export */   "TextDocument": () => /* binding */ TextDocument
15861 /* harmony export */ });
15862 /* --------------------------------------------------------------------------------------------
15863  * Copyright (c) Microsoft Corporation. All rights reserved.
15864  * Licensed under the MIT License. See License.txt in the project root for license information.
15865  * ------------------------------------------------------------------------------------------ */
15866
15867 /**
15868  * The Position namespace provides helper functions to work with
15869  * [Position](#Position) literals.
15870  */
15871 var Position;
15872 (function (Position) {
15873     /**
15874      * Creates a new Position literal from the given line and character.
15875      * @param line The position's line.
15876      * @param character The position's character.
15877      */
15878     function create(line, character) {
15879         return { line: line, character: character };
15880     }
15881     Position.create = create;
15882     /**
15883      * Checks whether the given liternal conforms to the [Position](#Position) interface.
15884      */
15885     function is(value) {
15886         var candidate = value;
15887         return Is.objectLiteral(candidate) && Is.number(candidate.line) && Is.number(candidate.character);
15888     }
15889     Position.is = is;
15890 })(Position || (Position = {}));
15891 /**
15892  * The Range namespace provides helper functions to work with
15893  * [Range](#Range) literals.
15894  */
15895 var Range;
15896 (function (Range) {
15897     function create(one, two, three, four) {
15898         if (Is.number(one) && Is.number(two) && Is.number(three) && Is.number(four)) {
15899             return { start: Position.create(one, two), end: Position.create(three, four) };
15900         }
15901         else if (Position.is(one) && Position.is(two)) {
15902             return { start: one, end: two };
15903         }
15904         else {
15905             throw new Error("Range#create called with invalid arguments[" + one + ", " + two + ", " + three + ", " + four + "]");
15906         }
15907     }
15908     Range.create = create;
15909     /**
15910      * Checks whether the given literal conforms to the [Range](#Range) interface.
15911      */
15912     function is(value) {
15913         var candidate = value;
15914         return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);
15915     }
15916     Range.is = is;
15917 })(Range || (Range = {}));
15918 /**
15919  * The Location namespace provides helper functions to work with
15920  * [Location](#Location) literals.
15921  */
15922 var Location;
15923 (function (Location) {
15924     /**
15925      * Creates a Location literal.
15926      * @param uri The location's uri.
15927      * @param range The location's range.
15928      */
15929     function create(uri, range) {
15930         return { uri: uri, range: range };
15931     }
15932     Location.create = create;
15933     /**
15934      * Checks whether the given literal conforms to the [Location](#Location) interface.
15935      */
15936     function is(value) {
15937         var candidate = value;
15938         return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));
15939     }
15940     Location.is = is;
15941 })(Location || (Location = {}));
15942 /**
15943  * The LocationLink namespace provides helper functions to work with
15944  * [LocationLink](#LocationLink) literals.
15945  */
15946 var LocationLink;
15947 (function (LocationLink) {
15948     /**
15949      * Creates a LocationLink literal.
15950      * @param targetUri The definition's uri.
15951      * @param targetRange The full range of the definition.
15952      * @param targetSelectionRange The span of the symbol definition at the target.
15953      * @param originSelectionRange The span of the symbol being defined in the originating source file.
15954      */
15955     function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {
15956         return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };
15957     }
15958     LocationLink.create = create;
15959     /**
15960      * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.
15961      */
15962     function is(value) {
15963         var candidate = value;
15964         return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)
15965             && (Range.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange))
15966             && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));
15967     }
15968     LocationLink.is = is;
15969 })(LocationLink || (LocationLink = {}));
15970 /**
15971  * The Color namespace provides helper functions to work with
15972  * [Color](#Color) literals.
15973  */
15974 var Color;
15975 (function (Color) {
15976     /**
15977      * Creates a new Color literal.
15978      */
15979     function create(red, green, blue, alpha) {
15980         return {
15981             red: red,
15982             green: green,
15983             blue: blue,
15984             alpha: alpha,
15985         };
15986     }
15987     Color.create = create;
15988     /**
15989      * Checks whether the given literal conforms to the [Color](#Color) interface.
15990      */
15991     function is(value) {
15992         var candidate = value;
15993         return Is.number(candidate.red)
15994             && Is.number(candidate.green)
15995             && Is.number(candidate.blue)
15996             && Is.number(candidate.alpha);
15997     }
15998     Color.is = is;
15999 })(Color || (Color = {}));
16000 /**
16001  * The ColorInformation namespace provides helper functions to work with
16002  * [ColorInformation](#ColorInformation) literals.
16003  */
16004 var ColorInformation;
16005 (function (ColorInformation) {
16006     /**
16007      * Creates a new ColorInformation literal.
16008      */
16009     function create(range, color) {
16010         return {
16011             range: range,
16012             color: color,
16013         };
16014     }
16015     ColorInformation.create = create;
16016     /**
16017      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
16018      */
16019     function is(value) {
16020         var candidate = value;
16021         return Range.is(candidate.range) && Color.is(candidate.color);
16022     }
16023     ColorInformation.is = is;
16024 })(ColorInformation || (ColorInformation = {}));
16025 /**
16026  * The Color namespace provides helper functions to work with
16027  * [ColorPresentation](#ColorPresentation) literals.
16028  */
16029 var ColorPresentation;
16030 (function (ColorPresentation) {
16031     /**
16032      * Creates a new ColorInformation literal.
16033      */
16034     function create(label, textEdit, additionalTextEdits) {
16035         return {
16036             label: label,
16037             textEdit: textEdit,
16038             additionalTextEdits: additionalTextEdits,
16039         };
16040     }
16041     ColorPresentation.create = create;
16042     /**
16043      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
16044      */
16045     function is(value) {
16046         var candidate = value;
16047         return Is.string(candidate.label)
16048             && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))
16049             && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));
16050     }
16051     ColorPresentation.is = is;
16052 })(ColorPresentation || (ColorPresentation = {}));
16053 /**
16054  * Enum of known range kinds
16055  */
16056 var FoldingRangeKind;
16057 (function (FoldingRangeKind) {
16058     /**
16059      * Folding range for a comment
16060      */
16061     FoldingRangeKind["Comment"] = "comment";
16062     /**
16063      * Folding range for a imports or includes
16064      */
16065     FoldingRangeKind["Imports"] = "imports";
16066     /**
16067      * Folding range for a region (e.g. `#region`)
16068      */
16069     FoldingRangeKind["Region"] = "region";
16070 })(FoldingRangeKind || (FoldingRangeKind = {}));
16071 /**
16072  * The folding range namespace provides helper functions to work with
16073  * [FoldingRange](#FoldingRange) literals.
16074  */
16075 var FoldingRange;
16076 (function (FoldingRange) {
16077     /**
16078      * Creates a new FoldingRange literal.
16079      */
16080     function create(startLine, endLine, startCharacter, endCharacter, kind) {
16081         var result = {
16082             startLine: startLine,
16083             endLine: endLine
16084         };
16085         if (Is.defined(startCharacter)) {
16086             result.startCharacter = startCharacter;
16087         }
16088         if (Is.defined(endCharacter)) {
16089             result.endCharacter = endCharacter;
16090         }
16091         if (Is.defined(kind)) {
16092             result.kind = kind;
16093         }
16094         return result;
16095     }
16096     FoldingRange.create = create;
16097     /**
16098      * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.
16099      */
16100     function is(value) {
16101         var candidate = value;
16102         return Is.number(candidate.startLine) && Is.number(candidate.startLine)
16103             && (Is.undefined(candidate.startCharacter) || Is.number(candidate.startCharacter))
16104             && (Is.undefined(candidate.endCharacter) || Is.number(candidate.endCharacter))
16105             && (Is.undefined(candidate.kind) || Is.string(candidate.kind));
16106     }
16107     FoldingRange.is = is;
16108 })(FoldingRange || (FoldingRange = {}));
16109 /**
16110  * The DiagnosticRelatedInformation namespace provides helper functions to work with
16111  * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.
16112  */
16113 var DiagnosticRelatedInformation;
16114 (function (DiagnosticRelatedInformation) {
16115     /**
16116      * Creates a new DiagnosticRelatedInformation literal.
16117      */
16118     function create(location, message) {
16119         return {
16120             location: location,
16121             message: message
16122         };
16123     }
16124     DiagnosticRelatedInformation.create = create;
16125     /**
16126      * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.
16127      */
16128     function is(value) {
16129         var candidate = value;
16130         return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);
16131     }
16132     DiagnosticRelatedInformation.is = is;
16133 })(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));
16134 /**
16135  * The diagnostic's severity.
16136  */
16137 var DiagnosticSeverity;
16138 (function (DiagnosticSeverity) {
16139     /**
16140      * Reports an error.
16141      */
16142     DiagnosticSeverity.Error = 1;
16143     /**
16144      * Reports a warning.
16145      */
16146     DiagnosticSeverity.Warning = 2;
16147     /**
16148      * Reports an information.
16149      */
16150     DiagnosticSeverity.Information = 3;
16151     /**
16152      * Reports a hint.
16153      */
16154     DiagnosticSeverity.Hint = 4;
16155 })(DiagnosticSeverity || (DiagnosticSeverity = {}));
16156 /**
16157  * The diagnostic tags.
16158  *
16159  * @since 3.15.0
16160  */
16161 var DiagnosticTag;
16162 (function (DiagnosticTag) {
16163     /**
16164      * Unused or unnecessary code.
16165      *
16166      * Clients are allowed to render diagnostics with this tag faded out instead of having
16167      * an error squiggle.
16168      */
16169     DiagnosticTag.Unnecessary = 1;
16170     /**
16171      * Deprecated or obsolete code.
16172      *
16173      * Clients are allowed to rendered diagnostics with this tag strike through.
16174      */
16175     DiagnosticTag.Deprecated = 2;
16176 })(DiagnosticTag || (DiagnosticTag = {}));
16177 /**
16178  * The DiagnosticCode namespace provides functions to deal with complex diagnostic codes.
16179  *
16180  * @since 3.16.0 - Proposed state
16181  */
16182 var DiagnosticCode;
16183 (function (DiagnosticCode) {
16184     /**
16185      * Checks whether the given liternal conforms to the [DiagnosticCode](#DiagnosticCode) interface.
16186      */
16187     function is(value) {
16188         var candidate = value;
16189         return candidate !== undefined && candidate !== null && (Is.number(candidate.value) || Is.string(candidate.value)) && Is.string(candidate.target);
16190     }
16191     DiagnosticCode.is = is;
16192 })(DiagnosticCode || (DiagnosticCode = {}));
16193 /**
16194  * The Diagnostic namespace provides helper functions to work with
16195  * [Diagnostic](#Diagnostic) literals.
16196  */
16197 var Diagnostic;
16198 (function (Diagnostic) {
16199     /**
16200      * Creates a new Diagnostic literal.
16201      */
16202     function create(range, message, severity, code, source, relatedInformation) {
16203         var result = { range: range, message: message };
16204         if (Is.defined(severity)) {
16205             result.severity = severity;
16206         }
16207         if (Is.defined(code)) {
16208             result.code = code;
16209         }
16210         if (Is.defined(source)) {
16211             result.source = source;
16212         }
16213         if (Is.defined(relatedInformation)) {
16214             result.relatedInformation = relatedInformation;
16215         }
16216         return result;
16217     }
16218     Diagnostic.create = create;
16219     /**
16220      * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.
16221      */
16222     function is(value) {
16223         var candidate = value;
16224         return Is.defined(candidate)
16225             && Range.is(candidate.range)
16226             && Is.string(candidate.message)
16227             && (Is.number(candidate.severity) || Is.undefined(candidate.severity))
16228             && (Is.number(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))
16229             && (Is.string(candidate.source) || Is.undefined(candidate.source))
16230             && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));
16231     }
16232     Diagnostic.is = is;
16233 })(Diagnostic || (Diagnostic = {}));
16234 /**
16235  * The Command namespace provides helper functions to work with
16236  * [Command](#Command) literals.
16237  */
16238 var Command;
16239 (function (Command) {
16240     /**
16241      * Creates a new Command literal.
16242      */
16243     function create(title, command) {
16244         var args = [];
16245         for (var _i = 2; _i < arguments.length; _i++) {
16246             args[_i - 2] = arguments[_i];
16247         }
16248         var result = { title: title, command: command };
16249         if (Is.defined(args) && args.length > 0) {
16250             result.arguments = args;
16251         }
16252         return result;
16253     }
16254     Command.create = create;
16255     /**
16256      * Checks whether the given literal conforms to the [Command](#Command) interface.
16257      */
16258     function is(value) {
16259         var candidate = value;
16260         return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);
16261     }
16262     Command.is = is;
16263 })(Command || (Command = {}));
16264 /**
16265  * The TextEdit namespace provides helper function to create replace,
16266  * insert and delete edits more easily.
16267  */
16268 var TextEdit;
16269 (function (TextEdit) {
16270     /**
16271      * Creates a replace text edit.
16272      * @param range The range of text to be replaced.
16273      * @param newText The new text.
16274      */
16275     function replace(range, newText) {
16276         return { range: range, newText: newText };
16277     }
16278     TextEdit.replace = replace;
16279     /**
16280      * Creates a insert text edit.
16281      * @param position The position to insert the text at.
16282      * @param newText The text to be inserted.
16283      */
16284     function insert(position, newText) {
16285         return { range: { start: position, end: position }, newText: newText };
16286     }
16287     TextEdit.insert = insert;
16288     /**
16289      * Creates a delete text edit.
16290      * @param range The range of text to be deleted.
16291      */
16292     function del(range) {
16293         return { range: range, newText: '' };
16294     }
16295     TextEdit.del = del;
16296     function is(value) {
16297         var candidate = value;
16298         return Is.objectLiteral(candidate)
16299             && Is.string(candidate.newText)
16300             && Range.is(candidate.range);
16301     }
16302     TextEdit.is = is;
16303 })(TextEdit || (TextEdit = {}));
16304 /**
16305  * The TextDocumentEdit namespace provides helper function to create
16306  * an edit that manipulates a text document.
16307  */
16308 var TextDocumentEdit;
16309 (function (TextDocumentEdit) {
16310     /**
16311      * Creates a new `TextDocumentEdit`
16312      */
16313     function create(textDocument, edits) {
16314         return { textDocument: textDocument, edits: edits };
16315     }
16316     TextDocumentEdit.create = create;
16317     function is(value) {
16318         var candidate = value;
16319         return Is.defined(candidate)
16320             && VersionedTextDocumentIdentifier.is(candidate.textDocument)
16321             && Array.isArray(candidate.edits);
16322     }
16323     TextDocumentEdit.is = is;
16324 })(TextDocumentEdit || (TextDocumentEdit = {}));
16325 var CreateFile;
16326 (function (CreateFile) {
16327     function create(uri, options) {
16328         var result = {
16329             kind: 'create',
16330             uri: uri
16331         };
16332         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
16333             result.options = options;
16334         }
16335         return result;
16336     }
16337     CreateFile.create = create;
16338     function is(value) {
16339         var candidate = value;
16340         return candidate && candidate.kind === 'create' && Is.string(candidate.uri) &&
16341             (candidate.options === void 0 ||
16342                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
16343     }
16344     CreateFile.is = is;
16345 })(CreateFile || (CreateFile = {}));
16346 var RenameFile;
16347 (function (RenameFile) {
16348     function create(oldUri, newUri, options) {
16349         var result = {
16350             kind: 'rename',
16351             oldUri: oldUri,
16352             newUri: newUri
16353         };
16354         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
16355             result.options = options;
16356         }
16357         return result;
16358     }
16359     RenameFile.create = create;
16360     function is(value) {
16361         var candidate = value;
16362         return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) &&
16363             (candidate.options === void 0 ||
16364                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
16365     }
16366     RenameFile.is = is;
16367 })(RenameFile || (RenameFile = {}));
16368 var DeleteFile;
16369 (function (DeleteFile) {
16370     function create(uri, options) {
16371         var result = {
16372             kind: 'delete',
16373             uri: uri
16374         };
16375         if (options !== void 0 && (options.recursive !== void 0 || options.ignoreIfNotExists !== void 0)) {
16376             result.options = options;
16377         }
16378         return result;
16379     }
16380     DeleteFile.create = create;
16381     function is(value) {
16382         var candidate = value;
16383         return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) &&
16384             (candidate.options === void 0 ||
16385                 ((candidate.options.recursive === void 0 || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === void 0 || Is.boolean(candidate.options.ignoreIfNotExists))));
16386     }
16387     DeleteFile.is = is;
16388 })(DeleteFile || (DeleteFile = {}));
16389 var WorkspaceEdit;
16390 (function (WorkspaceEdit) {
16391     function is(value) {
16392         var candidate = value;
16393         return candidate &&
16394             (candidate.changes !== void 0 || candidate.documentChanges !== void 0) &&
16395             (candidate.documentChanges === void 0 || candidate.documentChanges.every(function (change) {
16396                 if (Is.string(change.kind)) {
16397                     return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);
16398                 }
16399                 else {
16400                     return TextDocumentEdit.is(change);
16401                 }
16402             }));
16403     }
16404     WorkspaceEdit.is = is;
16405 })(WorkspaceEdit || (WorkspaceEdit = {}));
16406 var TextEditChangeImpl = /** @class */ (function () {
16407     function TextEditChangeImpl(edits) {
16408         this.edits = edits;
16409     }
16410     TextEditChangeImpl.prototype.insert = function (position, newText) {
16411         this.edits.push(TextEdit.insert(position, newText));
16412     };
16413     TextEditChangeImpl.prototype.replace = function (range, newText) {
16414         this.edits.push(TextEdit.replace(range, newText));
16415     };
16416     TextEditChangeImpl.prototype.delete = function (range) {
16417         this.edits.push(TextEdit.del(range));
16418     };
16419     TextEditChangeImpl.prototype.add = function (edit) {
16420         this.edits.push(edit);
16421     };
16422     TextEditChangeImpl.prototype.all = function () {
16423         return this.edits;
16424     };
16425     TextEditChangeImpl.prototype.clear = function () {
16426         this.edits.splice(0, this.edits.length);
16427     };
16428     return TextEditChangeImpl;
16429 }());
16430 /**
16431  * A workspace change helps constructing changes to a workspace.
16432  */
16433 var WorkspaceChange = /** @class */ (function () {
16434     function WorkspaceChange(workspaceEdit) {
16435         var _this = this;
16436         this._textEditChanges = Object.create(null);
16437         if (workspaceEdit) {
16438             this._workspaceEdit = workspaceEdit;
16439             if (workspaceEdit.documentChanges) {
16440                 workspaceEdit.documentChanges.forEach(function (change) {
16441                     if (TextDocumentEdit.is(change)) {
16442                         var textEditChange = new TextEditChangeImpl(change.edits);
16443                         _this._textEditChanges[change.textDocument.uri] = textEditChange;
16444                     }
16445                 });
16446             }
16447             else if (workspaceEdit.changes) {
16448                 Object.keys(workspaceEdit.changes).forEach(function (key) {
16449                     var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);
16450                     _this._textEditChanges[key] = textEditChange;
16451                 });
16452             }
16453         }
16454     }
16455     Object.defineProperty(WorkspaceChange.prototype, "edit", {
16456         /**
16457          * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal
16458          * use to be returned from a workspace edit operation like rename.
16459          */
16460         get: function () {
16461             if (this._workspaceEdit === undefined) {
16462                 return { documentChanges: [] };
16463             }
16464             return this._workspaceEdit;
16465         },
16466         enumerable: true,
16467         configurable: true
16468     });
16469     WorkspaceChange.prototype.getTextEditChange = function (key) {
16470         if (VersionedTextDocumentIdentifier.is(key)) {
16471             if (!this._workspaceEdit) {
16472                 this._workspaceEdit = {
16473                     documentChanges: []
16474                 };
16475             }
16476             if (!this._workspaceEdit.documentChanges) {
16477                 throw new Error('Workspace edit is not configured for document changes.');
16478             }
16479             var textDocument = key;
16480             var result = this._textEditChanges[textDocument.uri];
16481             if (!result) {
16482                 var edits = [];
16483                 var textDocumentEdit = {
16484                     textDocument: textDocument,
16485                     edits: edits
16486                 };
16487                 this._workspaceEdit.documentChanges.push(textDocumentEdit);
16488                 result = new TextEditChangeImpl(edits);
16489                 this._textEditChanges[textDocument.uri] = result;
16490             }
16491             return result;
16492         }
16493         else {
16494             if (!this._workspaceEdit) {
16495                 this._workspaceEdit = {
16496                     changes: Object.create(null)
16497                 };
16498             }
16499             if (!this._workspaceEdit.changes) {
16500                 throw new Error('Workspace edit is not configured for normal text edit changes.');
16501             }
16502             var result = this._textEditChanges[key];
16503             if (!result) {
16504                 var edits = [];
16505                 this._workspaceEdit.changes[key] = edits;
16506                 result = new TextEditChangeImpl(edits);
16507                 this._textEditChanges[key] = result;
16508             }
16509             return result;
16510         }
16511     };
16512     WorkspaceChange.prototype.createFile = function (uri, options) {
16513         this.checkDocumentChanges();
16514         this._workspaceEdit.documentChanges.push(CreateFile.create(uri, options));
16515     };
16516     WorkspaceChange.prototype.renameFile = function (oldUri, newUri, options) {
16517         this.checkDocumentChanges();
16518         this._workspaceEdit.documentChanges.push(RenameFile.create(oldUri, newUri, options));
16519     };
16520     WorkspaceChange.prototype.deleteFile = function (uri, options) {
16521         this.checkDocumentChanges();
16522         this._workspaceEdit.documentChanges.push(DeleteFile.create(uri, options));
16523     };
16524     WorkspaceChange.prototype.checkDocumentChanges = function () {
16525         if (!this._workspaceEdit || !this._workspaceEdit.documentChanges) {
16526             throw new Error('Workspace edit is not configured for document changes.');
16527         }
16528     };
16529     return WorkspaceChange;
16530 }());
16531
16532 /**
16533  * The TextDocumentIdentifier namespace provides helper functions to work with
16534  * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.
16535  */
16536 var TextDocumentIdentifier;
16537 (function (TextDocumentIdentifier) {
16538     /**
16539      * Creates a new TextDocumentIdentifier literal.
16540      * @param uri The document's uri.
16541      */
16542     function create(uri) {
16543         return { uri: uri };
16544     }
16545     TextDocumentIdentifier.create = create;
16546     /**
16547      * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.
16548      */
16549     function is(value) {
16550         var candidate = value;
16551         return Is.defined(candidate) && Is.string(candidate.uri);
16552     }
16553     TextDocumentIdentifier.is = is;
16554 })(TextDocumentIdentifier || (TextDocumentIdentifier = {}));
16555 /**
16556  * The VersionedTextDocumentIdentifier namespace provides helper functions to work with
16557  * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.
16558  */
16559 var VersionedTextDocumentIdentifier;
16560 (function (VersionedTextDocumentIdentifier) {
16561     /**
16562      * Creates a new VersionedTextDocumentIdentifier literal.
16563      * @param uri The document's uri.
16564      * @param uri The document's text.
16565      */
16566     function create(uri, version) {
16567         return { uri: uri, version: version };
16568     }
16569     VersionedTextDocumentIdentifier.create = create;
16570     /**
16571      * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.
16572      */
16573     function is(value) {
16574         var candidate = value;
16575         return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.number(candidate.version));
16576     }
16577     VersionedTextDocumentIdentifier.is = is;
16578 })(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));
16579 /**
16580  * The TextDocumentItem namespace provides helper functions to work with
16581  * [TextDocumentItem](#TextDocumentItem) literals.
16582  */
16583 var TextDocumentItem;
16584 (function (TextDocumentItem) {
16585     /**
16586      * Creates a new TextDocumentItem literal.
16587      * @param uri The document's uri.
16588      * @param languageId The document's language identifier.
16589      * @param version The document's version number.
16590      * @param text The document's text.
16591      */
16592     function create(uri, languageId, version, text) {
16593         return { uri: uri, languageId: languageId, version: version, text: text };
16594     }
16595     TextDocumentItem.create = create;
16596     /**
16597      * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.
16598      */
16599     function is(value) {
16600         var candidate = value;
16601         return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.number(candidate.version) && Is.string(candidate.text);
16602     }
16603     TextDocumentItem.is = is;
16604 })(TextDocumentItem || (TextDocumentItem = {}));
16605 /**
16606  * Describes the content type that a client supports in various
16607  * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
16608  *
16609  * Please note that `MarkupKinds` must not start with a `$`. This kinds
16610  * are reserved for internal usage.
16611  */
16612 var MarkupKind;
16613 (function (MarkupKind) {
16614     /**
16615      * Plain text is supported as a content format
16616      */
16617     MarkupKind.PlainText = 'plaintext';
16618     /**
16619      * Markdown is supported as a content format
16620      */
16621     MarkupKind.Markdown = 'markdown';
16622 })(MarkupKind || (MarkupKind = {}));
16623 (function (MarkupKind) {
16624     /**
16625      * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.
16626      */
16627     function is(value) {
16628         var candidate = value;
16629         return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;
16630     }
16631     MarkupKind.is = is;
16632 })(MarkupKind || (MarkupKind = {}));
16633 var MarkupContent;
16634 (function (MarkupContent) {
16635     /**
16636      * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.
16637      */
16638     function is(value) {
16639         var candidate = value;
16640         return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);
16641     }
16642     MarkupContent.is = is;
16643 })(MarkupContent || (MarkupContent = {}));
16644 /**
16645  * The kind of a completion entry.
16646  */
16647 var CompletionItemKind;
16648 (function (CompletionItemKind) {
16649     CompletionItemKind.Text = 1;
16650     CompletionItemKind.Method = 2;
16651     CompletionItemKind.Function = 3;
16652     CompletionItemKind.Constructor = 4;
16653     CompletionItemKind.Field = 5;
16654     CompletionItemKind.Variable = 6;
16655     CompletionItemKind.Class = 7;
16656     CompletionItemKind.Interface = 8;
16657     CompletionItemKind.Module = 9;
16658     CompletionItemKind.Property = 10;
16659     CompletionItemKind.Unit = 11;
16660     CompletionItemKind.Value = 12;
16661     CompletionItemKind.Enum = 13;
16662     CompletionItemKind.Keyword = 14;
16663     CompletionItemKind.Snippet = 15;
16664     CompletionItemKind.Color = 16;
16665     CompletionItemKind.File = 17;
16666     CompletionItemKind.Reference = 18;
16667     CompletionItemKind.Folder = 19;
16668     CompletionItemKind.EnumMember = 20;
16669     CompletionItemKind.Constant = 21;
16670     CompletionItemKind.Struct = 22;
16671     CompletionItemKind.Event = 23;
16672     CompletionItemKind.Operator = 24;
16673     CompletionItemKind.TypeParameter = 25;
16674 })(CompletionItemKind || (CompletionItemKind = {}));
16675 /**
16676  * Defines whether the insert text in a completion item should be interpreted as
16677  * plain text or a snippet.
16678  */
16679 var InsertTextFormat;
16680 (function (InsertTextFormat) {
16681     /**
16682      * The primary text to be inserted is treated as a plain string.
16683      */
16684     InsertTextFormat.PlainText = 1;
16685     /**
16686      * The primary text to be inserted is treated as a snippet.
16687      *
16688      * A snippet can define tab stops and placeholders with `$1`, `$2`
16689      * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
16690      * the end of the snippet. Placeholders with equal identifiers are linked,
16691      * that is typing in one will update others too.
16692      *
16693      * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax
16694      */
16695     InsertTextFormat.Snippet = 2;
16696 })(InsertTextFormat || (InsertTextFormat = {}));
16697 /**
16698  * Completion item tags are extra annotations that tweak the rendering of a completion
16699  * item.
16700  *
16701  * @since 3.15.0
16702  */
16703 var CompletionItemTag;
16704 (function (CompletionItemTag) {
16705     /**
16706      * Render a completion as obsolete, usually using a strike-out.
16707      */
16708     CompletionItemTag.Deprecated = 1;
16709 })(CompletionItemTag || (CompletionItemTag = {}));
16710 /**
16711  * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.
16712  *
16713  * @since 3.16.0 - Proposed state
16714  */
16715 var InsertReplaceEdit;
16716 (function (InsertReplaceEdit) {
16717     /**
16718      * Creates a new insert / replace edit
16719      */
16720     function create(newText, insert, replace) {
16721         return { newText: newText, insert: insert, replace: replace };
16722     }
16723     InsertReplaceEdit.create = create;
16724     /**
16725      * Checks whether the given liternal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.
16726      */
16727     function is(value) {
16728         var candidate = value;
16729         return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);
16730     }
16731     InsertReplaceEdit.is = is;
16732 })(InsertReplaceEdit || (InsertReplaceEdit = {}));
16733 /**
16734  * The CompletionItem namespace provides functions to deal with
16735  * completion items.
16736  */
16737 var CompletionItem;
16738 (function (CompletionItem) {
16739     /**
16740      * Create a completion item and seed it with a label.
16741      * @param label The completion item's label
16742      */
16743     function create(label) {
16744         return { label: label };
16745     }
16746     CompletionItem.create = create;
16747 })(CompletionItem || (CompletionItem = {}));
16748 /**
16749  * The CompletionList namespace provides functions to deal with
16750  * completion lists.
16751  */
16752 var CompletionList;
16753 (function (CompletionList) {
16754     /**
16755      * Creates a new completion list.
16756      *
16757      * @param items The completion items.
16758      * @param isIncomplete The list is not complete.
16759      */
16760     function create(items, isIncomplete) {
16761         return { items: items ? items : [], isIncomplete: !!isIncomplete };
16762     }
16763     CompletionList.create = create;
16764 })(CompletionList || (CompletionList = {}));
16765 var MarkedString;
16766 (function (MarkedString) {
16767     /**
16768      * Creates a marked string from plain text.
16769      *
16770      * @param plainText The plain text.
16771      */
16772     function fromPlainText(plainText) {
16773         return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
16774     }
16775     MarkedString.fromPlainText = fromPlainText;
16776     /**
16777      * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.
16778      */
16779     function is(value) {
16780         var candidate = value;
16781         return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));
16782     }
16783     MarkedString.is = is;
16784 })(MarkedString || (MarkedString = {}));
16785 var Hover;
16786 (function (Hover) {
16787     /**
16788      * Checks whether the given value conforms to the [Hover](#Hover) interface.
16789      */
16790     function is(value) {
16791         var candidate = value;
16792         return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||
16793             MarkedString.is(candidate.contents) ||
16794             Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === void 0 || Range.is(value.range));
16795     }
16796     Hover.is = is;
16797 })(Hover || (Hover = {}));
16798 /**
16799  * The ParameterInformation namespace provides helper functions to work with
16800  * [ParameterInformation](#ParameterInformation) literals.
16801  */
16802 var ParameterInformation;
16803 (function (ParameterInformation) {
16804     /**
16805      * Creates a new parameter information literal.
16806      *
16807      * @param label A label string.
16808      * @param documentation A doc string.
16809      */
16810     function create(label, documentation) {
16811         return documentation ? { label: label, documentation: documentation } : { label: label };
16812     }
16813     ParameterInformation.create = create;
16814 })(ParameterInformation || (ParameterInformation = {}));
16815 /**
16816  * The SignatureInformation namespace provides helper functions to work with
16817  * [SignatureInformation](#SignatureInformation) literals.
16818  */
16819 var SignatureInformation;
16820 (function (SignatureInformation) {
16821     function create(label, documentation) {
16822         var parameters = [];
16823         for (var _i = 2; _i < arguments.length; _i++) {
16824             parameters[_i - 2] = arguments[_i];
16825         }
16826         var result = { label: label };
16827         if (Is.defined(documentation)) {
16828             result.documentation = documentation;
16829         }
16830         if (Is.defined(parameters)) {
16831             result.parameters = parameters;
16832         }
16833         else {
16834             result.parameters = [];
16835         }
16836         return result;
16837     }
16838     SignatureInformation.create = create;
16839 })(SignatureInformation || (SignatureInformation = {}));
16840 /**
16841  * A document highlight kind.
16842  */
16843 var DocumentHighlightKind;
16844 (function (DocumentHighlightKind) {
16845     /**
16846      * A textual occurrence.
16847      */
16848     DocumentHighlightKind.Text = 1;
16849     /**
16850      * Read-access of a symbol, like reading a variable.
16851      */
16852     DocumentHighlightKind.Read = 2;
16853     /**
16854      * Write-access of a symbol, like writing to a variable.
16855      */
16856     DocumentHighlightKind.Write = 3;
16857 })(DocumentHighlightKind || (DocumentHighlightKind = {}));
16858 /**
16859  * DocumentHighlight namespace to provide helper functions to work with
16860  * [DocumentHighlight](#DocumentHighlight) literals.
16861  */
16862 var DocumentHighlight;
16863 (function (DocumentHighlight) {
16864     /**
16865      * Create a DocumentHighlight object.
16866      * @param range The range the highlight applies to.
16867      */
16868     function create(range, kind) {
16869         var result = { range: range };
16870         if (Is.number(kind)) {
16871             result.kind = kind;
16872         }
16873         return result;
16874     }
16875     DocumentHighlight.create = create;
16876 })(DocumentHighlight || (DocumentHighlight = {}));
16877 /**
16878  * A symbol kind.
16879  */
16880 var SymbolKind;
16881 (function (SymbolKind) {
16882     SymbolKind.File = 1;
16883     SymbolKind.Module = 2;
16884     SymbolKind.Namespace = 3;
16885     SymbolKind.Package = 4;
16886     SymbolKind.Class = 5;
16887     SymbolKind.Method = 6;
16888     SymbolKind.Property = 7;
16889     SymbolKind.Field = 8;
16890     SymbolKind.Constructor = 9;
16891     SymbolKind.Enum = 10;
16892     SymbolKind.Interface = 11;
16893     SymbolKind.Function = 12;
16894     SymbolKind.Variable = 13;
16895     SymbolKind.Constant = 14;
16896     SymbolKind.String = 15;
16897     SymbolKind.Number = 16;
16898     SymbolKind.Boolean = 17;
16899     SymbolKind.Array = 18;
16900     SymbolKind.Object = 19;
16901     SymbolKind.Key = 20;
16902     SymbolKind.Null = 21;
16903     SymbolKind.EnumMember = 22;
16904     SymbolKind.Struct = 23;
16905     SymbolKind.Event = 24;
16906     SymbolKind.Operator = 25;
16907     SymbolKind.TypeParameter = 26;
16908 })(SymbolKind || (SymbolKind = {}));
16909 /**
16910  * Symbol tags are extra annotations that tweak the rendering of a symbol.
16911  * @since 3.15
16912  */
16913 var SymbolTag;
16914 (function (SymbolTag) {
16915     /**
16916      * Render a symbol as obsolete, usually using a strike-out.
16917      */
16918     SymbolTag.Deprecated = 1;
16919 })(SymbolTag || (SymbolTag = {}));
16920 var SymbolInformation;
16921 (function (SymbolInformation) {
16922     /**
16923      * Creates a new symbol information literal.
16924      *
16925      * @param name The name of the symbol.
16926      * @param kind The kind of the symbol.
16927      * @param range The range of the location of the symbol.
16928      * @param uri The resource of the location of symbol, defaults to the current document.
16929      * @param containerName The name of the symbol containing the symbol.
16930      */
16931     function create(name, kind, range, uri, containerName) {
16932         var result = {
16933             name: name,
16934             kind: kind,
16935             location: { uri: uri, range: range }
16936         };
16937         if (containerName) {
16938             result.containerName = containerName;
16939         }
16940         return result;
16941     }
16942     SymbolInformation.create = create;
16943 })(SymbolInformation || (SymbolInformation = {}));
16944 var DocumentSymbol;
16945 (function (DocumentSymbol) {
16946     /**
16947      * Creates a new symbol information literal.
16948      *
16949      * @param name The name of the symbol.
16950      * @param detail The detail of the symbol.
16951      * @param kind The kind of the symbol.
16952      * @param range The range of the symbol.
16953      * @param selectionRange The selectionRange of the symbol.
16954      * @param children Children of the symbol.
16955      */
16956     function create(name, detail, kind, range, selectionRange, children) {
16957         var result = {
16958             name: name,
16959             detail: detail,
16960             kind: kind,
16961             range: range,
16962             selectionRange: selectionRange
16963         };
16964         if (children !== void 0) {
16965             result.children = children;
16966         }
16967         return result;
16968     }
16969     DocumentSymbol.create = create;
16970     /**
16971      * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.
16972      */
16973     function is(value) {
16974         var candidate = value;
16975         return candidate &&
16976             Is.string(candidate.name) && Is.number(candidate.kind) &&
16977             Range.is(candidate.range) && Range.is(candidate.selectionRange) &&
16978             (candidate.detail === void 0 || Is.string(candidate.detail)) &&
16979             (candidate.deprecated === void 0 || Is.boolean(candidate.deprecated)) &&
16980             (candidate.children === void 0 || Array.isArray(candidate.children)) &&
16981             (candidate.tags === void 0 || Array.isArray(candidate.tags));
16982     }
16983     DocumentSymbol.is = is;
16984 })(DocumentSymbol || (DocumentSymbol = {}));
16985 /**
16986  * A set of predefined code action kinds
16987  */
16988 var CodeActionKind;
16989 (function (CodeActionKind) {
16990     /**
16991      * Empty kind.
16992      */
16993     CodeActionKind.Empty = '';
16994     /**
16995      * Base kind for quickfix actions: 'quickfix'
16996      */
16997     CodeActionKind.QuickFix = 'quickfix';
16998     /**
16999      * Base kind for refactoring actions: 'refactor'
17000      */
17001     CodeActionKind.Refactor = 'refactor';
17002     /**
17003      * Base kind for refactoring extraction actions: 'refactor.extract'
17004      *
17005      * Example extract actions:
17006      *
17007      * - Extract method
17008      * - Extract function
17009      * - Extract variable
17010      * - Extract interface from class
17011      * - ...
17012      */
17013     CodeActionKind.RefactorExtract = 'refactor.extract';
17014     /**
17015      * Base kind for refactoring inline actions: 'refactor.inline'
17016      *
17017      * Example inline actions:
17018      *
17019      * - Inline function
17020      * - Inline variable
17021      * - Inline constant
17022      * - ...
17023      */
17024     CodeActionKind.RefactorInline = 'refactor.inline';
17025     /**
17026      * Base kind for refactoring rewrite actions: 'refactor.rewrite'
17027      *
17028      * Example rewrite actions:
17029      *
17030      * - Convert JavaScript function to class
17031      * - Add or remove parameter
17032      * - Encapsulate field
17033      * - Make method static
17034      * - Move method to base class
17035      * - ...
17036      */
17037     CodeActionKind.RefactorRewrite = 'refactor.rewrite';
17038     /**
17039      * Base kind for source actions: `source`
17040      *
17041      * Source code actions apply to the entire file.
17042      */
17043     CodeActionKind.Source = 'source';
17044     /**
17045      * Base kind for an organize imports source action: `source.organizeImports`
17046      */
17047     CodeActionKind.SourceOrganizeImports = 'source.organizeImports';
17048     /**
17049      * Base kind for auto-fix source actions: `source.fixAll`.
17050      *
17051      * Fix all actions automatically fix errors that have a clear fix that do not require user input.
17052      * They should not suppress errors or perform unsafe fixes such as generating new types or classes.
17053      *
17054      * @since 3.15.0
17055      */
17056     CodeActionKind.SourceFixAll = 'source.fixAll';
17057 })(CodeActionKind || (CodeActionKind = {}));
17058 /**
17059  * The CodeActionContext namespace provides helper functions to work with
17060  * [CodeActionContext](#CodeActionContext) literals.
17061  */
17062 var CodeActionContext;
17063 (function (CodeActionContext) {
17064     /**
17065      * Creates a new CodeActionContext literal.
17066      */
17067     function create(diagnostics, only) {
17068         var result = { diagnostics: diagnostics };
17069         if (only !== void 0 && only !== null) {
17070             result.only = only;
17071         }
17072         return result;
17073     }
17074     CodeActionContext.create = create;
17075     /**
17076      * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.
17077      */
17078     function is(value) {
17079         var candidate = value;
17080         return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === void 0 || Is.typedArray(candidate.only, Is.string));
17081     }
17082     CodeActionContext.is = is;
17083 })(CodeActionContext || (CodeActionContext = {}));
17084 var CodeAction;
17085 (function (CodeAction) {
17086     function create(title, commandOrEdit, kind) {
17087         var result = { title: title };
17088         if (Command.is(commandOrEdit)) {
17089             result.command = commandOrEdit;
17090         }
17091         else {
17092             result.edit = commandOrEdit;
17093         }
17094         if (kind !== void 0) {
17095             result.kind = kind;
17096         }
17097         return result;
17098     }
17099     CodeAction.create = create;
17100     function is(value) {
17101         var candidate = value;
17102         return candidate && Is.string(candidate.title) &&
17103             (candidate.diagnostics === void 0 || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&
17104             (candidate.kind === void 0 || Is.string(candidate.kind)) &&
17105             (candidate.edit !== void 0 || candidate.command !== void 0) &&
17106             (candidate.command === void 0 || Command.is(candidate.command)) &&
17107             (candidate.isPreferred === void 0 || Is.boolean(candidate.isPreferred)) &&
17108             (candidate.edit === void 0 || WorkspaceEdit.is(candidate.edit));
17109     }
17110     CodeAction.is = is;
17111 })(CodeAction || (CodeAction = {}));
17112 /**
17113  * The CodeLens namespace provides helper functions to work with
17114  * [CodeLens](#CodeLens) literals.
17115  */
17116 var CodeLens;
17117 (function (CodeLens) {
17118     /**
17119      * Creates a new CodeLens literal.
17120      */
17121     function create(range, data) {
17122         var result = { range: range };
17123         if (Is.defined(data)) {
17124             result.data = data;
17125         }
17126         return result;
17127     }
17128     CodeLens.create = create;
17129     /**
17130      * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.
17131      */
17132     function is(value) {
17133         var candidate = value;
17134         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));
17135     }
17136     CodeLens.is = is;
17137 })(CodeLens || (CodeLens = {}));
17138 /**
17139  * The FormattingOptions namespace provides helper functions to work with
17140  * [FormattingOptions](#FormattingOptions) literals.
17141  */
17142 var FormattingOptions;
17143 (function (FormattingOptions) {
17144     /**
17145      * Creates a new FormattingOptions literal.
17146      */
17147     function create(tabSize, insertSpaces) {
17148         return { tabSize: tabSize, insertSpaces: insertSpaces };
17149     }
17150     FormattingOptions.create = create;
17151     /**
17152      * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.
17153      */
17154     function is(value) {
17155         var candidate = value;
17156         return Is.defined(candidate) && Is.number(candidate.tabSize) && Is.boolean(candidate.insertSpaces);
17157     }
17158     FormattingOptions.is = is;
17159 })(FormattingOptions || (FormattingOptions = {}));
17160 /**
17161  * The DocumentLink namespace provides helper functions to work with
17162  * [DocumentLink](#DocumentLink) literals.
17163  */
17164 var DocumentLink;
17165 (function (DocumentLink) {
17166     /**
17167      * Creates a new DocumentLink literal.
17168      */
17169     function create(range, target, data) {
17170         return { range: range, target: target, data: data };
17171     }
17172     DocumentLink.create = create;
17173     /**
17174      * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.
17175      */
17176     function is(value) {
17177         var candidate = value;
17178         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));
17179     }
17180     DocumentLink.is = is;
17181 })(DocumentLink || (DocumentLink = {}));
17182 /**
17183  * The SelectionRange namespace provides helper function to work with
17184  * SelectionRange literals.
17185  */
17186 var SelectionRange;
17187 (function (SelectionRange) {
17188     /**
17189      * Creates a new SelectionRange
17190      * @param range the range.
17191      * @param parent an optional parent.
17192      */
17193     function create(range, parent) {
17194         return { range: range, parent: parent };
17195     }
17196     SelectionRange.create = create;
17197     function is(value) {
17198         var candidate = value;
17199         return candidate !== undefined && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));
17200     }
17201     SelectionRange.is = is;
17202 })(SelectionRange || (SelectionRange = {}));
17203 var EOL = ['\n', '\r\n', '\r'];
17204 /**
17205  * @deprecated Use the text document from the new vscode-languageserver-textdocument package.
17206  */
17207 var TextDocument;
17208 (function (TextDocument) {
17209     /**
17210      * Creates a new ITextDocument literal from the given uri and content.
17211      * @param uri The document's uri.
17212      * @param languageId  The document's language Id.
17213      * @param content The document's content.
17214      */
17215     function create(uri, languageId, version, content) {
17216         return new FullTextDocument(uri, languageId, version, content);
17217     }
17218     TextDocument.create = create;
17219     /**
17220      * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.
17221      */
17222     function is(value) {
17223         var candidate = value;
17224         return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.number(candidate.lineCount)
17225             && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;
17226     }
17227     TextDocument.is = is;
17228     function applyEdits(document, edits) {
17229         var text = document.getText();
17230         var sortedEdits = mergeSort(edits, function (a, b) {
17231             var diff = a.range.start.line - b.range.start.line;
17232             if (diff === 0) {
17233                 return a.range.start.character - b.range.start.character;
17234             }
17235             return diff;
17236         });
17237         var lastModifiedOffset = text.length;
17238         for (var i = sortedEdits.length - 1; i >= 0; i--) {
17239             var e = sortedEdits[i];
17240             var startOffset = document.offsetAt(e.range.start);
17241             var endOffset = document.offsetAt(e.range.end);
17242             if (endOffset <= lastModifiedOffset) {
17243                 text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);
17244             }
17245             else {
17246                 throw new Error('Overlapping edit');
17247             }
17248             lastModifiedOffset = startOffset;
17249         }
17250         return text;
17251     }
17252     TextDocument.applyEdits = applyEdits;
17253     function mergeSort(data, compare) {
17254         if (data.length <= 1) {
17255             // sorted
17256             return data;
17257         }
17258         var p = (data.length / 2) | 0;
17259         var left = data.slice(0, p);
17260         var right = data.slice(p);
17261         mergeSort(left, compare);
17262         mergeSort(right, compare);
17263         var leftIdx = 0;
17264         var rightIdx = 0;
17265         var i = 0;
17266         while (leftIdx < left.length && rightIdx < right.length) {
17267             var ret = compare(left[leftIdx], right[rightIdx]);
17268             if (ret <= 0) {
17269                 // smaller_equal -> take left to preserve order
17270                 data[i++] = left[leftIdx++];
17271             }
17272             else {
17273                 // greater -> take right
17274                 data[i++] = right[rightIdx++];
17275             }
17276         }
17277         while (leftIdx < left.length) {
17278             data[i++] = left[leftIdx++];
17279         }
17280         while (rightIdx < right.length) {
17281             data[i++] = right[rightIdx++];
17282         }
17283         return data;
17284     }
17285 })(TextDocument || (TextDocument = {}));
17286 var FullTextDocument = /** @class */ (function () {
17287     function FullTextDocument(uri, languageId, version, content) {
17288         this._uri = uri;
17289         this._languageId = languageId;
17290         this._version = version;
17291         this._content = content;
17292         this._lineOffsets = undefined;
17293     }
17294     Object.defineProperty(FullTextDocument.prototype, "uri", {
17295         get: function () {
17296             return this._uri;
17297         },
17298         enumerable: true,
17299         configurable: true
17300     });
17301     Object.defineProperty(FullTextDocument.prototype, "languageId", {
17302         get: function () {
17303             return this._languageId;
17304         },
17305         enumerable: true,
17306         configurable: true
17307     });
17308     Object.defineProperty(FullTextDocument.prototype, "version", {
17309         get: function () {
17310             return this._version;
17311         },
17312         enumerable: true,
17313         configurable: true
17314     });
17315     FullTextDocument.prototype.getText = function (range) {
17316         if (range) {
17317             var start = this.offsetAt(range.start);
17318             var end = this.offsetAt(range.end);
17319             return this._content.substring(start, end);
17320         }
17321         return this._content;
17322     };
17323     FullTextDocument.prototype.update = function (event, version) {
17324         this._content = event.text;
17325         this._version = version;
17326         this._lineOffsets = undefined;
17327     };
17328     FullTextDocument.prototype.getLineOffsets = function () {
17329         if (this._lineOffsets === undefined) {
17330             var lineOffsets = [];
17331             var text = this._content;
17332             var isLineStart = true;
17333             for (var i = 0; i < text.length; i++) {
17334                 if (isLineStart) {
17335                     lineOffsets.push(i);
17336                     isLineStart = false;
17337                 }
17338                 var ch = text.charAt(i);
17339                 isLineStart = (ch === '\r' || ch === '\n');
17340                 if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') {
17341                     i++;
17342                 }
17343             }
17344             if (isLineStart && text.length > 0) {
17345                 lineOffsets.push(text.length);
17346             }
17347             this._lineOffsets = lineOffsets;
17348         }
17349         return this._lineOffsets;
17350     };
17351     FullTextDocument.prototype.positionAt = function (offset) {
17352         offset = Math.max(Math.min(offset, this._content.length), 0);
17353         var lineOffsets = this.getLineOffsets();
17354         var low = 0, high = lineOffsets.length;
17355         if (high === 0) {
17356             return Position.create(0, offset);
17357         }
17358         while (low < high) {
17359             var mid = Math.floor((low + high) / 2);
17360             if (lineOffsets[mid] > offset) {
17361                 high = mid;
17362             }
17363             else {
17364                 low = mid + 1;
17365             }
17366         }
17367         // low is the least x for which the line offset is larger than the current offset
17368         // or array.length if no line offset is larger than the current offset
17369         var line = low - 1;
17370         return Position.create(line, offset - lineOffsets[line]);
17371     };
17372     FullTextDocument.prototype.offsetAt = function (position) {
17373         var lineOffsets = this.getLineOffsets();
17374         if (position.line >= lineOffsets.length) {
17375             return this._content.length;
17376         }
17377         else if (position.line < 0) {
17378             return 0;
17379         }
17380         var lineOffset = lineOffsets[position.line];
17381         var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
17382         return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
17383     };
17384     Object.defineProperty(FullTextDocument.prototype, "lineCount", {
17385         get: function () {
17386             return this.getLineOffsets().length;
17387         },
17388         enumerable: true,
17389         configurable: true
17390     });
17391     return FullTextDocument;
17392 }());
17393 var Is;
17394 (function (Is) {
17395     var toString = Object.prototype.toString;
17396     function defined(value) {
17397         return typeof value !== 'undefined';
17398     }
17399     Is.defined = defined;
17400     function undefined(value) {
17401         return typeof value === 'undefined';
17402     }
17403     Is.undefined = undefined;
17404     function boolean(value) {
17405         return value === true || value === false;
17406     }
17407     Is.boolean = boolean;
17408     function string(value) {
17409         return toString.call(value) === '[object String]';
17410     }
17411     Is.string = string;
17412     function number(value) {
17413         return toString.call(value) === '[object Number]';
17414     }
17415     Is.number = number;
17416     function func(value) {
17417         return toString.call(value) === '[object Function]';
17418     }
17419     Is.func = func;
17420     function objectLiteral(value) {
17421         // Strictly speaking class instances pass this check as well. Since the LSP
17422         // doesn't use classes we ignore this for now. If we do we need to add something
17423         // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
17424         return value !== null && typeof value === 'object';
17425     }
17426     Is.objectLiteral = objectLiteral;
17427     function typedArray(value, check) {
17428         return Array.isArray(value) && value.every(check);
17429     }
17430     Is.typedArray = typedArray;
17431 })(Is || (Is = {}));
17432
17433
17434 /***/ }),
17435 /* 81 */
17436 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
17437
17438 __webpack_require__.r(__webpack_exports__);
17439 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17440 /* harmony export */   "TextDocument": () => /* binding */ TextDocument
17441 /* harmony export */ });
17442 /* --------------------------------------------------------------------------------------------
17443  * Copyright (c) Microsoft Corporation. All rights reserved.
17444  * Licensed under the MIT License. See License.txt in the project root for license information.
17445  * ------------------------------------------------------------------------------------------ */
17446
17447 var FullTextDocument = /** @class */ (function () {
17448     function FullTextDocument(uri, languageId, version, content) {
17449         this._uri = uri;
17450         this._languageId = languageId;
17451         this._version = version;
17452         this._content = content;
17453         this._lineOffsets = undefined;
17454     }
17455     Object.defineProperty(FullTextDocument.prototype, "uri", {
17456         get: function () {
17457             return this._uri;
17458         },
17459         enumerable: true,
17460         configurable: true
17461     });
17462     Object.defineProperty(FullTextDocument.prototype, "languageId", {
17463         get: function () {
17464             return this._languageId;
17465         },
17466         enumerable: true,
17467         configurable: true
17468     });
17469     Object.defineProperty(FullTextDocument.prototype, "version", {
17470         get: function () {
17471             return this._version;
17472         },
17473         enumerable: true,
17474         configurable: true
17475     });
17476     FullTextDocument.prototype.getText = function (range) {
17477         if (range) {
17478             var start = this.offsetAt(range.start);
17479             var end = this.offsetAt(range.end);
17480             return this._content.substring(start, end);
17481         }
17482         return this._content;
17483     };
17484     FullTextDocument.prototype.update = function (changes, version) {
17485         for (var _i = 0, changes_1 = changes; _i < changes_1.length; _i++) {
17486             var change = changes_1[_i];
17487             if (FullTextDocument.isIncremental(change)) {
17488                 // makes sure start is before end
17489                 var range = getWellformedRange(change.range);
17490                 // update content
17491                 var startOffset = this.offsetAt(range.start);
17492                 var endOffset = this.offsetAt(range.end);
17493                 this._content = this._content.substring(0, startOffset) + change.text + this._content.substring(endOffset, this._content.length);
17494                 // update the offsets
17495                 var startLine = Math.max(range.start.line, 0);
17496                 var endLine = Math.max(range.end.line, 0);
17497                 var lineOffsets = this._lineOffsets;
17498                 var addedLineOffsets = computeLineOffsets(change.text, false, startOffset);
17499                 if (endLine - startLine === addedLineOffsets.length) {
17500                     for (var i = 0, len = addedLineOffsets.length; i < len; i++) {
17501                         lineOffsets[i + startLine + 1] = addedLineOffsets[i];
17502                     }
17503                 }
17504                 else {
17505                     if (addedLineOffsets.length < 10000) {
17506                         lineOffsets.splice.apply(lineOffsets, [startLine + 1, endLine - startLine].concat(addedLineOffsets));
17507                     }
17508                     else { // avoid too many arguments for splice
17509                         this._lineOffsets = lineOffsets = lineOffsets.slice(0, startLine + 1).concat(addedLineOffsets, lineOffsets.slice(endLine + 1));
17510                     }
17511                 }
17512                 var diff = change.text.length - (endOffset - startOffset);
17513                 if (diff !== 0) {
17514                     for (var i = startLine + 1 + addedLineOffsets.length, len = lineOffsets.length; i < len; i++) {
17515                         lineOffsets[i] = lineOffsets[i] + diff;
17516                     }
17517                 }
17518             }
17519             else if (FullTextDocument.isFull(change)) {
17520                 this._content = change.text;
17521                 this._lineOffsets = undefined;
17522             }
17523             else {
17524                 throw new Error('Unknown change event received');
17525             }
17526         }
17527         this._version = version;
17528     };
17529     FullTextDocument.prototype.getLineOffsets = function () {
17530         if (this._lineOffsets === undefined) {
17531             this._lineOffsets = computeLineOffsets(this._content, true);
17532         }
17533         return this._lineOffsets;
17534     };
17535     FullTextDocument.prototype.positionAt = function (offset) {
17536         offset = Math.max(Math.min(offset, this._content.length), 0);
17537         var lineOffsets = this.getLineOffsets();
17538         var low = 0, high = lineOffsets.length;
17539         if (high === 0) {
17540             return { line: 0, character: offset };
17541         }
17542         while (low < high) {
17543             var mid = Math.floor((low + high) / 2);
17544             if (lineOffsets[mid] > offset) {
17545                 high = mid;
17546             }
17547             else {
17548                 low = mid + 1;
17549             }
17550         }
17551         // low is the least x for which the line offset is larger than the current offset
17552         // or array.length if no line offset is larger than the current offset
17553         var line = low - 1;
17554         return { line: line, character: offset - lineOffsets[line] };
17555     };
17556     FullTextDocument.prototype.offsetAt = function (position) {
17557         var lineOffsets = this.getLineOffsets();
17558         if (position.line >= lineOffsets.length) {
17559             return this._content.length;
17560         }
17561         else if (position.line < 0) {
17562             return 0;
17563         }
17564         var lineOffset = lineOffsets[position.line];
17565         var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
17566         return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
17567     };
17568     Object.defineProperty(FullTextDocument.prototype, "lineCount", {
17569         get: function () {
17570             return this.getLineOffsets().length;
17571         },
17572         enumerable: true,
17573         configurable: true
17574     });
17575     FullTextDocument.isIncremental = function (event) {
17576         var candidate = event;
17577         return candidate !== undefined && candidate !== null &&
17578             typeof candidate.text === 'string' && candidate.range !== undefined &&
17579             (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');
17580     };
17581     FullTextDocument.isFull = function (event) {
17582         var candidate = event;
17583         return candidate !== undefined && candidate !== null &&
17584             typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;
17585     };
17586     return FullTextDocument;
17587 }());
17588 var TextDocument;
17589 (function (TextDocument) {
17590     /**
17591      * Creates a new text document.
17592      *
17593      * @param uri The document's uri.
17594      * @param languageId  The document's language Id.
17595      * @param version The document's initial version number.
17596      * @param content The document's content.
17597      */
17598     function create(uri, languageId, version, content) {
17599         return new FullTextDocument(uri, languageId, version, content);
17600     }
17601     TextDocument.create = create;
17602     /**
17603      * Updates a TextDocument by modifing its content.
17604      *
17605      * @param document the document to update. Only documents created by TextDocument.create are valid inputs.
17606      * @param changes the changes to apply to the document.
17607      * @returns The updated TextDocument. Note: That's the same document instance passed in as first parameter.
17608      *
17609      */
17610     function update(document, changes, version) {
17611         if (document instanceof FullTextDocument) {
17612             document.update(changes, version);
17613             return document;
17614         }
17615         else {
17616             throw new Error('TextDocument.update: document must be created by TextDocument.create');
17617         }
17618     }
17619     TextDocument.update = update;
17620     function applyEdits(document, edits) {
17621         var text = document.getText();
17622         var sortedEdits = mergeSort(edits.map(getWellformedEdit), function (a, b) {
17623             var diff = a.range.start.line - b.range.start.line;
17624             if (diff === 0) {
17625                 return a.range.start.character - b.range.start.character;
17626             }
17627             return diff;
17628         });
17629         var lastModifiedOffset = 0;
17630         var spans = [];
17631         for (var _i = 0, sortedEdits_1 = sortedEdits; _i < sortedEdits_1.length; _i++) {
17632             var e = sortedEdits_1[_i];
17633             var startOffset = document.offsetAt(e.range.start);
17634             if (startOffset < lastModifiedOffset) {
17635                 throw new Error('Overlapping edit');
17636             }
17637             else if (startOffset > lastModifiedOffset) {
17638                 spans.push(text.substring(lastModifiedOffset, startOffset));
17639             }
17640             if (e.newText.length) {
17641                 spans.push(e.newText);
17642             }
17643             lastModifiedOffset = document.offsetAt(e.range.end);
17644         }
17645         spans.push(text.substr(lastModifiedOffset));
17646         return spans.join('');
17647     }
17648     TextDocument.applyEdits = applyEdits;
17649 })(TextDocument || (TextDocument = {}));
17650 function mergeSort(data, compare) {
17651     if (data.length <= 1) {
17652         // sorted
17653         return data;
17654     }
17655     var p = (data.length / 2) | 0;
17656     var left = data.slice(0, p);
17657     var right = data.slice(p);
17658     mergeSort(left, compare);
17659     mergeSort(right, compare);
17660     var leftIdx = 0;
17661     var rightIdx = 0;
17662     var i = 0;
17663     while (leftIdx < left.length && rightIdx < right.length) {
17664         var ret = compare(left[leftIdx], right[rightIdx]);
17665         if (ret <= 0) {
17666             // smaller_equal -> take left to preserve order
17667             data[i++] = left[leftIdx++];
17668         }
17669         else {
17670             // greater -> take right
17671             data[i++] = right[rightIdx++];
17672         }
17673     }
17674     while (leftIdx < left.length) {
17675         data[i++] = left[leftIdx++];
17676     }
17677     while (rightIdx < right.length) {
17678         data[i++] = right[rightIdx++];
17679     }
17680     return data;
17681 }
17682 function computeLineOffsets(text, isAtLineStart, textOffset) {
17683     if (textOffset === void 0) { textOffset = 0; }
17684     var result = isAtLineStart ? [textOffset] : [];
17685     for (var i = 0; i < text.length; i++) {
17686         var ch = text.charCodeAt(i);
17687         if (ch === 13 /* CarriageReturn */ || ch === 10 /* LineFeed */) {
17688             if (ch === 13 /* CarriageReturn */ && i + 1 < text.length && text.charCodeAt(i + 1) === 10 /* LineFeed */) {
17689                 i++;
17690             }
17691             result.push(textOffset + i + 1);
17692         }
17693     }
17694     return result;
17695 }
17696 function getWellformedRange(range) {
17697     var start = range.start;
17698     var end = range.end;
17699     if (start.line > end.line || (start.line === end.line && start.character > end.character)) {
17700         return { start: end, end: start };
17701     }
17702     return range;
17703 }
17704 function getWellformedEdit(textEdit) {
17705     var range = getWellformedRange(textEdit.range);
17706     if (range !== textEdit.range) {
17707         return { newText: textEdit.newText, range: range };
17708     }
17709     return textEdit;
17710 }
17711
17712
17713 /***/ }),
17714 /* 82 */
17715 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
17716
17717 __webpack_require__.r(__webpack_exports__);
17718 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17719 /* harmony export */   "PathCompletionParticipant": () => /* binding */ PathCompletionParticipant
17720 /* harmony export */ });
17721 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79);
17722 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(66);
17723 /* harmony import */ var _utils_resources__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(83);
17724 /*---------------------------------------------------------------------------------------------
17725  *  Copyright (c) Microsoft Corporation. All rights reserved.
17726  *  Licensed under the MIT License. See License.txt in the project root for license information.
17727  *--------------------------------------------------------------------------------------------*/
17728 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
17729     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17730     return new (P || (P = Promise))(function (resolve, reject) {
17731         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17732         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17733         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
17734         step((generator = generator.apply(thisArg, _arguments || [])).next());
17735     });
17736 };
17737 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
17738     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
17739     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
17740     function verb(n) { return function (v) { return step([n, v]); }; }
17741     function step(op) {
17742         if (f) throw new TypeError("Generator is already executing.");
17743         while (_) try {
17744             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
17745             if (y = 0, t) op = [op[0] & 2, t.value];
17746             switch (op[0]) {
17747                 case 0: case 1: t = op; break;
17748                 case 4: _.label++; return { value: op[1], done: false };
17749                 case 5: _.label++; y = op[1]; op = [0]; continue;
17750                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
17751                 default:
17752                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
17753                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
17754                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
17755                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
17756                     if (t[2]) _.ops.pop();
17757                     _.trys.pop(); continue;
17758             }
17759             op = body.call(thisArg, _);
17760         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
17761         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
17762     }
17763 };
17764
17765
17766
17767 var PathCompletionParticipant = /** @class */ (function () {
17768     function PathCompletionParticipant(readDirectory) {
17769         this.readDirectory = readDirectory;
17770         this.literalCompletions = [];
17771         this.importCompletions = [];
17772     }
17773     PathCompletionParticipant.prototype.onCssURILiteralValue = function (context) {
17774         this.literalCompletions.push(context);
17775     };
17776     PathCompletionParticipant.prototype.onCssImportPath = function (context) {
17777         this.importCompletions.push(context);
17778     };
17779     PathCompletionParticipant.prototype.computeCompletions = function (document, documentContext) {
17780         return __awaiter(this, void 0, void 0, function () {
17781             var result, _i, _a, literalCompletion, uriValue, fullValue, items, _b, items_1, item, _c, _d, importCompletion, pathValue, fullValue, suggestions, _e, suggestions_1, item;
17782             return __generator(this, function (_f) {
17783                 switch (_f.label) {
17784                     case 0:
17785                         result = { items: [], isIncomplete: false };
17786                         _i = 0, _a = this.literalCompletions;
17787                         _f.label = 1;
17788                     case 1:
17789                         if (!(_i < _a.length)) return [3 /*break*/, 5];
17790                         literalCompletion = _a[_i];
17791                         uriValue = literalCompletion.uriValue;
17792                         fullValue = stripQuotes(uriValue);
17793                         if (!(fullValue === '.' || fullValue === '..')) return [3 /*break*/, 2];
17794                         result.isIncomplete = true;
17795                         return [3 /*break*/, 4];
17796                     case 2: return [4 /*yield*/, this.providePathSuggestions(uriValue, literalCompletion.position, literalCompletion.range, document, documentContext)];
17797                     case 3:
17798                         items = _f.sent();
17799                         for (_b = 0, items_1 = items; _b < items_1.length; _b++) {
17800                             item = items_1[_b];
17801                             result.items.push(item);
17802                         }
17803                         _f.label = 4;
17804                     case 4:
17805                         _i++;
17806                         return [3 /*break*/, 1];
17807                     case 5:
17808                         _c = 0, _d = this.importCompletions;
17809                         _f.label = 6;
17810                     case 6:
17811                         if (!(_c < _d.length)) return [3 /*break*/, 10];
17812                         importCompletion = _d[_c];
17813                         pathValue = importCompletion.pathValue;
17814                         fullValue = stripQuotes(pathValue);
17815                         if (!(fullValue === '.' || fullValue === '..')) return [3 /*break*/, 7];
17816                         result.isIncomplete = true;
17817                         return [3 /*break*/, 9];
17818                     case 7: return [4 /*yield*/, this.providePathSuggestions(pathValue, importCompletion.position, importCompletion.range, document, documentContext)];
17819                     case 8:
17820                         suggestions = _f.sent();
17821                         if (document.languageId === 'scss') {
17822                             suggestions.forEach(function (s) {
17823                                 if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith)(s.label, '_') && (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.endsWith)(s.label, '.scss')) {
17824                                     if (s.textEdit) {
17825                                         s.textEdit.newText = s.label.slice(1, -5);
17826                                     }
17827                                     else {
17828                                         s.label = s.label.slice(1, -5);
17829                                     }
17830                                 }
17831                             });
17832                         }
17833                         for (_e = 0, suggestions_1 = suggestions; _e < suggestions_1.length; _e++) {
17834                             item = suggestions_1[_e];
17835                             result.items.push(item);
17836                         }
17837                         _f.label = 9;
17838                     case 9:
17839                         _c++;
17840                         return [3 /*break*/, 6];
17841                     case 10: return [2 /*return*/, result];
17842                 }
17843             });
17844         });
17845     };
17846     PathCompletionParticipant.prototype.providePathSuggestions = function (pathValue, position, range, document, documentContext) {
17847         return __awaiter(this, void 0, void 0, function () {
17848             var fullValue, isValueQuoted, valueBeforeCursor, currentDocUri, fullValueRange, replaceRange, valueBeforeLastSlash, parentDir, result, infos, _i, infos_1, _a, name, type, e_1;
17849             return __generator(this, function (_b) {
17850                 switch (_b.label) {
17851                     case 0:
17852                         fullValue = stripQuotes(pathValue);
17853                         isValueQuoted = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith)(pathValue, "'") || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith)(pathValue, "\"");
17854                         valueBeforeCursor = isValueQuoted
17855                             ? fullValue.slice(0, position.character - (range.start.character + 1))
17856                             : fullValue.slice(0, position.character - range.start.character);
17857                         currentDocUri = document.uri;
17858                         fullValueRange = isValueQuoted ? shiftRange(range, 1, -1) : range;
17859                         replaceRange = pathToReplaceRange(valueBeforeCursor, fullValue, fullValueRange);
17860                         valueBeforeLastSlash = valueBeforeCursor.substring(0, valueBeforeCursor.lastIndexOf('/') + 1);
17861                         parentDir = documentContext.resolveReference(valueBeforeLastSlash || '.', currentDocUri);
17862                         if (!parentDir) return [3 /*break*/, 4];
17863                         _b.label = 1;
17864                     case 1:
17865                         _b.trys.push([1, 3, , 4]);
17866                         result = [];
17867                         return [4 /*yield*/, this.readDirectory(parentDir)];
17868                     case 2:
17869                         infos = _b.sent();
17870                         for (_i = 0, infos_1 = infos; _i < infos_1.length; _i++) {
17871                             _a = infos_1[_i], name = _a[0], type = _a[1];
17872                             // Exclude paths that start with `.`
17873                             if (name.charCodeAt(0) !== CharCode_dot && (type === _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.FileType.Directory || (0,_utils_resources__WEBPACK_IMPORTED_MODULE_1__.joinPath)(parentDir, name) !== currentDocUri)) {
17874                                 result.push(createCompletionItem(name, type === _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.FileType.Directory, replaceRange));
17875                             }
17876                         }
17877                         return [2 /*return*/, result];
17878                     case 3:
17879                         e_1 = _b.sent();
17880                         return [3 /*break*/, 4];
17881                     case 4: return [2 /*return*/, []];
17882                 }
17883             });
17884         });
17885     };
17886     return PathCompletionParticipant;
17887 }());
17888
17889 var CharCode_dot = '.'.charCodeAt(0);
17890 function stripQuotes(fullValue) {
17891     if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith)(fullValue, "'") || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith)(fullValue, "\"")) {
17892         return fullValue.slice(1, -1);
17893     }
17894     else {
17895         return fullValue;
17896     }
17897 }
17898 function pathToReplaceRange(valueBeforeCursor, fullValue, fullValueRange) {
17899     var replaceRange;
17900     var lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/');
17901     if (lastIndexOfSlash === -1) {
17902         replaceRange = fullValueRange;
17903     }
17904     else {
17905         // For cases where cursor is in the middle of attribute value, like <script src="./s|rc/test.js">
17906         // Find the last slash before cursor, and calculate the start of replace range from there
17907         var valueAfterLastSlash = fullValue.slice(lastIndexOfSlash + 1);
17908         var startPos = shiftPosition(fullValueRange.end, -valueAfterLastSlash.length);
17909         // If whitespace exists, replace until it
17910         var whitespaceIndex = valueAfterLastSlash.indexOf(' ');
17911         var endPos = void 0;
17912         if (whitespaceIndex !== -1) {
17913             endPos = shiftPosition(startPos, whitespaceIndex);
17914         }
17915         else {
17916             endPos = fullValueRange.end;
17917         }
17918         replaceRange = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(startPos, endPos);
17919     }
17920     return replaceRange;
17921 }
17922 function createCompletionItem(name, isDir, replaceRange) {
17923     if (isDir) {
17924         name = name + '/';
17925         return {
17926             label: escapePath(name),
17927             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Folder,
17928             textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(replaceRange, escapePath(name)),
17929             command: {
17930                 title: 'Suggest',
17931                 command: 'editor.action.triggerSuggest'
17932             }
17933         };
17934     }
17935     else {
17936         return {
17937             label: escapePath(name),
17938             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.File,
17939             textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(replaceRange, escapePath(name))
17940         };
17941     }
17942 }
17943 // Escape https://www.w3.org/TR/CSS1/#url
17944 function escapePath(p) {
17945     return p.replace(/(\s|\(|\)|,|"|')/g, '\\$1');
17946 }
17947 function shiftPosition(pos, offset) {
17948     return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Position.create(pos.line, pos.character + offset);
17949 }
17950 function shiftRange(range, startOffset, endOffset) {
17951     var start = shiftPosition(range.start, startOffset);
17952     var end = shiftPosition(range.end, endOffset);
17953     return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(start, end);
17954 }
17955
17956
17957 /***/ }),
17958 /* 83 */
17959 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
17960
17961 __webpack_require__.r(__webpack_exports__);
17962 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
17963 /* harmony export */   "isAbsolutePath": () => /* binding */ isAbsolutePath,
17964 /* harmony export */   "dirname": () => /* binding */ dirname,
17965 /* harmony export */   "basename": () => /* binding */ basename,
17966 /* harmony export */   "extname": () => /* binding */ extname,
17967 /* harmony export */   "resolvePath": () => /* binding */ resolvePath,
17968 /* harmony export */   "normalizePath": () => /* binding */ normalizePath,
17969 /* harmony export */   "joinPath": () => /* binding */ joinPath
17970 /* harmony export */ });
17971 /* harmony import */ var vscode_uri__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(84);
17972 /*---------------------------------------------------------------------------------------------
17973  *  Copyright (c) Microsoft Corporation. All rights reserved.
17974  *  Licensed under the MIT License. See License.txt in the project root for license information.
17975  *--------------------------------------------------------------------------------------------*/
17976
17977 var Slash = '/'.charCodeAt(0);
17978 var Dot = '.'.charCodeAt(0);
17979 function isAbsolutePath(path) {
17980     return path.charCodeAt(0) === Slash;
17981 }
17982 function dirname(uri) {
17983     var lastIndexOfSlash = uri.lastIndexOf('/');
17984     return lastIndexOfSlash !== -1 ? uri.substr(0, lastIndexOfSlash) : '';
17985 }
17986 function basename(uri) {
17987     var lastIndexOfSlash = uri.lastIndexOf('/');
17988     return uri.substr(lastIndexOfSlash + 1);
17989 }
17990 function extname(uri) {
17991     for (var i = uri.length - 1; i >= 0; i--) {
17992         var ch = uri.charCodeAt(i);
17993         if (ch === Dot) {
17994             if (i > 0 && uri.charCodeAt(i - 1) !== Slash) {
17995                 return uri.substr(i);
17996             }
17997             else {
17998                 break;
17999             }
18000         }
18001         else if (ch === Slash) {
18002             break;
18003         }
18004     }
18005     return '';
18006 }
18007 function resolvePath(uriString, path) {
18008     if (isAbsolutePath(path)) {
18009         var uri = vscode_uri__WEBPACK_IMPORTED_MODULE_0__.URI.parse(uriString);
18010         var parts = path.split('/');
18011         return uri.with({ path: normalizePath(parts) }).toString();
18012     }
18013     return joinPath(uriString, path);
18014 }
18015 function normalizePath(parts) {
18016     var newParts = [];
18017     for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
18018         var part = parts_1[_i];
18019         if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) {
18020             // ignore
18021         }
18022         else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) {
18023             newParts.pop();
18024         }
18025         else {
18026             newParts.push(part);
18027         }
18028     }
18029     if (parts.length > 1 && parts[parts.length - 1].length === 0) {
18030         newParts.push('');
18031     }
18032     var res = newParts.join('/');
18033     if (parts[0].length === 0) {
18034         res = '/' + res;
18035     }
18036     return res;
18037 }
18038 function joinPath(uriString) {
18039     var paths = [];
18040     for (var _i = 1; _i < arguments.length; _i++) {
18041         paths[_i - 1] = arguments[_i];
18042     }
18043     var uri = vscode_uri__WEBPACK_IMPORTED_MODULE_0__.URI.parse(uriString);
18044     var parts = uri.path.split('/');
18045     for (var _a = 0, paths_1 = paths; _a < paths_1.length; _a++) {
18046         var path = paths_1[_a];
18047         parts.push.apply(parts, path.split('/'));
18048     }
18049     return uri.with({ path: normalizePath(parts) }).toString();
18050 }
18051
18052
18053 /***/ }),
18054 /* 84 */
18055 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18056
18057 __webpack_require__.r(__webpack_exports__);
18058 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18059 /* harmony export */   "URI": () => /* binding */ URI,
18060 /* harmony export */   "uriToFsPath": () => /* binding */ uriToFsPath
18061 /* harmony export */ });
18062 /*---------------------------------------------------------------------------------------------
18063  *  Copyright (c) Microsoft Corporation. All rights reserved.
18064  *  Licensed under the MIT License. See License.txt in the project root for license information.
18065  *--------------------------------------------------------------------------------------------*/
18066
18067 var __extends = (undefined && undefined.__extends) || (function () {
18068     var extendStatics = function (d, b) {
18069         extendStatics = Object.setPrototypeOf ||
18070             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
18071             function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
18072         return extendStatics(d, b);
18073     };
18074     return function (d, b) {
18075         extendStatics(d, b);
18076         function __() { this.constructor = d; }
18077         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
18078     };
18079 })();
18080 var _a;
18081 var isWindows;
18082 if (typeof process === 'object') {
18083     isWindows = process.platform === 'win32';
18084 }
18085 else if (typeof navigator === 'object') {
18086     var userAgent = navigator.userAgent;
18087     isWindows = userAgent.indexOf('Windows') >= 0;
18088 }
18089 function isHighSurrogate(charCode) {
18090     return (0xD800 <= charCode && charCode <= 0xDBFF);
18091 }
18092 function isLowSurrogate(charCode) {
18093     return (0xDC00 <= charCode && charCode <= 0xDFFF);
18094 }
18095 function isLowerAsciiHex(code) {
18096     return code >= 97 /* a */ && code <= 102 /* f */;
18097 }
18098 function isLowerAsciiLetter(code) {
18099     return code >= 97 /* a */ && code <= 122 /* z */;
18100 }
18101 function isUpperAsciiLetter(code) {
18102     return code >= 65 /* A */ && code <= 90 /* Z */;
18103 }
18104 function isAsciiLetter(code) {
18105     return isLowerAsciiLetter(code) || isUpperAsciiLetter(code);
18106 }
18107 //#endregion
18108 var _schemePattern = /^\w[\w\d+.-]*$/;
18109 var _singleSlashStart = /^\//;
18110 var _doubleSlashStart = /^\/\//;
18111 function _validateUri(ret, _strict) {
18112     // scheme, must be set
18113     if (!ret.scheme && _strict) {
18114         throw new Error("[UriError]: Scheme is missing: {scheme: \"\", authority: \"" + ret.authority + "\", path: \"" + ret.path + "\", query: \"" + ret.query + "\", fragment: \"" + ret.fragment + "\"}");
18115     }
18116     // scheme, https://tools.ietf.org/html/rfc3986#section-3.1
18117     // ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
18118     if (ret.scheme && !_schemePattern.test(ret.scheme)) {
18119         throw new Error('[UriError]: Scheme contains illegal characters.');
18120     }
18121     // path, http://tools.ietf.org/html/rfc3986#section-3.3
18122     // If a URI contains an authority component, then the path component
18123     // must either be empty or begin with a slash ("/") character.  If a URI
18124     // does not contain an authority component, then the path cannot begin
18125     // with two slash characters ("//").
18126     if (ret.path) {
18127         if (ret.authority) {
18128             if (!_singleSlashStart.test(ret.path)) {
18129                 throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character');
18130             }
18131         }
18132         else {
18133             if (_doubleSlashStart.test(ret.path)) {
18134                 throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")');
18135             }
18136         }
18137     }
18138 }
18139 // for a while we allowed uris *without* schemes and this is the migration
18140 // for them, e.g. an uri without scheme and without strict-mode warns and falls
18141 // back to the file-scheme. that should cause the least carnage and still be a
18142 // clear warning
18143 function _schemeFix(scheme, _strict) {
18144     if (!scheme && !_strict) {
18145         return 'file';
18146     }
18147     return scheme;
18148 }
18149 // implements a bit of https://tools.ietf.org/html/rfc3986#section-5
18150 function _referenceResolution(scheme, path) {
18151     // the slash-character is our 'default base' as we don't
18152     // support constructing URIs relative to other URIs. This
18153     // also means that we alter and potentially break paths.
18154     // see https://tools.ietf.org/html/rfc3986#section-5.1.4
18155     switch (scheme) {
18156         case 'https':
18157         case 'http':
18158         case 'file':
18159             if (!path) {
18160                 path = _slash;
18161             }
18162             else if (path[0] !== _slash) {
18163                 path = _slash + path;
18164             }
18165             break;
18166     }
18167     return path;
18168 }
18169 var _empty = '';
18170 var _slash = '/';
18171 var _regexp = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
18172 /**
18173  * Uniform Resource Identifier (URI) http://tools.ietf.org/html/rfc3986.
18174  * This class is a simple parser which creates the basic component parts
18175  * (http://tools.ietf.org/html/rfc3986#section-3) with minimal validation
18176  * and encoding.
18177  *
18178  * ```txt
18179  *       foo://example.com:8042/over/there?name=ferret#nose
18180  *       \_/   \______________/\_________/ \_________/ \__/
18181  *        |           |            |            |        |
18182  *     scheme     authority       path        query   fragment
18183  *        |   _____________________|__
18184  *       / \ /                        \
18185  *       urn:example:animal:ferret:nose
18186  * ```
18187  */
18188 var URI = /** @class */ (function () {
18189     /**
18190      * @internal
18191      */
18192     function URI(schemeOrData, authority, path, query, fragment, _strict) {
18193         if (_strict === void 0) { _strict = false; }
18194         if (typeof schemeOrData === 'object') {
18195             this.scheme = schemeOrData.scheme || _empty;
18196             this.authority = schemeOrData.authority || _empty;
18197             this.path = schemeOrData.path || _empty;
18198             this.query = schemeOrData.query || _empty;
18199             this.fragment = schemeOrData.fragment || _empty;
18200             // no validation because it's this URI
18201             // that creates uri components.
18202             // _validateUri(this);
18203         }
18204         else {
18205             this.scheme = _schemeFix(schemeOrData, _strict);
18206             this.authority = authority || _empty;
18207             this.path = _referenceResolution(this.scheme, path || _empty);
18208             this.query = query || _empty;
18209             this.fragment = fragment || _empty;
18210             _validateUri(this, _strict);
18211         }
18212     }
18213     URI.isUri = function (thing) {
18214         if (thing instanceof URI) {
18215             return true;
18216         }
18217         if (!thing) {
18218             return false;
18219         }
18220         return typeof thing.authority === 'string'
18221             && typeof thing.fragment === 'string'
18222             && typeof thing.path === 'string'
18223             && typeof thing.query === 'string'
18224             && typeof thing.scheme === 'string'
18225             && typeof thing.fsPath === 'function'
18226             && typeof thing.with === 'function'
18227             && typeof thing.toString === 'function';
18228     };
18229     Object.defineProperty(URI.prototype, "fsPath", {
18230         // ---- filesystem path -----------------------
18231         /**
18232          * Returns a string representing the corresponding file system path of this URI.
18233          * Will handle UNC paths, normalizes windows drive letters to lower-case, and uses the
18234          * platform specific path separator.
18235          *
18236          * * Will *not* validate the path for invalid characters and semantics.
18237          * * Will *not* look at the scheme of this URI.
18238          * * The result shall *not* be used for display purposes but for accessing a file on disk.
18239          *
18240          *
18241          * The *difference* to `URI#path` is the use of the platform specific separator and the handling
18242          * of UNC paths. See the below sample of a file-uri with an authority (UNC path).
18243          *
18244          * ```ts
18245             const u = URI.parse('file://server/c$/folder/file.txt')
18246             u.authority === 'server'
18247             u.path === '/shares/c$/file.txt'
18248             u.fsPath === '\\server\c$\folder\file.txt'
18249         ```
18250          *
18251          * Using `URI#path` to read a file (using fs-apis) would not be enough because parts of the path,
18252          * namely the server name, would be missing. Therefore `URI#fsPath` exists - it's sugar to ease working
18253          * with URIs that represent files on disk (`file` scheme).
18254          */
18255         get: function () {
18256             // if (this.scheme !== 'file') {
18257             //  console.warn(`[UriError] calling fsPath with scheme ${this.scheme}`);
18258             // }
18259             return uriToFsPath(this, false);
18260         },
18261         enumerable: true,
18262         configurable: true
18263     });
18264     // ---- modify to new -------------------------
18265     URI.prototype.with = function (change) {
18266         if (!change) {
18267             return this;
18268         }
18269         var scheme = change.scheme, authority = change.authority, path = change.path, query = change.query, fragment = change.fragment;
18270         if (scheme === undefined) {
18271             scheme = this.scheme;
18272         }
18273         else if (scheme === null) {
18274             scheme = _empty;
18275         }
18276         if (authority === undefined) {
18277             authority = this.authority;
18278         }
18279         else if (authority === null) {
18280             authority = _empty;
18281         }
18282         if (path === undefined) {
18283             path = this.path;
18284         }
18285         else if (path === null) {
18286             path = _empty;
18287         }
18288         if (query === undefined) {
18289             query = this.query;
18290         }
18291         else if (query === null) {
18292             query = _empty;
18293         }
18294         if (fragment === undefined) {
18295             fragment = this.fragment;
18296         }
18297         else if (fragment === null) {
18298             fragment = _empty;
18299         }
18300         if (scheme === this.scheme
18301             && authority === this.authority
18302             && path === this.path
18303             && query === this.query
18304             && fragment === this.fragment) {
18305             return this;
18306         }
18307         return new _URI(scheme, authority, path, query, fragment);
18308     };
18309     // ---- parse & validate ------------------------
18310     /**
18311      * Creates a new URI from a string, e.g. `http://www.msft.com/some/path`,
18312      * `file:///usr/home`, or `scheme:with/path`.
18313      *
18314      * @param value A string which represents an URI (see `URI#toString`).
18315      */
18316     URI.parse = function (value, _strict) {
18317         if (_strict === void 0) { _strict = false; }
18318         var match = _regexp.exec(value);
18319         if (!match) {
18320             return new _URI(_empty, _empty, _empty, _empty, _empty);
18321         }
18322         return new _URI(match[2] || _empty, percentDecode(match[4] || _empty), percentDecode(match[5] || _empty), percentDecode(match[7] || _empty), percentDecode(match[9] || _empty), _strict);
18323     };
18324     /**
18325      * Creates a new URI from a file system path, e.g. `c:\my\files`,
18326      * `/usr/home`, or `\\server\share\some\path`.
18327      *
18328      * The *difference* between `URI#parse` and `URI#file` is that the latter treats the argument
18329      * as path, not as stringified-uri. E.g. `URI.file(path)` is **not the same as**
18330      * `URI.parse('file://' + path)` because the path might contain characters that are
18331      * interpreted (# and ?). See the following sample:
18332      * ```ts
18333     const good = URI.file('/coding/c#/project1');
18334     good.scheme === 'file';
18335     good.path === '/coding/c#/project1';
18336     good.fragment === '';
18337     const bad = URI.parse('file://' + '/coding/c#/project1');
18338     bad.scheme === 'file';
18339     bad.path === '/coding/c'; // path is now broken
18340     bad.fragment === '/project1';
18341     ```
18342      *
18343      * @param path A file system path (see `URI#fsPath`)
18344      */
18345     URI.file = function (path) {
18346         var authority = _empty;
18347         // normalize to fwd-slashes on windows,
18348         // on other systems bwd-slashes are valid
18349         // filename character, eg /f\oo/ba\r.txt
18350         if (isWindows) {
18351             path = path.replace(/\\/g, _slash);
18352         }
18353         // check for authority as used in UNC shares
18354         // or use the path as given
18355         if (path[0] === _slash && path[1] === _slash) {
18356             var idx = path.indexOf(_slash, 2);
18357             if (idx === -1) {
18358                 authority = path.substring(2);
18359                 path = _slash;
18360             }
18361             else {
18362                 authority = path.substring(2, idx);
18363                 path = path.substring(idx) || _slash;
18364             }
18365         }
18366         return new _URI('file', authority, path, _empty, _empty);
18367     };
18368     URI.from = function (components) {
18369         return new _URI(components.scheme, components.authority, components.path, components.query, components.fragment);
18370     };
18371     // /**
18372     //  * Join a URI path with path fragments and normalizes the resulting path.
18373     //  *
18374     //  * @param uri The input URI.
18375     //  * @param pathFragment The path fragment to add to the URI path.
18376     //  * @returns The resulting URI.
18377     //  */
18378     // static joinPath(uri: URI, ...pathFragment: string[]): URI {
18379     //  if (!uri.path) {
18380     //          throw new Error(`[UriError]: cannot call joinPaths on URI without path`);
18381     //  }
18382     //  let newPath: string;
18383     //  if (isWindows && uri.scheme === 'file') {
18384     //          newPath = URI.file(paths.win32.join(uriToFsPath(uri, true), ...pathFragment)).path;
18385     //  } else {
18386     //          newPath = paths.posix.join(uri.path, ...pathFragment);
18387     //  }
18388     //  return uri.with({ path: newPath });
18389     // }
18390     // ---- printing/externalize ---------------------------
18391     /**
18392      * Creates a string representation for this URI. It's guaranteed that calling
18393      * `URI.parse` with the result of this function creates an URI which is equal
18394      * to this URI.
18395      *
18396      * * The result shall *not* be used for display purposes but for externalization or transport.
18397      * * The result will be encoded using the percentage encoding and encoding happens mostly
18398      * ignore the scheme-specific encoding rules.
18399      *
18400      * @param skipEncoding Do not encode the result, default is `false`
18401      */
18402     URI.prototype.toString = function (skipEncoding) {
18403         if (skipEncoding === void 0) { skipEncoding = false; }
18404         return _asFormatted(this, skipEncoding);
18405     };
18406     URI.prototype.toJSON = function () {
18407         return this;
18408     };
18409     URI.revive = function (data) {
18410         if (!data) {
18411             return data;
18412         }
18413         else if (data instanceof URI) {
18414             return data;
18415         }
18416         else {
18417             var result = new _URI(data);
18418             result._formatted = data.external;
18419             result._fsPath = data._sep === _pathSepMarker ? data.fsPath : null;
18420             return result;
18421         }
18422     };
18423     return URI;
18424 }());
18425
18426 var _pathSepMarker = isWindows ? 1 : undefined;
18427 // eslint-disable-next-line @typescript-eslint/class-name-casing
18428 var _URI = /** @class */ (function (_super) {
18429     __extends(_URI, _super);
18430     function _URI() {
18431         var _this = _super !== null && _super.apply(this, arguments) || this;
18432         _this._formatted = null;
18433         _this._fsPath = null;
18434         return _this;
18435     }
18436     Object.defineProperty(_URI.prototype, "fsPath", {
18437         get: function () {
18438             if (!this._fsPath) {
18439                 this._fsPath = uriToFsPath(this, false);
18440             }
18441             return this._fsPath;
18442         },
18443         enumerable: true,
18444         configurable: true
18445     });
18446     _URI.prototype.toString = function (skipEncoding) {
18447         if (skipEncoding === void 0) { skipEncoding = false; }
18448         if (!skipEncoding) {
18449             if (!this._formatted) {
18450                 this._formatted = _asFormatted(this, false);
18451             }
18452             return this._formatted;
18453         }
18454         else {
18455             // we don't cache that
18456             return _asFormatted(this, true);
18457         }
18458     };
18459     _URI.prototype.toJSON = function () {
18460         var res = {
18461             $mid: 1
18462         };
18463         // cached state
18464         if (this._fsPath) {
18465             res.fsPath = this._fsPath;
18466             res._sep = _pathSepMarker;
18467         }
18468         if (this._formatted) {
18469             res.external = this._formatted;
18470         }
18471         // uri components
18472         if (this.path) {
18473             res.path = this.path;
18474         }
18475         if (this.scheme) {
18476             res.scheme = this.scheme;
18477         }
18478         if (this.authority) {
18479             res.authority = this.authority;
18480         }
18481         if (this.query) {
18482             res.query = this.query;
18483         }
18484         if (this.fragment) {
18485             res.fragment = this.fragment;
18486         }
18487         return res;
18488     };
18489     return _URI;
18490 }(URI));
18491 // reserved characters: https://tools.ietf.org/html/rfc3986#section-2.2
18492 var encodeTable = (_a = {},
18493     _a[58 /* Colon */] = '%3A',
18494     _a[47 /* Slash */] = '%2F',
18495     _a[63 /* QuestionMark */] = '%3F',
18496     _a[35 /* Hash */] = '%23',
18497     _a[91 /* OpenSquareBracket */] = '%5B',
18498     _a[93 /* CloseSquareBracket */] = '%5D',
18499     _a[64 /* AtSign */] = '%40',
18500     _a[33 /* ExclamationMark */] = '%21',
18501     _a[36 /* DollarSign */] = '%24',
18502     _a[38 /* Ampersand */] = '%26',
18503     _a[39 /* SingleQuote */] = '%27',
18504     _a[40 /* OpenParen */] = '%28',
18505     _a[41 /* CloseParen */] = '%29',
18506     _a[42 /* Asterisk */] = '%2A',
18507     _a[43 /* Plus */] = '%2B',
18508     _a[44 /* Comma */] = '%2C',
18509     _a[59 /* Semicolon */] = '%3B',
18510     _a[61 /* Equals */] = '%3D',
18511     _a[32 /* Space */] = '%20',
18512     _a);
18513 function encodeURIComponentFast(uriComponent, allowSlash) {
18514     var res = undefined;
18515     var nativeEncodePos = -1;
18516     for (var pos = 0; pos < uriComponent.length; pos++) {
18517         var code = uriComponent.charCodeAt(pos);
18518         // unreserved characters: https://tools.ietf.org/html/rfc3986#section-2.3
18519         if ((code >= 97 /* a */ && code <= 122 /* z */)
18520             || (code >= 65 /* A */ && code <= 90 /* Z */)
18521             || (code >= 48 /* Digit0 */ && code <= 57 /* Digit9 */)
18522             || code === 45 /* Dash */
18523             || code === 46 /* Period */
18524             || code === 95 /* Underline */
18525             || code === 126 /* Tilde */
18526             || (allowSlash && code === 47 /* Slash */)) {
18527             // check if we are delaying native encode
18528             if (nativeEncodePos !== -1) {
18529                 res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));
18530                 nativeEncodePos = -1;
18531             }
18532             // check if we write into a new string (by default we try to return the param)
18533             if (res !== undefined) {
18534                 res += uriComponent.charAt(pos);
18535             }
18536         }
18537         else {
18538             // encoding needed, we need to allocate a new string
18539             if (res === undefined) {
18540                 res = uriComponent.substr(0, pos);
18541             }
18542             // check with default table first
18543             var escaped = encodeTable[code];
18544             if (escaped !== undefined) {
18545                 // check if we are delaying native encode
18546                 if (nativeEncodePos !== -1) {
18547                     res += encodeURIComponent(uriComponent.substring(nativeEncodePos, pos));
18548                     nativeEncodePos = -1;
18549                 }
18550                 // append escaped variant to result
18551                 res += escaped;
18552             }
18553             else if (nativeEncodePos === -1) {
18554                 // use native encode only when needed
18555                 nativeEncodePos = pos;
18556             }
18557         }
18558     }
18559     if (nativeEncodePos !== -1) {
18560         res += encodeURIComponent(uriComponent.substring(nativeEncodePos));
18561     }
18562     return res !== undefined ? res : uriComponent;
18563 }
18564 function encodeURIComponentMinimal(path) {
18565     var res = undefined;
18566     for (var pos = 0; pos < path.length; pos++) {
18567         var code = path.charCodeAt(pos);
18568         if (code === 35 /* Hash */ || code === 63 /* QuestionMark */) {
18569             if (res === undefined) {
18570                 res = path.substr(0, pos);
18571             }
18572             res += encodeTable[code];
18573         }
18574         else {
18575             if (res !== undefined) {
18576                 res += path[pos];
18577             }
18578         }
18579     }
18580     return res !== undefined ? res : path;
18581 }
18582 /**
18583  * Compute `fsPath` for the given uri
18584  */
18585 function uriToFsPath(uri, keepDriveLetterCasing) {
18586     var value;
18587     if (uri.authority && uri.path.length > 1 && uri.scheme === 'file') {
18588         // unc path: file://shares/c$/far/boo
18589         value = "//" + uri.authority + uri.path;
18590     }
18591     else if (uri.path.charCodeAt(0) === 47 /* Slash */
18592         && (uri.path.charCodeAt(1) >= 65 /* A */ && uri.path.charCodeAt(1) <= 90 /* Z */ || uri.path.charCodeAt(1) >= 97 /* a */ && uri.path.charCodeAt(1) <= 122 /* z */)
18593         && uri.path.charCodeAt(2) === 58 /* Colon */) {
18594         if (!keepDriveLetterCasing) {
18595             // windows drive letter: file:///c:/far/boo
18596             value = uri.path[1].toLowerCase() + uri.path.substr(2);
18597         }
18598         else {
18599             value = uri.path.substr(1);
18600         }
18601     }
18602     else {
18603         // other path
18604         value = uri.path;
18605     }
18606     if (isWindows) {
18607         value = value.replace(/\//g, '\\');
18608     }
18609     return value;
18610 }
18611 /**
18612  * Create the external version of a uri
18613  */
18614 function _asFormatted(uri, skipEncoding) {
18615     var encoder = !skipEncoding
18616         ? encodeURIComponentFast
18617         : encodeURIComponentMinimal;
18618     var res = '';
18619     var scheme = uri.scheme, authority = uri.authority, path = uri.path, query = uri.query, fragment = uri.fragment;
18620     if (scheme) {
18621         res += scheme;
18622         res += ':';
18623     }
18624     if (authority || scheme === 'file') {
18625         res += _slash;
18626         res += _slash;
18627     }
18628     if (authority) {
18629         var idx = authority.indexOf('@');
18630         if (idx !== -1) {
18631             // <user>@<auth>
18632             var userinfo = authority.substr(0, idx);
18633             authority = authority.substr(idx + 1);
18634             idx = userinfo.indexOf(':');
18635             if (idx === -1) {
18636                 res += encoder(userinfo, false);
18637             }
18638             else {
18639                 // <user>:<pass>@<auth>
18640                 res += encoder(userinfo.substr(0, idx), false);
18641                 res += ':';
18642                 res += encoder(userinfo.substr(idx + 1), false);
18643             }
18644             res += '@';
18645         }
18646         authority = authority.toLowerCase();
18647         idx = authority.indexOf(':');
18648         if (idx === -1) {
18649             res += encoder(authority, false);
18650         }
18651         else {
18652             // <auth>:<port>
18653             res += encoder(authority.substr(0, idx), false);
18654             res += authority.substr(idx);
18655         }
18656     }
18657     if (path) {
18658         // lower-case windows drive letters in /C:/fff or C:/fff
18659         if (path.length >= 3 && path.charCodeAt(0) === 47 /* Slash */ && path.charCodeAt(2) === 58 /* Colon */) {
18660             var code = path.charCodeAt(1);
18661             if (code >= 65 /* A */ && code <= 90 /* Z */) {
18662                 path = "/" + String.fromCharCode(code + 32) + ":" + path.substr(3); // "/c:".length === 3
18663             }
18664         }
18665         else if (path.length >= 2 && path.charCodeAt(1) === 58 /* Colon */) {
18666             var code = path.charCodeAt(0);
18667             if (code >= 65 /* A */ && code <= 90 /* Z */) {
18668                 path = String.fromCharCode(code + 32) + ":" + path.substr(2); // "/c:".length === 3
18669             }
18670         }
18671         // encode the rest of the path
18672         res += encoder(path, true);
18673     }
18674     if (query) {
18675         res += '?';
18676         res += encoder(query, false);
18677     }
18678     if (fragment) {
18679         res += '#';
18680         res += !skipEncoding ? encodeURIComponentFast(fragment, false) : fragment;
18681     }
18682     return res;
18683 }
18684 // --- decode
18685 function decodeURIComponentGraceful(str) {
18686     try {
18687         return decodeURIComponent(str);
18688     }
18689     catch (_a) {
18690         if (str.length > 3) {
18691             return str.substr(0, 3) + decodeURIComponentGraceful(str.substr(3));
18692         }
18693         else {
18694             return str;
18695         }
18696     }
18697 }
18698 var _rEncodedAsHex = /(%[0-9A-Za-z][0-9A-Za-z])+/g;
18699 function percentDecode(str) {
18700     if (!str.match(_rEncodedAsHex)) {
18701         return str;
18702     }
18703     return str.replace(_rEncodedAsHex, function (match) { return decodeURIComponentGraceful(match); });
18704 }
18705
18706
18707 /***/ }),
18708 /* 85 */
18709 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18710
18711 __webpack_require__.r(__webpack_exports__);
18712 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18713 /* harmony export */   "CSSHover": () => /* binding */ CSSHover
18714 /* harmony export */ });
18715 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
18716 /* harmony import */ var _languageFacts_facts__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(71);
18717 /* harmony import */ var _selectorPrinting__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(86);
18718 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66);
18719 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(79);
18720 /* harmony import */ var _utils_objects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(75);
18721 /*---------------------------------------------------------------------------------------------
18722  *  Copyright (c) Microsoft Corporation. All rights reserved.
18723  *  Licensed under the MIT License. See License.txt in the project root for license information.
18724  *--------------------------------------------------------------------------------------------*/
18725
18726
18727
18728
18729
18730
18731
18732 var CSSHover = /** @class */ (function () {
18733     function CSSHover(clientCapabilities, cssDataManager) {
18734         this.clientCapabilities = clientCapabilities;
18735         this.cssDataManager = cssDataManager;
18736         this.selectorPrinting = new _selectorPrinting__WEBPACK_IMPORTED_MODULE_2__.SelectorPrinting(cssDataManager);
18737     }
18738     CSSHover.prototype.doHover = function (document, position, stylesheet) {
18739         function getRange(node) {
18740             return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(document.positionAt(node.offset), document.positionAt(node.end));
18741         }
18742         var offset = document.offsetAt(position);
18743         var nodepath = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.getNodePath(stylesheet, offset);
18744         /**
18745          * nodepath is top-down
18746          * Build up the hover by appending inner node's information
18747          */
18748         var hover = null;
18749         for (var i = 0; i < nodepath.length; i++) {
18750             var node = nodepath[i];
18751             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Selector) {
18752                 hover = {
18753                     contents: this.selectorPrinting.selectorToMarkedString(node),
18754                     range: getRange(node)
18755                 };
18756                 break;
18757             }
18758             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SimpleSelector) {
18759                 /**
18760                  * Some sass specific at rules such as `@at-root` are parsed as `SimpleSelector`
18761                  */
18762                 if (!(0,_utils_strings__WEBPACK_IMPORTED_MODULE_4__.startsWith)(node.getText(), '@')) {
18763                     hover = {
18764                         contents: this.selectorPrinting.simpleSelectorToMarkedString(node),
18765                         range: getRange(node)
18766                     };
18767                 }
18768                 break;
18769             }
18770             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declaration) {
18771                 var propertyName = node.getFullPropertyName();
18772                 var entry = this.cssDataManager.getProperty(propertyName);
18773                 if (entry) {
18774                     var contents = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_1__.getEntryDescription(entry, this.doesSupportMarkdown());
18775                     if (contents) {
18776                         hover = {
18777                             contents: contents,
18778                             range: getRange(node)
18779                         };
18780                     }
18781                     else {
18782                         hover = null;
18783                     }
18784                 }
18785                 continue;
18786             }
18787             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.UnknownAtRule) {
18788                 var atRuleName = node.getText();
18789                 var entry = this.cssDataManager.getAtDirective(atRuleName);
18790                 if (entry) {
18791                     var contents = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_1__.getEntryDescription(entry, this.doesSupportMarkdown());
18792                     if (contents) {
18793                         hover = {
18794                             contents: contents,
18795                             range: getRange(node)
18796                         };
18797                     }
18798                     else {
18799                         hover = null;
18800                     }
18801                 }
18802                 continue;
18803             }
18804             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Node && node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.PseudoSelector) {
18805                 var selectorName = node.getText();
18806                 var entry = selectorName.slice(0, 2) === '::'
18807                     ? this.cssDataManager.getPseudoElement(selectorName)
18808                     : this.cssDataManager.getPseudoClass(selectorName);
18809                 if (entry) {
18810                     var contents = _languageFacts_facts__WEBPACK_IMPORTED_MODULE_1__.getEntryDescription(entry, this.doesSupportMarkdown());
18811                     if (contents) {
18812                         hover = {
18813                             contents: contents,
18814                             range: getRange(node)
18815                         };
18816                     }
18817                     else {
18818                         hover = null;
18819                     }
18820                 }
18821                 continue;
18822             }
18823         }
18824         if (hover) {
18825             hover.contents = this.convertContents(hover.contents);
18826         }
18827         return hover;
18828     };
18829     CSSHover.prototype.convertContents = function (contents) {
18830         if (!this.doesSupportMarkdown()) {
18831             if (typeof contents === 'string') {
18832                 return contents;
18833             }
18834             // MarkupContent
18835             else if ('kind' in contents) {
18836                 return {
18837                     kind: 'plaintext',
18838                     value: contents.value
18839                 };
18840             }
18841             // MarkedString[]
18842             else if (Array.isArray(contents)) {
18843                 return contents.map(function (c) {
18844                     return typeof c === 'string' ? c : c.value;
18845                 });
18846             }
18847             // MarkedString
18848             else {
18849                 return contents.value;
18850             }
18851         }
18852         return contents;
18853     };
18854     CSSHover.prototype.doesSupportMarkdown = function () {
18855         if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_5__.isDefined)(this.supportsMarkdown)) {
18856             if (!(0,_utils_objects__WEBPACK_IMPORTED_MODULE_5__.isDefined)(this.clientCapabilities)) {
18857                 this.supportsMarkdown = true;
18858                 return this.supportsMarkdown;
18859             }
18860             var hover = this.clientCapabilities.textDocument && this.clientCapabilities.textDocument.hover;
18861             this.supportsMarkdown = hover && hover.contentFormat && Array.isArray(hover.contentFormat) && hover.contentFormat.indexOf(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.MarkupKind.Markdown) !== -1;
18862         }
18863         return this.supportsMarkdown;
18864     };
18865     return CSSHover;
18866 }());
18867
18868
18869
18870 /***/ }),
18871 /* 86 */
18872 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18873
18874 __webpack_require__.r(__webpack_exports__);
18875 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18876 /* harmony export */   "Element": () => /* binding */ Element,
18877 /* harmony export */   "RootElement": () => /* binding */ RootElement,
18878 /* harmony export */   "LabelElement": () => /* binding */ LabelElement,
18879 /* harmony export */   "toElement": () => /* binding */ toElement,
18880 /* harmony export */   "SelectorPrinting": () => /* binding */ SelectorPrinting,
18881 /* harmony export */   "selectorToElement": () => /* binding */ selectorToElement
18882 /* harmony export */ });
18883 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
18884 /* harmony import */ var _parser_cssScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64);
18885 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(68);
18886 /*---------------------------------------------------------------------------------------------
18887  *  Copyright (c) Microsoft Corporation. All rights reserved.
18888  *  Licensed under the MIT License. See License.txt in the project root for license information.
18889  *--------------------------------------------------------------------------------------------*/
18890
18891 var __extends = (undefined && undefined.__extends) || (function () {
18892     var extendStatics = function (d, b) {
18893         extendStatics = Object.setPrototypeOf ||
18894             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
18895             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
18896         return extendStatics(d, b);
18897     };
18898     return function (d, b) {
18899         extendStatics(d, b);
18900         function __() { this.constructor = d; }
18901         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
18902     };
18903 })();
18904
18905
18906
18907 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_2__.loadMessageBundle();
18908 var Element = /** @class */ (function () {
18909     function Element() {
18910         this.parent = null;
18911         this.children = null;
18912         this.attributes = null;
18913     }
18914     Element.prototype.findAttribute = function (name) {
18915         if (this.attributes) {
18916             for (var _i = 0, _a = this.attributes; _i < _a.length; _i++) {
18917                 var attribute = _a[_i];
18918                 if (attribute.name === name) {
18919                     return attribute.value;
18920                 }
18921             }
18922         }
18923         return null;
18924     };
18925     Element.prototype.addChild = function (child) {
18926         if (child instanceof Element) {
18927             child.parent = this;
18928         }
18929         if (!this.children) {
18930             this.children = [];
18931         }
18932         this.children.push(child);
18933     };
18934     Element.prototype.append = function (text) {
18935         if (this.attributes) {
18936             var last = this.attributes[this.attributes.length - 1];
18937             last.value = last.value + text;
18938         }
18939     };
18940     Element.prototype.prepend = function (text) {
18941         if (this.attributes) {
18942             var first = this.attributes[0];
18943             first.value = text + first.value;
18944         }
18945     };
18946     Element.prototype.findRoot = function () {
18947         var curr = this;
18948         while (curr.parent && !(curr.parent instanceof RootElement)) {
18949             curr = curr.parent;
18950         }
18951         return curr;
18952     };
18953     Element.prototype.removeChild = function (child) {
18954         if (this.children) {
18955             var index = this.children.indexOf(child);
18956             if (index !== -1) {
18957                 this.children.splice(index, 1);
18958                 return true;
18959             }
18960         }
18961         return false;
18962     };
18963     Element.prototype.addAttr = function (name, value) {
18964         if (!this.attributes) {
18965             this.attributes = [];
18966         }
18967         for (var _i = 0, _a = this.attributes; _i < _a.length; _i++) {
18968             var attribute = _a[_i];
18969             if (attribute.name === name) {
18970                 attribute.value += ' ' + value;
18971                 return;
18972             }
18973         }
18974         this.attributes.push({ name: name, value: value });
18975     };
18976     Element.prototype.clone = function (cloneChildren) {
18977         if (cloneChildren === void 0) { cloneChildren = true; }
18978         var elem = new Element();
18979         if (this.attributes) {
18980             elem.attributes = [];
18981             for (var _i = 0, _a = this.attributes; _i < _a.length; _i++) {
18982                 var attribute = _a[_i];
18983                 elem.addAttr(attribute.name, attribute.value);
18984             }
18985         }
18986         if (cloneChildren && this.children) {
18987             elem.children = [];
18988             for (var index = 0; index < this.children.length; index++) {
18989                 elem.addChild(this.children[index].clone());
18990             }
18991         }
18992         return elem;
18993     };
18994     Element.prototype.cloneWithParent = function () {
18995         var clone = this.clone(false);
18996         if (this.parent && !(this.parent instanceof RootElement)) {
18997             var parentClone = this.parent.cloneWithParent();
18998             parentClone.addChild(clone);
18999         }
19000         return clone;
19001     };
19002     return Element;
19003 }());
19004
19005 var RootElement = /** @class */ (function (_super) {
19006     __extends(RootElement, _super);
19007     function RootElement() {
19008         return _super !== null && _super.apply(this, arguments) || this;
19009     }
19010     return RootElement;
19011 }(Element));
19012
19013 var LabelElement = /** @class */ (function (_super) {
19014     __extends(LabelElement, _super);
19015     function LabelElement(label) {
19016         var _this = _super.call(this) || this;
19017         _this.addAttr('name', label);
19018         return _this;
19019     }
19020     return LabelElement;
19021 }(Element));
19022
19023 var MarkedStringPrinter = /** @class */ (function () {
19024     function MarkedStringPrinter(quote) {
19025         this.quote = quote;
19026         this.result = [];
19027         // empty
19028     }
19029     MarkedStringPrinter.prototype.print = function (element) {
19030         this.result = [];
19031         if (element instanceof RootElement) {
19032             if (element.children) {
19033                 this.doPrint(element.children, 0);
19034             }
19035         }
19036         else {
19037             this.doPrint([element], 0);
19038         }
19039         var value = this.result.join('\n');
19040         return [{ language: 'html', value: value }];
19041     };
19042     MarkedStringPrinter.prototype.doPrint = function (elements, indent) {
19043         for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
19044             var element = elements_1[_i];
19045             this.doPrintElement(element, indent);
19046             if (element.children) {
19047                 this.doPrint(element.children, indent + 1);
19048             }
19049         }
19050     };
19051     MarkedStringPrinter.prototype.writeLine = function (level, content) {
19052         var indent = new Array(level + 1).join('  ');
19053         this.result.push(indent + content);
19054     };
19055     MarkedStringPrinter.prototype.doPrintElement = function (element, indent) {
19056         var name = element.findAttribute('name');
19057         // special case: a simple label
19058         if (element instanceof LabelElement || name === '\u2026') {
19059             this.writeLine(indent, name);
19060             return;
19061         }
19062         // the real deal
19063         var content = ['<'];
19064         // element name
19065         if (name) {
19066             content.push(name);
19067         }
19068         else {
19069             content.push('element');
19070         }
19071         // attributes
19072         if (element.attributes) {
19073             for (var _i = 0, _a = element.attributes; _i < _a.length; _i++) {
19074                 var attr = _a[_i];
19075                 if (attr.name !== 'name') {
19076                     content.push(' ');
19077                     content.push(attr.name);
19078                     var value = attr.value;
19079                     if (value) {
19080                         content.push('=');
19081                         content.push(quotes.ensure(value, this.quote));
19082                     }
19083                 }
19084             }
19085         }
19086         content.push('>');
19087         this.writeLine(indent, content.join(''));
19088     };
19089     return MarkedStringPrinter;
19090 }());
19091 var quotes;
19092 (function (quotes) {
19093     function ensure(value, which) {
19094         return which + remove(value) + which;
19095     }
19096     quotes.ensure = ensure;
19097     function remove(value) {
19098         var match = value.match(/^['"](.*)["']$/);
19099         if (match) {
19100             return match[1];
19101         }
19102         return value;
19103     }
19104     quotes.remove = remove;
19105 })(quotes || (quotes = {}));
19106 var Specificity = /** @class */ (function () {
19107     function Specificity() {
19108         /** Count of identifiers (e.g., `#app`) */
19109         this.id = 0;
19110         /** Count of attributes (`[type="number"]`), classes (`.container-fluid`), and pseudo-classes (`:hover`) */
19111         this.attr = 0;
19112         /** Count of tag names (`div`), and pseudo-elements (`::before`) */
19113         this.tag = 0;
19114     }
19115     return Specificity;
19116 }());
19117 function toElement(node, parentElement) {
19118     var result = new Element();
19119     for (var _i = 0, _a = node.getChildren(); _i < _a.length; _i++) {
19120         var child = _a[_i];
19121         switch (child.type) {
19122             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinator:
19123                 if (parentElement) {
19124                     var segments = child.getText().split('&');
19125                     if (segments.length === 1) {
19126                         // should not happen
19127                         result.addAttr('name', segments[0]);
19128                         break;
19129                     }
19130                     result = parentElement.cloneWithParent();
19131                     if (segments[0]) {
19132                         var root = result.findRoot();
19133                         root.prepend(segments[0]);
19134                     }
19135                     for (var i = 1; i < segments.length; i++) {
19136                         if (i > 1) {
19137                             var clone = parentElement.cloneWithParent();
19138                             result.addChild(clone.findRoot());
19139                             result = clone;
19140                         }
19141                         result.append(segments[i]);
19142                     }
19143                 }
19144                 break;
19145             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorPlaceholder:
19146                 if (child.matches('@at-root')) {
19147                     return result;
19148                 }
19149             // fall through
19150             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ElementNameSelector:
19151                 var text = child.getText();
19152                 result.addAttr('name', text === '*' ? 'element' : unescape(text));
19153                 break;
19154             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ClassSelector:
19155                 result.addAttr('class', unescape(child.getText().substring(1)));
19156                 break;
19157             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.IdentifierSelector:
19158                 result.addAttr('id', unescape(child.getText().substring(1)));
19159                 break;
19160             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.MixinDeclaration:
19161                 result.addAttr('class', child.getName());
19162                 break;
19163             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.PseudoSelector:
19164                 result.addAttr(unescape(child.getText()), '');
19165                 break;
19166             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.AttributeSelector:
19167                 var selector = child;
19168                 var identifier = selector.getIdentifier();
19169                 if (identifier) {
19170                     var expression = selector.getValue();
19171                     var operator = selector.getOperator();
19172                     var value = void 0;
19173                     if (expression && operator) {
19174                         switch (unescape(operator.getText())) {
19175                             case '|=':
19176                                 // excatly or followed by -words
19177                                 value = quotes.remove(unescape(expression.getText())) + "-\u2026";
19178                                 break;
19179                             case '^=':
19180                                 // prefix
19181                                 value = quotes.remove(unescape(expression.getText())) + "\u2026";
19182                                 break;
19183                             case '$=':
19184                                 // suffix
19185                                 value = "\u2026" + quotes.remove(unescape(expression.getText()));
19186                                 break;
19187                             case '~=':
19188                                 // one of a list of words
19189                                 value = " \u2026 " + quotes.remove(unescape(expression.getText())) + " \u2026 ";
19190                                 break;
19191                             case '*=':
19192                                 // substring
19193                                 value = "\u2026" + quotes.remove(unescape(expression.getText())) + "\u2026";
19194                                 break;
19195                             default:
19196                                 value = quotes.remove(unescape(expression.getText()));
19197                                 break;
19198                         }
19199                     }
19200                     result.addAttr(unescape(identifier.getText()), value);
19201                 }
19202                 break;
19203         }
19204     }
19205     return result;
19206 }
19207 function unescape(content) {
19208     var scanner = new _parser_cssScanner__WEBPACK_IMPORTED_MODULE_1__.Scanner();
19209     scanner.setSource(content);
19210     var token = scanner.scanUnquotedString();
19211     if (token) {
19212         return token.text;
19213     }
19214     return content;
19215 }
19216 var SelectorPrinting = /** @class */ (function () {
19217     function SelectorPrinting(cssDataManager) {
19218         this.cssDataManager = cssDataManager;
19219     }
19220     SelectorPrinting.prototype.selectorToMarkedString = function (node) {
19221         var root = selectorToElement(node);
19222         if (root) {
19223             var markedStrings = new MarkedStringPrinter('"').print(root);
19224             markedStrings.push(this.selectorToSpecificityMarkedString(node));
19225             return markedStrings;
19226         }
19227         else {
19228             return [];
19229         }
19230     };
19231     SelectorPrinting.prototype.simpleSelectorToMarkedString = function (node) {
19232         var element = toElement(node);
19233         var markedStrings = new MarkedStringPrinter('"').print(element);
19234         markedStrings.push(this.selectorToSpecificityMarkedString(node));
19235         return markedStrings;
19236     };
19237     SelectorPrinting.prototype.isPseudoElementIdentifier = function (text) {
19238         var match = text.match(/^::?([\w-]+)/);
19239         if (!match) {
19240             return false;
19241         }
19242         return !!this.cssDataManager.getPseudoElement("::" + match[1]);
19243     };
19244     SelectorPrinting.prototype.selectorToSpecificityMarkedString = function (node) {
19245         var _this = this;
19246         //https://www.w3.org/TR/selectors-3/#specificity
19247         var calculateScore = function (node) {
19248             for (var _i = 0, _a = node.getChildren(); _i < _a.length; _i++) {
19249                 var element = _a[_i];
19250                 switch (element.type) {
19251                     case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.IdentifierSelector:
19252                         specificity.id++;
19253                         break;
19254                     case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ClassSelector:
19255                     case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.AttributeSelector:
19256                         specificity.attr++;
19257                         break;
19258                     case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.ElementNameSelector:
19259                         //ignore universal selector
19260                         if (element.matches("*")) {
19261                             break;
19262                         }
19263                         specificity.tag++;
19264                         break;
19265                     case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.PseudoSelector:
19266                         var text = element.getText();
19267                         if (_this.isPseudoElementIdentifier(text)) {
19268                             specificity.tag++; // pseudo element
19269                         }
19270                         else {
19271                             //ignore psuedo class NOT
19272                             if (text.match(/^:not/i)) {
19273                                 break;
19274                             }
19275                             specificity.attr++; //pseudo class
19276                         }
19277                         break;
19278                 }
19279                 if (element.getChildren().length > 0) {
19280                     calculateScore(element);
19281                 }
19282             }
19283         };
19284         var specificity = new Specificity();
19285         calculateScore(node);
19286         return localize('specificity', "[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})", specificity.id, specificity.attr, specificity.tag);
19287     };
19288     return SelectorPrinting;
19289 }());
19290
19291 var SelectorElementBuilder = /** @class */ (function () {
19292     function SelectorElementBuilder(element) {
19293         this.prev = null;
19294         this.element = element;
19295     }
19296     SelectorElementBuilder.prototype.processSelector = function (selector) {
19297         var parentElement = null;
19298         if (!(this.element instanceof RootElement)) {
19299             if (selector.getChildren().some(function (c) { return c.hasChildren() && c.getChild(0).type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinator; })) {
19300                 var curr = this.element.findRoot();
19301                 if (curr.parent instanceof RootElement) {
19302                     parentElement = this.element;
19303                     this.element = curr.parent;
19304                     this.element.removeChild(curr);
19305                     this.prev = null;
19306                 }
19307             }
19308         }
19309         for (var _i = 0, _a = selector.getChildren(); _i < _a.length; _i++) {
19310             var selectorChild = _a[_i];
19311             if (selectorChild instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SimpleSelector) {
19312                 if (this.prev instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SimpleSelector) {
19313                     var labelElement = new LabelElement('\u2026');
19314                     this.element.addChild(labelElement);
19315                     this.element = labelElement;
19316                 }
19317                 else if (this.prev && (this.prev.matches('+') || this.prev.matches('~')) && this.element.parent) {
19318                     this.element = this.element.parent;
19319                 }
19320                 if (this.prev && this.prev.matches('~')) {
19321                     this.element.addChild(toElement(selectorChild));
19322                     this.element.addChild(new LabelElement('\u22EE'));
19323                 }
19324                 var thisElement = toElement(selectorChild, parentElement);
19325                 var root = thisElement.findRoot();
19326                 this.element.addChild(root);
19327                 this.element = thisElement;
19328             }
19329             if (selectorChild instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.SimpleSelector ||
19330                 selectorChild.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinatorParent ||
19331                 selectorChild.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinatorShadowPiercingDescendant ||
19332                 selectorChild.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinatorSibling ||
19333                 selectorChild.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.SelectorCombinatorAllSiblings) {
19334                 this.prev = selectorChild;
19335             }
19336         }
19337     };
19338     return SelectorElementBuilder;
19339 }());
19340 function isNewSelectorContext(node) {
19341     switch (node.type) {
19342         case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.MixinDeclaration:
19343         case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.NodeType.Stylesheet:
19344             return true;
19345     }
19346     return false;
19347 }
19348 function selectorToElement(node) {
19349     if (node.matches('@at-root')) {
19350         return null;
19351     }
19352     var root = new RootElement();
19353     var parentRuleSets = [];
19354     var ruleSet = node.getParent();
19355     if (ruleSet instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.RuleSet) {
19356         var parent = ruleSet.getParent(); // parent of the selector's ruleset
19357         while (parent && !isNewSelectorContext(parent)) {
19358             if (parent instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.RuleSet) {
19359                 if (parent.getSelectors().matches('@at-root')) {
19360                     break;
19361                 }
19362                 parentRuleSets.push(parent);
19363             }
19364             parent = parent.getParent();
19365         }
19366     }
19367     var builder = new SelectorElementBuilder(root);
19368     for (var i = parentRuleSets.length - 1; i >= 0; i--) {
19369         var selector = parentRuleSets[i].getSelectors().getChild(0);
19370         if (selector) {
19371             builder.processSelector(selector);
19372         }
19373     }
19374     builder.processSelector(node);
19375     return root;
19376 }
19377
19378
19379 /***/ }),
19380 /* 87 */
19381 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19382
19383 __webpack_require__.r(__webpack_exports__);
19384 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19385 /* harmony export */   "CSSNavigation": () => /* binding */ CSSNavigation
19386 /* harmony export */ });
19387 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79);
19388 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68);
19389 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(65);
19390 /* harmony import */ var _parser_cssSymbolScope__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(77);
19391 /* harmony import */ var _languageFacts_facts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(71);
19392 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(66);
19393 /* harmony import */ var _utils_resources__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83);
19394 /*---------------------------------------------------------------------------------------------
19395  *  Copyright (c) Microsoft Corporation. All rights reserved.
19396  *  Licensed under the MIT License. See License.txt in the project root for license information.
19397  *--------------------------------------------------------------------------------------------*/
19398
19399 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
19400     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19401     return new (P || (P = Promise))(function (resolve, reject) {
19402         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19403         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19404         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19405         step((generator = generator.apply(thisArg, _arguments || [])).next());
19406     });
19407 };
19408 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
19409     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
19410     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
19411     function verb(n) { return function (v) { return step([n, v]); }; }
19412     function step(op) {
19413         if (f) throw new TypeError("Generator is already executing.");
19414         while (_) try {
19415             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19416             if (y = 0, t) op = [op[0] & 2, t.value];
19417             switch (op[0]) {
19418                 case 0: case 1: t = op; break;
19419                 case 4: _.label++; return { value: op[1], done: false };
19420                 case 5: _.label++; y = op[1]; op = [0]; continue;
19421                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
19422                 default:
19423                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
19424                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
19425                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
19426                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
19427                     if (t[2]) _.ops.pop();
19428                     _.trys.pop(); continue;
19429             }
19430             op = body.call(thisArg, _);
19431         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
19432         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
19433     }
19434 };
19435
19436
19437
19438
19439
19440
19441
19442 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_1__.loadMessageBundle();
19443 var CSSNavigation = /** @class */ (function () {
19444     function CSSNavigation(fileSystemProvider) {
19445         this.fileSystemProvider = fileSystemProvider;
19446     }
19447     CSSNavigation.prototype.findDefinition = function (document, position, stylesheet) {
19448         var symbols = new _parser_cssSymbolScope__WEBPACK_IMPORTED_MODULE_3__.Symbols(stylesheet);
19449         var offset = document.offsetAt(position);
19450         var node = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.getNodeAtOffset(stylesheet, offset);
19451         if (!node) {
19452             return null;
19453         }
19454         var symbol = symbols.findSymbolFromNode(node);
19455         if (!symbol) {
19456             return null;
19457         }
19458         return {
19459             uri: document.uri,
19460             range: getRange(symbol.node, document)
19461         };
19462     };
19463     CSSNavigation.prototype.findReferences = function (document, position, stylesheet) {
19464         var highlights = this.findDocumentHighlights(document, position, stylesheet);
19465         return highlights.map(function (h) {
19466             return {
19467                 uri: document.uri,
19468                 range: h.range
19469             };
19470         });
19471     };
19472     CSSNavigation.prototype.findDocumentHighlights = function (document, position, stylesheet) {
19473         var result = [];
19474         var offset = document.offsetAt(position);
19475         var node = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.getNodeAtOffset(stylesheet, offset);
19476         if (!node || node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Stylesheet || node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Declarations) {
19477             return result;
19478         }
19479         if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Identifier && node.parent && node.parent.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.ClassSelector) {
19480             node = node.parent;
19481         }
19482         var symbols = new _parser_cssSymbolScope__WEBPACK_IMPORTED_MODULE_3__.Symbols(stylesheet);
19483         var symbol = symbols.findSymbolFromNode(node);
19484         var name = node.getText();
19485         stylesheet.accept(function (candidate) {
19486             if (symbol) {
19487                 if (symbols.matchesSymbol(candidate, symbol)) {
19488                     result.push({
19489                         kind: getHighlightKind(candidate),
19490                         range: getRange(candidate, document)
19491                     });
19492                     return false;
19493                 }
19494             }
19495             else if (node && node.type === candidate.type && candidate.matches(name)) {
19496                 // Same node type and data
19497                 result.push({
19498                     kind: getHighlightKind(candidate),
19499                     range: getRange(candidate, document)
19500                 });
19501             }
19502             return true;
19503         });
19504         return result;
19505     };
19506     CSSNavigation.prototype.isRawStringDocumentLinkNode = function (node) {
19507         return node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Import;
19508     };
19509     CSSNavigation.prototype.findDocumentLinks = function (document, stylesheet, documentContext) {
19510         var links = this.findUnresolvedLinks(document, stylesheet);
19511         for (var i = 0; i < links.length; i++) {
19512             var target = links[i].target;
19513             if (target && !(/^\w+:\/\//g.test(target))) {
19514                 var resolved = documentContext.resolveReference(target, document.uri);
19515                 if (resolved) {
19516                     links[i].target = resolved;
19517                 }
19518             }
19519         }
19520         return links;
19521     };
19522     CSSNavigation.prototype.findDocumentLinks2 = function (document, stylesheet, documentContext) {
19523         return __awaiter(this, void 0, void 0, function () {
19524             var links, resolvedLinks, _i, links_1, link, target, resolvedTarget;
19525             return __generator(this, function (_a) {
19526                 switch (_a.label) {
19527                     case 0:
19528                         links = this.findUnresolvedLinks(document, stylesheet);
19529                         resolvedLinks = [];
19530                         _i = 0, links_1 = links;
19531                         _a.label = 1;
19532                     case 1:
19533                         if (!(_i < links_1.length)) return [3 /*break*/, 5];
19534                         link = links_1[_i];
19535                         target = link.target;
19536                         if (!(target && !(/^\w+:\/\//g.test(target)))) return [3 /*break*/, 3];
19537                         return [4 /*yield*/, this.resolveRelativeReference(target, document.uri, documentContext)];
19538                     case 2:
19539                         resolvedTarget = _a.sent();
19540                         if (resolvedTarget !== undefined) {
19541                             link.target = resolvedTarget;
19542                             resolvedLinks.push(link);
19543                         }
19544                         return [3 /*break*/, 4];
19545                     case 3:
19546                         resolvedLinks.push(link);
19547                         _a.label = 4;
19548                     case 4:
19549                         _i++;
19550                         return [3 /*break*/, 1];
19551                     case 5: return [2 /*return*/, resolvedLinks];
19552                 }
19553             });
19554         });
19555     };
19556     CSSNavigation.prototype.findUnresolvedLinks = function (document, stylesheet) {
19557         var _this = this;
19558         var result = [];
19559         var collect = function (uriStringNode) {
19560             var rawUri = uriStringNode.getText();
19561             var range = getRange(uriStringNode, document);
19562             // Make sure the range is not empty
19563             if (range.start.line === range.end.line && range.start.character === range.end.character) {
19564                 return;
19565             }
19566             if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_6__.startsWith)(rawUri, "'") || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_6__.startsWith)(rawUri, "\"")) {
19567                 rawUri = rawUri.slice(1, -1);
19568             }
19569             result.push({ target: rawUri, range: range });
19570         };
19571         stylesheet.accept(function (candidate) {
19572             if (candidate.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.URILiteral) {
19573                 var first = candidate.getChild(0);
19574                 if (first) {
19575                     collect(first);
19576                 }
19577                 return false;
19578             }
19579             /**
19580              * In @import, it is possible to include links that do not use `url()`
19581              * For example, `@import 'foo.css';`
19582              */
19583             if (candidate.parent && _this.isRawStringDocumentLinkNode(candidate.parent)) {
19584                 var rawText = candidate.getText();
19585                 if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_6__.startsWith)(rawText, "'") || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_6__.startsWith)(rawText, "\"")) {
19586                     collect(candidate);
19587                 }
19588                 return false;
19589             }
19590             return true;
19591         });
19592         return result;
19593     };
19594     CSSNavigation.prototype.findDocumentSymbols = function (document, stylesheet) {
19595         var result = [];
19596         stylesheet.accept(function (node) {
19597             var entry = {
19598                 name: null,
19599                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Class,
19600                 location: null
19601             };
19602             var locationNode = node;
19603             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Selector) {
19604                 entry.name = node.getText();
19605                 locationNode = node.findAParent(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Ruleset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.ExtendsReference);
19606                 if (locationNode) {
19607                     entry.location = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Location.create(document.uri, getRange(locationNode, document));
19608                     result.push(entry);
19609                 }
19610                 return false;
19611             }
19612             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.VariableDeclaration) {
19613                 entry.name = node.getName();
19614                 entry.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Variable;
19615             }
19616             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.MixinDeclaration) {
19617                 entry.name = node.getName();
19618                 entry.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Method;
19619             }
19620             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.FunctionDeclaration) {
19621                 entry.name = node.getName();
19622                 entry.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Function;
19623             }
19624             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Keyframe) {
19625                 entry.name = localize('literal.keyframes', "@keyframes {0}", node.getName());
19626             }
19627             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.FontFace) {
19628                 entry.name = localize('literal.fontface', "@font-face");
19629             }
19630             else if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Media) {
19631                 var mediaList = node.getChild(0);
19632                 if (mediaList instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Medialist) {
19633                     entry.name = '@media ' + mediaList.getText();
19634                     entry.kind = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Module;
19635                 }
19636             }
19637             if (entry.name) {
19638                 entry.location = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Location.create(document.uri, getRange(locationNode, document));
19639                 result.push(entry);
19640             }
19641             return true;
19642         });
19643         return result;
19644     };
19645     CSSNavigation.prototype.findDocumentColors = function (document, stylesheet) {
19646         var result = [];
19647         stylesheet.accept(function (node) {
19648             var colorInfo = getColorInformation(node, document);
19649             if (colorInfo) {
19650                 result.push(colorInfo);
19651             }
19652             return true;
19653         });
19654         return result;
19655     };
19656     CSSNavigation.prototype.getColorPresentations = function (document, stylesheet, color, range) {
19657         var result = [];
19658         var red256 = Math.round(color.red * 255), green256 = Math.round(color.green * 255), blue256 = Math.round(color.blue * 255);
19659         var label;
19660         if (color.alpha === 1) {
19661             label = "rgb(" + red256 + ", " + green256 + ", " + blue256 + ")";
19662         }
19663         else {
19664             label = "rgba(" + red256 + ", " + green256 + ", " + blue256 + ", " + color.alpha + ")";
19665         }
19666         result.push({ label: label, textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, label) });
19667         if (color.alpha === 1) {
19668             label = "#" + toTwoDigitHex(red256) + toTwoDigitHex(green256) + toTwoDigitHex(blue256);
19669         }
19670         else {
19671             label = "#" + toTwoDigitHex(red256) + toTwoDigitHex(green256) + toTwoDigitHex(blue256) + toTwoDigitHex(Math.round(color.alpha * 255));
19672         }
19673         result.push({ label: label, textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, label) });
19674         var hsl = (0,_languageFacts_facts__WEBPACK_IMPORTED_MODULE_4__.hslFromColor)(color);
19675         if (hsl.a === 1) {
19676             label = "hsl(" + hsl.h + ", " + Math.round(hsl.s * 100) + "%, " + Math.round(hsl.l * 100) + "%)";
19677         }
19678         else {
19679             label = "hsla(" + hsl.h + ", " + Math.round(hsl.s * 100) + "%, " + Math.round(hsl.l * 100) + "%, " + hsl.a + ")";
19680         }
19681         result.push({ label: label, textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, label) });
19682         return result;
19683     };
19684     CSSNavigation.prototype.doRename = function (document, position, newName, stylesheet) {
19685         var _a;
19686         var highlights = this.findDocumentHighlights(document, position, stylesheet);
19687         var edits = highlights.map(function (h) { return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(h.range, newName); });
19688         return {
19689             changes: (_a = {}, _a[document.uri] = edits, _a)
19690         };
19691     };
19692     CSSNavigation.prototype.resolveRelativeReference = function (ref, documentUri, documentContext) {
19693         return __awaiter(this, void 0, void 0, function () {
19694             var moduleName, rootFolderUri, documentFolderUri, modulePath, pathWithinModule;
19695             return __generator(this, function (_a) {
19696                 switch (_a.label) {
19697                     case 0:
19698                         if (!(ref[0] === '~' && ref[1] !== '/' && this.fileSystemProvider)) return [3 /*break*/, 3];
19699                         ref = ref.substring(1);
19700                         if (!(0,_utils_strings__WEBPACK_IMPORTED_MODULE_6__.startsWith)(documentUri, 'file://')) return [3 /*break*/, 2];
19701                         moduleName = getModuleNameFromPath(ref);
19702                         rootFolderUri = documentContext.resolveReference('/', documentUri);
19703                         documentFolderUri = (0,_utils_resources__WEBPACK_IMPORTED_MODULE_5__.dirname)(documentUri);
19704                         return [4 /*yield*/, this.resolvePathToModule(moduleName, documentFolderUri, rootFolderUri)];
19705                     case 1:
19706                         modulePath = _a.sent();
19707                         if (modulePath) {
19708                             pathWithinModule = ref.substring(moduleName.length + 1);
19709                             return [2 /*return*/, (0,_utils_resources__WEBPACK_IMPORTED_MODULE_5__.joinPath)(modulePath, pathWithinModule)];
19710                         }
19711                         _a.label = 2;
19712                     case 2: return [2 /*return*/, documentContext.resolveReference(ref, documentUri)];
19713                     case 3: return [2 /*return*/, documentContext.resolveReference(ref, documentUri)];
19714                 }
19715             });
19716         });
19717     };
19718     CSSNavigation.prototype.resolvePathToModule = function (_moduleName, documentFolderUri, rootFolderUri) {
19719         return __awaiter(this, void 0, void 0, function () {
19720             var packPath;
19721             return __generator(this, function (_a) {
19722                 switch (_a.label) {
19723                     case 0:
19724                         packPath = (0,_utils_resources__WEBPACK_IMPORTED_MODULE_5__.joinPath)(documentFolderUri, 'node_modules', _moduleName, 'package.json');
19725                         return [4 /*yield*/, this.fileExists(packPath)];
19726                     case 1:
19727                         if (_a.sent()) {
19728                             return [2 /*return*/, (0,_utils_resources__WEBPACK_IMPORTED_MODULE_5__.dirname)(packPath)];
19729                         }
19730                         else if (rootFolderUri && documentFolderUri.startsWith(rootFolderUri) && (documentFolderUri.length !== rootFolderUri.length)) {
19731                             return [2 /*return*/, this.resolvePathToModule(_moduleName, (0,_utils_resources__WEBPACK_IMPORTED_MODULE_5__.dirname)(documentFolderUri), rootFolderUri)];
19732                         }
19733                         return [2 /*return*/, undefined];
19734                 }
19735             });
19736         });
19737     };
19738     CSSNavigation.prototype.fileExists = function (uri) {
19739         return __awaiter(this, void 0, void 0, function () {
19740             var stat, err_1;
19741             return __generator(this, function (_a) {
19742                 switch (_a.label) {
19743                     case 0:
19744                         if (!this.fileSystemProvider) {
19745                             return [2 /*return*/, false];
19746                         }
19747                         _a.label = 1;
19748                     case 1:
19749                         _a.trys.push([1, 3, , 4]);
19750                         return [4 /*yield*/, this.fileSystemProvider.stat(uri)];
19751                     case 2:
19752                         stat = _a.sent();
19753                         if (stat.type === _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.FileType.Unknown && stat.size === -1) {
19754                             return [2 /*return*/, false];
19755                         }
19756                         return [2 /*return*/, true];
19757                     case 3:
19758                         err_1 = _a.sent();
19759                         return [2 /*return*/, false];
19760                     case 4: return [2 /*return*/];
19761                 }
19762             });
19763         });
19764     };
19765     return CSSNavigation;
19766 }());
19767
19768 function getColorInformation(node, document) {
19769     var color = (0,_languageFacts_facts__WEBPACK_IMPORTED_MODULE_4__.getColorValue)(node);
19770     if (color) {
19771         var range = getRange(node, document);
19772         return { color: color, range: range };
19773     }
19774     return null;
19775 }
19776 function getRange(node, document) {
19777     return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(node.offset), document.positionAt(node.end));
19778 }
19779 function getHighlightKind(node) {
19780     if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Selector) {
19781         return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind.Write;
19782     }
19783     if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Identifier) {
19784         if (node.parent && node.parent instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Property) {
19785             if (node.isCustomProperty) {
19786                 return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind.Write;
19787             }
19788         }
19789     }
19790     if (node.parent) {
19791         switch (node.parent.type) {
19792             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.FunctionDeclaration:
19793             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.MixinDeclaration:
19794             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Keyframe:
19795             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.VariableDeclaration:
19796             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.FunctionParameter:
19797                 return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind.Write;
19798         }
19799     }
19800     return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind.Read;
19801 }
19802 function toTwoDigitHex(n) {
19803     var r = n.toString(16);
19804     return r.length !== 2 ? '0' + r : r;
19805 }
19806 function getModuleNameFromPath(path) {
19807     // If a scoped module (starts with @) then get up until second instance of '/', otherwise get until first instance of '/'
19808     if (path[0] === '@') {
19809         return path.substring(0, path.indexOf('/', path.indexOf('/') + 1));
19810     }
19811     return path.substring(0, path.indexOf('/'));
19812 }
19813
19814
19815 /***/ }),
19816 /* 88 */
19817 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19818
19819 __webpack_require__.r(__webpack_exports__);
19820 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19821 /* harmony export */   "CSSCodeActions": () => /* binding */ CSSCodeActions
19822 /* harmony export */ });
19823 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
19824 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66);
19825 /* harmony import */ var _services_lintRules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
19826 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(79);
19827 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(68);
19828 /*---------------------------------------------------------------------------------------------
19829  *  Copyright (c) Microsoft Corporation. All rights reserved.
19830  *  Licensed under the MIT License. See License.txt in the project root for license information.
19831  *--------------------------------------------------------------------------------------------*/
19832
19833
19834
19835
19836
19837
19838 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_3__.loadMessageBundle();
19839 var CSSCodeActions = /** @class */ (function () {
19840     function CSSCodeActions(cssDataManager) {
19841         this.cssDataManager = cssDataManager;
19842     }
19843     CSSCodeActions.prototype.doCodeActions = function (document, range, context, stylesheet) {
19844         return this.doCodeActions2(document, range, context, stylesheet).map(function (ca) {
19845             var textDocumentEdit = ca.edit && ca.edit.documentChanges && ca.edit.documentChanges[0];
19846             return _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.Command.create(ca.title, '_css.applyCodeAction', document.uri, document.version, textDocumentEdit && textDocumentEdit.edits);
19847         });
19848     };
19849     CSSCodeActions.prototype.doCodeActions2 = function (document, range, context, stylesheet) {
19850         var result = [];
19851         if (context.diagnostics) {
19852             for (var _i = 0, _a = context.diagnostics; _i < _a.length; _i++) {
19853                 var diagnostic = _a[_i];
19854                 this.appendFixesForMarker(document, stylesheet, diagnostic, result);
19855             }
19856         }
19857         return result;
19858     };
19859     CSSCodeActions.prototype.getFixesForUnknownProperty = function (document, property, marker, result) {
19860         var propertyName = property.getName();
19861         var candidates = [];
19862         this.cssDataManager.getProperties().forEach(function (p) {
19863             var score = (0,_utils_strings__WEBPACK_IMPORTED_MODULE_4__.difference)(propertyName, p.name);
19864             if (score >= propertyName.length / 2 /*score_lim*/) {
19865                 candidates.push({ property: p.name, score: score });
19866             }
19867         });
19868         // Sort in descending order.
19869         candidates.sort(function (a, b) {
19870             return b.score - a.score || a.property.localeCompare(b.property);
19871         });
19872         var maxActions = 3;
19873         for (var _i = 0, candidates_1 = candidates; _i < candidates_1.length; _i++) {
19874             var candidate = candidates_1[_i];
19875             var propertyName_1 = candidate.property;
19876             var title = localize('css.codeaction.rename', "Rename to '{0}'", propertyName_1);
19877             var edit = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TextEdit.replace(marker.range, propertyName_1);
19878             var documentIdentifier = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.VersionedTextDocumentIdentifier.create(document.uri, document.version);
19879             var workspaceEdit = { documentChanges: [_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TextDocumentEdit.create(documentIdentifier, [edit])] };
19880             var codeAction = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CodeAction.create(title, workspaceEdit, _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CodeActionKind.QuickFix);
19881             codeAction.diagnostics = [marker];
19882             result.push(codeAction);
19883             if (--maxActions <= 0) {
19884                 return;
19885             }
19886         }
19887     };
19888     CSSCodeActions.prototype.appendFixesForMarker = function (document, stylesheet, marker, result) {
19889         if (marker.code !== _services_lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.UnknownProperty.id) {
19890             return;
19891         }
19892         var offset = document.offsetAt(marker.range.start);
19893         var end = document.offsetAt(marker.range.end);
19894         var nodepath = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.getNodePath(stylesheet, offset);
19895         for (var i = nodepath.length - 1; i >= 0; i--) {
19896             var node = nodepath[i];
19897             if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Declaration) {
19898                 var property = node.getProperty();
19899                 if (property && property.offset === offset && property.end === end) {
19900                     this.getFixesForUnknownProperty(document, property, marker, result);
19901                     return;
19902                 }
19903             }
19904         }
19905     };
19906     return CSSCodeActions;
19907 }());
19908
19909
19910
19911 /***/ }),
19912 /* 89 */
19913 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
19914
19915 __webpack_require__.r(__webpack_exports__);
19916 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
19917 /* harmony export */   "Rule": () => /* binding */ Rule,
19918 /* harmony export */   "Setting": () => /* binding */ Setting,
19919 /* harmony export */   "Rules": () => /* binding */ Rules,
19920 /* harmony export */   "Settings": () => /* binding */ Settings,
19921 /* harmony export */   "LintConfigurationSettings": () => /* binding */ LintConfigurationSettings
19922 /* harmony export */ });
19923 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
19924 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68);
19925 /*---------------------------------------------------------------------------------------------
19926  *  Copyright (c) Microsoft Corporation. All rights reserved.
19927  *  Licensed under the MIT License. See License.txt in the project root for license information.
19928  *--------------------------------------------------------------------------------------------*/
19929
19930
19931
19932 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_1__.loadMessageBundle();
19933 var Warning = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Warning;
19934 var Error = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Error;
19935 var Ignore = _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Ignore;
19936 var Rule = /** @class */ (function () {
19937     function Rule(id, message, defaultValue) {
19938         this.id = id;
19939         this.message = message;
19940         this.defaultValue = defaultValue;
19941         // nothing to do
19942     }
19943     return Rule;
19944 }());
19945
19946 var Setting = /** @class */ (function () {
19947     function Setting(id, message, defaultValue) {
19948         this.id = id;
19949         this.message = message;
19950         this.defaultValue = defaultValue;
19951         // nothing to do
19952     }
19953     return Setting;
19954 }());
19955
19956 var Rules = {
19957     AllVendorPrefixes: new Rule('compatibleVendorPrefixes', localize('rule.vendorprefixes.all', "When using a vendor-specific prefix make sure to also include all other vendor-specific properties"), Ignore),
19958     IncludeStandardPropertyWhenUsingVendorPrefix: new Rule('vendorPrefix', localize('rule.standardvendorprefix.all', "When using a vendor-specific prefix also include the standard property"), Warning),
19959     DuplicateDeclarations: new Rule('duplicateProperties', localize('rule.duplicateDeclarations', "Do not use duplicate style definitions"), Ignore),
19960     EmptyRuleSet: new Rule('emptyRules', localize('rule.emptyRuleSets', "Do not use empty rulesets"), Warning),
19961     ImportStatemement: new Rule('importStatement', localize('rule.importDirective', "Import statements do not load in parallel"), Ignore),
19962     BewareOfBoxModelSize: new Rule('boxModel', localize('rule.bewareOfBoxModelSize', "Do not use width or height when using padding or border"), Ignore),
19963     UniversalSelector: new Rule('universalSelector', localize('rule.universalSelector', "The universal selector (*) is known to be slow"), Ignore),
19964     ZeroWithUnit: new Rule('zeroUnits', localize('rule.zeroWidthUnit', "No unit for zero needed"), Ignore),
19965     RequiredPropertiesForFontFace: new Rule('fontFaceProperties', localize('rule.fontFaceProperties', "@font-face rule must define 'src' and 'font-family' properties"), Warning),
19966     HexColorLength: new Rule('hexColorLength', localize('rule.hexColor', "Hex colors must consist of three, four, six or eight hex numbers"), Error),
19967     ArgsInColorFunction: new Rule('argumentsInColorFunction', localize('rule.colorFunction', "Invalid number of parameters"), Error),
19968     UnknownProperty: new Rule('unknownProperties', localize('rule.unknownProperty', "Unknown property."), Warning),
19969     UnknownAtRules: new Rule('unknownAtRules', localize('rule.unknownAtRules', "Unknown at-rule."), Warning),
19970     IEStarHack: new Rule('ieHack', localize('rule.ieHack', "IE hacks are only necessary when supporting IE7 and older"), Ignore),
19971     UnknownVendorSpecificProperty: new Rule('unknownVendorSpecificProperties', localize('rule.unknownVendorSpecificProperty', "Unknown vendor specific property."), Ignore),
19972     PropertyIgnoredDueToDisplay: new Rule('propertyIgnoredDueToDisplay', localize('rule.propertyIgnoredDueToDisplay', "Property is ignored due to the display."), Warning),
19973     AvoidImportant: new Rule('important', localize('rule.avoidImportant', "Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."), Ignore),
19974     AvoidFloat: new Rule('float', localize('rule.avoidFloat', "Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."), Ignore),
19975     AvoidIdSelector: new Rule('idSelector', localize('rule.avoidIdSelector', "Selectors should not contain IDs because these rules are too tightly coupled with the HTML."), Ignore),
19976 };
19977 var Settings = {
19978     ValidProperties: new Setting('validProperties', localize('rule.validProperties', "A list of properties that are not validated against the `unknownProperties` rule."), [])
19979 };
19980 var LintConfigurationSettings = /** @class */ (function () {
19981     function LintConfigurationSettings(conf) {
19982         if (conf === void 0) { conf = {}; }
19983         this.conf = conf;
19984     }
19985     LintConfigurationSettings.prototype.getRule = function (rule) {
19986         if (this.conf.hasOwnProperty(rule.id)) {
19987             var level = toLevel(this.conf[rule.id]);
19988             if (level) {
19989                 return level;
19990             }
19991         }
19992         return rule.defaultValue;
19993     };
19994     LintConfigurationSettings.prototype.getSetting = function (setting) {
19995         return this.conf[setting.id];
19996     };
19997     return LintConfigurationSettings;
19998 }());
19999
20000 function toLevel(level) {
20001     switch (level) {
20002         case 'ignore': return _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Ignore;
20003         case 'warning': return _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Warning;
20004         case 'error': return _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Error;
20005     }
20006     return null;
20007 }
20008
20009
20010 /***/ }),
20011 /* 90 */
20012 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20013
20014 __webpack_require__.r(__webpack_exports__);
20015 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
20016 /* harmony export */   "CSSValidation": () => /* binding */ CSSValidation
20017 /* harmony export */ });
20018 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65);
20019 /* harmony import */ var _lintRules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
20020 /* harmony import */ var _lint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(91);
20021 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(79);
20022 /*---------------------------------------------------------------------------------------------
20023  *  Copyright (c) Microsoft Corporation. All rights reserved.
20024  *  Licensed under the MIT License. See License.txt in the project root for license information.
20025  *--------------------------------------------------------------------------------------------*/
20026
20027
20028
20029
20030
20031 var CSSValidation = /** @class */ (function () {
20032     function CSSValidation(cssDataManager) {
20033         this.cssDataManager = cssDataManager;
20034     }
20035     CSSValidation.prototype.configure = function (settings) {
20036         this.settings = settings;
20037     };
20038     CSSValidation.prototype.doValidation = function (document, stylesheet, settings) {
20039         if (settings === void 0) { settings = this.settings; }
20040         if (settings && settings.validate === false) {
20041             return [];
20042         }
20043         var entries = [];
20044         entries.push.apply(entries, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.ParseErrorCollector.entries(stylesheet));
20045         entries.push.apply(entries, _lint__WEBPACK_IMPORTED_MODULE_2__.LintVisitor.entries(stylesheet, document, new _lintRules__WEBPACK_IMPORTED_MODULE_1__.LintConfigurationSettings(settings && settings.lint), this.cssDataManager));
20046         var ruleIds = [];
20047         for (var r in _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules) {
20048             ruleIds.push(_lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules[r].id);
20049         }
20050         function toDiagnostic(marker) {
20051             var range = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.Range.create(document.positionAt(marker.getOffset()), document.positionAt(marker.getOffset() + marker.getLength()));
20052             var source = document.languageId;
20053             return {
20054                 code: marker.getRule().id,
20055                 source: source,
20056                 message: marker.getMessage(),
20057                 severity: marker.getLevel() === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Warning ? _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.DiagnosticSeverity.Warning : _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.DiagnosticSeverity.Error,
20058                 range: range
20059             };
20060         }
20061         return entries.filter(function (entry) { return entry.getLevel() !== _parser_cssNodes__WEBPACK_IMPORTED_MODULE_0__.Level.Ignore; }).map(toDiagnostic);
20062     };
20063     return CSSValidation;
20064 }());
20065
20066
20067
20068 /***/ }),
20069 /* 91 */
20070 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20071
20072 __webpack_require__.r(__webpack_exports__);
20073 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
20074 /* harmony export */   "LintVisitor": () => /* binding */ LintVisitor
20075 /* harmony export */ });
20076 /* harmony import */ var _languageFacts_facts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(71);
20077 /* harmony import */ var _lintRules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(89);
20078 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(65);
20079 /* harmony import */ var _lintUtil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(92);
20080 /* harmony import */ var _utils_arrays__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(78);
20081 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(68);
20082 /*---------------------------------------------------------------------------------------------
20083  *  Copyright (c) Microsoft Corporation. All rights reserved.
20084  *  Licensed under the MIT License. See License.txt in the project root for license information.
20085  *--------------------------------------------------------------------------------------------*/
20086
20087
20088
20089
20090
20091
20092
20093 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_4__.loadMessageBundle();
20094 var NodesByRootMap = /** @class */ (function () {
20095     function NodesByRootMap() {
20096         this.data = {};
20097     }
20098     NodesByRootMap.prototype.add = function (root, name, node) {
20099         var entry = this.data[root];
20100         if (!entry) {
20101             entry = { nodes: [], names: [] };
20102             this.data[root] = entry;
20103         }
20104         entry.names.push(name);
20105         if (node) {
20106             entry.nodes.push(node);
20107         }
20108     };
20109     return NodesByRootMap;
20110 }());
20111 var LintVisitor = /** @class */ (function () {
20112     function LintVisitor(document, settings, cssDataManager) {
20113         var _this = this;
20114         this.cssDataManager = cssDataManager;
20115         this.warnings = [];
20116         this.settings = settings;
20117         this.documentText = document.getText();
20118         this.keyframes = new NodesByRootMap();
20119         this.validProperties = {};
20120         var properties = settings.getSetting(_lintRules__WEBPACK_IMPORTED_MODULE_1__.Settings.ValidProperties);
20121         if (Array.isArray(properties)) {
20122             properties.forEach(function (p) {
20123                 if (typeof p === 'string') {
20124                     var name = p.trim().toLowerCase();
20125                     if (name.length) {
20126                         _this.validProperties[name] = true;
20127                     }
20128                 }
20129             });
20130         }
20131     }
20132     LintVisitor.entries = function (node, document, settings, cssDataManager, entryFilter) {
20133         var visitor = new LintVisitor(document, settings, cssDataManager);
20134         node.acceptVisitor(visitor);
20135         visitor.completeValidations();
20136         return visitor.getEntries(entryFilter);
20137     };
20138     LintVisitor.prototype.isValidPropertyDeclaration = function (element) {
20139         var propertyName = element.fullPropertyName;
20140         return this.validProperties[propertyName];
20141     };
20142     LintVisitor.prototype.fetch = function (input, s) {
20143         var elements = [];
20144         for (var _i = 0, input_1 = input; _i < input_1.length; _i++) {
20145             var curr = input_1[_i];
20146             if (curr.fullPropertyName === s) {
20147                 elements.push(curr);
20148             }
20149         }
20150         return elements;
20151     };
20152     LintVisitor.prototype.fetchWithValue = function (input, s, v) {
20153         var elements = [];
20154         for (var _i = 0, input_2 = input; _i < input_2.length; _i++) {
20155             var inputElement = input_2[_i];
20156             if (inputElement.fullPropertyName === s) {
20157                 var expression = inputElement.node.getValue();
20158                 if (expression && this.findValueInExpression(expression, v)) {
20159                     elements.push(inputElement);
20160                 }
20161             }
20162         }
20163         return elements;
20164     };
20165     LintVisitor.prototype.findValueInExpression = function (expression, v) {
20166         var found = false;
20167         expression.accept(function (node) {
20168             if (node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Identifier && node.matches(v)) {
20169                 found = true;
20170             }
20171             return !found;
20172         });
20173         return found;
20174     };
20175     LintVisitor.prototype.getEntries = function (filter) {
20176         if (filter === void 0) { filter = (_parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Level.Warning | _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Level.Error); }
20177         return this.warnings.filter(function (entry) {
20178             return (entry.getLevel() & filter) !== 0;
20179         });
20180     };
20181     LintVisitor.prototype.addEntry = function (node, rule, details) {
20182         var entry = new _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Marker(node, rule, this.settings.getRule(rule), details);
20183         this.warnings.push(entry);
20184     };
20185     LintVisitor.prototype.getMissingNames = function (expected, actual) {
20186         var expectedClone = expected.slice(0); // clone
20187         for (var i = 0; i < actual.length; i++) {
20188             var k = expectedClone.indexOf(actual[i]);
20189             if (k !== -1) {
20190                 expectedClone[k] = null;
20191             }
20192         }
20193         var result = null;
20194         for (var i = 0; i < expectedClone.length; i++) {
20195             var curr = expectedClone[i];
20196             if (curr) {
20197                 if (result === null) {
20198                     result = localize('namelist.single', "'{0}'", curr);
20199                 }
20200                 else {
20201                     result = localize('namelist.concatenated', "{0}, '{1}'", result, curr);
20202                 }
20203             }
20204         }
20205         return result;
20206     };
20207     LintVisitor.prototype.visitNode = function (node) {
20208         switch (node.type) {
20209             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.UnknownAtRule:
20210                 return this.visitUnknownAtRule(node);
20211             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Keyframe:
20212                 return this.visitKeyframe(node);
20213             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.FontFace:
20214                 return this.visitFontFace(node);
20215             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Ruleset:
20216                 return this.visitRuleSet(node);
20217             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.SimpleSelector:
20218                 return this.visitSimpleSelector(node);
20219             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Function:
20220                 return this.visitFunction(node);
20221             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.NumericValue:
20222                 return this.visitNumericValue(node);
20223             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Import:
20224                 return this.visitImport(node);
20225             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.HexColorValue:
20226                 return this.visitHexColorValue(node);
20227             case _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Prio:
20228                 return this.visitPrio(node);
20229         }
20230         return true;
20231     };
20232     LintVisitor.prototype.completeValidations = function () {
20233         this.validateKeyframes();
20234     };
20235     LintVisitor.prototype.visitUnknownAtRule = function (node) {
20236         var atRuleName = node.getChild(0);
20237         if (!atRuleName) {
20238             return false;
20239         }
20240         var atDirective = this.cssDataManager.getAtDirective(atRuleName.getText());
20241         if (atDirective) {
20242             return false;
20243         }
20244         this.addEntry(atRuleName, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.UnknownAtRules, "Unknown at rule " + atRuleName.getText());
20245         return true;
20246     };
20247     LintVisitor.prototype.visitKeyframe = function (node) {
20248         var keyword = node.getKeyword();
20249         if (!keyword) {
20250             return false;
20251         }
20252         var text = keyword.getText();
20253         this.keyframes.add(node.getName(), text, (text !== '@keyframes') ? keyword : null);
20254         return true;
20255     };
20256     LintVisitor.prototype.validateKeyframes = function () {
20257         // @keyframe and it's vendor specific alternatives
20258         // @keyframe should be included
20259         var expected = ['@-webkit-keyframes', '@-moz-keyframes', '@-o-keyframes'];
20260         for (var name in this.keyframes.data) {
20261             var actual = this.keyframes.data[name].names;
20262             var needsStandard = (actual.indexOf('@keyframes') === -1);
20263             if (!needsStandard && actual.length === 1) {
20264                 continue; // only the non-vendor specific keyword is used, that's fine, no warning
20265             }
20266             var missingVendorSpecific = this.getMissingNames(expected, actual);
20267             if (missingVendorSpecific || needsStandard) {
20268                 for (var _i = 0, _a = this.keyframes.data[name].nodes; _i < _a.length; _i++) {
20269                     var node = _a[_i];
20270                     if (needsStandard) {
20271                         var message = localize('keyframes.standardrule.missing', "Always define standard rule '@keyframes' when defining keyframes.");
20272                         this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.IncludeStandardPropertyWhenUsingVendorPrefix, message);
20273                     }
20274                     if (missingVendorSpecific) {
20275                         var message = localize('keyframes.vendorspecific.missing', "Always include all vendor specific rules: Missing: {0}", missingVendorSpecific);
20276                         this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.AllVendorPrefixes, message);
20277                     }
20278                 }
20279             }
20280         }
20281         return true;
20282     };
20283     LintVisitor.prototype.visitSimpleSelector = function (node) {
20284         var firstChar = this.documentText.charAt(node.offset);
20285         /////////////////////////////////////////////////////////////
20286         //      Lint - The universal selector (*) is known to be slow.
20287         /////////////////////////////////////////////////////////////
20288         if (node.length === 1 && firstChar === '*') {
20289             this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.UniversalSelector);
20290         }
20291         /////////////////////////////////////////////////////////////
20292         //      Lint - Avoid id selectors
20293         /////////////////////////////////////////////////////////////
20294         if (firstChar === '#') {
20295             this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.AvoidIdSelector);
20296         }
20297         return true;
20298     };
20299     LintVisitor.prototype.visitImport = function (node) {
20300         /////////////////////////////////////////////////////////////
20301         //      Lint - Import statements shouldn't be used, because they aren't offering parallel downloads.
20302         /////////////////////////////////////////////////////////////
20303         this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.ImportStatemement);
20304         return true;
20305     };
20306     LintVisitor.prototype.visitRuleSet = function (node) {
20307         /////////////////////////////////////////////////////////////
20308         //      Lint - Don't use empty rulesets.
20309         /////////////////////////////////////////////////////////////
20310         var declarations = node.getDeclarations();
20311         if (!declarations) {
20312             // syntax error
20313             return false;
20314         }
20315         if (!declarations.hasChildren()) {
20316             this.addEntry(node.getSelectors(), _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.EmptyRuleSet);
20317         }
20318         var propertyTable = [];
20319         for (var _i = 0, _a = declarations.getChildren(); _i < _a.length; _i++) {
20320             var element = _a[_i];
20321             if (element instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Declaration) {
20322                 propertyTable.push(new _lintUtil__WEBPACK_IMPORTED_MODULE_3__.Element(element));
20323             }
20324         }
20325         /////////////////////////////////////////////////////////////
20326         // the rule warns when it finds:
20327         // width being used with border, border-left, border-right, padding, padding-left, or padding-right
20328         // height being used with border, border-top, border-bottom, padding, padding-top, or padding-bottom
20329         // No error when box-sizing property is specified, as it assumes the user knows what he's doing.
20330         // see https://github.com/CSSLint/csslint/wiki/Beware-of-box-model-size
20331         /////////////////////////////////////////////////////////////
20332         var boxModel = (0,_lintUtil__WEBPACK_IMPORTED_MODULE_3__.default)(propertyTable);
20333         if (boxModel.width) {
20334             var properties = [];
20335             if (boxModel.right.value) {
20336                 properties = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_5__.union)(properties, boxModel.right.properties);
20337             }
20338             if (boxModel.left.value) {
20339                 properties = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_5__.union)(properties, boxModel.left.properties);
20340             }
20341             if (properties.length !== 0) {
20342                 for (var _b = 0, properties_1 = properties; _b < properties_1.length; _b++) {
20343                     var item = properties_1[_b];
20344                     this.addEntry(item.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.BewareOfBoxModelSize);
20345                 }
20346                 this.addEntry(boxModel.width.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.BewareOfBoxModelSize);
20347             }
20348         }
20349         if (boxModel.height) {
20350             var properties = [];
20351             if (boxModel.top.value) {
20352                 properties = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_5__.union)(properties, boxModel.top.properties);
20353             }
20354             if (boxModel.bottom.value) {
20355                 properties = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_5__.union)(properties, boxModel.bottom.properties);
20356             }
20357             if (properties.length !== 0) {
20358                 for (var _c = 0, properties_2 = properties; _c < properties_2.length; _c++) {
20359                     var item = properties_2[_c];
20360                     this.addEntry(item.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.BewareOfBoxModelSize);
20361                 }
20362                 this.addEntry(boxModel.height.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.BewareOfBoxModelSize);
20363             }
20364         }
20365         /////////////////////////////////////////////////////////////
20366         //      Properties ignored due to display
20367         /////////////////////////////////////////////////////////////
20368         // With 'display: inline-block', 'float' has no effect
20369         var displayElems = this.fetchWithValue(propertyTable, 'display', 'inline-block');
20370         if (displayElems.length > 0) {
20371             var elem = this.fetch(propertyTable, 'float');
20372             for (var index = 0; index < elem.length; index++) {
20373                 var node_1 = elem[index].node;
20374                 var value = node_1.getValue();
20375                 if (value && !value.matches('none')) {
20376                     this.addEntry(node_1, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.PropertyIgnoredDueToDisplay, localize('rule.propertyIgnoredDueToDisplayInlineBlock', "inline-block is ignored due to the float. If 'float' has a value other than 'none', the box is floated and 'display' is treated as 'block'"));
20377                 }
20378             }
20379         }
20380         // With 'display: block', 'vertical-align' has no effect
20381         displayElems = this.fetchWithValue(propertyTable, 'display', 'block');
20382         if (displayElems.length > 0) {
20383             var elem = this.fetch(propertyTable, 'vertical-align');
20384             for (var index = 0; index < elem.length; index++) {
20385                 this.addEntry(elem[index].node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.PropertyIgnoredDueToDisplay, localize('rule.propertyIgnoredDueToDisplayBlock', "Property is ignored due to the display. With 'display: block', vertical-align should not be used."));
20386             }
20387         }
20388         /////////////////////////////////////////////////////////////
20389         //      Avoid 'float'
20390         /////////////////////////////////////////////////////////////
20391         var elements = this.fetch(propertyTable, 'float');
20392         for (var index = 0; index < elements.length; index++) {
20393             var element = elements[index];
20394             if (!this.isValidPropertyDeclaration(element)) {
20395                 this.addEntry(element.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.AvoidFloat);
20396             }
20397         }
20398         /////////////////////////////////////////////////////////////
20399         //      Don't use duplicate declarations.
20400         /////////////////////////////////////////////////////////////
20401         for (var i = 0; i < propertyTable.length; i++) {
20402             var element = propertyTable[i];
20403             if (element.fullPropertyName !== 'background' && !this.validProperties[element.fullPropertyName]) {
20404                 var value = element.node.getValue();
20405                 if (value && this.documentText.charAt(value.offset) !== '-') {
20406                     var elements_1 = this.fetch(propertyTable, element.fullPropertyName);
20407                     if (elements_1.length > 1) {
20408                         for (var k = 0; k < elements_1.length; k++) {
20409                             var value_1 = elements_1[k].node.getValue();
20410                             if (value_1 && this.documentText.charAt(value_1.offset) !== '-' && elements_1[k] !== element) {
20411                                 this.addEntry(element.node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.DuplicateDeclarations);
20412                             }
20413                         }
20414                     }
20415                 }
20416             }
20417         }
20418         /////////////////////////////////////////////////////////////
20419         //      Unknown propery & When using a vendor-prefixed gradient, make sure to use them all.
20420         /////////////////////////////////////////////////////////////
20421         var isExportBlock = node.getSelectors().matches(":export");
20422         if (!isExportBlock) {
20423             var propertiesBySuffix = new NodesByRootMap();
20424             var containsUnknowns = false;
20425             for (var _d = 0, propertyTable_1 = propertyTable; _d < propertyTable_1.length; _d++) {
20426                 var element = propertyTable_1[_d];
20427                 var decl = element.node;
20428                 if (this.isCSSDeclaration(decl)) {
20429                     var name = element.fullPropertyName;
20430                     var firstChar = name.charAt(0);
20431                     if (firstChar === '-') {
20432                         if (name.charAt(1) !== '-') { // avoid css variables
20433                             if (!this.cssDataManager.isKnownProperty(name) && !this.validProperties[name]) {
20434                                 this.addEntry(decl.getProperty(), _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.UnknownVendorSpecificProperty);
20435                             }
20436                             var nonPrefixedName = decl.getNonPrefixedPropertyName();
20437                             propertiesBySuffix.add(nonPrefixedName, name, decl.getProperty());
20438                         }
20439                     }
20440                     else {
20441                         var fullName = name;
20442                         if (firstChar === '*' || firstChar === '_') {
20443                             this.addEntry(decl.getProperty(), _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.IEStarHack);
20444                             name = name.substr(1);
20445                         }
20446                         // _property and *property might be contributed via custom data
20447                         if (!this.cssDataManager.isKnownProperty(fullName) && !this.cssDataManager.isKnownProperty(name)) {
20448                             if (!this.validProperties[name]) {
20449                                 this.addEntry(decl.getProperty(), _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.UnknownProperty, localize('property.unknownproperty.detailed', "Unknown property: '{0}'", decl.getFullPropertyName()));
20450                             }
20451                         }
20452                         propertiesBySuffix.add(name, name, null); // don't pass the node as we don't show errors on the standard
20453                     }
20454                 }
20455                 else {
20456                     containsUnknowns = true;
20457                 }
20458             }
20459             if (!containsUnknowns) { // don't perform this test if there are
20460                 for (var suffix in propertiesBySuffix.data) {
20461                     var entry = propertiesBySuffix.data[suffix];
20462                     var actual = entry.names;
20463                     var needsStandard = this.cssDataManager.isStandardProperty(suffix) && (actual.indexOf(suffix) === -1);
20464                     if (!needsStandard && actual.length === 1) {
20465                         continue; // only the non-vendor specific rule is used, that's fine, no warning
20466                     }
20467                     var expected = [];
20468                     for (var i = 0, len = LintVisitor.prefixes.length; i < len; i++) {
20469                         var prefix = LintVisitor.prefixes[i];
20470                         if (this.cssDataManager.isStandardProperty(prefix + suffix)) {
20471                             expected.push(prefix + suffix);
20472                         }
20473                     }
20474                     var missingVendorSpecific = this.getMissingNames(expected, actual);
20475                     if (missingVendorSpecific || needsStandard) {
20476                         for (var _e = 0, _f = entry.nodes; _e < _f.length; _e++) {
20477                             var node_2 = _f[_e];
20478                             if (needsStandard) {
20479                                 var message = localize('property.standard.missing', "Also define the standard property '{0}' for compatibility", suffix);
20480                                 this.addEntry(node_2, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.IncludeStandardPropertyWhenUsingVendorPrefix, message);
20481                             }
20482                             if (missingVendorSpecific) {
20483                                 var message = localize('property.vendorspecific.missing', "Always include all vendor specific properties: Missing: {0}", missingVendorSpecific);
20484                                 this.addEntry(node_2, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.AllVendorPrefixes, message);
20485                             }
20486                         }
20487                     }
20488                 }
20489             }
20490         }
20491         return true;
20492     };
20493     LintVisitor.prototype.visitPrio = function (node) {
20494         /////////////////////////////////////////////////////////////
20495         //      Don't use !important
20496         /////////////////////////////////////////////////////////////
20497         this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.AvoidImportant);
20498         return true;
20499     };
20500     LintVisitor.prototype.visitNumericValue = function (node) {
20501         /////////////////////////////////////////////////////////////
20502         //      0 has no following unit
20503         /////////////////////////////////////////////////////////////
20504         var funcDecl = node.findParent(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Function);
20505         if (funcDecl && funcDecl.getName() === 'calc') {
20506             return true;
20507         }
20508         var decl = node.findParent(_parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.NodeType.Declaration);
20509         if (decl) {
20510             var declValue = decl.getValue();
20511             if (declValue) {
20512                 var value = node.getValue();
20513                 if (!value.unit || _languageFacts_facts__WEBPACK_IMPORTED_MODULE_0__.units.length.indexOf(value.unit.toLowerCase()) === -1) {
20514                     return true;
20515                 }
20516                 if (parseFloat(value.value) === 0.0 && !!value.unit && !this.validProperties[decl.getFullPropertyName()]) {
20517                     this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.ZeroWithUnit);
20518                 }
20519             }
20520         }
20521         return true;
20522     };
20523     LintVisitor.prototype.visitFontFace = function (node) {
20524         var declarations = node.getDeclarations();
20525         if (!declarations) {
20526             // syntax error
20527             return false;
20528         }
20529         var definesSrc = false, definesFontFamily = false;
20530         var containsUnknowns = false;
20531         for (var _i = 0, _a = declarations.getChildren(); _i < _a.length; _i++) {
20532             var node_3 = _a[_i];
20533             if (this.isCSSDeclaration(node_3)) {
20534                 var name = node_3.getProperty().getName().toLowerCase();
20535                 if (name === 'src') {
20536                     definesSrc = true;
20537                 }
20538                 if (name === 'font-family') {
20539                     definesFontFamily = true;
20540                 }
20541             }
20542             else {
20543                 containsUnknowns = true;
20544             }
20545         }
20546         if (!containsUnknowns && (!definesSrc || !definesFontFamily)) {
20547             this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.RequiredPropertiesForFontFace);
20548         }
20549         return true;
20550     };
20551     LintVisitor.prototype.isCSSDeclaration = function (node) {
20552         if (node instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.Declaration) {
20553             if (!node.getValue()) {
20554                 return false;
20555             }
20556             var property = node.getProperty();
20557             if (!property) {
20558                 return false;
20559             }
20560             var identifier = property.getIdentifier();
20561             if (!identifier || identifier.containsInterpolation()) {
20562                 return false;
20563             }
20564             return true;
20565         }
20566         return false;
20567     };
20568     LintVisitor.prototype.visitHexColorValue = function (node) {
20569         // Rule: #eeff0011 or #eeff00 or #ef01 or #ef0
20570         var length = node.length;
20571         if (length !== 9 && length !== 7 && length !== 5 && length !== 4) {
20572             this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.HexColorLength);
20573         }
20574         return false;
20575     };
20576     LintVisitor.prototype.visitFunction = function (node) {
20577         var fnName = node.getName().toLowerCase();
20578         var expectedAttrCount = -1;
20579         var actualAttrCount = 0;
20580         switch (fnName) {
20581             case 'rgb(':
20582             case 'hsl(':
20583                 expectedAttrCount = 3;
20584                 break;
20585             case 'rgba(':
20586             case 'hsla(':
20587                 expectedAttrCount = 4;
20588                 break;
20589         }
20590         if (expectedAttrCount !== -1) {
20591             node.getArguments().accept(function (n) {
20592                 if (n instanceof _parser_cssNodes__WEBPACK_IMPORTED_MODULE_2__.BinaryExpression) {
20593                     actualAttrCount += 1;
20594                     return false;
20595                 }
20596                 return true;
20597             });
20598             if (actualAttrCount !== expectedAttrCount) {
20599                 this.addEntry(node, _lintRules__WEBPACK_IMPORTED_MODULE_1__.Rules.ArgsInColorFunction);
20600             }
20601         }
20602         return true;
20603     };
20604     LintVisitor.prefixes = [
20605         '-ms-', '-moz-', '-o-', '-webkit-',
20606     ];
20607     return LintVisitor;
20608 }());
20609
20610
20611
20612 /***/ }),
20613 /* 92 */
20614 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20615
20616 __webpack_require__.r(__webpack_exports__);
20617 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
20618 /* harmony export */   "Element": () => /* binding */ Element,
20619 /* harmony export */   "default": () => /* binding */ calculateBoxModel
20620 /* harmony export */ });
20621 /* harmony import */ var _utils_arrays__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78);
20622 /*---------------------------------------------------------------------------------------------
20623  *  Copyright (c) Microsoft Corporation. All rights reserved.
20624  *  Licensed under the MIT License. See License.txt in the project root for license information.
20625  *--------------------------------------------------------------------------------------------*/
20626
20627
20628 var Element = /** @class */ (function () {
20629     function Element(decl) {
20630         this.fullPropertyName = decl.getFullPropertyName().toLowerCase();
20631         this.node = decl;
20632     }
20633     return Element;
20634 }());
20635
20636 function setSide(model, side, value, property) {
20637     var state = model[side];
20638     state.value = value;
20639     if (value) {
20640         if (!(0,_utils_arrays__WEBPACK_IMPORTED_MODULE_0__.includes)(state.properties, property)) {
20641             state.properties.push(property);
20642         }
20643     }
20644 }
20645 function setAllSides(model, value, property) {
20646     setSide(model, 'top', value, property);
20647     setSide(model, 'right', value, property);
20648     setSide(model, 'bottom', value, property);
20649     setSide(model, 'left', value, property);
20650 }
20651 function updateModelWithValue(model, side, value, property) {
20652     if (side === 'top' || side === 'right' ||
20653         side === 'bottom' || side === 'left') {
20654         setSide(model, side, value, property);
20655     }
20656     else {
20657         setAllSides(model, value, property);
20658     }
20659 }
20660 function updateModelWithList(model, values, property) {
20661     switch (values.length) {
20662         case 1:
20663             updateModelWithValue(model, undefined, values[0], property);
20664             break;
20665         case 2:
20666             updateModelWithValue(model, 'top', values[0], property);
20667             updateModelWithValue(model, 'bottom', values[0], property);
20668             updateModelWithValue(model, 'right', values[1], property);
20669             updateModelWithValue(model, 'left', values[1], property);
20670             break;
20671         case 3:
20672             updateModelWithValue(model, 'top', values[0], property);
20673             updateModelWithValue(model, 'right', values[1], property);
20674             updateModelWithValue(model, 'left', values[1], property);
20675             updateModelWithValue(model, 'bottom', values[2], property);
20676             break;
20677         case 4:
20678             updateModelWithValue(model, 'top', values[0], property);
20679             updateModelWithValue(model, 'right', values[1], property);
20680             updateModelWithValue(model, 'bottom', values[2], property);
20681             updateModelWithValue(model, 'left', values[3], property);
20682             break;
20683     }
20684 }
20685 function matches(value, candidates) {
20686     for (var _i = 0, candidates_1 = candidates; _i < candidates_1.length; _i++) {
20687         var candidate = candidates_1[_i];
20688         if (value.matches(candidate)) {
20689             return true;
20690         }
20691     }
20692     return false;
20693 }
20694 /**
20695  * @param allowsKeywords whether the initial value of property is zero, so keywords `initial` and `unset` count as zero
20696  * @return `true` if this node represents a non-zero border; otherwise, `false`
20697  */
20698 function checkLineWidth(value, allowsKeywords) {
20699     if (allowsKeywords === void 0) { allowsKeywords = true; }
20700     if (allowsKeywords && matches(value, ['initial', 'unset'])) {
20701         return false;
20702     }
20703     // a <length> is a value and a unit
20704     // so use `parseFloat` to strip the unit
20705     return parseFloat(value.getText()) !== 0;
20706 }
20707 function checkLineWidthList(nodes, allowsKeywords) {
20708     if (allowsKeywords === void 0) { allowsKeywords = true; }
20709     return nodes.map(function (node) { return checkLineWidth(node, allowsKeywords); });
20710 }
20711 /**
20712  * @param allowsKeywords whether keywords `initial` and `unset` count as zero
20713  * @return `true` if this node represents a non-zero border; otherwise, `false`
20714  */
20715 function checkLineStyle(valueNode, allowsKeywords) {
20716     if (allowsKeywords === void 0) { allowsKeywords = true; }
20717     if (matches(valueNode, ['none', 'hidden'])) {
20718         return false;
20719     }
20720     if (allowsKeywords && matches(valueNode, ['initial', 'unset'])) {
20721         return false;
20722     }
20723     return true;
20724 }
20725 function checkLineStyleList(nodes, allowsKeywords) {
20726     if (allowsKeywords === void 0) { allowsKeywords = true; }
20727     return nodes.map(function (node) { return checkLineStyle(node, allowsKeywords); });
20728 }
20729 function checkBorderShorthand(node) {
20730     var children = node.getChildren();
20731     // the only child can be a keyword, a <line-width>, or a <line-style>
20732     // if either check returns false, the result is no border
20733     if (children.length === 1) {
20734         var value = children[0];
20735         return checkLineWidth(value) && checkLineStyle(value);
20736     }
20737     // multiple children can't contain keywords
20738     // if any child means no border, the result is no border
20739     for (var _i = 0, children_1 = children; _i < children_1.length; _i++) {
20740         var child = children_1[_i];
20741         var value = child;
20742         if (!checkLineWidth(value, /* allowsKeywords: */ false) ||
20743             !checkLineStyle(value, /* allowsKeywords: */ false)) {
20744             return false;
20745         }
20746     }
20747     return true;
20748 }
20749 function calculateBoxModel(propertyTable) {
20750     var model = {
20751         top: { value: false, properties: [] },
20752         right: { value: false, properties: [] },
20753         bottom: { value: false, properties: [] },
20754         left: { value: false, properties: [] },
20755     };
20756     for (var _i = 0, propertyTable_1 = propertyTable; _i < propertyTable_1.length; _i++) {
20757         var property = propertyTable_1[_i];
20758         var value = property.node.value;
20759         if (typeof value === 'undefined') {
20760             continue;
20761         }
20762         switch (property.fullPropertyName) {
20763             case 'box-sizing':
20764                 // has `box-sizing`, bail out
20765                 return {
20766                     top: { value: false, properties: [] },
20767                     right: { value: false, properties: [] },
20768                     bottom: { value: false, properties: [] },
20769                     left: { value: false, properties: [] },
20770                 };
20771             case 'width':
20772                 model.width = property;
20773                 break;
20774             case 'height':
20775                 model.height = property;
20776                 break;
20777             default:
20778                 var segments = property.fullPropertyName.split('-');
20779                 switch (segments[0]) {
20780                     case 'border':
20781                         switch (segments[1]) {
20782                             case undefined:
20783                             case 'top':
20784                             case 'right':
20785                             case 'bottom':
20786                             case 'left':
20787                                 switch (segments[2]) {
20788                                     case undefined:
20789                                         updateModelWithValue(model, segments[1], checkBorderShorthand(value), property);
20790                                         break;
20791                                     case 'width':
20792                                         // the initial value of `border-width` is `medium`, not zero
20793                                         updateModelWithValue(model, segments[1], checkLineWidth(value, false), property);
20794                                         break;
20795                                     case 'style':
20796                                         // the initial value of `border-style` is `none`
20797                                         updateModelWithValue(model, segments[1], checkLineStyle(value, true), property);
20798                                         break;
20799                                 }
20800                                 break;
20801                             case 'width':
20802                                 // the initial value of `border-width` is `medium`, not zero
20803                                 updateModelWithList(model, checkLineWidthList(value.getChildren(), false), property);
20804                                 break;
20805                             case 'style':
20806                                 // the initial value of `border-style` is `none`
20807                                 updateModelWithList(model, checkLineStyleList(value.getChildren(), true), property);
20808                                 break;
20809                         }
20810                         break;
20811                     case 'padding':
20812                         if (segments.length === 1) {
20813                             // the initial value of `padding` is zero
20814                             updateModelWithList(model, checkLineWidthList(value.getChildren(), true), property);
20815                         }
20816                         else {
20817                             // the initial value of `padding` is zero
20818                             updateModelWithValue(model, segments[1], checkLineWidth(value, true), property);
20819                         }
20820                         break;
20821                 }
20822                 break;
20823         }
20824     }
20825     return model;
20826 }
20827
20828
20829 /***/ }),
20830 /* 93 */
20831 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20832
20833 __webpack_require__.r(__webpack_exports__);
20834 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
20835 /* harmony export */   "SCSSParser": () => /* binding */ SCSSParser
20836 /* harmony export */ });
20837 /* harmony import */ var _scssScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(94);
20838 /* harmony import */ var _cssScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64);
20839 /* harmony import */ var _cssParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(63);
20840 /* harmony import */ var _cssNodes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(65);
20841 /* harmony import */ var _scssErrors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(95);
20842 /* harmony import */ var _cssErrors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(67);
20843 /*---------------------------------------------------------------------------------------------
20844  *  Copyright (c) Microsoft Corporation. All rights reserved.
20845  *  Licensed under the MIT License. See License.txt in the project root for license information.
20846  *--------------------------------------------------------------------------------------------*/
20847
20848 var __extends = (undefined && undefined.__extends) || (function () {
20849     var extendStatics = function (d, b) {
20850         extendStatics = Object.setPrototypeOf ||
20851             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
20852             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
20853         return extendStatics(d, b);
20854     };
20855     return function (d, b) {
20856         extendStatics(d, b);
20857         function __() { this.constructor = d; }
20858         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
20859     };
20860 })();
20861
20862
20863
20864
20865
20866
20867 /// <summary>
20868 /// A parser for scss
20869 /// http://sass-lang.com/documentation/file.SASS_REFERENCE.html
20870 /// </summary>
20871 var SCSSParser = /** @class */ (function (_super) {
20872     __extends(SCSSParser, _super);
20873     function SCSSParser() {
20874         return _super.call(this, new _scssScanner__WEBPACK_IMPORTED_MODULE_0__.SCSSScanner()) || this;
20875     }
20876     SCSSParser.prototype._parseStylesheetStatement = function (isNested) {
20877         if (isNested === void 0) { isNested = false; }
20878         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
20879             return this._parseWarnAndDebug() // @warn, @debug and @error statements
20880                 || this._parseControlStatement() // @if, @while, @for, @each
20881                 || this._parseMixinDeclaration() // @mixin
20882                 || this._parseMixinContent() // @content
20883                 || this._parseMixinReference() // @include
20884                 || this._parseFunctionDeclaration() // @function
20885                 || this._parseForward() // @forward
20886                 || this._parseUse() // @use
20887                 || this._parseRuleset(isNested) // @at-rule
20888                 || _super.prototype._parseStylesheetAtStatement.call(this, isNested);
20889         }
20890         return this._parseRuleset(true) || this._parseVariableDeclaration();
20891     };
20892     SCSSParser.prototype._parseImport = function () {
20893         if (!this.peekKeyword('@import')) {
20894             return null;
20895         }
20896         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Import);
20897         this.consumeToken();
20898         if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {
20899             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.URIOrStringExpected);
20900         }
20901         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
20902             if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {
20903                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.URIOrStringExpected);
20904             }
20905         }
20906         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
20907             node.setMedialist(this._parseMediaQueryList());
20908         }
20909         return this.finish(node);
20910     };
20911     // scss variables: $font-size: 12px;
20912     SCSSParser.prototype._parseVariableDeclaration = function (panic) {
20913         if (panic === void 0) { panic = []; }
20914         if (!this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.VariableName)) {
20915             return null;
20916         }
20917         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.VariableDeclaration);
20918         if (!node.setVariable(this._parseVariable())) {
20919             return null;
20920         }
20921         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
20922             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ColonExpected);
20923         }
20924         if (this.prevToken) {
20925             node.colonPosition = this.prevToken.offset;
20926         }
20927         if (!node.setValue(this._parseExpr())) {
20928             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableValueExpected, [], panic);
20929         }
20930         while (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Exclamation)) {
20931             if (node.addChild(this._tryParsePrio())) {
20932                 // !important
20933             }
20934             else {
20935                 this.consumeToken();
20936                 if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident, /^(default|global)$/)) {
20937                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.UnknownKeyword);
20938                 }
20939                 this.consumeToken();
20940             }
20941         }
20942         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
20943             node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
20944         }
20945         return this.finish(node);
20946     };
20947     SCSSParser.prototype._parseMediaContentStart = function () {
20948         return this._parseInterpolation();
20949     };
20950     SCSSParser.prototype._parseMediaFeatureName = function () {
20951         return this._parseModuleMember()
20952             || this._parseFunction() // function before ident
20953             || this._parseIdent()
20954             || this._parseVariable();
20955     };
20956     SCSSParser.prototype._parseKeyframeSelector = function () {
20957         return this._tryParseKeyframeSelector()
20958             || this._parseControlStatement(this._parseKeyframeSelector.bind(this))
20959             || this._parseVariableDeclaration()
20960             || this._parseMixinContent();
20961     };
20962     SCSSParser.prototype._parseVariable = function () {
20963         if (!this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.VariableName)) {
20964             return null;
20965         }
20966         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Variable);
20967         this.consumeToken();
20968         return node;
20969     };
20970     SCSSParser.prototype._parseModuleMember = function () {
20971         var pos = this.mark();
20972         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Module);
20973         if (!node.setIdentifier(this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Module]))) {
20974             return null;
20975         }
20976         if (this.hasWhitespace()
20977             || !this.acceptDelim('.')
20978             || this.hasWhitespace()) {
20979             this.restoreAtMark(pos);
20980             return null;
20981         }
20982         if (!node.addChild(this._parseVariable() || this._parseFunction())) {
20983             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierOrVariableExpected);
20984         }
20985         return node;
20986     };
20987     SCSSParser.prototype._parseIdent = function (referenceTypes) {
20988         var _this = this;
20989         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident) && !this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.InterpolationFunction) && !this.peekDelim('-')) {
20990             return null;
20991         }
20992         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Identifier);
20993         node.referenceTypes = referenceTypes;
20994         node.isCustomProperty = this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident, /^--/);
20995         var hasContent = false;
20996         var indentInterpolation = function () {
20997             var pos = _this.mark();
20998             if (_this.acceptDelim('-')) {
20999                 if (!_this.hasWhitespace()) {
21000                     _this.acceptDelim('-');
21001                 }
21002                 if (_this.hasWhitespace()) {
21003                     _this.restoreAtMark(pos);
21004                     return null;
21005                 }
21006             }
21007             return _this._parseInterpolation();
21008         };
21009         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident) || node.addChild(indentInterpolation()) || (hasContent && this.acceptRegexp(/^[\w-]/))) {
21010             hasContent = true;
21011             if (this.hasWhitespace()) {
21012                 break;
21013             }
21014         }
21015         return hasContent ? this.finish(node) : null;
21016     };
21017     SCSSParser.prototype._parseTermExpression = function () {
21018         return this._parseModuleMember() ||
21019             this._parseVariable() ||
21020             this._parseSelectorCombinator() ||
21021             //this._tryParsePrio() ||
21022             _super.prototype._parseTermExpression.call(this);
21023     };
21024     SCSSParser.prototype._parseInterpolation = function () {
21025         if (this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.InterpolationFunction)) {
21026             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Interpolation);
21027             this.consumeToken();
21028             if (!node.addChild(this._parseExpr()) && !this._parseSelectorCombinator()) {
21029                 if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR)) {
21030                     return this.finish(node);
21031                 }
21032                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21033             }
21034             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR)) {
21035                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightCurlyExpected);
21036             }
21037             return this.finish(node);
21038         }
21039         return null;
21040     };
21041     SCSSParser.prototype._parseOperator = function () {
21042         if (this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.EqualsOperator) || this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.NotEqualsOperator)
21043             || this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.GreaterEqualsOperator) || this.peek(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.SmallerEqualsOperator)
21044             || this.peekDelim('>') || this.peekDelim('<')
21045             || this.peekIdent('and') || this.peekIdent('or')
21046             || this.peekDelim('%')) {
21047             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Operator);
21048             this.consumeToken();
21049             return this.finish(node);
21050         }
21051         return _super.prototype._parseOperator.call(this);
21052     };
21053     SCSSParser.prototype._parseUnaryOperator = function () {
21054         if (this.peekIdent('not')) {
21055             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
21056             this.consumeToken();
21057             return this.finish(node);
21058         }
21059         return _super.prototype._parseUnaryOperator.call(this);
21060     };
21061     SCSSParser.prototype._parseRuleSetDeclaration = function () {
21062         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
21063             return this._parseKeyframe() // nested @keyframe
21064                 || this._parseImport() // nested @import
21065                 || this._parseMedia(true) // nested @media
21066                 || this._parseFontFace() // nested @font-face
21067                 || this._parseWarnAndDebug() // @warn, @debug and @error statements
21068                 || this._parseControlStatement() // @if, @while, @for, @each
21069                 || this._parseFunctionDeclaration() // @function
21070                 || this._parseExtends() // @extends
21071                 || this._parseMixinReference() // @include
21072                 || this._parseMixinContent() // @content
21073                 || this._parseMixinDeclaration() // nested @mixin
21074                 || this._parseRuleset(true) // @at-rule
21075                 || this._parseSupports(true) // @supports
21076                 || _super.prototype._parseRuleSetDeclarationAtStatement.call(this);
21077         }
21078         return this._parseVariableDeclaration() // variable declaration
21079             || this._tryParseRuleset(true) // nested ruleset
21080             || _super.prototype._parseRuleSetDeclaration.call(this); // try css ruleset declaration as last so in the error case, the ast will contain a declaration
21081     };
21082     SCSSParser.prototype._parseDeclaration = function (resyncStopTokens) {
21083         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Declaration);
21084         if (!node.setProperty(this._parseProperty())) {
21085             return null;
21086         }
21087         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
21088             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ColonExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon], resyncStopTokens);
21089         }
21090         if (this.prevToken) {
21091             node.colonPosition = this.prevToken.offset;
21092         }
21093         var hasContent = false;
21094         if (node.setValue(this._parseExpr())) {
21095             hasContent = true;
21096             node.addChild(this._parsePrio());
21097         }
21098         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
21099             node.setNestedProperties(this._parseNestedProperties());
21100         }
21101         else {
21102             if (!hasContent) {
21103                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.PropertyValueExpected);
21104             }
21105         }
21106         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
21107             node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
21108         }
21109         return this.finish(node);
21110     };
21111     SCSSParser.prototype._parseNestedProperties = function () {
21112         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NestedProperties);
21113         return this._parseBody(node, this._parseDeclaration.bind(this));
21114     };
21115     SCSSParser.prototype._parseExtends = function () {
21116         if (this.peekKeyword('@extend')) {
21117             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ExtendsReference);
21118             this.consumeToken();
21119             if (!node.getSelectors().addChild(this._parseSimpleSelector())) {
21120                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.SelectorExpected);
21121             }
21122             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21123                 node.getSelectors().addChild(this._parseSimpleSelector());
21124             }
21125             if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Exclamation)) {
21126                 if (!this.acceptIdent('optional')) {
21127                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.UnknownKeyword);
21128                 }
21129             }
21130             return this.finish(node);
21131         }
21132         return null;
21133     };
21134     SCSSParser.prototype._parseSimpleSelectorBody = function () {
21135         return this._parseSelectorCombinator() || this._parseSelectorPlaceholder() || _super.prototype._parseSimpleSelectorBody.call(this);
21136     };
21137     SCSSParser.prototype._parseSelectorCombinator = function () {
21138         if (this.peekDelim('&')) {
21139             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.SelectorCombinator);
21140             this.consumeToken();
21141             while (!this.hasWhitespace() && (this.acceptDelim('-') || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Num) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Dimension) || node.addChild(this._parseIdent()) || this.acceptDelim('&'))) {
21142                 //  support &-foo-1
21143             }
21144             return this.finish(node);
21145         }
21146         return null;
21147     };
21148     SCSSParser.prototype._parseSelectorPlaceholder = function () {
21149         if (this.peekDelim('%')) {
21150             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.SelectorPlaceholder);
21151             this.consumeToken();
21152             this._parseIdent();
21153             return this.finish(node);
21154         }
21155         else if (this.peekKeyword('@at-root')) {
21156             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.SelectorPlaceholder);
21157             this.consumeToken();
21158             return this.finish(node);
21159         }
21160         return null;
21161     };
21162     SCSSParser.prototype._parseElementName = function () {
21163         var pos = this.mark();
21164         var node = _super.prototype._parseElementName.call(this);
21165         if (node && !this.hasWhitespace() && this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) { // for #49589
21166             this.restoreAtMark(pos);
21167             return null;
21168         }
21169         return node;
21170     };
21171     SCSSParser.prototype._tryParsePseudoIdentifier = function () {
21172         return this._parseInterpolation() || _super.prototype._tryParsePseudoIdentifier.call(this); // for #49589
21173     };
21174     SCSSParser.prototype._parseWarnAndDebug = function () {
21175         if (!this.peekKeyword('@debug')
21176             && !this.peekKeyword('@warn')
21177             && !this.peekKeyword('@error')) {
21178             return null;
21179         }
21180         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Debug);
21181         this.consumeToken(); // @debug, @warn or @error
21182         node.addChild(this._parseExpr()); // optional
21183         return this.finish(node);
21184     };
21185     SCSSParser.prototype._parseControlStatement = function (parseStatement) {
21186         if (parseStatement === void 0) { parseStatement = this._parseRuleSetDeclaration.bind(this); }
21187         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
21188             return null;
21189         }
21190         return this._parseIfStatement(parseStatement) || this._parseForStatement(parseStatement)
21191             || this._parseEachStatement(parseStatement) || this._parseWhileStatement(parseStatement);
21192     };
21193     SCSSParser.prototype._parseIfStatement = function (parseStatement) {
21194         if (!this.peekKeyword('@if')) {
21195             return null;
21196         }
21197         return this._internalParseIfStatement(parseStatement);
21198     };
21199     SCSSParser.prototype._internalParseIfStatement = function (parseStatement) {
21200         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.IfStatement);
21201         this.consumeToken(); // @if or if
21202         if (!node.setExpression(this._parseExpr(true))) {
21203             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21204         }
21205         this._parseBody(node, parseStatement);
21206         if (this.acceptKeyword('@else')) {
21207             if (this.peekIdent('if')) {
21208                 node.setElseClause(this._internalParseIfStatement(parseStatement));
21209             }
21210             else if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
21211                 var elseNode = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ElseStatement);
21212                 this._parseBody(elseNode, parseStatement);
21213                 node.setElseClause(elseNode);
21214             }
21215         }
21216         return this.finish(node);
21217     };
21218     SCSSParser.prototype._parseForStatement = function (parseStatement) {
21219         if (!this.peekKeyword('@for')) {
21220             return null;
21221         }
21222         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ForStatement);
21223         this.consumeToken(); // @for
21224         if (!node.setVariable(this._parseVariable())) {
21225             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21226         }
21227         if (!this.acceptIdent('from')) {
21228             return this.finish(node, _scssErrors__WEBPACK_IMPORTED_MODULE_4__.SCSSParseError.FromExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21229         }
21230         if (!node.addChild(this._parseBinaryExpr())) {
21231             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21232         }
21233         if (!this.acceptIdent('to') && !this.acceptIdent('through')) {
21234             return this.finish(node, _scssErrors__WEBPACK_IMPORTED_MODULE_4__.SCSSParseError.ThroughOrToExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21235         }
21236         if (!node.addChild(this._parseBinaryExpr())) {
21237             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21238         }
21239         return this._parseBody(node, parseStatement);
21240     };
21241     SCSSParser.prototype._parseEachStatement = function (parseStatement) {
21242         if (!this.peekKeyword('@each')) {
21243             return null;
21244         }
21245         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.EachStatement);
21246         this.consumeToken(); // @each
21247         var variables = node.getVariables();
21248         if (!variables.addChild(this._parseVariable())) {
21249             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21250         }
21251         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21252             if (!variables.addChild(this._parseVariable())) {
21253                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21254             }
21255         }
21256         this.finish(variables);
21257         if (!this.acceptIdent('in')) {
21258             return this.finish(node, _scssErrors__WEBPACK_IMPORTED_MODULE_4__.SCSSParseError.InExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21259         }
21260         if (!node.addChild(this._parseExpr())) {
21261             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21262         }
21263         return this._parseBody(node, parseStatement);
21264     };
21265     SCSSParser.prototype._parseWhileStatement = function (parseStatement) {
21266         if (!this.peekKeyword('@while')) {
21267             return null;
21268         }
21269         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.WhileStatement);
21270         this.consumeToken(); // @while
21271         if (!node.addChild(this._parseBinaryExpr())) {
21272             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21273         }
21274         return this._parseBody(node, parseStatement);
21275     };
21276     SCSSParser.prototype._parseFunctionBodyDeclaration = function () {
21277         return this._parseVariableDeclaration() || this._parseReturnStatement() || this._parseWarnAndDebug()
21278             || this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this));
21279     };
21280     SCSSParser.prototype._parseFunctionDeclaration = function () {
21281         if (!this.peekKeyword('@function')) {
21282             return null;
21283         }
21284         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.FunctionDeclaration);
21285         this.consumeToken(); // @function
21286         if (!node.setIdentifier(this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Function]))) {
21287             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21288         }
21289         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21290             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.LeftParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21291         }
21292         if (node.getParameters().addChild(this._parseParameterDeclaration())) {
21293             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21294                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21295                     break;
21296                 }
21297                 if (!node.getParameters().addChild(this._parseParameterDeclaration())) {
21298                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected);
21299                 }
21300             }
21301         }
21302         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21303             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21304         }
21305         return this._parseBody(node, this._parseFunctionBodyDeclaration.bind(this));
21306     };
21307     SCSSParser.prototype._parseReturnStatement = function () {
21308         if (!this.peekKeyword('@return')) {
21309             return null;
21310         }
21311         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.ReturnStatement);
21312         this.consumeToken(); // @function
21313         if (!node.addChild(this._parseExpr())) {
21314             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21315         }
21316         return this.finish(node);
21317     };
21318     SCSSParser.prototype._parseMixinDeclaration = function () {
21319         if (!this.peekKeyword('@mixin')) {
21320             return null;
21321         }
21322         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinDeclaration);
21323         this.consumeToken();
21324         if (!node.setIdentifier(this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin]))) {
21325             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21326         }
21327         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21328             if (node.getParameters().addChild(this._parseParameterDeclaration())) {
21329                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21330                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21331                         break;
21332                     }
21333                     if (!node.getParameters().addChild(this._parseParameterDeclaration())) {
21334                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected);
21335                     }
21336                 }
21337             }
21338             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21339                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21340             }
21341         }
21342         return this._parseBody(node, this._parseRuleSetDeclaration.bind(this));
21343     };
21344     SCSSParser.prototype._parseParameterDeclaration = function () {
21345         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.FunctionParameter);
21346         if (!node.setIdentifier(this._parseVariable())) {
21347             return null;
21348         }
21349         if (this.accept(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.Ellipsis)) {
21350             // ok
21351         }
21352         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
21353             if (!node.setDefaultValue(this._parseExpr(true))) {
21354                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableValueExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma, _cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
21355             }
21356         }
21357         return this.finish(node);
21358     };
21359     SCSSParser.prototype._parseMixinContent = function () {
21360         if (!this.peekKeyword('@content')) {
21361             return null;
21362         }
21363         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinContentReference);
21364         this.consumeToken();
21365         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21366             if (node.getArguments().addChild(this._parseFunctionArgument())) {
21367                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21368                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21369                         break;
21370                     }
21371                     if (!node.getArguments().addChild(this._parseFunctionArgument())) {
21372                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21373                     }
21374                 }
21375             }
21376             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21377                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected);
21378             }
21379         }
21380         return this.finish(node);
21381     };
21382     SCSSParser.prototype._parseMixinReference = function () {
21383         if (!this.peekKeyword('@include')) {
21384             return null;
21385         }
21386         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinReference);
21387         this.consumeToken();
21388         // Could be module or mixin identifier, set as mixin as default.
21389         var firstIdent = this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin]);
21390         if (!node.setIdentifier(firstIdent)) {
21391             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21392         }
21393         // Is a module accessor.
21394         if (!this.hasWhitespace() && this.acceptDelim('.') && !this.hasWhitespace()) {
21395             var secondIdent = this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin]);
21396             if (!secondIdent) {
21397                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR]);
21398             }
21399             var moduleToken = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Module);
21400             // Re-purpose first matched ident as identifier for module token.
21401             firstIdent.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Module];
21402             moduleToken.setIdentifier(firstIdent);
21403             // Override identifier with second ident.
21404             node.setIdentifier(secondIdent);
21405             node.addChild(moduleToken);
21406         }
21407         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21408             if (node.getArguments().addChild(this._parseFunctionArgument())) {
21409                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21410                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21411                         break;
21412                     }
21413                     if (!node.getArguments().addChild(this._parseFunctionArgument())) {
21414                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21415                     }
21416                 }
21417             }
21418             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21419                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected);
21420             }
21421         }
21422         if (this.peekIdent('using') || this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
21423             node.setContent(this._parseMixinContentDeclaration());
21424         }
21425         return this.finish(node);
21426     };
21427     SCSSParser.prototype._parseMixinContentDeclaration = function () {
21428         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinContentDeclaration);
21429         if (this.acceptIdent('using')) {
21430             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21431                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.LeftParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL]);
21432             }
21433             if (node.getParameters().addChild(this._parseParameterDeclaration())) {
21434                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21435                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21436                         break;
21437                     }
21438                     if (!node.getParameters().addChild(this._parseParameterDeclaration())) {
21439                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected);
21440                     }
21441                 }
21442             }
21443             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21444                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL]);
21445             }
21446         }
21447         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
21448             this._parseBody(node, this._parseMixinReferenceBodyStatement.bind(this));
21449         }
21450         return this.finish(node);
21451     };
21452     SCSSParser.prototype._parseMixinReferenceBodyStatement = function () {
21453         return this._tryParseKeyframeSelector() || this._parseRuleSetDeclaration();
21454     };
21455     SCSSParser.prototype._parseFunctionArgument = function () {
21456         // [variableName ':'] expression | variableName '...'
21457         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.FunctionArgument);
21458         var pos = this.mark();
21459         var argument = this._parseVariable();
21460         if (argument) {
21461             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
21462                 if (this.accept(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.Ellipsis)) { // optional
21463                     node.setValue(argument);
21464                     return this.finish(node);
21465                 }
21466                 else {
21467                     this.restoreAtMark(pos);
21468                 }
21469             }
21470             else {
21471                 node.setIdentifier(argument);
21472             }
21473         }
21474         if (node.setValue(this._parseExpr(true))) {
21475             this.accept(_scssScanner__WEBPACK_IMPORTED_MODULE_0__.Ellipsis); // #43746
21476             node.addChild(this._parsePrio()); // #9859
21477             return this.finish(node);
21478         }
21479         else if (node.setValue(this._tryParsePrio())) {
21480             return this.finish(node);
21481         }
21482         return null;
21483     };
21484     SCSSParser.prototype._parseURLArgument = function () {
21485         var pos = this.mark();
21486         var node = _super.prototype._parseURLArgument.call(this);
21487         if (!node || !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21488             this.restoreAtMark(pos);
21489             var node_1 = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
21490             node_1.addChild(this._parseBinaryExpr());
21491             return this.finish(node_1);
21492         }
21493         return node;
21494     };
21495     SCSSParser.prototype._parseOperation = function () {
21496         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21497             return null;
21498         }
21499         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
21500         this.consumeToken();
21501         while (node.addChild(this._parseListElement())) {
21502             this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma); // optional
21503         }
21504         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21505             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected);
21506         }
21507         return this.finish(node);
21508     };
21509     SCSSParser.prototype._parseListElement = function () {
21510         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ListEntry);
21511         var child = this._parseBinaryExpr();
21512         if (!child) {
21513             return null;
21514         }
21515         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
21516             node.setKey(child);
21517             if (!node.setValue(this._parseBinaryExpr())) {
21518                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.ExpressionExpected);
21519             }
21520         }
21521         else {
21522             node.setValue(child);
21523         }
21524         return this.finish(node);
21525     };
21526     SCSSParser.prototype._parseUse = function () {
21527         if (!this.peekKeyword('@use')) {
21528             return null;
21529         }
21530         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Use);
21531         this.consumeToken(); // @use
21532         if (!node.addChild(this._parseStringLiteral())) {
21533             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.StringLiteralExpected);
21534         }
21535         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
21536             if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident, /as|with/)) {
21537                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.UnknownKeyword);
21538             }
21539             if (this.acceptIdent('as') &&
21540                 (!node.setIdentifier(this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Module])) && !this.acceptDelim('*'))) {
21541                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierOrWildcardExpected);
21542             }
21543             if (this.acceptIdent('with')) {
21544                 if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
21545                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.LeftParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
21546                 }
21547                 // First variable statement, no comma.
21548                 if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {
21549                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected);
21550                 }
21551                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
21552                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21553                         break;
21554                     }
21555                     if (!node.getParameters().addChild(this._parseModuleConfigDeclaration())) {
21556                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableNameExpected);
21557                     }
21558                 }
21559                 if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
21560                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.RightParenthesisExpected);
21561                 }
21562             }
21563         }
21564         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
21565             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.SemiColonExpected);
21566         }
21567         return this.finish(node);
21568     };
21569     SCSSParser.prototype._parseModuleConfigDeclaration = function () {
21570         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ModuleConfiguration);
21571         if (!node.setIdentifier(this._parseVariable())) {
21572             return null;
21573         }
21574         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon) || !node.setValue(this._parseExpr(true))) {
21575             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.VariableValueExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma, _cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
21576         }
21577         return this.finish(node);
21578     };
21579     SCSSParser.prototype._parseForward = function () {
21580         if (!this.peekKeyword('@forward')) {
21581             return null;
21582         }
21583         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Forward);
21584         this.consumeToken();
21585         if (!node.addChild(this._parseStringLiteral())) {
21586             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.StringLiteralExpected);
21587         }
21588         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
21589             if (!this.peekRegExp(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident, /as|hide|show/)) {
21590                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.UnknownKeyword);
21591             }
21592             if (this.acceptIdent('as')) {
21593                 var identifier = this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Forward]);
21594                 if (!node.setIdentifier(identifier)) {
21595                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierExpected);
21596                 }
21597                 // Wildcard must be the next character after the identifier string.
21598                 if (this.hasWhitespace() || !this.acceptDelim('*')) {
21599                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.WildcardExpected);
21600                 }
21601             }
21602             if (this.peekIdent('hide') || this.peekIdent('show')) {
21603                 if (!node.addChild(this._parseForwardVisibility())) {
21604                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.IdentifierOrVariableExpected);
21605                 }
21606             }
21607         }
21608         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
21609             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_5__.ParseError.SemiColonExpected);
21610         }
21611         return this.finish(node);
21612     };
21613     SCSSParser.prototype._parseForwardVisibility = function () {
21614         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ForwardVisibility);
21615         // Assume to be "hide" or "show".
21616         node.setIdentifier(this._parseIdent());
21617         while (node.addChild(this._parseVariable() || this._parseIdent())) {
21618             // Consume all variables and idents ahead.
21619         }
21620         // More than just identifier 
21621         return node.getChildren().length > 1 ? node : null;
21622     };
21623     SCSSParser.prototype._parseSupportsCondition = function () {
21624         return this._parseInterpolation() || _super.prototype._parseSupportsCondition.call(this);
21625     };
21626     return SCSSParser;
21627 }(_cssParser__WEBPACK_IMPORTED_MODULE_2__.Parser));
21628
21629
21630
21631 /***/ }),
21632 /* 94 */
21633 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
21634
21635 __webpack_require__.r(__webpack_exports__);
21636 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21637 /* harmony export */   "VariableName": () => /* binding */ VariableName,
21638 /* harmony export */   "InterpolationFunction": () => /* binding */ InterpolationFunction,
21639 /* harmony export */   "Default": () => /* binding */ Default,
21640 /* harmony export */   "EqualsOperator": () => /* binding */ EqualsOperator,
21641 /* harmony export */   "NotEqualsOperator": () => /* binding */ NotEqualsOperator,
21642 /* harmony export */   "GreaterEqualsOperator": () => /* binding */ GreaterEqualsOperator,
21643 /* harmony export */   "SmallerEqualsOperator": () => /* binding */ SmallerEqualsOperator,
21644 /* harmony export */   "Ellipsis": () => /* binding */ Ellipsis,
21645 /* harmony export */   "Module": () => /* binding */ Module,
21646 /* harmony export */   "SCSSScanner": () => /* binding */ SCSSScanner
21647 /* harmony export */ });
21648 /* harmony import */ var _cssScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64);
21649 /*---------------------------------------------------------------------------------------------
21650  *  Copyright (c) Microsoft Corporation. All rights reserved.
21651  *  Licensed under the MIT License. See License.txt in the project root for license information.
21652  *--------------------------------------------------------------------------------------------*/
21653
21654 var __extends = (undefined && undefined.__extends) || (function () {
21655     var extendStatics = function (d, b) {
21656         extendStatics = Object.setPrototypeOf ||
21657             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
21658             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
21659         return extendStatics(d, b);
21660     };
21661     return function (d, b) {
21662         extendStatics(d, b);
21663         function __() { this.constructor = d; }
21664         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
21665     };
21666 })();
21667
21668 var _FSL = '/'.charCodeAt(0);
21669 var _NWL = '\n'.charCodeAt(0);
21670 var _CAR = '\r'.charCodeAt(0);
21671 var _LFD = '\f'.charCodeAt(0);
21672 var _DLR = '$'.charCodeAt(0);
21673 var _HSH = '#'.charCodeAt(0);
21674 var _CUL = '{'.charCodeAt(0);
21675 var _EQS = '='.charCodeAt(0);
21676 var _BNG = '!'.charCodeAt(0);
21677 var _LAN = '<'.charCodeAt(0);
21678 var _RAN = '>'.charCodeAt(0);
21679 var _DOT = '.'.charCodeAt(0);
21680 var _ATS = '@'.charCodeAt(0);
21681 var customTokenValue = _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CustomToken;
21682 var VariableName = customTokenValue++;
21683 var InterpolationFunction = customTokenValue++;
21684 var Default = customTokenValue++;
21685 var EqualsOperator = customTokenValue++;
21686 var NotEqualsOperator = customTokenValue++;
21687 var GreaterEqualsOperator = customTokenValue++;
21688 var SmallerEqualsOperator = customTokenValue++;
21689 var Ellipsis = customTokenValue++;
21690 var Module = customTokenValue++;
21691 var SCSSScanner = /** @class */ (function (_super) {
21692     __extends(SCSSScanner, _super);
21693     function SCSSScanner() {
21694         return _super !== null && _super.apply(this, arguments) || this;
21695     }
21696     SCSSScanner.prototype.scanNext = function (offset) {
21697         // scss variable
21698         if (this.stream.advanceIfChar(_DLR)) {
21699             var content = ['$'];
21700             if (this.ident(content)) {
21701                 return this.finishToken(offset, VariableName, content.join(''));
21702             }
21703             else {
21704                 this.stream.goBackTo(offset);
21705             }
21706         }
21707         // scss: interpolation function #{..})
21708         if (this.stream.advanceIfChars([_HSH, _CUL])) {
21709             return this.finishToken(offset, InterpolationFunction);
21710         }
21711         // operator ==
21712         if (this.stream.advanceIfChars([_EQS, _EQS])) {
21713             return this.finishToken(offset, EqualsOperator);
21714         }
21715         // operator !=
21716         if (this.stream.advanceIfChars([_BNG, _EQS])) {
21717             return this.finishToken(offset, NotEqualsOperator);
21718         }
21719         // operators <, <=
21720         if (this.stream.advanceIfChar(_LAN)) {
21721             if (this.stream.advanceIfChar(_EQS)) {
21722                 return this.finishToken(offset, SmallerEqualsOperator);
21723             }
21724             return this.finishToken(offset, _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Delim);
21725         }
21726         // ooperators >, >=
21727         if (this.stream.advanceIfChar(_RAN)) {
21728             if (this.stream.advanceIfChar(_EQS)) {
21729                 return this.finishToken(offset, GreaterEqualsOperator);
21730             }
21731             return this.finishToken(offset, _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Delim);
21732         }
21733         // ellipis
21734         if (this.stream.advanceIfChars([_DOT, _DOT, _DOT])) {
21735             return this.finishToken(offset, Ellipsis);
21736         }
21737         return _super.prototype.scanNext.call(this, offset);
21738     };
21739     SCSSScanner.prototype.comment = function () {
21740         if (_super.prototype.comment.call(this)) {
21741             return true;
21742         }
21743         if (!this.inURL && this.stream.advanceIfChars([_FSL, _FSL])) {
21744             this.stream.advanceWhileChar(function (ch) {
21745                 switch (ch) {
21746                     case _NWL:
21747                     case _CAR:
21748                     case _LFD:
21749                         return false;
21750                     default:
21751                         return true;
21752                 }
21753             });
21754             return true;
21755         }
21756         else {
21757             return false;
21758         }
21759     };
21760     return SCSSScanner;
21761 }(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.Scanner));
21762
21763
21764
21765 /***/ }),
21766 /* 95 */
21767 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
21768
21769 __webpack_require__.r(__webpack_exports__);
21770 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21771 /* harmony export */   "SCSSIssueType": () => /* binding */ SCSSIssueType,
21772 /* harmony export */   "SCSSParseError": () => /* binding */ SCSSParseError
21773 /* harmony export */ });
21774 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);
21775 /*---------------------------------------------------------------------------------------------
21776  *  Copyright (c) Microsoft Corporation. All rights reserved.
21777  *  Licensed under the MIT License. See License.txt in the project root for license information.
21778  *--------------------------------------------------------------------------------------------*/
21779
21780
21781 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_0__.loadMessageBundle();
21782 var SCSSIssueType = /** @class */ (function () {
21783     function SCSSIssueType(id, message) {
21784         this.id = id;
21785         this.message = message;
21786     }
21787     return SCSSIssueType;
21788 }());
21789
21790 var SCSSParseError = {
21791     FromExpected: new SCSSIssueType('scss-fromexpected', localize('expected.from', "'from' expected")),
21792     ThroughOrToExpected: new SCSSIssueType('scss-throughexpected', localize('expected.through', "'through' or 'to' expected")),
21793     InExpected: new SCSSIssueType('scss-fromexpected', localize('expected.in', "'in' expected")),
21794 };
21795
21796
21797 /***/ }),
21798 /* 96 */
21799 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
21800
21801 __webpack_require__.r(__webpack_exports__);
21802 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21803 /* harmony export */   "SCSSCompletion": () => /* binding */ SCSSCompletion
21804 /* harmony export */ });
21805 /* harmony import */ var _cssCompletion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(76);
21806 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65);
21807 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(79);
21808 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(68);
21809 /*---------------------------------------------------------------------------------------------
21810  *  Copyright (c) Microsoft Corporation. All rights reserved.
21811  *  Licensed under the MIT License. See License.txt in the project root for license information.
21812  *--------------------------------------------------------------------------------------------*/
21813
21814 var __extends = (undefined && undefined.__extends) || (function () {
21815     var extendStatics = function (d, b) {
21816         extendStatics = Object.setPrototypeOf ||
21817             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
21818             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
21819         return extendStatics(d, b);
21820     };
21821     return function (d, b) {
21822         extendStatics(d, b);
21823         function __() { this.constructor = d; }
21824         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
21825     };
21826 })();
21827
21828
21829
21830
21831 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_3__.loadMessageBundle();
21832 var SCSSCompletion = /** @class */ (function (_super) {
21833     __extends(SCSSCompletion, _super);
21834     function SCSSCompletion(lsServiceOptions, cssDataManager) {
21835         var _this = _super.call(this, '$', lsServiceOptions, cssDataManager) || this;
21836         addReferencesToDocumentation(SCSSCompletion.scssModuleLoaders);
21837         addReferencesToDocumentation(SCSSCompletion.scssModuleBuiltIns);
21838         return _this;
21839     }
21840     SCSSCompletion.prototype.isImportPathParent = function (type) {
21841         return type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Forward
21842             || type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Use
21843             || _super.prototype.isImportPathParent.call(this, type);
21844     };
21845     SCSSCompletion.prototype.getCompletionForImportPath = function (importPathNode, result) {
21846         var parentType = importPathNode.getParent().type;
21847         if (parentType === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Forward || parentType === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Use) {
21848             for (var _i = 0, _a = SCSSCompletion.scssModuleBuiltIns; _i < _a.length; _i++) {
21849                 var p = _a[_i];
21850                 var item = {
21851                     label: p.label,
21852                     documentation: p.documentation,
21853                     textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TextEdit.replace(this.getCompletionRange(importPathNode), "'" + p.label + "'"),
21854                     kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Module
21855                 };
21856                 result.items.push(item);
21857             }
21858         }
21859         return _super.prototype.getCompletionForImportPath.call(this, importPathNode, result);
21860     };
21861     SCSSCompletion.prototype.createReplaceFunction = function () {
21862         var tabStopCounter = 1;
21863         return function (_match, p1) {
21864             return '\\' + p1 + ': ${' + tabStopCounter++ + ':' + (SCSSCompletion.variableDefaults[p1] || '') + '}';
21865         };
21866     };
21867     SCSSCompletion.prototype.createFunctionProposals = function (proposals, existingNode, sortToEnd, result) {
21868         for (var _i = 0, proposals_1 = proposals; _i < proposals_1.length; _i++) {
21869             var p = proposals_1[_i];
21870             var insertText = p.func.replace(/\[?(\$\w+)\]?/g, this.createReplaceFunction());
21871             var label = p.func.substr(0, p.func.indexOf('('));
21872             var item = {
21873                 label: label,
21874                 detail: p.func,
21875                 documentation: p.desc,
21876                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TextEdit.replace(this.getCompletionRange(existingNode), insertText),
21877                 insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
21878                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Function
21879             };
21880             if (sortToEnd) {
21881                 item.sortText = 'z';
21882             }
21883             result.items.push(item);
21884         }
21885         return result;
21886     };
21887     SCSSCompletion.prototype.getCompletionsForSelector = function (ruleSet, isNested, result) {
21888         this.createFunctionProposals(SCSSCompletion.selectorFuncs, null, true, result);
21889         return _super.prototype.getCompletionsForSelector.call(this, ruleSet, isNested, result);
21890     };
21891     SCSSCompletion.prototype.getTermProposals = function (entry, existingNode, result) {
21892         var functions = SCSSCompletion.builtInFuncs;
21893         if (entry) {
21894             functions = functions.filter(function (f) { return !f.type || !entry.restrictions || entry.restrictions.indexOf(f.type) !== -1; });
21895         }
21896         this.createFunctionProposals(functions, existingNode, true, result);
21897         return _super.prototype.getTermProposals.call(this, entry, existingNode, result);
21898     };
21899     SCSSCompletion.prototype.getColorProposals = function (entry, existingNode, result) {
21900         this.createFunctionProposals(SCSSCompletion.colorProposals, existingNode, false, result);
21901         return _super.prototype.getColorProposals.call(this, entry, existingNode, result);
21902     };
21903     SCSSCompletion.prototype.getCompletionsForDeclarationProperty = function (declaration, result) {
21904         this.getCompletionForAtDirectives(result);
21905         this.getCompletionsForSelector(null, true, result);
21906         return _super.prototype.getCompletionsForDeclarationProperty.call(this, declaration, result);
21907     };
21908     SCSSCompletion.prototype.getCompletionsForExtendsReference = function (_extendsRef, existingNode, result) {
21909         var symbols = this.getSymbolContext().findSymbolsAtOffset(this.offset, _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.ReferenceType.Rule);
21910         for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
21911             var symbol = symbols_1[_i];
21912             var suggest = {
21913                 label: symbol.name,
21914                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TextEdit.replace(this.getCompletionRange(existingNode), symbol.name),
21915                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Function,
21916             };
21917             result.items.push(suggest);
21918         }
21919         return result;
21920     };
21921     SCSSCompletion.prototype.getCompletionForAtDirectives = function (result) {
21922         var _a;
21923         (_a = result.items).push.apply(_a, SCSSCompletion.scssAtDirectives);
21924         return result;
21925     };
21926     SCSSCompletion.prototype.getCompletionForTopLevel = function (result) {
21927         this.getCompletionForAtDirectives(result);
21928         this.getCompletionForModuleLoaders(result);
21929         _super.prototype.getCompletionForTopLevel.call(this, result);
21930         return result;
21931     };
21932     SCSSCompletion.prototype.getCompletionForModuleLoaders = function (result) {
21933         var _a;
21934         (_a = result.items).push.apply(_a, SCSSCompletion.scssModuleLoaders);
21935         return result;
21936     };
21937     SCSSCompletion.variableDefaults = {
21938         '$red': '1',
21939         '$green': '2',
21940         '$blue': '3',
21941         '$alpha': '1.0',
21942         '$color': '#000000',
21943         '$weight': '0.5',
21944         '$hue': '0',
21945         '$saturation': '0%',
21946         '$lightness': '0%',
21947         '$degrees': '0',
21948         '$amount': '0',
21949         '$string': '""',
21950         '$substring': '"s"',
21951         '$number': '0',
21952         '$limit': '1'
21953     };
21954     SCSSCompletion.colorProposals = [
21955         { func: 'red($color)', desc: localize('scss.builtin.red', 'Gets the red component of a color.') },
21956         { func: 'green($color)', desc: localize('scss.builtin.green', 'Gets the green component of a color.') },
21957         { func: 'blue($color)', desc: localize('scss.builtin.blue', 'Gets the blue component of a color.') },
21958         { func: 'mix($color, $color, [$weight])', desc: localize('scss.builtin.mix', 'Mixes two colors together.') },
21959         { func: 'hue($color)', desc: localize('scss.builtin.hue', 'Gets the hue component of a color.') },
21960         { func: 'saturation($color)', desc: localize('scss.builtin.saturation', 'Gets the saturation component of a color.') },
21961         { func: 'lightness($color)', desc: localize('scss.builtin.lightness', 'Gets the lightness component of a color.') },
21962         { func: 'adjust-hue($color, $degrees)', desc: localize('scss.builtin.adjust-hue', 'Changes the hue of a color.') },
21963         { func: 'lighten($color, $amount)', desc: localize('scss.builtin.lighten', 'Makes a color lighter.') },
21964         { func: 'darken($color, $amount)', desc: localize('scss.builtin.darken', 'Makes a color darker.') },
21965         { func: 'saturate($color, $amount)', desc: localize('scss.builtin.saturate', 'Makes a color more saturated.') },
21966         { func: 'desaturate($color, $amount)', desc: localize('scss.builtin.desaturate', 'Makes a color less saturated.') },
21967         { func: 'grayscale($color)', desc: localize('scss.builtin.grayscale', 'Converts a color to grayscale.') },
21968         { func: 'complement($color)', desc: localize('scss.builtin.complement', 'Returns the complement of a color.') },
21969         { func: 'invert($color)', desc: localize('scss.builtin.invert', 'Returns the inverse of a color.') },
21970         { func: 'alpha($color)', desc: localize('scss.builtin.alpha', 'Gets the opacity component of a color.') },
21971         { func: 'opacity($color)', desc: 'Gets the alpha component (opacity) of a color.' },
21972         { func: 'rgba($color, $alpha)', desc: localize('scss.builtin.rgba', 'Changes the alpha component for a color.') },
21973         { func: 'opacify($color, $amount)', desc: localize('scss.builtin.opacify', 'Makes a color more opaque.') },
21974         { func: 'fade-in($color, $amount)', desc: localize('scss.builtin.fade-in', 'Makes a color more opaque.') },
21975         { func: 'transparentize($color, $amount)', desc: localize('scss.builtin.transparentize', 'Makes a color more transparent.') },
21976         { func: 'fade-out($color, $amount)', desc: localize('scss.builtin.fade-out', 'Makes a color more transparent.') },
21977         { func: 'adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])', desc: localize('scss.builtin.adjust-color', 'Increases or decreases one or more components of a color.') },
21978         { func: 'scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])', desc: localize('scss.builtin.scale-color', 'Fluidly scales one or more properties of a color.') },
21979         { func: 'change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])', desc: localize('scss.builtin.change-color', 'Changes one or more properties of a color.') },
21980         { func: 'ie-hex-str($color)', desc: localize('scss.builtin.ie-hex-str', 'Converts a color into the format understood by IE filters.') }
21981     ];
21982     SCSSCompletion.selectorFuncs = [
21983         { func: 'selector-nest($selectors…)', desc: localize('scss.builtin.selector-nest', 'Nests selector beneath one another like they would be nested in the stylesheet.') },
21984         { func: 'selector-append($selectors…)', desc: localize('scss.builtin.selector-append', 'Appends selectors to one another without spaces in between.') },
21985         { func: 'selector-extend($selector, $extendee, $extender)', desc: localize('scss.builtin.selector-extend', 'Extends $extendee with $extender within $selector.') },
21986         { func: 'selector-replace($selector, $original, $replacement)', desc: localize('scss.builtin.selector-replace', 'Replaces $original with $replacement within $selector.') },
21987         { func: 'selector-unify($selector1, $selector2)', desc: localize('scss.builtin.selector-unify', 'Unifies two selectors to produce a selector that matches elements matched by both.') },
21988         { func: 'is-superselector($super, $sub)', desc: localize('scss.builtin.is-superselector', 'Returns whether $super matches all the elements $sub does, and possibly more.') },
21989         { func: 'simple-selectors($selector)', desc: localize('scss.builtin.simple-selectors', 'Returns the simple selectors that comprise a compound selector.') },
21990         { func: 'selector-parse($selector)', desc: localize('scss.builtin.selector-parse', 'Parses a selector into the format returned by &.') }
21991     ];
21992     SCSSCompletion.builtInFuncs = [
21993         { func: 'unquote($string)', desc: localize('scss.builtin.unquote', 'Removes quotes from a string.') },
21994         { func: 'quote($string)', desc: localize('scss.builtin.quote', 'Adds quotes to a string.') },
21995         { func: 'str-length($string)', desc: localize('scss.builtin.str-length', 'Returns the number of characters in a string.') },
21996         { func: 'str-insert($string, $insert, $index)', desc: localize('scss.builtin.str-insert', 'Inserts $insert into $string at $index.') },
21997         { func: 'str-index($string, $substring)', desc: localize('scss.builtin.str-index', 'Returns the index of the first occurance of $substring in $string.') },
21998         { func: 'str-slice($string, $start-at, [$end-at])', desc: localize('scss.builtin.str-slice', 'Extracts a substring from $string.') },
21999         { func: 'to-upper-case($string)', desc: localize('scss.builtin.to-upper-case', 'Converts a string to upper case.') },
22000         { func: 'to-lower-case($string)', desc: localize('scss.builtin.to-lower-case', 'Converts a string to lower case.') },
22001         { func: 'percentage($number)', desc: localize('scss.builtin.percentage', 'Converts a unitless number to a percentage.'), type: 'percentage' },
22002         { func: 'round($number)', desc: localize('scss.builtin.round', 'Rounds a number to the nearest whole number.') },
22003         { func: 'ceil($number)', desc: localize('scss.builtin.ceil', 'Rounds a number up to the next whole number.') },
22004         { func: 'floor($number)', desc: localize('scss.builtin.floor', 'Rounds a number down to the previous whole number.') },
22005         { func: 'abs($number)', desc: localize('scss.builtin.abs', 'Returns the absolute value of a number.') },
22006         { func: 'min($numbers)', desc: localize('scss.builtin.min', 'Finds the minimum of several numbers.') },
22007         { func: 'max($numbers)', desc: localize('scss.builtin.max', 'Finds the maximum of several numbers.') },
22008         { func: 'random([$limit])', desc: localize('scss.builtin.random', 'Returns a random number.') },
22009         { func: 'length($list)', desc: localize('scss.builtin.length', 'Returns the length of a list.') },
22010         { func: 'nth($list, $n)', desc: localize('scss.builtin.nth', 'Returns a specific item in a list.') },
22011         { func: 'set-nth($list, $n, $value)', desc: localize('scss.builtin.set-nth', 'Replaces the nth item in a list.') },
22012         { func: 'join($list1, $list2, [$separator])', desc: localize('scss.builtin.join', 'Joins together two lists into one.') },
22013         { func: 'append($list1, $val, [$separator])', desc: localize('scss.builtin.append', 'Appends a single value onto the end of a list.') },
22014         { func: 'zip($lists)', desc: localize('scss.builtin.zip', 'Combines several lists into a single multidimensional list.') },
22015         { func: 'index($list, $value)', desc: localize('scss.builtin.index', 'Returns the position of a value within a list.') },
22016         { func: 'list-separator(#list)', desc: localize('scss.builtin.list-separator', 'Returns the separator of a list.') },
22017         { func: 'map-get($map, $key)', desc: localize('scss.builtin.map-get', 'Returns the value in a map associated with a given key.') },
22018         { func: 'map-merge($map1, $map2)', desc: localize('scss.builtin.map-merge', 'Merges two maps together into a new map.') },
22019         { func: 'map-remove($map, $keys)', desc: localize('scss.builtin.map-remove', 'Returns a new map with keys removed.') },
22020         { func: 'map-keys($map)', desc: localize('scss.builtin.map-keys', 'Returns a list of all keys in a map.') },
22021         { func: 'map-values($map)', desc: localize('scss.builtin.map-values', 'Returns a list of all values in a map.') },
22022         { func: 'map-has-key($map, $key)', desc: localize('scss.builtin.map-has-key', 'Returns whether a map has a value associated with a given key.') },
22023         { func: 'keywords($args)', desc: localize('scss.builtin.keywords', 'Returns the keywords passed to a function that takes variable arguments.') },
22024         { func: 'feature-exists($feature)', desc: localize('scss.builtin.feature-exists', 'Returns whether a feature exists in the current Sass runtime.') },
22025         { func: 'variable-exists($name)', desc: localize('scss.builtin.variable-exists', 'Returns whether a variable with the given name exists in the current scope.') },
22026         { func: 'global-variable-exists($name)', desc: localize('scss.builtin.global-variable-exists', 'Returns whether a variable with the given name exists in the global scope.') },
22027         { func: 'function-exists($name)', desc: localize('scss.builtin.function-exists', 'Returns whether a function with the given name exists.') },
22028         { func: 'mixin-exists($name)', desc: localize('scss.builtin.mixin-exists', 'Returns whether a mixin with the given name exists.') },
22029         { func: 'inspect($value)', desc: localize('scss.builtin.inspect', 'Returns the string representation of a value as it would be represented in Sass.') },
22030         { func: 'type-of($value)', desc: localize('scss.builtin.type-of', 'Returns the type of a value.') },
22031         { func: 'unit($number)', desc: localize('scss.builtin.unit', 'Returns the unit(s) associated with a number.') },
22032         { func: 'unitless($number)', desc: localize('scss.builtin.unitless', 'Returns whether a number has units.') },
22033         { func: 'comparable($number1, $number2)', desc: localize('scss.builtin.comparable', 'Returns whether two numbers can be added, subtracted, or compared.') },
22034         { func: 'call($name, $args…)', desc: localize('scss.builtin.call', 'Dynamically calls a Sass function.') }
22035     ];
22036     SCSSCompletion.scssAtDirectives = [
22037         {
22038             label: "@extend",
22039             documentation: localize("scss.builtin.@extend", "Inherits the styles of another selector."),
22040             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22041         },
22042         {
22043             label: "@at-root",
22044             documentation: localize("scss.builtin.@at-root", "Causes one or more rules to be emitted at the root of the document."),
22045             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22046         },
22047         {
22048             label: "@debug",
22049             documentation: localize("scss.builtin.@debug", "Prints the value of an expression to the standard error output stream. Useful for debugging complicated Sass files."),
22050             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22051         },
22052         {
22053             label: "@warn",
22054             documentation: localize("scss.builtin.@warn", "Prints the value of an expression to the standard error output stream. Useful for libraries that need to warn users of deprecations or recovering from minor mixin usage mistakes. Warnings can be turned off with the `--quiet` command-line option or the `:quiet` Sass option."),
22055             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22056         },
22057         {
22058             label: "@error",
22059             documentation: localize("scss.builtin.@error", "Throws the value of an expression as a fatal error with stack trace. Useful for validating arguments to mixins and functions."),
22060             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22061         },
22062         {
22063             label: "@if",
22064             documentation: localize("scss.builtin.@if", "Includes the body if the expression does not evaluate to `false` or `null`."),
22065             insertText: "@if ${1:expr} {\n\t$0\n}",
22066             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22067             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22068         },
22069         {
22070             label: "@for",
22071             documentation: localize("scss.builtin.@for", "For loop that repeatedly outputs a set of styles for each `$var` in the `from/through` or `from/to` clause."),
22072             insertText: "@for \\$${1:var} from ${2:start} ${3|to,through|} ${4:end} {\n\t$0\n}",
22073             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22074             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22075         },
22076         {
22077             label: "@each",
22078             documentation: localize("scss.builtin.@each", "Each loop that sets `$var` to each item in the list or map, then outputs the styles it contains using that value of `$var`."),
22079             insertText: "@each \\$${1:var} in ${2:list} {\n\t$0\n}",
22080             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22081             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22082         },
22083         {
22084             label: "@while",
22085             documentation: localize("scss.builtin.@while", "While loop that takes an expression and repeatedly outputs the nested styles until the statement evaluates to `false`."),
22086             insertText: "@while ${1:condition} {\n\t$0\n}",
22087             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22088             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22089         },
22090         {
22091             label: "@mixin",
22092             documentation: localize("scss.builtin.@mixin", "Defines styles that can be re-used throughout the stylesheet with `@include`."),
22093             insertText: "@mixin ${1:name} {\n\t$0\n}",
22094             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22095             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22096         },
22097         {
22098             label: "@include",
22099             documentation: localize("scss.builtin.@include", "Includes the styles defined by another mixin into the current rule."),
22100             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22101         },
22102         {
22103             label: "@function",
22104             documentation: localize("scss.builtin.@function", "Defines complex operations that can be re-used throughout stylesheets."),
22105             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22106         }
22107     ];
22108     SCSSCompletion.scssModuleLoaders = [
22109         {
22110             label: "@use",
22111             documentation: localize("scss.builtin.@use", "Loads mixins, functions, and variables from other Sass stylesheets as 'modules', and combines CSS from multiple stylesheets together."),
22112             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/at-rules/use' }],
22113             insertText: "@use '$0';",
22114             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22115             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22116         },
22117         {
22118             label: "@forward",
22119             documentation: localize("scss.builtin.@forward", "Loads a Sass stylesheet and makes its mixins, functions, and variables available when this stylesheet is loaded with the @use rule."),
22120             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/at-rules/forward' }],
22121             insertText: "@forward '$0';",
22122             insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.InsertTextFormat.Snippet,
22123             kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.CompletionItemKind.Keyword
22124         },
22125     ];
22126     SCSSCompletion.scssModuleBuiltIns = [
22127         {
22128             label: 'sass:math',
22129             documentation: localize('scss.builtin.sass:math', 'Provides functions that operate on numbers.'),
22130             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/math' }]
22131         },
22132         {
22133             label: 'sass:string',
22134             documentation: localize('scss.builtin.sass:string', 'Makes it easy to combine, search, or split apart strings.'),
22135             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/string' }]
22136         },
22137         {
22138             label: 'sass:color',
22139             documentation: localize('scss.builtin.sass:color', 'Generates new colors based on existing ones, making it easy to build color themes.'),
22140             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/color' }]
22141         },
22142         {
22143             label: 'sass:list',
22144             documentation: localize('scss.builtin.sass:list', 'Lets you access and modify values in lists.'),
22145             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/list' }]
22146         },
22147         {
22148             label: 'sass:map',
22149             documentation: localize('scss.builtin.sass:map', 'Makes it possible to look up the value associated with a key in a map, and much more.'),
22150             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/map' }]
22151         },
22152         {
22153             label: 'sass:selector',
22154             documentation: localize('scss.builtin.sass:selector', 'Provides access to Sass’s powerful selector engine.'),
22155             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/selector' }]
22156         },
22157         {
22158             label: 'sass:meta',
22159             documentation: localize('scss.builtin.sass:meta', 'Exposes the details of Sass’s inner workings.'),
22160             references: [{ name: 'Sass documentation', url: 'https://sass-lang.com/documentation/modules/meta' }]
22161         },
22162     ];
22163     return SCSSCompletion;
22164 }(_cssCompletion__WEBPACK_IMPORTED_MODULE_0__.CSSCompletion));
22165
22166 /**
22167  * Todo @Pine: Remove this and do it through custom data
22168  */
22169 function addReferencesToDocumentation(items) {
22170     items.forEach(function (i) {
22171         if (i.documentation && i.references && i.references.length > 0) {
22172             var markdownDoc = typeof i.documentation === 'string'
22173                 ? { kind: 'markdown', value: i.documentation }
22174                 : { kind: 'markdown', value: i.documentation.value };
22175             markdownDoc.value += '\n\n';
22176             markdownDoc.value += i.references
22177                 .map(function (r) {
22178                 return "[" + r.name + "](" + r.url + ")";
22179             })
22180                 .join(' | ');
22181             i.documentation = markdownDoc;
22182         }
22183     });
22184 }
22185
22186
22187 /***/ }),
22188 /* 97 */
22189 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
22190
22191 __webpack_require__.r(__webpack_exports__);
22192 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
22193 /* harmony export */   "LESSParser": () => /* binding */ LESSParser
22194 /* harmony export */ });
22195 /* harmony import */ var _lessScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(98);
22196 /* harmony import */ var _cssScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64);
22197 /* harmony import */ var _cssParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(63);
22198 /* harmony import */ var _cssNodes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(65);
22199 /* harmony import */ var _cssErrors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(67);
22200 /*---------------------------------------------------------------------------------------------
22201  *  Copyright (c) Microsoft Corporation. All rights reserved.
22202  *  Licensed under the MIT License. See License.txt in the project root for license information.
22203  *--------------------------------------------------------------------------------------------*/
22204
22205 var __extends = (undefined && undefined.__extends) || (function () {
22206     var extendStatics = function (d, b) {
22207         extendStatics = Object.setPrototypeOf ||
22208             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
22209             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
22210         return extendStatics(d, b);
22211     };
22212     return function (d, b) {
22213         extendStatics(d, b);
22214         function __() { this.constructor = d; }
22215         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
22216     };
22217 })();
22218
22219
22220
22221
22222
22223 /// <summary>
22224 /// A parser for LESS
22225 /// http://lesscss.org/
22226 /// </summary>
22227 var LESSParser = /** @class */ (function (_super) {
22228     __extends(LESSParser, _super);
22229     function LESSParser() {
22230         return _super.call(this, new _lessScanner__WEBPACK_IMPORTED_MODULE_0__.LESSScanner()) || this;
22231     }
22232     LESSParser.prototype._parseStylesheetStatement = function (isNested) {
22233         if (isNested === void 0) { isNested = false; }
22234         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
22235             return this._parseVariableDeclaration()
22236                 || this._parsePlugin()
22237                 || _super.prototype._parseStylesheetAtStatement.call(this, isNested);
22238         }
22239         return this._tryParseMixinDeclaration()
22240             || this._tryParseMixinReference()
22241             || this._parseFunction()
22242             || this._parseRuleset(true);
22243     };
22244     LESSParser.prototype._parseImport = function () {
22245         if (!this.peekKeyword('@import') && !this.peekKeyword('@import-once') /* deprecated in less 1.4.1 */) {
22246             return null;
22247         }
22248         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Import);
22249         this.consumeToken();
22250         // less 1.4.1: @import (css) "lib"
22251         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22252             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident)) {
22253                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.IdentifierExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon]);
22254             }
22255             do {
22256                 if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
22257                     break;
22258                 }
22259             } while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident));
22260             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22261                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon]);
22262             }
22263         }
22264         if (!node.addChild(this._parseURILiteral()) && !node.addChild(this._parseStringLiteral())) {
22265             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.URIOrStringExpected, [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon]);
22266         }
22267         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
22268             node.setMedialist(this._parseMediaQueryList());
22269         }
22270         return this.finish(node);
22271     };
22272     LESSParser.prototype._parsePlugin = function () {
22273         if (!this.peekKeyword('@plugin')) {
22274             return null;
22275         }
22276         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Plugin);
22277         this.consumeToken(); // @import
22278         if (!node.addChild(this._parseStringLiteral())) {
22279             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.StringLiteralExpected);
22280         }
22281         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22282             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.SemiColonExpected);
22283         }
22284         return this.finish(node);
22285     };
22286     LESSParser.prototype._parseMediaQuery = function (resyncStopToken) {
22287         var node = _super.prototype._parseMediaQuery.call(this, resyncStopToken);
22288         if (!node) {
22289             var node_1 = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MediaQuery);
22290             if (node_1.addChild(this._parseVariable())) {
22291                 return this.finish(node_1);
22292             }
22293             return null;
22294         }
22295         return node;
22296     };
22297     LESSParser.prototype._parseMediaDeclaration = function (isNested) {
22298         if (isNested === void 0) { isNested = false; }
22299         return this._tryParseRuleset(isNested)
22300             || this._tryToParseDeclaration()
22301             || this._tryParseMixinDeclaration()
22302             || this._tryParseMixinReference()
22303             || this._parseDetachedRuleSetMixin()
22304             || this._parseStylesheetStatement(isNested);
22305     };
22306     LESSParser.prototype._parseMediaFeatureName = function () {
22307         return this._parseIdent() || this._parseVariable();
22308     };
22309     LESSParser.prototype._parseVariableDeclaration = function (panic) {
22310         if (panic === void 0) { panic = []; }
22311         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.VariableDeclaration);
22312         var mark = this.mark();
22313         if (!node.setVariable(this._parseVariable(true))) {
22314             return null;
22315         }
22316         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
22317             if (this.prevToken) {
22318                 node.colonPosition = this.prevToken.offset;
22319             }
22320             if (node.setValue(this._parseDetachedRuleSet())) {
22321                 node.needsSemicolon = false;
22322             }
22323             else if (!node.setValue(this._parseExpr())) {
22324                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.VariableValueExpected, [], panic);
22325             }
22326             node.addChild(this._parsePrio());
22327         }
22328         else {
22329             this.restoreAtMark(mark);
22330             return null; // at keyword, but no ':', not a variable declaration but some at keyword
22331         }
22332         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22333             node.semicolonPosition = this.token.offset; // not part of the declaration, but useful information for code assist
22334         }
22335         return this.finish(node);
22336     };
22337     LESSParser.prototype._parseDetachedRuleSet = function () {
22338         var mark = this.mark();
22339         // "Anonymous mixin" used in each() and possibly a generic type in the future
22340         if (this.peekDelim('#') || this.peekDelim('.')) {
22341             this.consumeToken();
22342             if (!this.hasWhitespace() && this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22343                 var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinDeclaration);
22344                 if (node.getParameters().addChild(this._parseMixinParameter())) {
22345                     while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22346                         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22347                             break;
22348                         }
22349                         if (!node.getParameters().addChild(this._parseMixinParameter())) {
22350                             this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.IdentifierExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
22351                         }
22352                     }
22353                 }
22354                 if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22355                     this.restoreAtMark(mark);
22356                     return null;
22357                 }
22358             }
22359             else {
22360                 this.restoreAtMark(mark);
22361                 return null;
22362             }
22363         }
22364         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
22365             return null;
22366         }
22367         var content = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.BodyDeclaration);
22368         this._parseBody(content, this._parseDetachedRuleSetBody.bind(this));
22369         return this.finish(content);
22370     };
22371     LESSParser.prototype._parseDetachedRuleSetBody = function () {
22372         return this._tryParseKeyframeSelector() || this._parseRuleSetDeclaration();
22373     };
22374     LESSParser.prototype._addLookupChildren = function (node) {
22375         if (!node.addChild(this._parseLookupValue())) {
22376             return false;
22377         }
22378         var expectsValue = false;
22379         while (true) {
22380             if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketL)) {
22381                 expectsValue = true;
22382             }
22383             if (!node.addChild(this._parseLookupValue())) {
22384                 break;
22385             }
22386             expectsValue = false;
22387         }
22388         return !expectsValue;
22389     };
22390     LESSParser.prototype._parseLookupValue = function () {
22391         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
22392         var mark = this.mark();
22393         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketL)) {
22394             this.restoreAtMark(mark);
22395             return null;
22396         }
22397         if (((node.addChild(this._parseVariable(false, true)) ||
22398             node.addChild(this._parsePropertyIdentifier())) &&
22399             this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketR)) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketR)) {
22400             return node;
22401         }
22402         this.restoreAtMark(mark);
22403         return null;
22404     };
22405     LESSParser.prototype._parseVariable = function (declaration, insideLookup) {
22406         if (declaration === void 0) { declaration = false; }
22407         if (insideLookup === void 0) { insideLookup = false; }
22408         var isPropertyReference = !declaration && this.peekDelim('$');
22409         if (!this.peekDelim('@') && !isPropertyReference && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
22410             return null;
22411         }
22412         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Variable);
22413         var mark = this.mark();
22414         while (this.acceptDelim('@') || (!declaration && this.acceptDelim('$'))) {
22415             if (this.hasWhitespace()) {
22416                 this.restoreAtMark(mark);
22417                 return null;
22418             }
22419         }
22420         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword) && !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident)) {
22421             this.restoreAtMark(mark);
22422             return null;
22423         }
22424         if (!insideLookup && this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketL)) {
22425             if (!this._addLookupChildren(node)) {
22426                 this.restoreAtMark(mark);
22427                 return null;
22428             }
22429         }
22430         return node;
22431     };
22432     LESSParser.prototype._parseTermExpression = function () {
22433         return this._parseVariable() ||
22434             this._parseEscaped() ||
22435             _super.prototype._parseTermExpression.call(this) || // preference for colors before mixin references
22436             this._tryParseMixinReference(false);
22437     };
22438     LESSParser.prototype._parseEscaped = function () {
22439         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EscapedJavaScript) ||
22440             this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BadEscapedJavaScript)) {
22441             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.EscapedValue);
22442             this.consumeToken();
22443             return this.finish(node);
22444         }
22445         if (this.peekDelim('~')) {
22446             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.EscapedValue);
22447             this.consumeToken();
22448             if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.String) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EscapedJavaScript)) {
22449                 return this.finish(node);
22450             }
22451             else {
22452                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.TermExpected);
22453             }
22454         }
22455         return null;
22456     };
22457     LESSParser.prototype._parseOperator = function () {
22458         var node = this._parseGuardOperator();
22459         if (node) {
22460             return node;
22461         }
22462         else {
22463             return _super.prototype._parseOperator.call(this);
22464         }
22465     };
22466     LESSParser.prototype._parseGuardOperator = function () {
22467         if (this.peekDelim('>')) {
22468             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Operator);
22469             this.consumeToken();
22470             this.acceptDelim('=');
22471             return node;
22472         }
22473         else if (this.peekDelim('=')) {
22474             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Operator);
22475             this.consumeToken();
22476             this.acceptDelim('<');
22477             return node;
22478         }
22479         else if (this.peekDelim('<')) {
22480             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Operator);
22481             this.consumeToken();
22482             this.acceptDelim('=');
22483             return node;
22484         }
22485         return null;
22486     };
22487     LESSParser.prototype._parseRuleSetDeclaration = function () {
22488         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
22489             return this._parseKeyframe()
22490                 || this._parseMedia(true)
22491                 || this._parseImport()
22492                 || this._parseSupports(true) // @supports
22493                 || this._parseDetachedRuleSetMixin() // less detached ruleset mixin
22494                 || this._parseVariableDeclaration() // Variable declarations
22495                 || _super.prototype._parseRuleSetDeclarationAtStatement.call(this);
22496         }
22497         return this._tryParseMixinDeclaration()
22498             || this._tryParseRuleset(true) // nested ruleset
22499             || this._tryParseMixinReference() // less mixin reference
22500             || this._parseFunction()
22501             || this._parseExtend() // less extend declaration
22502             || _super.prototype._parseRuleSetDeclaration.call(this); // try css ruleset declaration as the last option
22503     };
22504     LESSParser.prototype._parseKeyframeIdent = function () {
22505         return this._parseIdent([_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Keyframe]) || this._parseVariable();
22506     };
22507     LESSParser.prototype._parseKeyframeSelector = function () {
22508         return this._parseDetachedRuleSetMixin() // less detached ruleset mixin
22509             || _super.prototype._parseKeyframeSelector.call(this);
22510     };
22511     LESSParser.prototype._parseSimpleSelectorBody = function () {
22512         return this._parseSelectorCombinator() || _super.prototype._parseSimpleSelectorBody.call(this);
22513     };
22514     LESSParser.prototype._parseSelector = function (isNested) {
22515         // CSS Guards
22516         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Selector);
22517         var hasContent = false;
22518         if (isNested) {
22519             // nested selectors can start with a combinator
22520             hasContent = node.addChild(this._parseCombinator());
22521         }
22522         while (node.addChild(this._parseSimpleSelector())) {
22523             hasContent = true;
22524             var mark = this.mark();
22525             if (node.addChild(this._parseGuard()) && this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
22526                 break;
22527             }
22528             this.restoreAtMark(mark);
22529             node.addChild(this._parseCombinator()); // optional
22530         }
22531         return hasContent ? this.finish(node) : null;
22532     };
22533     LESSParser.prototype._parseSelectorCombinator = function () {
22534         if (this.peekDelim('&')) {
22535             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.SelectorCombinator);
22536             this.consumeToken();
22537             while (!this.hasWhitespace() && (this.acceptDelim('-') || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Num) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Dimension) || node.addChild(this._parseIdent()) || this.acceptDelim('&'))) {
22538                 //  support &-foo
22539             }
22540             return this.finish(node);
22541         }
22542         return null;
22543     };
22544     LESSParser.prototype._parseSelectorIdent = function () {
22545         if (!this.peekInterpolatedIdent()) {
22546             return null;
22547         }
22548         var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.SelectorInterpolation);
22549         var hasContent = this._acceptInterpolatedIdent(node);
22550         return hasContent ? this.finish(node) : null;
22551     };
22552     LESSParser.prototype._parsePropertyIdentifier = function (inLookup) {
22553         if (inLookup === void 0) { inLookup = false; }
22554         var propertyRegex = /^[\w-]+/;
22555         if (!this.peekInterpolatedIdent() && !this.peekRegExp(this.token.type, propertyRegex)) {
22556             return null;
22557         }
22558         var mark = this.mark();
22559         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Identifier);
22560         node.isCustomProperty = this.acceptDelim('-') && this.acceptDelim('-');
22561         var childAdded = false;
22562         if (!inLookup) {
22563             if (node.isCustomProperty) {
22564                 childAdded = this._acceptInterpolatedIdent(node);
22565             }
22566             else {
22567                 childAdded = this._acceptInterpolatedIdent(node, propertyRegex);
22568             }
22569         }
22570         else {
22571             if (node.isCustomProperty) {
22572                 childAdded = node.addChild(this._parseIdent());
22573             }
22574             else {
22575                 childAdded = node.addChild(this._parseRegexp(propertyRegex));
22576             }
22577         }
22578         if (!childAdded) {
22579             this.restoreAtMark(mark);
22580             return null;
22581         }
22582         if (!inLookup && !this.hasWhitespace()) {
22583             this.acceptDelim('+');
22584             if (!this.hasWhitespace()) {
22585                 this.acceptIdent('_');
22586             }
22587         }
22588         return this.finish(node);
22589     };
22590     LESSParser.prototype.peekInterpolatedIdent = function () {
22591         return this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident) ||
22592             this.peekDelim('@') ||
22593             this.peekDelim('$') ||
22594             this.peekDelim('-');
22595     };
22596     LESSParser.prototype._acceptInterpolatedIdent = function (node, identRegex) {
22597         var _this = this;
22598         var hasContent = false;
22599         var indentInterpolation = function () {
22600             var pos = _this.mark();
22601             if (_this.acceptDelim('-')) {
22602                 if (!_this.hasWhitespace()) {
22603                     _this.acceptDelim('-');
22604                 }
22605                 if (_this.hasWhitespace()) {
22606                     _this.restoreAtMark(pos);
22607                     return null;
22608                 }
22609             }
22610             return _this._parseInterpolation();
22611         };
22612         var accept = identRegex ?
22613             function () { return _this.acceptRegexp(identRegex); } :
22614             function () { return _this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Ident); };
22615         while (accept() ||
22616             node.addChild(this._parseInterpolation() ||
22617                 this.try(indentInterpolation))) {
22618             hasContent = true;
22619             if (this.hasWhitespace()) {
22620                 break;
22621             }
22622         }
22623         return hasContent;
22624     };
22625     LESSParser.prototype._parseInterpolation = function () {
22626         // @{name} Variable or
22627         // ${name} Property
22628         var mark = this.mark();
22629         if (this.peekDelim('@') || this.peekDelim('$')) {
22630             var node = this.createNode(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.NodeType.Interpolation);
22631             this.consumeToken();
22632             if (this.hasWhitespace() || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
22633                 this.restoreAtMark(mark);
22634                 return null;
22635             }
22636             if (!node.addChild(this._parseIdent())) {
22637                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.IdentifierExpected);
22638             }
22639             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR)) {
22640                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightCurlyExpected);
22641             }
22642             return this.finish(node);
22643         }
22644         return null;
22645     };
22646     LESSParser.prototype._tryParseMixinDeclaration = function () {
22647         var mark = this.mark();
22648         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinDeclaration);
22649         if (!node.setIdentifier(this._parseMixinDeclarationIdentifier()) || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22650             this.restoreAtMark(mark);
22651             return null;
22652         }
22653         if (node.getParameters().addChild(this._parseMixinParameter())) {
22654             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22655                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22656                     break;
22657                 }
22658                 if (!node.getParameters().addChild(this._parseMixinParameter())) {
22659                     this.markError(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.IdentifierExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
22660                 }
22661             }
22662         }
22663         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22664             this.restoreAtMark(mark);
22665             return null;
22666         }
22667         node.setGuard(this._parseGuard());
22668         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyL)) {
22669             this.restoreAtMark(mark);
22670             return null;
22671         }
22672         return this._parseBody(node, this._parseMixInBodyDeclaration.bind(this));
22673     };
22674     LESSParser.prototype._parseMixInBodyDeclaration = function () {
22675         return this._parseFontFace() || this._parseRuleSetDeclaration();
22676     };
22677     LESSParser.prototype._parseMixinDeclarationIdentifier = function () {
22678         var identifier;
22679         if (this.peekDelim('#') || this.peekDelim('.')) {
22680             identifier = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Identifier);
22681             this.consumeToken(); // # or .
22682             if (this.hasWhitespace() || !identifier.addChild(this._parseIdent())) {
22683                 return null;
22684             }
22685         }
22686         else if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Hash)) {
22687             identifier = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Identifier);
22688             this.consumeToken(); // TokenType.Hash
22689         }
22690         else {
22691             return null;
22692         }
22693         identifier.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin];
22694         return this.finish(identifier);
22695     };
22696     LESSParser.prototype._parsePseudo = function () {
22697         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
22698             return null;
22699         }
22700         var mark = this.mark();
22701         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ExtendsReference);
22702         this.consumeToken(); // :
22703         if (this.acceptIdent('extend')) {
22704             return this._completeExtends(node);
22705         }
22706         this.restoreAtMark(mark);
22707         return _super.prototype._parsePseudo.call(this);
22708     };
22709     LESSParser.prototype._parseExtend = function () {
22710         if (!this.peekDelim('&')) {
22711             return null;
22712         }
22713         var mark = this.mark();
22714         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ExtendsReference);
22715         this.consumeToken(); // &
22716         if (this.hasWhitespace() || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon) || !this.acceptIdent('extend')) {
22717             this.restoreAtMark(mark);
22718             return null;
22719         }
22720         return this._completeExtends(node);
22721     };
22722     LESSParser.prototype._completeExtends = function (node) {
22723         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22724             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.LeftParenthesisExpected);
22725         }
22726         var selectors = node.getSelectors();
22727         if (!selectors.addChild(this._parseSelector(true))) {
22728             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.SelectorExpected);
22729         }
22730         while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
22731             if (!selectors.addChild(this._parseSelector(true))) {
22732                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.SelectorExpected);
22733             }
22734         }
22735         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22736             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected);
22737         }
22738         return this.finish(node);
22739     };
22740     LESSParser.prototype._parseDetachedRuleSetMixin = function () {
22741         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.AtKeyword)) {
22742             return null;
22743         }
22744         var mark = this.mark();
22745         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinReference);
22746         if (node.addChild(this._parseVariable(true)) && (this.hasWhitespace() || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL))) {
22747             this.restoreAtMark(mark);
22748             return null;
22749         }
22750         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22751             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected);
22752         }
22753         return this.finish(node);
22754     };
22755     LESSParser.prototype._tryParseMixinReference = function (atRoot) {
22756         if (atRoot === void 0) { atRoot = true; }
22757         var mark = this.mark();
22758         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.MixinReference);
22759         var identifier = this._parseMixinDeclarationIdentifier();
22760         while (identifier) {
22761             this.acceptDelim('>');
22762             var nextId = this._parseMixinDeclarationIdentifier();
22763             if (nextId) {
22764                 node.getNamespaces().addChild(identifier);
22765                 identifier = nextId;
22766             }
22767             else {
22768                 break;
22769             }
22770         }
22771         if (!node.setIdentifier(identifier)) {
22772             this.restoreAtMark(mark);
22773             return null;
22774         }
22775         var hasArguments = false;
22776         if (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22777             hasArguments = true;
22778             if (node.getArguments().addChild(this._parseMixinArgument())) {
22779                 while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22780                     if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22781                         break;
22782                     }
22783                     if (!node.getArguments().addChild(this._parseMixinArgument())) {
22784                         return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.ExpressionExpected);
22785                     }
22786                 }
22787             }
22788             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22789                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected);
22790             }
22791             identifier.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin];
22792         }
22793         else {
22794             identifier.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Mixin, _cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Rule];
22795         }
22796         if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.BracketL)) {
22797             if (!atRoot) {
22798                 this._addLookupChildren(node);
22799             }
22800         }
22801         else {
22802             node.addChild(this._parsePrio());
22803         }
22804         if (!hasArguments && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.CurlyR) && !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOF)) {
22805             this.restoreAtMark(mark);
22806             return null;
22807         }
22808         return this.finish(node);
22809     };
22810     LESSParser.prototype._parseMixinArgument = function () {
22811         // [variableName ':'] expression | variableName '...'
22812         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.FunctionArgument);
22813         var pos = this.mark();
22814         var argument = this._parseVariable();
22815         if (argument) {
22816             if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon)) {
22817                 this.restoreAtMark(pos);
22818             }
22819             else {
22820                 node.setIdentifier(argument);
22821             }
22822         }
22823         if (node.setValue(this._parseDetachedRuleSet() || this._parseExpr(true))) {
22824             return this.finish(node);
22825         }
22826         this.restoreAtMark(pos);
22827         return null;
22828     };
22829     LESSParser.prototype._parseMixinParameter = function () {
22830         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.FunctionParameter);
22831         // special rest variable: @rest...
22832         if (this.peekKeyword('@rest')) {
22833             var restNode = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
22834             this.consumeToken();
22835             if (!this.accept(_lessScanner__WEBPACK_IMPORTED_MODULE_0__.Ellipsis)) {
22836                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.DotExpected, [], [_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma, _cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR]);
22837             }
22838             node.setIdentifier(this.finish(restNode));
22839             return this.finish(node);
22840         }
22841         // special const args: ...
22842         if (this.peek(_lessScanner__WEBPACK_IMPORTED_MODULE_0__.Ellipsis)) {
22843             var varargsNode = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
22844             this.consumeToken();
22845             node.setIdentifier(this.finish(varargsNode));
22846             return this.finish(node);
22847         }
22848         var hasContent = false;
22849         // default variable declaration: @param: 12 or @name
22850         if (node.setIdentifier(this._parseVariable())) {
22851             this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Colon);
22852             hasContent = true;
22853         }
22854         if (!node.setDefaultValue(this._parseDetachedRuleSet() || this._parseExpr(true)) && !hasContent) {
22855             return null;
22856         }
22857         return this.finish(node);
22858     };
22859     LESSParser.prototype._parseGuard = function () {
22860         if (!this.peekIdent('when')) {
22861             return null;
22862         }
22863         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.LessGuard);
22864         this.consumeToken(); // when
22865         node.isNegated = this.acceptIdent('not');
22866         if (!node.getConditions().addChild(this._parseGuardCondition())) {
22867             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.ConditionExpected);
22868         }
22869         while (this.acceptIdent('and') || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma)) {
22870             if (!node.getConditions().addChild(this._parseGuardCondition())) {
22871                 return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.ConditionExpected);
22872             }
22873         }
22874         return this.finish(node);
22875     };
22876     LESSParser.prototype._parseGuardCondition = function () {
22877         if (!this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22878             return null;
22879         }
22880         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.GuardCondition);
22881         this.consumeToken(); // ParenthesisL
22882         if (!node.addChild(this._parseExpr())) {
22883             // empty (?)
22884         }
22885         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22886             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected);
22887         }
22888         return this.finish(node);
22889     };
22890     LESSParser.prototype._parseFunction = function () {
22891         var pos = this.mark();
22892         var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Function);
22893         if (!node.setIdentifier(this._parseFunctionIdentifier())) {
22894             return null;
22895         }
22896         if (this.hasWhitespace() || !this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisL)) {
22897             this.restoreAtMark(pos);
22898             return null;
22899         }
22900         if (node.getArguments().addChild(this._parseMixinArgument())) {
22901             while (this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comma) || this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.SemiColon)) {
22902                 if (this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22903                     break;
22904                 }
22905                 if (!node.getArguments().addChild(this._parseMixinArgument())) {
22906                     return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.ExpressionExpected);
22907                 }
22908             }
22909         }
22910         if (!this.accept(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22911             return this.finish(node, _cssErrors__WEBPACK_IMPORTED_MODULE_4__.ParseError.RightParenthesisExpected);
22912         }
22913         return this.finish(node);
22914     };
22915     LESSParser.prototype._parseFunctionIdentifier = function () {
22916         if (this.peekDelim('%')) {
22917             var node = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Identifier);
22918             node.referenceTypes = [_cssNodes__WEBPACK_IMPORTED_MODULE_3__.ReferenceType.Function];
22919             this.consumeToken();
22920             return this.finish(node);
22921         }
22922         return _super.prototype._parseFunctionIdentifier.call(this);
22923     };
22924     LESSParser.prototype._parseURLArgument = function () {
22925         var pos = this.mark();
22926         var node = _super.prototype._parseURLArgument.call(this);
22927         if (!node || !this.peek(_cssScanner__WEBPACK_IMPORTED_MODULE_1__.TokenType.ParenthesisR)) {
22928             this.restoreAtMark(pos);
22929             var node_2 = this.create(_cssNodes__WEBPACK_IMPORTED_MODULE_3__.Node);
22930             node_2.addChild(this._parseBinaryExpr());
22931             return this.finish(node_2);
22932         }
22933         return node;
22934     };
22935     return LESSParser;
22936 }(_cssParser__WEBPACK_IMPORTED_MODULE_2__.Parser));
22937
22938
22939
22940 /***/ }),
22941 /* 98 */
22942 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
22943
22944 __webpack_require__.r(__webpack_exports__);
22945 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
22946 /* harmony export */   "Ellipsis": () => /* binding */ Ellipsis,
22947 /* harmony export */   "LESSScanner": () => /* binding */ LESSScanner
22948 /* harmony export */ });
22949 /* harmony import */ var _cssScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64);
22950 /*---------------------------------------------------------------------------------------------
22951  *  Copyright (c) Microsoft Corporation. All rights reserved.
22952  *  Licensed under the MIT License. See License.txt in the project root for license information.
22953  *--------------------------------------------------------------------------------------------*/
22954
22955 var __extends = (undefined && undefined.__extends) || (function () {
22956     var extendStatics = function (d, b) {
22957         extendStatics = Object.setPrototypeOf ||
22958             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
22959             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
22960         return extendStatics(d, b);
22961     };
22962     return function (d, b) {
22963         extendStatics(d, b);
22964         function __() { this.constructor = d; }
22965         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
22966     };
22967 })();
22968
22969 var _FSL = '/'.charCodeAt(0);
22970 var _NWL = '\n'.charCodeAt(0);
22971 var _CAR = '\r'.charCodeAt(0);
22972 var _LFD = '\f'.charCodeAt(0);
22973 var _TIC = '`'.charCodeAt(0);
22974 var _DOT = '.'.charCodeAt(0);
22975 var customTokenValue = _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CustomToken;
22976 var Ellipsis = customTokenValue++;
22977 var LESSScanner = /** @class */ (function (_super) {
22978     __extends(LESSScanner, _super);
22979     function LESSScanner() {
22980         return _super !== null && _super.apply(this, arguments) || this;
22981     }
22982     LESSScanner.prototype.scanNext = function (offset) {
22983         // LESS: escaped JavaScript code `const a = "dddd"`
22984         var tokenType = this.escapedJavaScript();
22985         if (tokenType !== null) {
22986             return this.finishToken(offset, tokenType);
22987         }
22988         if (this.stream.advanceIfChars([_DOT, _DOT, _DOT])) {
22989             return this.finishToken(offset, Ellipsis);
22990         }
22991         return _super.prototype.scanNext.call(this, offset);
22992     };
22993     LESSScanner.prototype.comment = function () {
22994         if (_super.prototype.comment.call(this)) {
22995             return true;
22996         }
22997         if (!this.inURL && this.stream.advanceIfChars([_FSL, _FSL])) {
22998             this.stream.advanceWhileChar(function (ch) {
22999                 switch (ch) {
23000                     case _NWL:
23001                     case _CAR:
23002                     case _LFD:
23003                         return false;
23004                     default:
23005                         return true;
23006                 }
23007             });
23008             return true;
23009         }
23010         else {
23011             return false;
23012         }
23013     };
23014     LESSScanner.prototype.escapedJavaScript = function () {
23015         var ch = this.stream.peekChar();
23016         if (ch === _TIC) {
23017             this.stream.advance(1);
23018             this.stream.advanceWhileChar(function (ch) { return ch !== _TIC; });
23019             return this.stream.advanceIfChar(_TIC) ? _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EscapedJavaScript : _cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.BadEscapedJavaScript;
23020         }
23021         return null;
23022     };
23023     return LESSScanner;
23024 }(_cssScanner__WEBPACK_IMPORTED_MODULE_0__.Scanner));
23025
23026
23027
23028 /***/ }),
23029 /* 99 */
23030 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
23031
23032 __webpack_require__.r(__webpack_exports__);
23033 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23034 /* harmony export */   "LESSCompletion": () => /* binding */ LESSCompletion
23035 /* harmony export */ });
23036 /* harmony import */ var _cssCompletion__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(76);
23037 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(79);
23038 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(68);
23039 /*---------------------------------------------------------------------------------------------
23040  *  Copyright (c) Microsoft Corporation. All rights reserved.
23041  *  Licensed under the MIT License. See License.txt in the project root for license information.
23042  *--------------------------------------------------------------------------------------------*/
23043
23044 var __extends = (undefined && undefined.__extends) || (function () {
23045     var extendStatics = function (d, b) {
23046         extendStatics = Object.setPrototypeOf ||
23047             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
23048             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
23049         return extendStatics(d, b);
23050     };
23051     return function (d, b) {
23052         extendStatics(d, b);
23053         function __() { this.constructor = d; }
23054         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
23055     };
23056 })();
23057
23058
23059
23060 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_2__.loadMessageBundle();
23061 var LESSCompletion = /** @class */ (function (_super) {
23062     __extends(LESSCompletion, _super);
23063     function LESSCompletion(lsOptions, cssDataManager) {
23064         return _super.call(this, '@', lsOptions, cssDataManager) || this;
23065     }
23066     LESSCompletion.prototype.createFunctionProposals = function (proposals, existingNode, sortToEnd, result) {
23067         for (var _i = 0, proposals_1 = proposals; _i < proposals_1.length; _i++) {
23068             var p = proposals_1[_i];
23069             var item = {
23070                 label: p.name,
23071                 detail: p.example,
23072                 documentation: p.description,
23073                 textEdit: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TextEdit.replace(this.getCompletionRange(existingNode), p.name + '($0)'),
23074                 insertTextFormat: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.InsertTextFormat.Snippet,
23075                 kind: _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.CompletionItemKind.Function
23076             };
23077             if (sortToEnd) {
23078                 item.sortText = 'z';
23079             }
23080             result.items.push(item);
23081         }
23082         return result;
23083     };
23084     LESSCompletion.prototype.getTermProposals = function (entry, existingNode, result) {
23085         var functions = LESSCompletion.builtInProposals;
23086         if (entry) {
23087             functions = functions.filter(function (f) { return !f.type || !entry.restrictions || entry.restrictions.indexOf(f.type) !== -1; });
23088         }
23089         this.createFunctionProposals(functions, existingNode, true, result);
23090         return _super.prototype.getTermProposals.call(this, entry, existingNode, result);
23091     };
23092     LESSCompletion.prototype.getColorProposals = function (entry, existingNode, result) {
23093         this.createFunctionProposals(LESSCompletion.colorProposals, existingNode, false, result);
23094         return _super.prototype.getColorProposals.call(this, entry, existingNode, result);
23095     };
23096     LESSCompletion.prototype.getCompletionsForDeclarationProperty = function (declaration, result) {
23097         this.getCompletionsForSelector(null, true, result);
23098         return _super.prototype.getCompletionsForDeclarationProperty.call(this, declaration, result);
23099     };
23100     LESSCompletion.builtInProposals = [
23101         // Boolean functions
23102         {
23103             'name': 'if',
23104             'example': 'if(condition, trueValue [, falseValue]);',
23105             'description': localize('less.builtin.if', 'returns one of two values depending on a condition.')
23106         },
23107         {
23108             'name': 'boolean',
23109             'example': 'boolean(condition);',
23110             'description': localize('less.builtin.boolean', '"store" a boolean test for later evaluation in a guard or if().')
23111         },
23112         // List functions
23113         {
23114             'name': 'length',
23115             'example': 'length(@list);',
23116             'description': localize('less.builtin.length', 'returns the number of elements in a value list')
23117         },
23118         {
23119             'name': 'extract',
23120             'example': 'extract(@list, index);',
23121             'description': localize('less.builtin.extract', 'returns a value at the specified position in the list')
23122         },
23123         {
23124             'name': 'range',
23125             'example': 'range([start, ] end [, step]);',
23126             'description': localize('less.builtin.range', 'generate a list spanning a range of values')
23127         },
23128         {
23129             'name': 'each',
23130             'example': 'each(@list, ruleset);',
23131             'description': localize('less.builtin.each', 'bind the evaluation of a ruleset to each member of a list.')
23132         },
23133         // Other built-ins
23134         {
23135             'name': 'escape',
23136             'example': 'escape(@string);',
23137             'description': localize('less.builtin.escape', 'URL encodes a string')
23138         },
23139         {
23140             'name': 'e',
23141             'example': 'e(@string);',
23142             'description': localize('less.builtin.e', 'escape string content')
23143         },
23144         {
23145             'name': 'replace',
23146             'example': 'replace(@string, @pattern, @replacement[, @flags]);',
23147             'description': localize('less.builtin.replace', 'string replace')
23148         },
23149         {
23150             'name': 'unit',
23151             'example': 'unit(@dimension, [@unit: \'\']);',
23152             'description': localize('less.builtin.unit', 'remove or change the unit of a dimension')
23153         },
23154         {
23155             'name': 'color',
23156             'example': 'color(@string);',
23157             'description': localize('less.builtin.color', 'parses a string to a color'),
23158             'type': 'color'
23159         },
23160         {
23161             'name': 'convert',
23162             'example': 'convert(@value, unit);',
23163             'description': localize('less.builtin.convert', 'converts numbers from one type into another')
23164         },
23165         {
23166             'name': 'data-uri',
23167             'example': 'data-uri([mimetype,] url);',
23168             'description': localize('less.builtin.data-uri', 'inlines a resource and falls back to `url()`'),
23169             'type': 'url'
23170         },
23171         {
23172             'name': 'abs',
23173             'description': localize('less.builtin.abs', 'absolute value of a number'),
23174             'example': 'abs(number);'
23175         },
23176         {
23177             'name': 'acos',
23178             'description': localize('less.builtin.acos', 'arccosine - inverse of cosine function'),
23179             'example': 'acos(number);'
23180         },
23181         {
23182             'name': 'asin',
23183             'description': localize('less.builtin.asin', 'arcsine - inverse of sine function'),
23184             'example': 'asin(number);'
23185         },
23186         {
23187             'name': 'ceil',
23188             'example': 'ceil(@number);',
23189             'description': localize('less.builtin.ceil', 'rounds up to an integer')
23190         },
23191         {
23192             'name': 'cos',
23193             'description': localize('less.builtin.cos', 'cosine function'),
23194             'example': 'cos(number);'
23195         },
23196         {
23197             'name': 'floor',
23198             'description': localize('less.builtin.floor', 'rounds down to an integer'),
23199             'example': 'floor(@number);'
23200         },
23201         {
23202             'name': 'percentage',
23203             'description': localize('less.builtin.percentage', 'converts to a %, e.g. 0.5 > 50%'),
23204             'example': 'percentage(@number);',
23205             'type': 'percentage'
23206         },
23207         {
23208             'name': 'round',
23209             'description': localize('less.builtin.round', 'rounds a number to a number of places'),
23210             'example': 'round(number, [places: 0]);'
23211         },
23212         {
23213             'name': 'sqrt',
23214             'description': localize('less.builtin.sqrt', 'calculates square root of a number'),
23215             'example': 'sqrt(number);'
23216         },
23217         {
23218             'name': 'sin',
23219             'description': localize('less.builtin.sin', 'sine function'),
23220             'example': 'sin(number);'
23221         },
23222         {
23223             'name': 'tan',
23224             'description': localize('less.builtin.tan', 'tangent function'),
23225             'example': 'tan(number);'
23226         },
23227         {
23228             'name': 'atan',
23229             'description': localize('less.builtin.atan', 'arctangent - inverse of tangent function'),
23230             'example': 'atan(number);'
23231         },
23232         {
23233             'name': 'pi',
23234             'description': localize('less.builtin.pi', 'returns pi'),
23235             'example': 'pi();'
23236         },
23237         {
23238             'name': 'pow',
23239             'description': localize('less.builtin.pow', 'first argument raised to the power of the second argument'),
23240             'example': 'pow(@base, @exponent);'
23241         },
23242         {
23243             'name': 'mod',
23244             'description': localize('less.builtin.mod', 'first argument modulus second argument'),
23245             'example': 'mod(number, number);'
23246         },
23247         {
23248             'name': 'min',
23249             'description': localize('less.builtin.min', 'returns the lowest of one or more values'),
23250             'example': 'min(@x, @y);'
23251         },
23252         {
23253             'name': 'max',
23254             'description': localize('less.builtin.max', 'returns the lowest of one or more values'),
23255             'example': 'max(@x, @y);'
23256         }
23257     ];
23258     LESSCompletion.colorProposals = [
23259         {
23260             'name': 'argb',
23261             'example': 'argb(@color);',
23262             'description': localize('less.builtin.argb', 'creates a #AARRGGBB')
23263         },
23264         {
23265             'name': 'hsl',
23266             'example': 'hsl(@hue, @saturation, @lightness);',
23267             'description': localize('less.builtin.hsl', 'creates a color')
23268         },
23269         {
23270             'name': 'hsla',
23271             'example': 'hsla(@hue, @saturation, @lightness, @alpha);',
23272             'description': localize('less.builtin.hsla', 'creates a color')
23273         },
23274         {
23275             'name': 'hsv',
23276             'example': 'hsv(@hue, @saturation, @value);',
23277             'description': localize('less.builtin.hsv', 'creates a color')
23278         },
23279         {
23280             'name': 'hsva',
23281             'example': 'hsva(@hue, @saturation, @value, @alpha);',
23282             'description': localize('less.builtin.hsva', 'creates a color')
23283         },
23284         {
23285             'name': 'hue',
23286             'example': 'hue(@color);',
23287             'description': localize('less.builtin.hue', 'returns the `hue` channel of `@color` in the HSL space')
23288         },
23289         {
23290             'name': 'saturation',
23291             'example': 'saturation(@color);',
23292             'description': localize('less.builtin.saturation', 'returns the `saturation` channel of `@color` in the HSL space')
23293         },
23294         {
23295             'name': 'lightness',
23296             'example': 'lightness(@color);',
23297             'description': localize('less.builtin.lightness', 'returns the `lightness` channel of `@color` in the HSL space')
23298         },
23299         {
23300             'name': 'hsvhue',
23301             'example': 'hsvhue(@color);',
23302             'description': localize('less.builtin.hsvhue', 'returns the `hue` channel of `@color` in the HSV space')
23303         },
23304         {
23305             'name': 'hsvsaturation',
23306             'example': 'hsvsaturation(@color);',
23307             'description': localize('less.builtin.hsvsaturation', 'returns the `saturation` channel of `@color` in the HSV space')
23308         },
23309         {
23310             'name': 'hsvvalue',
23311             'example': 'hsvvalue(@color);',
23312             'description': localize('less.builtin.hsvvalue', 'returns the `value` channel of `@color` in the HSV space')
23313         },
23314         {
23315             'name': 'red',
23316             'example': 'red(@color);',
23317             'description': localize('less.builtin.red', 'returns the `red` channel of `@color`')
23318         },
23319         {
23320             'name': 'green',
23321             'example': 'green(@color);',
23322             'description': localize('less.builtin.green', 'returns the `green` channel of `@color`')
23323         },
23324         {
23325             'name': 'blue',
23326             'example': 'blue(@color);',
23327             'description': localize('less.builtin.blue', 'returns the `blue` channel of `@color`')
23328         },
23329         {
23330             'name': 'alpha',
23331             'example': 'alpha(@color);',
23332             'description': localize('less.builtin.alpha', 'returns the `alpha` channel of `@color`')
23333         },
23334         {
23335             'name': 'luma',
23336             'example': 'luma(@color);',
23337             'description': localize('less.builtin.luma', 'returns the `luma` value (perceptual brightness) of `@color`')
23338         },
23339         {
23340             'name': 'saturate',
23341             'example': 'saturate(@color, 10%);',
23342             'description': localize('less.builtin.saturate', 'return `@color` 10% points more saturated')
23343         },
23344         {
23345             'name': 'desaturate',
23346             'example': 'desaturate(@color, 10%);',
23347             'description': localize('less.builtin.desaturate', 'return `@color` 10% points less saturated')
23348         },
23349         {
23350             'name': 'lighten',
23351             'example': 'lighten(@color, 10%);',
23352             'description': localize('less.builtin.lighten', 'return `@color` 10% points lighter')
23353         },
23354         {
23355             'name': 'darken',
23356             'example': 'darken(@color, 10%);',
23357             'description': localize('less.builtin.darken', 'return `@color` 10% points darker')
23358         },
23359         {
23360             'name': 'fadein',
23361             'example': 'fadein(@color, 10%);',
23362             'description': localize('less.builtin.fadein', 'return `@color` 10% points less transparent')
23363         },
23364         {
23365             'name': 'fadeout',
23366             'example': 'fadeout(@color, 10%);',
23367             'description': localize('less.builtin.fadeout', 'return `@color` 10% points more transparent')
23368         },
23369         {
23370             'name': 'fade',
23371             'example': 'fade(@color, 50%);',
23372             'description': localize('less.builtin.fade', 'return `@color` with 50% transparency')
23373         },
23374         {
23375             'name': 'spin',
23376             'example': 'spin(@color, 10);',
23377             'description': localize('less.builtin.spin', 'return `@color` with a 10 degree larger in hue')
23378         },
23379         {
23380             'name': 'mix',
23381             'example': 'mix(@color1, @color2, [@weight: 50%]);',
23382             'description': localize('less.builtin.mix', 'return a mix of `@color1` and `@color2`')
23383         },
23384         {
23385             'name': 'greyscale',
23386             'example': 'greyscale(@color);',
23387             'description': localize('less.builtin.greyscale', 'returns a grey, 100% desaturated color'),
23388         },
23389         {
23390             'name': 'contrast',
23391             'example': 'contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);',
23392             'description': localize('less.builtin.contrast', 'return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes')
23393         },
23394         {
23395             'name': 'multiply',
23396             'example': 'multiply(@color1, @color2);'
23397         },
23398         {
23399             'name': 'screen',
23400             'example': 'screen(@color1, @color2);'
23401         },
23402         {
23403             'name': 'overlay',
23404             'example': 'overlay(@color1, @color2);'
23405         },
23406         {
23407             'name': 'softlight',
23408             'example': 'softlight(@color1, @color2);'
23409         },
23410         {
23411             'name': 'hardlight',
23412             'example': 'hardlight(@color1, @color2);'
23413         },
23414         {
23415             'name': 'difference',
23416             'example': 'difference(@color1, @color2);'
23417         },
23418         {
23419             'name': 'exclusion',
23420             'example': 'exclusion(@color1, @color2);'
23421         },
23422         {
23423             'name': 'average',
23424             'example': 'average(@color1, @color2);'
23425         },
23426         {
23427             'name': 'negation',
23428             'example': 'negation(@color1, @color2);'
23429         }
23430     ];
23431     return LESSCompletion;
23432 }(_cssCompletion__WEBPACK_IMPORTED_MODULE_0__.CSSCompletion));
23433
23434
23435
23436 /***/ }),
23437 /* 100 */
23438 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
23439
23440 __webpack_require__.r(__webpack_exports__);
23441 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23442 /* harmony export */   "getFoldingRanges": () => /* binding */ getFoldingRanges
23443 /* harmony export */ });
23444 /* harmony import */ var _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64);
23445 /* harmony import */ var _parser_scssScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(94);
23446 /* harmony import */ var _parser_lessScanner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(98);
23447 /*---------------------------------------------------------------------------------------------
23448  *  Copyright (c) Microsoft Corporation. All rights reserved.
23449  *  Licensed under the MIT License. See License.txt in the project root for license information.
23450  *--------------------------------------------------------------------------------------------*/
23451
23452
23453
23454
23455 function getFoldingRanges(document, context) {
23456     var ranges = computeFoldingRanges(document);
23457     return limitFoldingRanges(ranges, context);
23458 }
23459 function computeFoldingRanges(document) {
23460     function getStartLine(t) {
23461         return document.positionAt(t.offset).line;
23462     }
23463     function getEndLine(t) {
23464         return document.positionAt(t.offset + t.len).line;
23465     }
23466     function getScanner() {
23467         switch (document.languageId) {
23468             case 'scss':
23469                 return new _parser_scssScanner__WEBPACK_IMPORTED_MODULE_1__.SCSSScanner();
23470             case 'less':
23471                 return new _parser_lessScanner__WEBPACK_IMPORTED_MODULE_2__.LESSScanner();
23472             default:
23473                 return new _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__.Scanner();
23474         }
23475     }
23476     function tokenToRange(t, kind) {
23477         var startLine = getStartLine(t);
23478         var endLine = getEndLine(t);
23479         if (startLine !== endLine) {
23480             return {
23481                 startLine: startLine,
23482                 endLine: endLine,
23483                 kind: kind
23484             };
23485         }
23486         else {
23487             return null;
23488         }
23489     }
23490     var ranges = [];
23491     var delimiterStack = [];
23492     var scanner = getScanner();
23493     scanner.ignoreComment = false;
23494     scanner.setSource(document.getText());
23495     var token = scanner.scan();
23496     var prevToken = null;
23497     var _loop_1 = function () {
23498         switch (token.type) {
23499             case _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyL:
23500             case _parser_scssScanner__WEBPACK_IMPORTED_MODULE_1__.InterpolationFunction:
23501                 {
23502                     delimiterStack.push({ line: getStartLine(token), type: 'brace', isStart: true });
23503                     break;
23504                 }
23505             case _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.CurlyR: {
23506                 if (delimiterStack.length !== 0) {
23507                     var prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'brace');
23508                     if (!prevDelimiter) {
23509                         break;
23510                     }
23511                     var endLine = getEndLine(token);
23512                     if (prevDelimiter.type === 'brace') {
23513                         /**
23514                          * Other than the case when curly brace is not on a new line by itself, for example
23515                          * .foo {
23516                          *   color: red; }
23517                          * Use endLine minus one to show ending curly brace
23518                          */
23519                         if (prevToken && getEndLine(prevToken) !== endLine) {
23520                             endLine--;
23521                         }
23522                         if (prevDelimiter.line !== endLine) {
23523                             ranges.push({
23524                                 startLine: prevDelimiter.line,
23525                                 endLine: endLine,
23526                                 kind: undefined
23527                             });
23528                         }
23529                     }
23530                 }
23531                 break;
23532             }
23533             /**
23534              * In CSS, there is no single line comment prefixed with //
23535              * All comments are marked as `Comment`
23536              */
23537             case _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.Comment: {
23538                 var commentRegionMarkerToDelimiter_1 = function (marker) {
23539                     if (marker === '#region') {
23540                         return { line: getStartLine(token), type: 'comment', isStart: true };
23541                     }
23542                     else {
23543                         return { line: getEndLine(token), type: 'comment', isStart: false };
23544                     }
23545                 };
23546                 var getCurrDelimiter = function (token) {
23547                     var matches = token.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);
23548                     if (matches) {
23549                         return commentRegionMarkerToDelimiter_1(matches[1]);
23550                     }
23551                     else if (document.languageId === 'scss' || document.languageId === 'less') {
23552                         var matches_1 = token.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);
23553                         if (matches_1) {
23554                             return commentRegionMarkerToDelimiter_1(matches_1[1]);
23555                         }
23556                     }
23557                     return null;
23558                 };
23559                 var currDelimiter = getCurrDelimiter(token);
23560                 // /* */ comment region folding
23561                 // All #region and #endregion cases
23562                 if (currDelimiter) {
23563                     if (currDelimiter.isStart) {
23564                         delimiterStack.push(currDelimiter);
23565                     }
23566                     else {
23567                         var prevDelimiter = popPrevStartDelimiterOfType(delimiterStack, 'comment');
23568                         if (!prevDelimiter) {
23569                             break;
23570                         }
23571                         if (prevDelimiter.type === 'comment') {
23572                             if (prevDelimiter.line !== currDelimiter.line) {
23573                                 ranges.push({
23574                                     startLine: prevDelimiter.line,
23575                                     endLine: currDelimiter.line,
23576                                     kind: 'region'
23577                                 });
23578                             }
23579                         }
23580                     }
23581                 }
23582                 // Multiline comment case
23583                 else {
23584                     var range = tokenToRange(token, 'comment');
23585                     if (range) {
23586                         ranges.push(range);
23587                     }
23588                 }
23589                 break;
23590             }
23591         }
23592         prevToken = token;
23593         token = scanner.scan();
23594     };
23595     while (token.type !== _parser_cssScanner__WEBPACK_IMPORTED_MODULE_0__.TokenType.EOF) {
23596         _loop_1();
23597     }
23598     return ranges;
23599 }
23600 function popPrevStartDelimiterOfType(stack, type) {
23601     if (stack.length === 0) {
23602         return null;
23603     }
23604     for (var i = stack.length - 1; i >= 0; i--) {
23605         if (stack[i].type === type && stack[i].isStart) {
23606             return stack.splice(i, 1)[0];
23607         }
23608     }
23609     return null;
23610 }
23611 /**
23612  * - Sort regions
23613  * - Remove invalid regions (intersections)
23614  * - If limit exceeds, only return `rangeLimit` amount of ranges
23615  */
23616 function limitFoldingRanges(ranges, context) {
23617     var maxRanges = context && context.rangeLimit || Number.MAX_VALUE;
23618     var sortedRanges = ranges.sort(function (r1, r2) {
23619         var diff = r1.startLine - r2.startLine;
23620         if (diff === 0) {
23621             diff = r1.endLine - r2.endLine;
23622         }
23623         return diff;
23624     });
23625     var validRanges = [];
23626     var prevEndLine = -1;
23627     sortedRanges.forEach(function (r) {
23628         if (!(r.startLine < prevEndLine && prevEndLine < r.endLine)) {
23629             validRanges.push(r);
23630             prevEndLine = r.endLine;
23631         }
23632     });
23633     if (validRanges.length < maxRanges) {
23634         return validRanges;
23635     }
23636     else {
23637         return validRanges.slice(0, maxRanges);
23638     }
23639 }
23640
23641
23642 /***/ }),
23643 /* 101 */
23644 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
23645
23646 __webpack_require__.r(__webpack_exports__);
23647 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23648 /* harmony export */   "CSSDataManager": () => /* binding */ CSSDataManager
23649 /* harmony export */ });
23650 /* harmony import */ var _utils_objects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(75);
23651 /* harmony import */ var _data_webCustomData__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(102);
23652 /* harmony import */ var _dataProvider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(103);
23653 /*---------------------------------------------------------------------------------------------
23654  *  Copyright (c) Microsoft Corporation. All rights reserved.
23655  *  Licensed under the MIT License. See License.txt in the project root for license information.
23656  *--------------------------------------------------------------------------------------------*/
23657
23658
23659
23660
23661 var CSSDataManager = /** @class */ (function () {
23662     function CSSDataManager(options) {
23663         this.dataProviders = [];
23664         this._propertySet = {};
23665         this._atDirectiveSet = {};
23666         this._pseudoClassSet = {};
23667         this._pseudoElementSet = {};
23668         this._properties = [];
23669         this._atDirectives = [];
23670         this._pseudoClasses = [];
23671         this._pseudoElements = [];
23672         this.setDataProviders((options === null || options === void 0 ? void 0 : options.useDefaultDataProvider) !== false, (options === null || options === void 0 ? void 0 : options.customDataProviders) || []);
23673     }
23674     CSSDataManager.prototype.setDataProviders = function (builtIn, providers) {
23675         var _a;
23676         this.dataProviders = [];
23677         if (builtIn) {
23678             this.dataProviders.push(new _dataProvider__WEBPACK_IMPORTED_MODULE_1__.CSSDataProvider(_data_webCustomData__WEBPACK_IMPORTED_MODULE_0__.cssData));
23679         }
23680         (_a = this.dataProviders).push.apply(_a, providers);
23681         this.collectData();
23682     };
23683     /**
23684      * Collect all data  & handle duplicates
23685      */
23686     CSSDataManager.prototype.collectData = function () {
23687         var _this = this;
23688         this._propertySet = {};
23689         this._atDirectiveSet = {};
23690         this._pseudoClassSet = {};
23691         this._pseudoElementSet = {};
23692         this.dataProviders.forEach(function (provider) {
23693             provider.provideProperties().forEach(function (p) {
23694                 if (!_this._propertySet[p.name]) {
23695                     _this._propertySet[p.name] = p;
23696                 }
23697             });
23698             provider.provideAtDirectives().forEach(function (p) {
23699                 if (!_this._atDirectiveSet[p.name]) {
23700                     _this._atDirectiveSet[p.name] = p;
23701                 }
23702             });
23703             provider.providePseudoClasses().forEach(function (p) {
23704                 if (!_this._pseudoClassSet[p.name]) {
23705                     _this._pseudoClassSet[p.name] = p;
23706                 }
23707             });
23708             provider.providePseudoElements().forEach(function (p) {
23709                 if (!_this._pseudoElementSet[p.name]) {
23710                     _this._pseudoElementSet[p.name] = p;
23711                 }
23712             });
23713         });
23714         this._properties = _utils_objects__WEBPACK_IMPORTED_MODULE_2__.values(this._propertySet);
23715         this._atDirectives = _utils_objects__WEBPACK_IMPORTED_MODULE_2__.values(this._atDirectiveSet);
23716         this._pseudoClasses = _utils_objects__WEBPACK_IMPORTED_MODULE_2__.values(this._pseudoClassSet);
23717         this._pseudoElements = _utils_objects__WEBPACK_IMPORTED_MODULE_2__.values(this._pseudoElementSet);
23718     };
23719     CSSDataManager.prototype.getProperty = function (name) { return this._propertySet[name]; };
23720     CSSDataManager.prototype.getAtDirective = function (name) { return this._atDirectiveSet[name]; };
23721     CSSDataManager.prototype.getPseudoClass = function (name) { return this._pseudoClassSet[name]; };
23722     CSSDataManager.prototype.getPseudoElement = function (name) { return this._pseudoElementSet[name]; };
23723     CSSDataManager.prototype.getProperties = function () {
23724         return this._properties;
23725     };
23726     CSSDataManager.prototype.getAtDirectives = function () {
23727         return this._atDirectives;
23728     };
23729     CSSDataManager.prototype.getPseudoClasses = function () {
23730         return this._pseudoClasses;
23731     };
23732     CSSDataManager.prototype.getPseudoElements = function () {
23733         return this._pseudoElements;
23734     };
23735     CSSDataManager.prototype.isKnownProperty = function (name) {
23736         return name.toLowerCase() in this._propertySet;
23737     };
23738     CSSDataManager.prototype.isStandardProperty = function (name) {
23739         return this.isKnownProperty(name) &&
23740             (!this._propertySet[name.toLowerCase()].status || this._propertySet[name.toLowerCase()].status === 'standard');
23741     };
23742     return CSSDataManager;
23743 }());
23744
23745
23746
23747 /***/ }),
23748 /* 102 */
23749 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
23750
23751 __webpack_require__.r(__webpack_exports__);
23752 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23753 /* harmony export */   "cssData": () => /* binding */ cssData
23754 /* harmony export */ });
23755 /*---------------------------------------------------------------------------------------------
23756  *  Copyright (c) Microsoft Corporation. All rights reserved.
23757  *  Licensed under the MIT License. See License.txt in the project root for license information.
23758  *--------------------------------------------------------------------------------------------*/
23759 // file generated from vscode-web-custom-data NPM package
23760 var cssData = {
23761     "version": 1.1,
23762     "properties": [
23763         {
23764             "name": "additive-symbols",
23765             "browsers": [
23766                 "FF33"
23767             ],
23768             "syntax": "[ <integer> && <symbol> ]#",
23769             "relevance": 50,
23770             "description": "@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",
23771             "restrictions": [
23772                 "integer",
23773                 "string",
23774                 "image",
23775                 "identifier"
23776             ]
23777         },
23778         {
23779             "name": "align-content",
23780             "values": [
23781                 {
23782                     "name": "center",
23783                     "description": "Lines are packed toward the center of the flex container."
23784                 },
23785                 {
23786                     "name": "flex-end",
23787                     "description": "Lines are packed toward the end of the flex container."
23788                 },
23789                 {
23790                     "name": "flex-start",
23791                     "description": "Lines are packed toward the start of the flex container."
23792                 },
23793                 {
23794                     "name": "space-around",
23795                     "description": "Lines are evenly distributed in the flex container, with half-size spaces on either end."
23796                 },
23797                 {
23798                     "name": "space-between",
23799                     "description": "Lines are evenly distributed in the flex container."
23800                 },
23801                 {
23802                     "name": "stretch",
23803                     "description": "Lines stretch to take up the remaining space."
23804                 }
23805             ],
23806             "syntax": "normal | <baseline-position> | <content-distribution> | <overflow-position>? <content-position>",
23807             "relevance": 59,
23808             "description": "Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",
23809             "restrictions": [
23810                 "enum"
23811             ]
23812         },
23813         {
23814             "name": "align-items",
23815             "values": [
23816                 {
23817                     "name": "baseline",
23818                     "description": "If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."
23819                 },
23820                 {
23821                     "name": "center",
23822                     "description": "The flex item’s margin box is centered in the cross axis within the line."
23823                 },
23824                 {
23825                     "name": "flex-end",
23826                     "description": "The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."
23827                 },
23828                 {
23829                     "name": "flex-start",
23830                     "description": "The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."
23831                 },
23832                 {
23833                     "name": "stretch",
23834                     "description": "If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."
23835                 }
23836             ],
23837             "syntax": "normal | stretch | <baseline-position> | [ <overflow-position>? <self-position> ]",
23838             "relevance": 81,
23839             "description": "Aligns flex items along the cross axis of the current line of the flex container.",
23840             "restrictions": [
23841                 "enum"
23842             ]
23843         },
23844         {
23845             "name": "justify-items",
23846             "values": [
23847                 {
23848                     "name": "auto"
23849                 },
23850                 {
23851                     "name": "normal"
23852                 },
23853                 {
23854                     "name": "end"
23855                 },
23856                 {
23857                     "name": "start"
23858                 },
23859                 {
23860                     "name": "flex-end",
23861                     "description": "\"Flex items are packed toward the end of the line.\""
23862                 },
23863                 {
23864                     "name": "flex-start",
23865                     "description": "\"Flex items are packed toward the start of the line.\""
23866                 },
23867                 {
23868                     "name": "self-end",
23869                     "description": "The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."
23870                 },
23871                 {
23872                     "name": "self-start",
23873                     "description": "The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."
23874                 },
23875                 {
23876                     "name": "center",
23877                     "description": "The items are packed flush to each other toward the center of the of the alignment container."
23878                 },
23879                 {
23880                     "name": "left"
23881                 },
23882                 {
23883                     "name": "right"
23884                 },
23885                 {
23886                     "name": "baseline"
23887                 },
23888                 {
23889                     "name": "first baseline"
23890                 },
23891                 {
23892                     "name": "last baseline"
23893                 },
23894                 {
23895                     "name": "stretch",
23896                     "description": "If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."
23897                 },
23898                 {
23899                     "name": "save"
23900                 },
23901                 {
23902                     "name": "unsave"
23903                 },
23904                 {
23905                     "name": "legacy"
23906                 }
23907             ],
23908             "syntax": "normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ] | legacy | legacy && [ left | right | center ]",
23909             "relevance": 50,
23910             "description": "Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",
23911             "restrictions": [
23912                 "enum"
23913             ]
23914         },
23915         {
23916             "name": "justify-self",
23917             "browsers": [
23918                 "E16",
23919                 "FF45",
23920                 "S10.1",
23921                 "C57",
23922                 "O44"
23923             ],
23924             "values": [
23925                 {
23926                     "name": "auto"
23927                 },
23928                 {
23929                     "name": "normal"
23930                 },
23931                 {
23932                     "name": "end"
23933                 },
23934                 {
23935                     "name": "start"
23936                 },
23937                 {
23938                     "name": "flex-end",
23939                     "description": "\"Flex items are packed toward the end of the line.\""
23940                 },
23941                 {
23942                     "name": "flex-start",
23943                     "description": "\"Flex items are packed toward the start of the line.\""
23944                 },
23945                 {
23946                     "name": "self-end",
23947                     "description": "The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."
23948                 },
23949                 {
23950                     "name": "self-start",
23951                     "description": "The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."
23952                 },
23953                 {
23954                     "name": "center",
23955                     "description": "The items are packed flush to each other toward the center of the of the alignment container."
23956                 },
23957                 {
23958                     "name": "left"
23959                 },
23960                 {
23961                     "name": "right"
23962                 },
23963                 {
23964                     "name": "baseline"
23965                 },
23966                 {
23967                     "name": "first baseline"
23968                 },
23969                 {
23970                     "name": "last baseline"
23971                 },
23972                 {
23973                     "name": "stretch",
23974                     "description": "If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."
23975                 },
23976                 {
23977                     "name": "save"
23978                 },
23979                 {
23980                     "name": "unsave"
23981                 }
23982             ],
23983             "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? [ <self-position> | left | right ]",
23984             "relevance": 52,
23985             "description": "Defines the way of justifying a box inside its container along the appropriate axis.",
23986             "restrictions": [
23987                 "enum"
23988             ]
23989         },
23990         {
23991             "name": "align-self",
23992             "values": [
23993                 {
23994                     "name": "auto",
23995                     "description": "Computes to the value of 'align-items' on the element’s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."
23996                 },
23997                 {
23998                     "name": "baseline",
23999                     "description": "If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."
24000                 },
24001                 {
24002                     "name": "center",
24003                     "description": "The flex item’s margin box is centered in the cross axis within the line."
24004                 },
24005                 {
24006                     "name": "flex-end",
24007                     "description": "The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."
24008                 },
24009                 {
24010                     "name": "flex-start",
24011                     "description": "The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."
24012                 },
24013                 {
24014                     "name": "stretch",
24015                     "description": "If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."
24016                 }
24017             ],
24018             "syntax": "auto | normal | stretch | <baseline-position> | <overflow-position>? <self-position>",
24019             "relevance": 69,
24020             "description": "Allows the default alignment along the cross axis to be overridden for individual flex items.",
24021             "restrictions": [
24022                 "enum"
24023             ]
24024         },
24025         {
24026             "name": "all",
24027             "browsers": [
24028                 "E79",
24029                 "FF27",
24030                 "S9.1",
24031                 "C37",
24032                 "O24"
24033             ],
24034             "values": [],
24035             "syntax": "initial | inherit | unset | revert",
24036             "relevance": 51,
24037             "references": [
24038                 {
24039                     "name": "MDN Reference",
24040                     "url": "https://developer.mozilla.org/docs/Web/CSS/all"
24041                 }
24042             ],
24043             "description": "Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",
24044             "restrictions": [
24045                 "enum"
24046             ]
24047         },
24048         {
24049             "name": "alt",
24050             "browsers": [
24051                 "S9"
24052             ],
24053             "values": [],
24054             "relevance": 50,
24055             "references": [
24056                 {
24057                     "name": "MDN Reference",
24058                     "url": "https://developer.mozilla.org/docs/Web/CSS/alt"
24059                 }
24060             ],
24061             "description": "Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",
24062             "restrictions": [
24063                 "string",
24064                 "enum"
24065             ]
24066         },
24067         {
24068             "name": "animation",
24069             "values": [
24070                 {
24071                     "name": "alternate",
24072                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
24073                 },
24074                 {
24075                     "name": "alternate-reverse",
24076                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
24077                 },
24078                 {
24079                     "name": "backwards",
24080                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
24081                 },
24082                 {
24083                     "name": "both",
24084                     "description": "Both forwards and backwards fill modes are applied."
24085                 },
24086                 {
24087                     "name": "forwards",
24088                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
24089                 },
24090                 {
24091                     "name": "infinite",
24092                     "description": "Causes the animation to repeat forever."
24093                 },
24094                 {
24095                     "name": "none",
24096                     "description": "No animation is performed"
24097                 },
24098                 {
24099                     "name": "normal",
24100                     "description": "Normal playback."
24101                 },
24102                 {
24103                     "name": "reverse",
24104                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
24105                 }
24106             ],
24107             "syntax": "<single-animation>#",
24108             "relevance": 79,
24109             "references": [
24110                 {
24111                     "name": "MDN Reference",
24112                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation"
24113                 }
24114             ],
24115             "description": "Shorthand property combines six of the animation properties into a single property.",
24116             "restrictions": [
24117                 "time",
24118                 "timing-function",
24119                 "enum",
24120                 "identifier",
24121                 "number"
24122             ]
24123         },
24124         {
24125             "name": "animation-delay",
24126             "syntax": "<time>#",
24127             "relevance": 62,
24128             "references": [
24129                 {
24130                     "name": "MDN Reference",
24131                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-delay"
24132                 }
24133             ],
24134             "description": "Defines when the animation will start.",
24135             "restrictions": [
24136                 "time"
24137             ]
24138         },
24139         {
24140             "name": "animation-direction",
24141             "values": [
24142                 {
24143                     "name": "alternate",
24144                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
24145                 },
24146                 {
24147                     "name": "alternate-reverse",
24148                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
24149                 },
24150                 {
24151                     "name": "normal",
24152                     "description": "Normal playback."
24153                 },
24154                 {
24155                     "name": "reverse",
24156                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
24157                 }
24158             ],
24159             "syntax": "<single-animation-direction>#",
24160             "relevance": 55,
24161             "references": [
24162                 {
24163                     "name": "MDN Reference",
24164                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-direction"
24165                 }
24166             ],
24167             "description": "Defines whether or not the animation should play in reverse on alternate cycles.",
24168             "restrictions": [
24169                 "enum"
24170             ]
24171         },
24172         {
24173             "name": "animation-duration",
24174             "syntax": "<time>#",
24175             "relevance": 64,
24176             "references": [
24177                 {
24178                     "name": "MDN Reference",
24179                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-duration"
24180                 }
24181             ],
24182             "description": "Defines the length of time that an animation takes to complete one cycle.",
24183             "restrictions": [
24184                 "time"
24185             ]
24186         },
24187         {
24188             "name": "animation-fill-mode",
24189             "values": [
24190                 {
24191                     "name": "backwards",
24192                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
24193                 },
24194                 {
24195                     "name": "both",
24196                     "description": "Both forwards and backwards fill modes are applied."
24197                 },
24198                 {
24199                     "name": "forwards",
24200                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
24201                 },
24202                 {
24203                     "name": "none",
24204                     "description": "There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."
24205                 }
24206             ],
24207             "syntax": "<single-animation-fill-mode>#",
24208             "relevance": 61,
24209             "references": [
24210                 {
24211                     "name": "MDN Reference",
24212                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-fill-mode"
24213                 }
24214             ],
24215             "description": "Defines what values are applied by the animation outside the time it is executing.",
24216             "restrictions": [
24217                 "enum"
24218             ]
24219         },
24220         {
24221             "name": "animation-iteration-count",
24222             "values": [
24223                 {
24224                     "name": "infinite",
24225                     "description": "Causes the animation to repeat forever."
24226                 }
24227             ],
24228             "syntax": "<single-animation-iteration-count>#",
24229             "relevance": 59,
24230             "references": [
24231                 {
24232                     "name": "MDN Reference",
24233                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-iteration-count"
24234                 }
24235             ],
24236             "description": "Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",
24237             "restrictions": [
24238                 "number",
24239                 "enum"
24240             ]
24241         },
24242         {
24243             "name": "animation-name",
24244             "values": [
24245                 {
24246                     "name": "none",
24247                     "description": "No animation is performed"
24248                 }
24249             ],
24250             "syntax": "[ none | <keyframes-name> ]#",
24251             "relevance": 64,
24252             "references": [
24253                 {
24254                     "name": "MDN Reference",
24255                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-name"
24256                 }
24257             ],
24258             "description": "Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",
24259             "restrictions": [
24260                 "identifier",
24261                 "enum"
24262             ]
24263         },
24264         {
24265             "name": "animation-play-state",
24266             "values": [
24267                 {
24268                     "name": "paused",
24269                     "description": "A running animation will be paused."
24270                 },
24271                 {
24272                     "name": "running",
24273                     "description": "Resume playback of a paused animation."
24274                 }
24275             ],
24276             "syntax": "<single-animation-play-state>#",
24277             "relevance": 53,
24278             "references": [
24279                 {
24280                     "name": "MDN Reference",
24281                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-play-state"
24282                 }
24283             ],
24284             "description": "Defines whether the animation is running or paused.",
24285             "restrictions": [
24286                 "enum"
24287             ]
24288         },
24289         {
24290             "name": "animation-timing-function",
24291             "syntax": "<timing-function>#",
24292             "relevance": 68,
24293             "references": [
24294                 {
24295                     "name": "MDN Reference",
24296                     "url": "https://developer.mozilla.org/docs/Web/CSS/animation-timing-function"
24297                 }
24298             ],
24299             "description": "Describes how the animation will progress over one cycle of its duration.",
24300             "restrictions": [
24301                 "timing-function"
24302             ]
24303         },
24304         {
24305             "name": "backface-visibility",
24306             "values": [
24307                 {
24308                     "name": "hidden",
24309                     "description": "Back side is hidden."
24310                 },
24311                 {
24312                     "name": "visible",
24313                     "description": "Back side is visible."
24314                 }
24315             ],
24316             "syntax": "visible | hidden",
24317             "relevance": 59,
24318             "references": [
24319                 {
24320                     "name": "MDN Reference",
24321                     "url": "https://developer.mozilla.org/docs/Web/CSS/backface-visibility"
24322                 }
24323             ],
24324             "description": "Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",
24325             "restrictions": [
24326                 "enum"
24327             ]
24328         },
24329         {
24330             "name": "background",
24331             "values": [
24332                 {
24333                     "name": "fixed",
24334                     "description": "The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page."
24335                 },
24336                 {
24337                     "name": "local",
24338                     "description": "The background is fixed with regard to the element's contents: if the element has a scrolling mechanism, the background scrolls with the element's contents."
24339                 },
24340                 {
24341                     "name": "none",
24342                     "description": "A value of 'none' counts as an image layer but draws nothing."
24343                 },
24344                 {
24345                     "name": "scroll",
24346                     "description": "The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element's border.)"
24347                 }
24348             ],
24349             "syntax": "[ <bg-layer> , ]* <final-bg-layer>",
24350             "relevance": 93,
24351             "references": [
24352                 {
24353                     "name": "MDN Reference",
24354                     "url": "https://developer.mozilla.org/docs/Web/CSS/background"
24355                 }
24356             ],
24357             "description": "Shorthand property for setting most background properties at the same place in the style sheet.",
24358             "restrictions": [
24359                 "enum",
24360                 "image",
24361                 "color",
24362                 "position",
24363                 "length",
24364                 "repeat",
24365                 "percentage",
24366                 "box"
24367             ]
24368         },
24369         {
24370             "name": "background-attachment",
24371             "values": [
24372                 {
24373                     "name": "fixed",
24374                     "description": "The background is fixed with regard to the viewport. In paged media where there is no viewport, a 'fixed' background is fixed with respect to the page box and therefore replicated on every page."
24375                 },
24376                 {
24377                     "name": "local",
24378                     "description": "The background is fixed with regard to the element’s contents: if the element has a scrolling mechanism, the background scrolls with the element’s contents."
24379                 },
24380                 {
24381                     "name": "scroll",
24382                     "description": "The background is fixed with regard to the element itself and does not scroll with its contents. (It is effectively attached to the element’s border.)"
24383                 }
24384             ],
24385             "syntax": "<attachment>#",
24386             "relevance": 53,
24387             "references": [
24388                 {
24389                     "name": "MDN Reference",
24390                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-attachment"
24391                 }
24392             ],
24393             "description": "Specifies whether the background images are fixed with regard to the viewport ('fixed') or scroll along with the element ('scroll') or its contents ('local').",
24394             "restrictions": [
24395                 "enum"
24396             ]
24397         },
24398         {
24399             "name": "background-blend-mode",
24400             "browsers": [
24401                 "E79",
24402                 "FF30",
24403                 "S8",
24404                 "C35",
24405                 "O22"
24406             ],
24407             "values": [
24408                 {
24409                     "name": "normal",
24410                     "description": "Default attribute which specifies no blending"
24411                 },
24412                 {
24413                     "name": "multiply",
24414                     "description": "The source color is multiplied by the destination color and replaces the destination."
24415                 },
24416                 {
24417                     "name": "screen",
24418                     "description": "Multiplies the complements of the backdrop and source color values, then complements the result."
24419                 },
24420                 {
24421                     "name": "overlay",
24422                     "description": "Multiplies or screens the colors, depending on the backdrop color value."
24423                 },
24424                 {
24425                     "name": "darken",
24426                     "description": "Selects the darker of the backdrop and source colors."
24427                 },
24428                 {
24429                     "name": "lighten",
24430                     "description": "Selects the lighter of the backdrop and source colors."
24431                 },
24432                 {
24433                     "name": "color-dodge",
24434                     "description": "Brightens the backdrop color to reflect the source color."
24435                 },
24436                 {
24437                     "name": "color-burn",
24438                     "description": "Darkens the backdrop color to reflect the source color."
24439                 },
24440                 {
24441                     "name": "hard-light",
24442                     "description": "Multiplies or screens the colors, depending on the source color value."
24443                 },
24444                 {
24445                     "name": "soft-light",
24446                     "description": "Darkens or lightens the colors, depending on the source color value."
24447                 },
24448                 {
24449                     "name": "difference",
24450                     "description": "Subtracts the darker of the two constituent colors from the lighter color.."
24451                 },
24452                 {
24453                     "name": "exclusion",
24454                     "description": "Produces an effect similar to that of the Difference mode but lower in contrast."
24455                 },
24456                 {
24457                     "name": "hue",
24458                     "browsers": [
24459                         "E79",
24460                         "FF30",
24461                         "S8",
24462                         "C35",
24463                         "O22"
24464                     ],
24465                     "description": "Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color."
24466                 },
24467                 {
24468                     "name": "saturation",
24469                     "browsers": [
24470                         "E79",
24471                         "FF30",
24472                         "S8",
24473                         "C35",
24474                         "O22"
24475                     ],
24476                     "description": "Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color."
24477                 },
24478                 {
24479                     "name": "color",
24480                     "browsers": [
24481                         "E79",
24482                         "FF30",
24483                         "S8",
24484                         "C35",
24485                         "O22"
24486                     ],
24487                     "description": "Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color."
24488                 },
24489                 {
24490                     "name": "luminosity",
24491                     "browsers": [
24492                         "E79",
24493                         "FF30",
24494                         "S8",
24495                         "C35",
24496                         "O22"
24497                     ],
24498                     "description": "Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color."
24499                 }
24500             ],
24501             "syntax": "<blend-mode>#",
24502             "relevance": 50,
24503             "references": [
24504                 {
24505                     "name": "MDN Reference",
24506                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-blend-mode"
24507                 }
24508             ],
24509             "description": "Defines the blending mode of each background layer.",
24510             "restrictions": [
24511                 "enum"
24512             ]
24513         },
24514         {
24515             "name": "background-clip",
24516             "syntax": "<box>#",
24517             "relevance": 67,
24518             "references": [
24519                 {
24520                     "name": "MDN Reference",
24521                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-clip"
24522                 }
24523             ],
24524             "description": "Determines the background painting area.",
24525             "restrictions": [
24526                 "box"
24527             ]
24528         },
24529         {
24530             "name": "background-color",
24531             "syntax": "<color>",
24532             "relevance": 94,
24533             "references": [
24534                 {
24535                     "name": "MDN Reference",
24536                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-color"
24537                 }
24538             ],
24539             "description": "Sets the background color of an element.",
24540             "restrictions": [
24541                 "color"
24542             ]
24543         },
24544         {
24545             "name": "background-image",
24546             "values": [
24547                 {
24548                     "name": "none",
24549                     "description": "Counts as an image layer but draws nothing."
24550                 }
24551             ],
24552             "syntax": "<bg-image>#",
24553             "relevance": 88,
24554             "references": [
24555                 {
24556                     "name": "MDN Reference",
24557                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-image"
24558                 }
24559             ],
24560             "description": "Sets the background image(s) of an element.",
24561             "restrictions": [
24562                 "image",
24563                 "enum"
24564             ]
24565         },
24566         {
24567             "name": "background-origin",
24568             "syntax": "<box>#",
24569             "relevance": 53,
24570             "references": [
24571                 {
24572                     "name": "MDN Reference",
24573                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-origin"
24574                 }
24575             ],
24576             "description": "For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",
24577             "restrictions": [
24578                 "box"
24579             ]
24580         },
24581         {
24582             "name": "background-position",
24583             "syntax": "<bg-position>#",
24584             "relevance": 87,
24585             "references": [
24586                 {
24587                     "name": "MDN Reference",
24588                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-position"
24589                 }
24590             ],
24591             "description": "Specifies the initial position of the background image(s) (after any resizing) within their corresponding background positioning area.",
24592             "restrictions": [
24593                 "position",
24594                 "length",
24595                 "percentage"
24596             ]
24597         },
24598         {
24599             "name": "background-position-x",
24600             "values": [
24601                 {
24602                     "name": "center",
24603                     "description": "Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is."
24604                 },
24605                 {
24606                     "name": "left",
24607                     "description": "Equivalent to '0%' for the horizontal position if one or two values are given, otherwise specifies the left edge as the origin for the next offset."
24608                 },
24609                 {
24610                     "name": "right",
24611                     "description": "Equivalent to '100%' for the horizontal position if one or two values are given, otherwise specifies the right edge as the origin for the next offset."
24612                 }
24613             ],
24614             "status": "experimental",
24615             "syntax": "[ center | [ [ left | right | x-start | x-end ]? <length-percentage>? ]! ]#",
24616             "relevance": 54,
24617             "references": [
24618                 {
24619                     "name": "MDN Reference",
24620                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-position-x"
24621                 }
24622             ],
24623             "description": "If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.",
24624             "restrictions": [
24625                 "length",
24626                 "percentage"
24627             ]
24628         },
24629         {
24630             "name": "background-position-y",
24631             "values": [
24632                 {
24633                     "name": "bottom",
24634                     "description": "Equivalent to '100%' for the vertical position if one or two values are given, otherwise specifies the bottom edge as the origin for the next offset."
24635                 },
24636                 {
24637                     "name": "center",
24638                     "description": "Equivalent to '50%' ('left 50%') for the horizontal position if the horizontal position is not otherwise specified, or '50%' ('top 50%') for the vertical position if it is."
24639                 },
24640                 {
24641                     "name": "top",
24642                     "description": "Equivalent to '0%' for the vertical position if one or two values are given, otherwise specifies the top edge as the origin for the next offset."
24643                 }
24644             ],
24645             "status": "experimental",
24646             "syntax": "[ center | [ [ top | bottom | y-start | y-end ]? <length-percentage>? ]! ]#",
24647             "relevance": 53,
24648             "references": [
24649                 {
24650                     "name": "MDN Reference",
24651                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-position-y"
24652                 }
24653             ],
24654             "description": "If background images have been specified, this property specifies their initial position (after any resizing) within their corresponding background positioning area.",
24655             "restrictions": [
24656                 "length",
24657                 "percentage"
24658             ]
24659         },
24660         {
24661             "name": "background-repeat",
24662             "values": [],
24663             "syntax": "<repeat-style>#",
24664             "relevance": 85,
24665             "references": [
24666                 {
24667                     "name": "MDN Reference",
24668                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-repeat"
24669                 }
24670             ],
24671             "description": "Specifies how background images are tiled after they have been sized and positioned.",
24672             "restrictions": [
24673                 "repeat"
24674             ]
24675         },
24676         {
24677             "name": "background-size",
24678             "values": [
24679                 {
24680                     "name": "auto",
24681                     "description": "Resolved by using the image’s intrinsic ratio and the size of the other dimension, or failing that, using the image’s intrinsic size, or failing that, treating it as 100%."
24682                 },
24683                 {
24684                     "name": "contain",
24685                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."
24686                 },
24687                 {
24688                     "name": "cover",
24689                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."
24690                 }
24691             ],
24692             "syntax": "<bg-size>#",
24693             "relevance": 85,
24694             "references": [
24695                 {
24696                     "name": "MDN Reference",
24697                     "url": "https://developer.mozilla.org/docs/Web/CSS/background-size"
24698                 }
24699             ],
24700             "description": "Specifies the size of the background images.",
24701             "restrictions": [
24702                 "length",
24703                 "percentage"
24704             ]
24705         },
24706         {
24707             "name": "behavior",
24708             "browsers": [
24709                 "IE6"
24710             ],
24711             "relevance": 50,
24712             "description": "IE only. Used to extend behaviors of the browser.",
24713             "restrictions": [
24714                 "url"
24715             ]
24716         },
24717         {
24718             "name": "block-size",
24719             "browsers": [
24720                 "E79",
24721                 "FF41",
24722                 "S12.1",
24723                 "C57",
24724                 "O44"
24725             ],
24726             "values": [
24727                 {
24728                     "name": "auto",
24729                     "description": "Depends on the values of other properties."
24730                 }
24731             ],
24732             "syntax": "<'width'>",
24733             "relevance": 50,
24734             "references": [
24735                 {
24736                     "name": "MDN Reference",
24737                     "url": "https://developer.mozilla.org/docs/Web/CSS/block-size"
24738                 }
24739             ],
24740             "description": "Logical 'width'. Mapping depends on the element’s 'writing-mode'.",
24741             "restrictions": [
24742                 "length",
24743                 "percentage"
24744             ]
24745         },
24746         {
24747             "name": "border",
24748             "syntax": "<line-width> || <line-style> || <color>",
24749             "relevance": 95,
24750             "references": [
24751                 {
24752                     "name": "MDN Reference",
24753                     "url": "https://developer.mozilla.org/docs/Web/CSS/border"
24754                 }
24755             ],
24756             "description": "Shorthand property for setting border width, style, and color.",
24757             "restrictions": [
24758                 "length",
24759                 "line-width",
24760                 "line-style",
24761                 "color"
24762             ]
24763         },
24764         {
24765             "name": "border-block-end",
24766             "browsers": [
24767                 "E79",
24768                 "FF41",
24769                 "S12.1",
24770                 "C69",
24771                 "O56"
24772             ],
24773             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
24774             "relevance": 50,
24775             "references": [
24776                 {
24777                     "name": "MDN Reference",
24778                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end"
24779                 }
24780             ],
24781             "description": "Logical 'border-bottom'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24782             "restrictions": [
24783                 "length",
24784                 "line-width",
24785                 "line-style",
24786                 "color"
24787             ]
24788         },
24789         {
24790             "name": "border-block-start",
24791             "browsers": [
24792                 "E79",
24793                 "FF41",
24794                 "S12.1",
24795                 "C69",
24796                 "O56"
24797             ],
24798             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
24799             "relevance": 50,
24800             "references": [
24801                 {
24802                     "name": "MDN Reference",
24803                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start"
24804                 }
24805             ],
24806             "description": "Logical 'border-top'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24807             "restrictions": [
24808                 "length",
24809                 "line-width",
24810                 "line-style",
24811                 "color"
24812             ]
24813         },
24814         {
24815             "name": "border-block-end-color",
24816             "browsers": [
24817                 "E79",
24818                 "FF41",
24819                 "S12.1",
24820                 "C69",
24821                 "O56"
24822             ],
24823             "syntax": "<'border-top-color'>",
24824             "relevance": 50,
24825             "references": [
24826                 {
24827                     "name": "MDN Reference",
24828                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-color"
24829                 }
24830             ],
24831             "description": "Logical 'border-bottom-color'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24832             "restrictions": [
24833                 "color"
24834             ]
24835         },
24836         {
24837             "name": "border-block-start-color",
24838             "browsers": [
24839                 "E79",
24840                 "FF41",
24841                 "S12.1",
24842                 "C69",
24843                 "O56"
24844             ],
24845             "syntax": "<'border-top-color'>",
24846             "relevance": 50,
24847             "references": [
24848                 {
24849                     "name": "MDN Reference",
24850                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-color"
24851                 }
24852             ],
24853             "description": "Logical 'border-top-color'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24854             "restrictions": [
24855                 "color"
24856             ]
24857         },
24858         {
24859             "name": "border-block-end-style",
24860             "browsers": [
24861                 "E79",
24862                 "FF41",
24863                 "S12.1",
24864                 "C69",
24865                 "O56"
24866             ],
24867             "syntax": "<'border-top-style'>",
24868             "relevance": 50,
24869             "references": [
24870                 {
24871                     "name": "MDN Reference",
24872                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-style"
24873                 }
24874             ],
24875             "description": "Logical 'border-bottom-style'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24876             "restrictions": [
24877                 "line-style"
24878             ]
24879         },
24880         {
24881             "name": "border-block-start-style",
24882             "browsers": [
24883                 "E79",
24884                 "FF41",
24885                 "S12.1",
24886                 "C69",
24887                 "O56"
24888             ],
24889             "syntax": "<'border-top-style'>",
24890             "relevance": 50,
24891             "references": [
24892                 {
24893                     "name": "MDN Reference",
24894                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-style"
24895                 }
24896             ],
24897             "description": "Logical 'border-top-style'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24898             "restrictions": [
24899                 "line-style"
24900             ]
24901         },
24902         {
24903             "name": "border-block-end-width",
24904             "browsers": [
24905                 "E79",
24906                 "FF41",
24907                 "S12.1",
24908                 "C69",
24909                 "O56"
24910             ],
24911             "syntax": "<'border-top-width'>",
24912             "relevance": 50,
24913             "references": [
24914                 {
24915                     "name": "MDN Reference",
24916                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-end-width"
24917                 }
24918             ],
24919             "description": "Logical 'border-bottom-width'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24920             "restrictions": [
24921                 "length",
24922                 "line-width"
24923             ]
24924         },
24925         {
24926             "name": "border-block-start-width",
24927             "browsers": [
24928                 "E79",
24929                 "FF41",
24930                 "S12.1",
24931                 "C69",
24932                 "O56"
24933             ],
24934             "syntax": "<'border-top-width'>",
24935             "relevance": 50,
24936             "references": [
24937                 {
24938                     "name": "MDN Reference",
24939                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-start-width"
24940                 }
24941             ],
24942             "description": "Logical 'border-top-width'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
24943             "restrictions": [
24944                 "length",
24945                 "line-width"
24946             ]
24947         },
24948         {
24949             "name": "border-bottom",
24950             "syntax": "<line-width> || <line-style> || <color>",
24951             "relevance": 88,
24952             "references": [
24953                 {
24954                     "name": "MDN Reference",
24955                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom"
24956                 }
24957             ],
24958             "description": "Shorthand property for setting border width, style and color.",
24959             "restrictions": [
24960                 "length",
24961                 "line-width",
24962                 "line-style",
24963                 "color"
24964             ]
24965         },
24966         {
24967             "name": "border-bottom-color",
24968             "syntax": "<'border-top-color'>",
24969             "relevance": 71,
24970             "references": [
24971                 {
24972                     "name": "MDN Reference",
24973                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-color"
24974                 }
24975             ],
24976             "description": "Sets the color of the bottom border.",
24977             "restrictions": [
24978                 "color"
24979             ]
24980         },
24981         {
24982             "name": "border-bottom-left-radius",
24983             "syntax": "<length-percentage>{1,2}",
24984             "relevance": 74,
24985             "references": [
24986                 {
24987                     "name": "MDN Reference",
24988                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-left-radius"
24989                 }
24990             ],
24991             "description": "Defines the radii of the bottom left outer border edge.",
24992             "restrictions": [
24993                 "length",
24994                 "percentage"
24995             ]
24996         },
24997         {
24998             "name": "border-bottom-right-radius",
24999             "syntax": "<length-percentage>{1,2}",
25000             "relevance": 73,
25001             "references": [
25002                 {
25003                     "name": "MDN Reference",
25004                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-right-radius"
25005                 }
25006             ],
25007             "description": "Defines the radii of the bottom right outer border edge.",
25008             "restrictions": [
25009                 "length",
25010                 "percentage"
25011             ]
25012         },
25013         {
25014             "name": "border-bottom-style",
25015             "syntax": "<line-style>",
25016             "relevance": 57,
25017             "references": [
25018                 {
25019                     "name": "MDN Reference",
25020                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-style"
25021                 }
25022             ],
25023             "description": "Sets the style of the bottom border.",
25024             "restrictions": [
25025                 "line-style"
25026             ]
25027         },
25028         {
25029             "name": "border-bottom-width",
25030             "syntax": "<line-width>",
25031             "relevance": 62,
25032             "references": [
25033                 {
25034                     "name": "MDN Reference",
25035                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-bottom-width"
25036                 }
25037             ],
25038             "description": "Sets the thickness of the bottom border.",
25039             "restrictions": [
25040                 "length",
25041                 "line-width"
25042             ]
25043         },
25044         {
25045             "name": "border-collapse",
25046             "values": [
25047                 {
25048                     "name": "collapse",
25049                     "description": "Selects the collapsing borders model."
25050                 },
25051                 {
25052                     "name": "separate",
25053                     "description": "Selects the separated borders border model."
25054                 }
25055             ],
25056             "syntax": "collapse | separate",
25057             "relevance": 75,
25058             "references": [
25059                 {
25060                     "name": "MDN Reference",
25061                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-collapse"
25062                 }
25063             ],
25064             "description": "Selects a table's border model.",
25065             "restrictions": [
25066                 "enum"
25067             ]
25068         },
25069         {
25070             "name": "border-color",
25071             "values": [],
25072             "syntax": "<color>{1,4}",
25073             "relevance": 86,
25074             "references": [
25075                 {
25076                     "name": "MDN Reference",
25077                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-color"
25078                 }
25079             ],
25080             "description": "The color of the border around all four edges of an element.",
25081             "restrictions": [
25082                 "color"
25083             ]
25084         },
25085         {
25086             "name": "border-image",
25087             "values": [
25088                 {
25089                     "name": "auto",
25090                     "description": "If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."
25091                 },
25092                 {
25093                     "name": "fill",
25094                     "description": "Causes the middle part of the border-image to be preserved."
25095                 },
25096                 {
25097                     "name": "none",
25098                     "description": "Use the border styles."
25099                 },
25100                 {
25101                     "name": "repeat",
25102                     "description": "The image is tiled (repeated) to fill the area."
25103                 },
25104                 {
25105                     "name": "round",
25106                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."
25107                 },
25108                 {
25109                     "name": "space",
25110                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."
25111                 },
25112                 {
25113                     "name": "stretch",
25114                     "description": "The image is stretched to fill the area."
25115                 },
25116                 {
25117                     "name": "url()"
25118                 }
25119             ],
25120             "syntax": "<'border-image-source'> || <'border-image-slice'> [ / <'border-image-width'> | / <'border-image-width'>? / <'border-image-outset'> ]? || <'border-image-repeat'>",
25121             "relevance": 52,
25122             "references": [
25123                 {
25124                     "name": "MDN Reference",
25125                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image"
25126                 }
25127             ],
25128             "description": "Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",
25129             "restrictions": [
25130                 "length",
25131                 "percentage",
25132                 "number",
25133                 "url",
25134                 "enum"
25135             ]
25136         },
25137         {
25138             "name": "border-image-outset",
25139             "syntax": "[ <length> | <number> ]{1,4}",
25140             "relevance": 50,
25141             "references": [
25142                 {
25143                     "name": "MDN Reference",
25144                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image-outset"
25145                 }
25146             ],
25147             "description": "The values specify the amount by which the border image area extends beyond the border box on the top, right, bottom, and left sides respectively. If the fourth value is absent, it is the same as the second. If the third one is also absent, it is the same as the first. If the second one is also absent, it is the same as the first. Numbers represent multiples of the corresponding border-width.",
25148             "restrictions": [
25149                 "length",
25150                 "number"
25151             ]
25152         },
25153         {
25154             "name": "border-image-repeat",
25155             "values": [
25156                 {
25157                     "name": "repeat",
25158                     "description": "The image is tiled (repeated) to fill the area."
25159                 },
25160                 {
25161                     "name": "round",
25162                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."
25163                 },
25164                 {
25165                     "name": "space",
25166                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."
25167                 },
25168                 {
25169                     "name": "stretch",
25170                     "description": "The image is stretched to fill the area."
25171                 }
25172             ],
25173             "syntax": "[ stretch | repeat | round | space ]{1,2}",
25174             "relevance": 51,
25175             "references": [
25176                 {
25177                     "name": "MDN Reference",
25178                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image-repeat"
25179                 }
25180             ],
25181             "description": "Specifies how the images for the sides and the middle part of the border image are scaled and tiled. If the second keyword is absent, it is assumed to be the same as the first.",
25182             "restrictions": [
25183                 "enum"
25184             ]
25185         },
25186         {
25187             "name": "border-image-slice",
25188             "values": [
25189                 {
25190                     "name": "fill",
25191                     "description": "Causes the middle part of the border-image to be preserved."
25192                 }
25193             ],
25194             "syntax": "<number-percentage>{1,4} && fill?",
25195             "relevance": 51,
25196             "references": [
25197                 {
25198                     "name": "MDN Reference",
25199                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image-slice"
25200                 }
25201             ],
25202             "description": "Specifies inward offsets from the top, right, bottom, and left edges of the image, dividing it into nine regions: four corners, four edges and a middle.",
25203             "restrictions": [
25204                 "number",
25205                 "percentage"
25206             ]
25207         },
25208         {
25209             "name": "border-image-source",
25210             "values": [
25211                 {
25212                     "name": "none",
25213                     "description": "Use the border styles."
25214                 }
25215             ],
25216             "syntax": "none | <image>",
25217             "relevance": 50,
25218             "references": [
25219                 {
25220                     "name": "MDN Reference",
25221                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image-source"
25222                 }
25223             ],
25224             "description": "Specifies an image to use instead of the border styles given by the 'border-style' properties and as an additional background layer for the element. If the value is 'none' or if the image cannot be displayed, the border styles will be used.",
25225             "restrictions": [
25226                 "image"
25227             ]
25228         },
25229         {
25230             "name": "border-image-width",
25231             "values": [
25232                 {
25233                     "name": "auto",
25234                     "description": "The border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."
25235                 }
25236             ],
25237             "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
25238             "relevance": 51,
25239             "references": [
25240                 {
25241                     "name": "MDN Reference",
25242                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-image-width"
25243                 }
25244             ],
25245             "description": "The four values of 'border-image-width' specify offsets that are used to divide the border image area into nine parts. They represent inward distances from the top, right, bottom, and left sides of the area, respectively.",
25246             "restrictions": [
25247                 "length",
25248                 "percentage",
25249                 "number"
25250             ]
25251         },
25252         {
25253             "name": "border-inline-end",
25254             "browsers": [
25255                 "E79",
25256                 "FF41",
25257                 "S12.1",
25258                 "C69",
25259                 "O56"
25260             ],
25261             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
25262             "relevance": 50,
25263             "references": [
25264                 {
25265                     "name": "MDN Reference",
25266                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end"
25267                 }
25268             ],
25269             "description": "Logical 'border-right'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25270             "restrictions": [
25271                 "length",
25272                 "line-width",
25273                 "line-style",
25274                 "color"
25275             ]
25276         },
25277         {
25278             "name": "border-inline-start",
25279             "browsers": [
25280                 "E79",
25281                 "FF41",
25282                 "S12.1",
25283                 "C69",
25284                 "O56"
25285             ],
25286             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
25287             "relevance": 50,
25288             "references": [
25289                 {
25290                     "name": "MDN Reference",
25291                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start"
25292                 }
25293             ],
25294             "description": "Logical 'border-left'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25295             "restrictions": [
25296                 "length",
25297                 "line-width",
25298                 "line-style",
25299                 "color"
25300             ]
25301         },
25302         {
25303             "name": "border-inline-end-color",
25304             "browsers": [
25305                 "E79",
25306                 "FF41",
25307                 "S12.1",
25308                 "C69",
25309                 "O56"
25310             ],
25311             "syntax": "<'border-top-color'>",
25312             "relevance": 50,
25313             "references": [
25314                 {
25315                     "name": "MDN Reference",
25316                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-color"
25317                 }
25318             ],
25319             "description": "Logical 'border-right-color'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25320             "restrictions": [
25321                 "color"
25322             ]
25323         },
25324         {
25325             "name": "border-inline-start-color",
25326             "browsers": [
25327                 "E79",
25328                 "FF41",
25329                 "S12.1",
25330                 "C69",
25331                 "O56"
25332             ],
25333             "syntax": "<'border-top-color'>",
25334             "relevance": 50,
25335             "references": [
25336                 {
25337                     "name": "MDN Reference",
25338                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-color"
25339                 }
25340             ],
25341             "description": "Logical 'border-left-color'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25342             "restrictions": [
25343                 "color"
25344             ]
25345         },
25346         {
25347             "name": "border-inline-end-style",
25348             "browsers": [
25349                 "E79",
25350                 "FF41",
25351                 "S12.1",
25352                 "C69",
25353                 "O56"
25354             ],
25355             "syntax": "<'border-top-style'>",
25356             "relevance": 50,
25357             "references": [
25358                 {
25359                     "name": "MDN Reference",
25360                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-style"
25361                 }
25362             ],
25363             "description": "Logical 'border-right-style'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25364             "restrictions": [
25365                 "line-style"
25366             ]
25367         },
25368         {
25369             "name": "border-inline-start-style",
25370             "browsers": [
25371                 "E79",
25372                 "FF41",
25373                 "S12.1",
25374                 "C69",
25375                 "O56"
25376             ],
25377             "syntax": "<'border-top-style'>",
25378             "relevance": 50,
25379             "references": [
25380                 {
25381                     "name": "MDN Reference",
25382                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-style"
25383                 }
25384             ],
25385             "description": "Logical 'border-left-style'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25386             "restrictions": [
25387                 "line-style"
25388             ]
25389         },
25390         {
25391             "name": "border-inline-end-width",
25392             "browsers": [
25393                 "E79",
25394                 "FF41",
25395                 "S12.1",
25396                 "C69",
25397                 "O56"
25398             ],
25399             "syntax": "<'border-top-width'>",
25400             "relevance": 50,
25401             "references": [
25402                 {
25403                     "name": "MDN Reference",
25404                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-end-width"
25405                 }
25406             ],
25407             "description": "Logical 'border-right-width'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25408             "restrictions": [
25409                 "length",
25410                 "line-width"
25411             ]
25412         },
25413         {
25414             "name": "border-inline-start-width",
25415             "browsers": [
25416                 "E79",
25417                 "FF41",
25418                 "S12.1",
25419                 "C69",
25420                 "O56"
25421             ],
25422             "syntax": "<'border-top-width'>",
25423             "relevance": 50,
25424             "references": [
25425                 {
25426                     "name": "MDN Reference",
25427                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-start-width"
25428                 }
25429             ],
25430             "description": "Logical 'border-left-width'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
25431             "restrictions": [
25432                 "length",
25433                 "line-width"
25434             ]
25435         },
25436         {
25437             "name": "border-left",
25438             "syntax": "<line-width> || <line-style> || <color>",
25439             "relevance": 82,
25440             "references": [
25441                 {
25442                     "name": "MDN Reference",
25443                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-left"
25444                 }
25445             ],
25446             "description": "Shorthand property for setting border width, style and color",
25447             "restrictions": [
25448                 "length",
25449                 "line-width",
25450                 "line-style",
25451                 "color"
25452             ]
25453         },
25454         {
25455             "name": "border-left-color",
25456             "syntax": "<color>",
25457             "relevance": 65,
25458             "references": [
25459                 {
25460                     "name": "MDN Reference",
25461                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-left-color"
25462                 }
25463             ],
25464             "description": "Sets the color of the left border.",
25465             "restrictions": [
25466                 "color"
25467             ]
25468         },
25469         {
25470             "name": "border-left-style",
25471             "syntax": "<line-style>",
25472             "relevance": 54,
25473             "references": [
25474                 {
25475                     "name": "MDN Reference",
25476                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-left-style"
25477                 }
25478             ],
25479             "description": "Sets the style of the left border.",
25480             "restrictions": [
25481                 "line-style"
25482             ]
25483         },
25484         {
25485             "name": "border-left-width",
25486             "syntax": "<line-width>",
25487             "relevance": 58,
25488             "references": [
25489                 {
25490                     "name": "MDN Reference",
25491                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-left-width"
25492                 }
25493             ],
25494             "description": "Sets the thickness of the left border.",
25495             "restrictions": [
25496                 "length",
25497                 "line-width"
25498             ]
25499         },
25500         {
25501             "name": "border-radius",
25502             "syntax": "<length-percentage>{1,4} [ / <length-percentage>{1,4} ]?",
25503             "relevance": 91,
25504             "references": [
25505                 {
25506                     "name": "MDN Reference",
25507                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-radius"
25508                 }
25509             ],
25510             "description": "Defines the radii of the outer border edge.",
25511             "restrictions": [
25512                 "length",
25513                 "percentage"
25514             ]
25515         },
25516         {
25517             "name": "border-right",
25518             "syntax": "<line-width> || <line-style> || <color>",
25519             "relevance": 81,
25520             "references": [
25521                 {
25522                     "name": "MDN Reference",
25523                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-right"
25524                 }
25525             ],
25526             "description": "Shorthand property for setting border width, style and color",
25527             "restrictions": [
25528                 "length",
25529                 "line-width",
25530                 "line-style",
25531                 "color"
25532             ]
25533         },
25534         {
25535             "name": "border-right-color",
25536             "syntax": "<color>",
25537             "relevance": 64,
25538             "references": [
25539                 {
25540                     "name": "MDN Reference",
25541                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-right-color"
25542                 }
25543             ],
25544             "description": "Sets the color of the right border.",
25545             "restrictions": [
25546                 "color"
25547             ]
25548         },
25549         {
25550             "name": "border-right-style",
25551             "syntax": "<line-style>",
25552             "relevance": 54,
25553             "references": [
25554                 {
25555                     "name": "MDN Reference",
25556                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-right-style"
25557                 }
25558             ],
25559             "description": "Sets the style of the right border.",
25560             "restrictions": [
25561                 "line-style"
25562             ]
25563         },
25564         {
25565             "name": "border-right-width",
25566             "syntax": "<line-width>",
25567             "relevance": 60,
25568             "references": [
25569                 {
25570                     "name": "MDN Reference",
25571                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-right-width"
25572                 }
25573             ],
25574             "description": "Sets the thickness of the right border.",
25575             "restrictions": [
25576                 "length",
25577                 "line-width"
25578             ]
25579         },
25580         {
25581             "name": "border-spacing",
25582             "syntax": "<length> <length>?",
25583             "relevance": 68,
25584             "references": [
25585                 {
25586                     "name": "MDN Reference",
25587                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-spacing"
25588                 }
25589             ],
25590             "description": "The lengths specify the distance that separates adjoining cell borders. If one length is specified, it gives both the horizontal and vertical spacing. If two are specified, the first gives the horizontal spacing and the second the vertical spacing. Lengths may not be negative.",
25591             "restrictions": [
25592                 "length"
25593             ]
25594         },
25595         {
25596             "name": "border-style",
25597             "values": [],
25598             "syntax": "<line-style>{1,4}",
25599             "relevance": 79,
25600             "references": [
25601                 {
25602                     "name": "MDN Reference",
25603                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-style"
25604                 }
25605             ],
25606             "description": "The style of the border around edges of an element.",
25607             "restrictions": [
25608                 "line-style"
25609             ]
25610         },
25611         {
25612             "name": "border-top",
25613             "syntax": "<line-width> || <line-style> || <color>",
25614             "relevance": 87,
25615             "references": [
25616                 {
25617                     "name": "MDN Reference",
25618                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top"
25619                 }
25620             ],
25621             "description": "Shorthand property for setting border width, style and color",
25622             "restrictions": [
25623                 "length",
25624                 "line-width",
25625                 "line-style",
25626                 "color"
25627             ]
25628         },
25629         {
25630             "name": "border-top-color",
25631             "syntax": "<color>",
25632             "relevance": 71,
25633             "references": [
25634                 {
25635                     "name": "MDN Reference",
25636                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top-color"
25637                 }
25638             ],
25639             "description": "Sets the color of the top border.",
25640             "restrictions": [
25641                 "color"
25642             ]
25643         },
25644         {
25645             "name": "border-top-left-radius",
25646             "syntax": "<length-percentage>{1,2}",
25647             "relevance": 74,
25648             "references": [
25649                 {
25650                     "name": "MDN Reference",
25651                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top-left-radius"
25652                 }
25653             ],
25654             "description": "Defines the radii of the top left outer border edge.",
25655             "restrictions": [
25656                 "length",
25657                 "percentage"
25658             ]
25659         },
25660         {
25661             "name": "border-top-right-radius",
25662             "syntax": "<length-percentage>{1,2}",
25663             "relevance": 72,
25664             "references": [
25665                 {
25666                     "name": "MDN Reference",
25667                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top-right-radius"
25668                 }
25669             ],
25670             "description": "Defines the radii of the top right outer border edge.",
25671             "restrictions": [
25672                 "length",
25673                 "percentage"
25674             ]
25675         },
25676         {
25677             "name": "border-top-style",
25678             "syntax": "<line-style>",
25679             "relevance": 57,
25680             "references": [
25681                 {
25682                     "name": "MDN Reference",
25683                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top-style"
25684                 }
25685             ],
25686             "description": "Sets the style of the top border.",
25687             "restrictions": [
25688                 "line-style"
25689             ]
25690         },
25691         {
25692             "name": "border-top-width",
25693             "syntax": "<line-width>",
25694             "relevance": 61,
25695             "references": [
25696                 {
25697                     "name": "MDN Reference",
25698                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-top-width"
25699                 }
25700             ],
25701             "description": "Sets the thickness of the top border.",
25702             "restrictions": [
25703                 "length",
25704                 "line-width"
25705             ]
25706         },
25707         {
25708             "name": "border-width",
25709             "values": [],
25710             "syntax": "<line-width>{1,4}",
25711             "relevance": 81,
25712             "references": [
25713                 {
25714                     "name": "MDN Reference",
25715                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-width"
25716                 }
25717             ],
25718             "description": "Shorthand that sets the four 'border-*-width' properties. If it has four values, they set top, right, bottom and left in that order. If left is missing, it is the same as right; if bottom is missing, it is the same as top; if right is missing, it is the same as top.",
25719             "restrictions": [
25720                 "length",
25721                 "line-width"
25722             ]
25723         },
25724         {
25725             "name": "bottom",
25726             "values": [
25727                 {
25728                     "name": "auto",
25729                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"
25730                 }
25731             ],
25732             "syntax": "<length> | <percentage> | auto",
25733             "relevance": 89,
25734             "references": [
25735                 {
25736                     "name": "MDN Reference",
25737                     "url": "https://developer.mozilla.org/docs/Web/CSS/bottom"
25738                 }
25739             ],
25740             "description": "Specifies how far an absolutely positioned box's bottom margin edge is offset above the bottom edge of the box's 'containing block'.",
25741             "restrictions": [
25742                 "length",
25743                 "percentage"
25744             ]
25745         },
25746         {
25747             "name": "box-decoration-break",
25748             "browsers": [
25749                 "E79",
25750                 "FF32",
25751                 "S6.1",
25752                 "C22",
25753                 "O15"
25754             ],
25755             "values": [
25756                 {
25757                     "name": "clone",
25758                     "description": "Each box is independently wrapped with the border and padding."
25759                 },
25760                 {
25761                     "name": "slice",
25762                     "description": "The effect is as though the element were rendered with no breaks present, and then sliced by the breaks afterward."
25763                 }
25764             ],
25765             "syntax": "slice | clone",
25766             "relevance": 50,
25767             "references": [
25768                 {
25769                     "name": "MDN Reference",
25770                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-decoration-break"
25771                 }
25772             ],
25773             "description": "Specifies whether individual boxes are treated as broken pieces of one continuous box, or whether each box is individually wrapped with the border and padding.",
25774             "restrictions": [
25775                 "enum"
25776             ]
25777         },
25778         {
25779             "name": "box-shadow",
25780             "values": [
25781                 {
25782                     "name": "inset",
25783                     "description": "Changes the drop shadow from an outer shadow (one that shadows the box onto the canvas, as if it were lifted above the canvas) to an inner shadow (one that shadows the canvas onto the box, as if the box were cut out of the canvas and shifted behind it)."
25784                 },
25785                 {
25786                     "name": "none",
25787                     "description": "No shadow."
25788                 }
25789             ],
25790             "syntax": "none | <shadow>#",
25791             "relevance": 89,
25792             "references": [
25793                 {
25794                     "name": "MDN Reference",
25795                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-shadow"
25796                 }
25797             ],
25798             "description": "Attaches one or more drop-shadows to the box. The property is a comma-separated list of shadows, each specified by 2-4 length values, an optional color, and an optional 'inset' keyword. Omitted lengths are 0; omitted colors are a user agent chosen color.",
25799             "restrictions": [
25800                 "length",
25801                 "color",
25802                 "enum"
25803             ]
25804         },
25805         {
25806             "name": "box-sizing",
25807             "values": [
25808                 {
25809                     "name": "border-box",
25810                     "description": "The specified width and height (and respective min/max properties) on this element determine the border box of the element."
25811                 },
25812                 {
25813                     "name": "content-box",
25814                     "description": "Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."
25815                 }
25816             ],
25817             "syntax": "content-box | border-box",
25818             "relevance": 92,
25819             "references": [
25820                 {
25821                     "name": "MDN Reference",
25822                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-sizing"
25823                 }
25824             ],
25825             "description": "Specifies the behavior of the 'width' and 'height' properties.",
25826             "restrictions": [
25827                 "enum"
25828             ]
25829         },
25830         {
25831             "name": "break-after",
25832             "values": [
25833                 {
25834                     "name": "always",
25835                     "description": "Always force a page break before/after the generated box."
25836                 },
25837                 {
25838                     "name": "auto",
25839                     "description": "Neither force nor forbid a page/column break before/after the principal box."
25840                 },
25841                 {
25842                     "name": "avoid",
25843                     "description": "Avoid a break before/after the principal box."
25844                 },
25845                 {
25846                     "name": "avoid-column",
25847                     "description": "Avoid a column break before/after the principal box."
25848                 },
25849                 {
25850                     "name": "avoid-page",
25851                     "description": "Avoid a page break before/after the principal box."
25852                 },
25853                 {
25854                     "name": "column",
25855                     "description": "Always force a column break before/after the principal box."
25856                 },
25857                 {
25858                     "name": "left",
25859                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
25860                 },
25861                 {
25862                     "name": "page",
25863                     "description": "Always force a page break before/after the principal box."
25864                 },
25865                 {
25866                     "name": "right",
25867                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
25868                 }
25869             ],
25870             "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
25871             "relevance": 50,
25872             "description": "Describes the page/column/region break behavior after the generated box.",
25873             "restrictions": [
25874                 "enum"
25875             ]
25876         },
25877         {
25878             "name": "break-before",
25879             "values": [
25880                 {
25881                     "name": "always",
25882                     "description": "Always force a page break before/after the generated box."
25883                 },
25884                 {
25885                     "name": "auto",
25886                     "description": "Neither force nor forbid a page/column break before/after the principal box."
25887                 },
25888                 {
25889                     "name": "avoid",
25890                     "description": "Avoid a break before/after the principal box."
25891                 },
25892                 {
25893                     "name": "avoid-column",
25894                     "description": "Avoid a column break before/after the principal box."
25895                 },
25896                 {
25897                     "name": "avoid-page",
25898                     "description": "Avoid a page break before/after the principal box."
25899                 },
25900                 {
25901                     "name": "column",
25902                     "description": "Always force a column break before/after the principal box."
25903                 },
25904                 {
25905                     "name": "left",
25906                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
25907                 },
25908                 {
25909                     "name": "page",
25910                     "description": "Always force a page break before/after the principal box."
25911                 },
25912                 {
25913                     "name": "right",
25914                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
25915                 }
25916             ],
25917             "syntax": "auto | avoid | always | all | avoid-page | page | left | right | recto | verso | avoid-column | column | avoid-region | region",
25918             "relevance": 50,
25919             "description": "Describes the page/column/region break behavior before the generated box.",
25920             "restrictions": [
25921                 "enum"
25922             ]
25923         },
25924         {
25925             "name": "break-inside",
25926             "values": [
25927                 {
25928                     "name": "auto",
25929                     "description": "Impose no additional breaking constraints within the box."
25930                 },
25931                 {
25932                     "name": "avoid",
25933                     "description": "Avoid breaks within the box."
25934                 },
25935                 {
25936                     "name": "avoid-column",
25937                     "description": "Avoid a column break within the box."
25938                 },
25939                 {
25940                     "name": "avoid-page",
25941                     "description": "Avoid a page break within the box."
25942                 }
25943             ],
25944             "syntax": "auto | avoid | avoid-page | avoid-column | avoid-region",
25945             "relevance": 50,
25946             "description": "Describes the page/column/region break behavior inside the principal box.",
25947             "restrictions": [
25948                 "enum"
25949             ]
25950         },
25951         {
25952             "name": "caption-side",
25953             "values": [
25954                 {
25955                     "name": "bottom",
25956                     "description": "Positions the caption box below the table box."
25957                 },
25958                 {
25959                     "name": "top",
25960                     "description": "Positions the caption box above the table box."
25961                 }
25962             ],
25963             "syntax": "top | bottom | block-start | block-end | inline-start | inline-end",
25964             "relevance": 51,
25965             "references": [
25966                 {
25967                     "name": "MDN Reference",
25968                     "url": "https://developer.mozilla.org/docs/Web/CSS/caption-side"
25969                 }
25970             ],
25971             "description": "Specifies the position of the caption box with respect to the table box.",
25972             "restrictions": [
25973                 "enum"
25974             ]
25975         },
25976         {
25977             "name": "caret-color",
25978             "browsers": [
25979                 "E79",
25980                 "FF53",
25981                 "S11.1",
25982                 "C57",
25983                 "O44"
25984             ],
25985             "values": [
25986                 {
25987                     "name": "auto",
25988                     "description": "The user agent selects an appropriate color for the caret. This is generally currentcolor, but the user agent may choose a different color to ensure good visibility and contrast with the surrounding content, taking into account the value of currentcolor, the background, shadows, and other factors."
25989                 }
25990             ],
25991             "syntax": "auto | <color>",
25992             "relevance": 51,
25993             "references": [
25994                 {
25995                     "name": "MDN Reference",
25996                     "url": "https://developer.mozilla.org/docs/Web/CSS/caret-color"
25997                 }
25998             ],
25999             "description": "Controls the color of the text insertion indicator.",
26000             "restrictions": [
26001                 "color",
26002                 "enum"
26003             ]
26004         },
26005         {
26006             "name": "clear",
26007             "values": [
26008                 {
26009                     "name": "both",
26010                     "description": "The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating and left-floating boxes that resulted from elements earlier in the source document."
26011                 },
26012                 {
26013                     "name": "left",
26014                     "description": "The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any left-floating boxes that resulted from elements earlier in the source document."
26015                 },
26016                 {
26017                     "name": "none",
26018                     "description": "No constraint on the box's position with respect to floats."
26019                 },
26020                 {
26021                     "name": "right",
26022                     "description": "The clearance of the generated box is set to the amount necessary to place the top border edge below the bottom outer edge of any right-floating boxes that resulted from elements earlier in the source document."
26023                 }
26024             ],
26025             "syntax": "none | left | right | both | inline-start | inline-end",
26026             "relevance": 84,
26027             "references": [
26028                 {
26029                     "name": "MDN Reference",
26030                     "url": "https://developer.mozilla.org/docs/Web/CSS/clear"
26031                 }
26032             ],
26033             "description": "Indicates which sides of an element's box(es) may not be adjacent to an earlier floating box. The 'clear' property does not consider floats inside the element itself or in other block formatting contexts.",
26034             "restrictions": [
26035                 "enum"
26036             ]
26037         },
26038         {
26039             "name": "clip",
26040             "values": [
26041                 {
26042                     "name": "auto",
26043                     "description": "The element does not clip."
26044                 },
26045                 {
26046                     "name": "rect()",
26047                     "description": "Specifies offsets from the edges of the border box."
26048                 }
26049             ],
26050             "syntax": "<shape> | auto",
26051             "relevance": 73,
26052             "references": [
26053                 {
26054                     "name": "MDN Reference",
26055                     "url": "https://developer.mozilla.org/docs/Web/CSS/clip"
26056                 }
26057             ],
26058             "description": "Deprecated. Use the 'clip-path' property when support allows. Defines the visible portion of an element’s box.",
26059             "restrictions": [
26060                 "enum"
26061             ]
26062         },
26063         {
26064             "name": "clip-path",
26065             "values": [
26066                 {
26067                     "name": "none",
26068                     "description": "No clipping path gets created."
26069                 },
26070                 {
26071                     "name": "url()",
26072                     "description": "References a <clipPath> element to create a clipping path."
26073                 }
26074             ],
26075             "syntax": "<clip-source> | [ <basic-shape> || <geometry-box> ] | none",
26076             "relevance": 55,
26077             "references": [
26078                 {
26079                     "name": "MDN Reference",
26080                     "url": "https://developer.mozilla.org/docs/Web/CSS/clip-path"
26081                 }
26082             ],
26083             "description": "Specifies a clipping path where everything inside the path is visible and everything outside is clipped out.",
26084             "restrictions": [
26085                 "url",
26086                 "shape",
26087                 "geometry-box",
26088                 "enum"
26089             ]
26090         },
26091         {
26092             "name": "clip-rule",
26093             "browsers": [
26094                 "E",
26095                 "C5",
26096                 "FF3",
26097                 "IE10",
26098                 "O9",
26099                 "S6"
26100             ],
26101             "values": [
26102                 {
26103                     "name": "evenodd",
26104                     "description": "Determines the ‘insideness’ of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses."
26105                 },
26106                 {
26107                     "name": "nonzero",
26108                     "description": "Determines the ‘insideness’ of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray."
26109                 }
26110             ],
26111             "relevance": 50,
26112             "description": "Indicates the algorithm which is to be used to determine what parts of the canvas are included inside the shape.",
26113             "restrictions": [
26114                 "enum"
26115             ]
26116         },
26117         {
26118             "name": "color",
26119             "syntax": "<color>",
26120             "relevance": 94,
26121             "references": [
26122                 {
26123                     "name": "MDN Reference",
26124                     "url": "https://developer.mozilla.org/docs/Web/CSS/color"
26125                 }
26126             ],
26127             "description": "Sets the color of an element's text",
26128             "restrictions": [
26129                 "color"
26130             ]
26131         },
26132         {
26133             "name": "color-interpolation-filters",
26134             "browsers": [
26135                 "E",
26136                 "C5",
26137                 "FF3",
26138                 "IE10",
26139                 "O9",
26140                 "S6"
26141             ],
26142             "values": [
26143                 {
26144                     "name": "auto",
26145                     "description": "Color operations are not required to occur in a particular color space."
26146                 },
26147                 {
26148                     "name": "linearRGB",
26149                     "description": "Color operations should occur in the linearized RGB color space."
26150                 },
26151                 {
26152                     "name": "sRGB",
26153                     "description": "Color operations should occur in the sRGB color space."
26154                 }
26155             ],
26156             "relevance": 50,
26157             "description": "Specifies the color space for imaging operations performed via filter effects.",
26158             "restrictions": [
26159                 "enum"
26160             ]
26161         },
26162         {
26163             "name": "column-count",
26164             "values": [
26165                 {
26166                     "name": "auto",
26167                     "description": "Determines the number of columns by the 'column-width' property and the element width."
26168                 }
26169             ],
26170             "syntax": "<integer> | auto",
26171             "relevance": 52,
26172             "references": [
26173                 {
26174                     "name": "MDN Reference",
26175                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-count"
26176                 }
26177             ],
26178             "description": "Describes the optimal number of columns into which the content of the element will be flowed.",
26179             "restrictions": [
26180                 "integer",
26181                 "enum"
26182             ]
26183         },
26184         {
26185             "name": "column-fill",
26186             "values": [
26187                 {
26188                     "name": "auto",
26189                     "description": "Fills columns sequentially."
26190                 },
26191                 {
26192                     "name": "balance",
26193                     "description": "Balance content equally between columns, if possible."
26194                 }
26195             ],
26196             "syntax": "auto | balance | balance-all",
26197             "relevance": 50,
26198             "references": [
26199                 {
26200                     "name": "MDN Reference",
26201                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-fill"
26202                 }
26203             ],
26204             "description": "In continuous media, this property will only be consulted if the length of columns has been constrained. Otherwise, columns will automatically be balanced.",
26205             "restrictions": [
26206                 "enum"
26207             ]
26208         },
26209         {
26210             "name": "column-gap",
26211             "values": [
26212                 {
26213                     "name": "normal",
26214                     "description": "User agent specific and typically equivalent to 1em."
26215                 }
26216             ],
26217             "syntax": "normal | <length-percentage>",
26218             "relevance": 52,
26219             "description": "Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",
26220             "restrictions": [
26221                 "length",
26222                 "enum"
26223             ]
26224         },
26225         {
26226             "name": "column-rule",
26227             "syntax": "<'column-rule-width'> || <'column-rule-style'> || <'column-rule-color'>",
26228             "relevance": 51,
26229             "references": [
26230                 {
26231                     "name": "MDN Reference",
26232                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-rule"
26233                 }
26234             ],
26235             "description": "Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",
26236             "restrictions": [
26237                 "length",
26238                 "line-width",
26239                 "line-style",
26240                 "color"
26241             ]
26242         },
26243         {
26244             "name": "column-rule-color",
26245             "syntax": "<color>",
26246             "relevance": 50,
26247             "references": [
26248                 {
26249                     "name": "MDN Reference",
26250                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-color"
26251                 }
26252             ],
26253             "description": "Sets the color of the column rule",
26254             "restrictions": [
26255                 "color"
26256             ]
26257         },
26258         {
26259             "name": "column-rule-style",
26260             "syntax": "<'border-style'>",
26261             "relevance": 50,
26262             "references": [
26263                 {
26264                     "name": "MDN Reference",
26265                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-style"
26266                 }
26267             ],
26268             "description": "Sets the style of the rule between columns of an element.",
26269             "restrictions": [
26270                 "line-style"
26271             ]
26272         },
26273         {
26274             "name": "column-rule-width",
26275             "syntax": "<'border-width'>",
26276             "relevance": 50,
26277             "references": [
26278                 {
26279                     "name": "MDN Reference",
26280                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-rule-width"
26281                 }
26282             ],
26283             "description": "Sets the width of the rule between columns. Negative values are not allowed.",
26284             "restrictions": [
26285                 "length",
26286                 "line-width"
26287             ]
26288         },
26289         {
26290             "name": "columns",
26291             "values": [
26292                 {
26293                     "name": "auto",
26294                     "description": "The width depends on the values of other properties."
26295                 }
26296             ],
26297             "syntax": "<'column-width'> || <'column-count'>",
26298             "relevance": 51,
26299             "references": [
26300                 {
26301                     "name": "MDN Reference",
26302                     "url": "https://developer.mozilla.org/docs/Web/CSS/columns"
26303                 }
26304             ],
26305             "description": "A shorthand property which sets both 'column-width' and 'column-count'.",
26306             "restrictions": [
26307                 "length",
26308                 "integer",
26309                 "enum"
26310             ]
26311         },
26312         {
26313             "name": "column-span",
26314             "values": [
26315                 {
26316                     "name": "all",
26317                     "description": "The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear."
26318                 },
26319                 {
26320                     "name": "none",
26321                     "description": "The element does not span multiple columns."
26322                 }
26323             ],
26324             "syntax": "none | all",
26325             "relevance": 50,
26326             "references": [
26327                 {
26328                     "name": "MDN Reference",
26329                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-span"
26330                 }
26331             ],
26332             "description": "Describes the page/column break behavior after the generated box.",
26333             "restrictions": [
26334                 "enum"
26335             ]
26336         },
26337         {
26338             "name": "column-width",
26339             "values": [
26340                 {
26341                     "name": "auto",
26342                     "description": "The width depends on the values of other properties."
26343                 }
26344             ],
26345             "syntax": "<length> | auto",
26346             "relevance": 51,
26347             "references": [
26348                 {
26349                     "name": "MDN Reference",
26350                     "url": "https://developer.mozilla.org/docs/Web/CSS/column-width"
26351                 }
26352             ],
26353             "description": "Describes the width of columns in multicol elements.",
26354             "restrictions": [
26355                 "length",
26356                 "enum"
26357             ]
26358         },
26359         {
26360             "name": "contain",
26361             "browsers": [
26362                 "E79",
26363                 "FF69",
26364                 "C52",
26365                 "O40"
26366             ],
26367             "values": [
26368                 {
26369                     "name": "none",
26370                     "description": "Indicates that the property has no effect."
26371                 },
26372                 {
26373                     "name": "strict",
26374                     "description": "Turns on all forms of containment for the element."
26375                 },
26376                 {
26377                     "name": "content",
26378                     "description": "All containment rules except size are applied to the element."
26379                 },
26380                 {
26381                     "name": "size",
26382                     "description": "For properties that can have effects on more than just an element and its descendants, those effects don't escape the containing element."
26383                 },
26384                 {
26385                     "name": "layout",
26386                     "description": "Turns on layout containment for the element."
26387                 },
26388                 {
26389                     "name": "style",
26390                     "description": "Turns on style containment for the element."
26391                 },
26392                 {
26393                     "name": "paint",
26394                     "description": "Turns on paint containment for the element."
26395                 }
26396             ],
26397             "syntax": "none | strict | content | [ size || layout || style || paint ]",
26398             "relevance": 55,
26399             "references": [
26400                 {
26401                     "name": "MDN Reference",
26402                     "url": "https://developer.mozilla.org/docs/Web/CSS/contain"
26403                 }
26404             ],
26405             "description": "Indicates that an element and its contents are, as much as possible, independent of the rest of the document tree.",
26406             "restrictions": [
26407                 "enum"
26408             ]
26409         },
26410         {
26411             "name": "content",
26412             "values": [
26413                 {
26414                     "name": "attr()",
26415                     "description": "The attr(n) function returns as a string the value of attribute n for the subject of the selector."
26416                 },
26417                 {
26418                     "name": "counter(name)",
26419                     "description": "Counters are denoted by identifiers (see the 'counter-increment' and 'counter-reset' properties)."
26420                 },
26421                 {
26422                     "name": "icon",
26423                     "description": "The (pseudo-)element is replaced in its entirety by the resource referenced by its 'icon' property, and treated as a replaced element."
26424                 },
26425                 {
26426                     "name": "none",
26427                     "description": "On elements, this inhibits the children of the element from being rendered as children of this element, as if the element was empty. On pseudo-elements it causes the pseudo-element to have no content."
26428                 },
26429                 {
26430                     "name": "normal",
26431                     "description": "See http://www.w3.org/TR/css3-content/#content for computation rules."
26432                 },
26433                 {
26434                     "name": "url()"
26435                 }
26436             ],
26437             "syntax": "normal | none | [ <content-replacement> | <content-list> ] [/ <string> ]?",
26438             "relevance": 89,
26439             "references": [
26440                 {
26441                     "name": "MDN Reference",
26442                     "url": "https://developer.mozilla.org/docs/Web/CSS/content"
26443                 }
26444             ],
26445             "description": "Determines which page-based occurrence of a given element is applied to a counter or string value.",
26446             "restrictions": [
26447                 "string",
26448                 "url"
26449             ]
26450         },
26451         {
26452             "name": "counter-increment",
26453             "values": [
26454                 {
26455                     "name": "none",
26456                     "description": "This element does not alter the value of any counters."
26457                 }
26458             ],
26459             "syntax": "[ <custom-ident> <integer>? ]+ | none",
26460             "relevance": 52,
26461             "references": [
26462                 {
26463                     "name": "MDN Reference",
26464                     "url": "https://developer.mozilla.org/docs/Web/CSS/counter-increment"
26465                 }
26466             ],
26467             "description": "Manipulate the value of existing counters.",
26468             "restrictions": [
26469                 "identifier",
26470                 "integer"
26471             ]
26472         },
26473         {
26474             "name": "counter-reset",
26475             "values": [
26476                 {
26477                     "name": "none",
26478                     "description": "The counter is not modified."
26479                 }
26480             ],
26481             "syntax": "[ <custom-ident> <integer>? ]+ | none",
26482             "relevance": 52,
26483             "references": [
26484                 {
26485                     "name": "MDN Reference",
26486                     "url": "https://developer.mozilla.org/docs/Web/CSS/counter-reset"
26487                 }
26488             ],
26489             "description": "Property accepts one or more names of counters (identifiers), each one optionally followed by an integer. The integer gives the value that the counter is set to on each occurrence of the element.",
26490             "restrictions": [
26491                 "identifier",
26492                 "integer"
26493             ]
26494         },
26495         {
26496             "name": "cursor",
26497             "values": [
26498                 {
26499                     "name": "alias",
26500                     "description": "Indicates an alias of/shortcut to something is to be created. Often rendered as an arrow with a small curved arrow next to it."
26501                 },
26502                 {
26503                     "name": "all-scroll",
26504                     "description": "Indicates that the something can be scrolled in any direction. Often rendered as arrows pointing up, down, left, and right with a dot in the middle."
26505                 },
26506                 {
26507                     "name": "auto",
26508                     "description": "The UA determines the cursor to display based on the current context."
26509                 },
26510                 {
26511                     "name": "cell",
26512                     "description": "Indicates that a cell or set of cells may be selected. Often rendered as a thick plus-sign with a dot in the middle."
26513                 },
26514                 {
26515                     "name": "col-resize",
26516                     "description": "Indicates that the item/column can be resized horizontally. Often rendered as arrows pointing left and right with a vertical bar separating them."
26517                 },
26518                 {
26519                     "name": "context-menu",
26520                     "description": "A context menu is available for the object under the cursor. Often rendered as an arrow with a small menu-like graphic next to it."
26521                 },
26522                 {
26523                     "name": "copy",
26524                     "description": "Indicates something is to be copied. Often rendered as an arrow with a small plus sign next to it."
26525                 },
26526                 {
26527                     "name": "crosshair",
26528                     "description": "A simple crosshair (e.g., short line segments resembling a '+' sign). Often used to indicate a two dimensional bitmap selection mode."
26529                 },
26530                 {
26531                     "name": "default",
26532                     "description": "The platform-dependent default cursor. Often rendered as an arrow."
26533                 },
26534                 {
26535                     "name": "e-resize",
26536                     "description": "Indicates that east edge is to be moved."
26537                 },
26538                 {
26539                     "name": "ew-resize",
26540                     "description": "Indicates a bidirectional east-west resize cursor."
26541                 },
26542                 {
26543                     "name": "grab",
26544                     "description": "Indicates that something can be grabbed."
26545                 },
26546                 {
26547                     "name": "grabbing",
26548                     "description": "Indicates that something is being grabbed."
26549                 },
26550                 {
26551                     "name": "help",
26552                     "description": "Help is available for the object under the cursor. Often rendered as a question mark or a balloon."
26553                 },
26554                 {
26555                     "name": "move",
26556                     "description": "Indicates something is to be moved."
26557                 },
26558                 {
26559                     "name": "-moz-grab",
26560                     "description": "Indicates that something can be grabbed."
26561                 },
26562                 {
26563                     "name": "-moz-grabbing",
26564                     "description": "Indicates that something is being grabbed."
26565                 },
26566                 {
26567                     "name": "-moz-zoom-in",
26568                     "description": "Indicates that something can be zoomed (magnified) in."
26569                 },
26570                 {
26571                     "name": "-moz-zoom-out",
26572                     "description": "Indicates that something can be zoomed (magnified) out."
26573                 },
26574                 {
26575                     "name": "ne-resize",
26576                     "description": "Indicates that movement starts from north-east corner."
26577                 },
26578                 {
26579                     "name": "nesw-resize",
26580                     "description": "Indicates a bidirectional north-east/south-west cursor."
26581                 },
26582                 {
26583                     "name": "no-drop",
26584                     "description": "Indicates that the dragged item cannot be dropped at the current cursor location. Often rendered as a hand or pointer with a small circle with a line through it."
26585                 },
26586                 {
26587                     "name": "none",
26588                     "description": "No cursor is rendered for the element."
26589                 },
26590                 {
26591                     "name": "not-allowed",
26592                     "description": "Indicates that the requested action will not be carried out. Often rendered as a circle with a line through it."
26593                 },
26594                 {
26595                     "name": "n-resize",
26596                     "description": "Indicates that north edge is to be moved."
26597                 },
26598                 {
26599                     "name": "ns-resize",
26600                     "description": "Indicates a bidirectional north-south cursor."
26601                 },
26602                 {
26603                     "name": "nw-resize",
26604                     "description": "Indicates that movement starts from north-west corner."
26605                 },
26606                 {
26607                     "name": "nwse-resize",
26608                     "description": "Indicates a bidirectional north-west/south-east cursor."
26609                 },
26610                 {
26611                     "name": "pointer",
26612                     "description": "The cursor is a pointer that indicates a link."
26613                 },
26614                 {
26615                     "name": "progress",
26616                     "description": "A progress indicator. The program is performing some processing, but is different from 'wait' in that the user may still interact with the program. Often rendered as a spinning beach ball, or an arrow with a watch or hourglass."
26617                 },
26618                 {
26619                     "name": "row-resize",
26620                     "description": "Indicates that the item/row can be resized vertically. Often rendered as arrows pointing up and down with a horizontal bar separating them."
26621                 },
26622                 {
26623                     "name": "se-resize",
26624                     "description": "Indicates that movement starts from south-east corner."
26625                 },
26626                 {
26627                     "name": "s-resize",
26628                     "description": "Indicates that south edge is to be moved."
26629                 },
26630                 {
26631                     "name": "sw-resize",
26632                     "description": "Indicates that movement starts from south-west corner."
26633                 },
26634                 {
26635                     "name": "text",
26636                     "description": "Indicates text that may be selected. Often rendered as a vertical I-beam."
26637                 },
26638                 {
26639                     "name": "vertical-text",
26640                     "description": "Indicates vertical-text that may be selected. Often rendered as a horizontal I-beam."
26641                 },
26642                 {
26643                     "name": "wait",
26644                     "description": "Indicates that the program is busy and the user should wait. Often rendered as a watch or hourglass."
26645                 },
26646                 {
26647                     "name": "-webkit-grab",
26648                     "description": "Indicates that something can be grabbed."
26649                 },
26650                 {
26651                     "name": "-webkit-grabbing",
26652                     "description": "Indicates that something is being grabbed."
26653                 },
26654                 {
26655                     "name": "-webkit-zoom-in",
26656                     "description": "Indicates that something can be zoomed (magnified) in."
26657                 },
26658                 {
26659                     "name": "-webkit-zoom-out",
26660                     "description": "Indicates that something can be zoomed (magnified) out."
26661                 },
26662                 {
26663                     "name": "w-resize",
26664                     "description": "Indicates that west edge is to be moved."
26665                 },
26666                 {
26667                     "name": "zoom-in",
26668                     "description": "Indicates that something can be zoomed (magnified) in."
26669                 },
26670                 {
26671                     "name": "zoom-out",
26672                     "description": "Indicates that something can be zoomed (magnified) out."
26673                 }
26674             ],
26675             "syntax": "[ [ <url> [ <x> <y> ]? , ]* [ auto | default | none | context-menu | help | pointer | progress | wait | cell | crosshair | text | vertical-text | alias | copy | move | no-drop | not-allowed | e-resize | n-resize | ne-resize | nw-resize | s-resize | se-resize | sw-resize | w-resize | ew-resize | ns-resize | nesw-resize | nwse-resize | col-resize | row-resize | all-scroll | zoom-in | zoom-out | grab | grabbing ] ]",
26676             "relevance": 91,
26677             "references": [
26678                 {
26679                     "name": "MDN Reference",
26680                     "url": "https://developer.mozilla.org/docs/Web/CSS/cursor"
26681                 }
26682             ],
26683             "description": "Allows control over cursor appearance in an element",
26684             "restrictions": [
26685                 "url",
26686                 "number",
26687                 "enum"
26688             ]
26689         },
26690         {
26691             "name": "direction",
26692             "values": [
26693                 {
26694                     "name": "ltr",
26695                     "description": "Left-to-right direction."
26696                 },
26697                 {
26698                     "name": "rtl",
26699                     "description": "Right-to-left direction."
26700                 }
26701             ],
26702             "syntax": "ltr | rtl",
26703             "relevance": 68,
26704             "references": [
26705                 {
26706                     "name": "MDN Reference",
26707                     "url": "https://developer.mozilla.org/docs/Web/CSS/direction"
26708                 }
26709             ],
26710             "description": "Specifies the inline base direction or directionality of any bidi paragraph, embedding, isolate, or override established by the box. Note: for HTML content use the 'dir' attribute and 'bdo' element rather than this property.",
26711             "restrictions": [
26712                 "enum"
26713             ]
26714         },
26715         {
26716             "name": "display",
26717             "values": [
26718                 {
26719                     "name": "block",
26720                     "description": "The element generates a block-level box"
26721                 },
26722                 {
26723                     "name": "contents",
26724                     "description": "The element itself does not generate any boxes, but its children and pseudo-elements still generate boxes as normal."
26725                 },
26726                 {
26727                     "name": "flex",
26728                     "description": "The element generates a principal flex container box and establishes a flex formatting context."
26729                 },
26730                 {
26731                     "name": "flexbox",
26732                     "description": "The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."
26733                 },
26734                 {
26735                     "name": "flow-root",
26736                     "description": "The element generates a block container box, and lays out its contents using flow layout."
26737                 },
26738                 {
26739                     "name": "grid",
26740                     "description": "The element generates a principal grid container box, and establishes a grid formatting context."
26741                 },
26742                 {
26743                     "name": "inline",
26744                     "description": "The element generates an inline-level box."
26745                 },
26746                 {
26747                     "name": "inline-block",
26748                     "description": "A block box, which itself is flowed as a single inline box, similar to a replaced element. The inside of an inline-block is formatted as a block box, and the box itself is formatted as an inline box."
26749                 },
26750                 {
26751                     "name": "inline-flex",
26752                     "description": "Inline-level flex container."
26753                 },
26754                 {
26755                     "name": "inline-flexbox",
26756                     "description": "Inline-level flex container. Standardized as 'inline-flex'"
26757                 },
26758                 {
26759                     "name": "inline-table",
26760                     "description": "Inline-level table wrapper box containing table box."
26761                 },
26762                 {
26763                     "name": "list-item",
26764                     "description": "One or more block boxes and one marker box."
26765                 },
26766                 {
26767                     "name": "-moz-box",
26768                     "description": "The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."
26769                 },
26770                 {
26771                     "name": "-moz-deck"
26772                 },
26773                 {
26774                     "name": "-moz-grid"
26775                 },
26776                 {
26777                     "name": "-moz-grid-group"
26778                 },
26779                 {
26780                     "name": "-moz-grid-line"
26781                 },
26782                 {
26783                     "name": "-moz-groupbox"
26784                 },
26785                 {
26786                     "name": "-moz-inline-box",
26787                     "description": "Inline-level flex container. Standardized as 'inline-flex'"
26788                 },
26789                 {
26790                     "name": "-moz-inline-grid"
26791                 },
26792                 {
26793                     "name": "-moz-inline-stack"
26794                 },
26795                 {
26796                     "name": "-moz-marker"
26797                 },
26798                 {
26799                     "name": "-moz-popup"
26800                 },
26801                 {
26802                     "name": "-moz-stack"
26803                 },
26804                 {
26805                     "name": "-ms-flexbox",
26806                     "description": "The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."
26807                 },
26808                 {
26809                     "name": "-ms-grid",
26810                     "description": "The element generates a principal grid container box, and establishes a grid formatting context."
26811                 },
26812                 {
26813                     "name": "-ms-inline-flexbox",
26814                     "description": "Inline-level flex container. Standardized as 'inline-flex'"
26815                 },
26816                 {
26817                     "name": "-ms-inline-grid",
26818                     "description": "Inline-level grid container."
26819                 },
26820                 {
26821                     "name": "none",
26822                     "description": "The element and its descendants generates no boxes."
26823                 },
26824                 {
26825                     "name": "ruby",
26826                     "description": "The element generates a principal ruby container box, and establishes a ruby formatting context."
26827                 },
26828                 {
26829                     "name": "ruby-base"
26830                 },
26831                 {
26832                     "name": "ruby-base-container"
26833                 },
26834                 {
26835                     "name": "ruby-text"
26836                 },
26837                 {
26838                     "name": "ruby-text-container"
26839                 },
26840                 {
26841                     "name": "run-in",
26842                     "description": "The element generates a run-in box. Run-in elements act like inlines or blocks, depending on the surrounding elements."
26843                 },
26844                 {
26845                     "name": "table",
26846                     "description": "The element generates a principal table wrapper box containing an additionally-generated table box, and establishes a table formatting context."
26847                 },
26848                 {
26849                     "name": "table-caption"
26850                 },
26851                 {
26852                     "name": "table-cell"
26853                 },
26854                 {
26855                     "name": "table-column"
26856                 },
26857                 {
26858                     "name": "table-column-group"
26859                 },
26860                 {
26861                     "name": "table-footer-group"
26862                 },
26863                 {
26864                     "name": "table-header-group"
26865                 },
26866                 {
26867                     "name": "table-row"
26868                 },
26869                 {
26870                     "name": "table-row-group"
26871                 },
26872                 {
26873                     "name": "-webkit-box",
26874                     "description": "The element lays out its contents using flow layout (block-and-inline layout). Standardized as 'flex'."
26875                 },
26876                 {
26877                     "name": "-webkit-flex",
26878                     "description": "The element lays out its contents using flow layout (block-and-inline layout)."
26879                 },
26880                 {
26881                     "name": "-webkit-inline-box",
26882                     "description": "Inline-level flex container. Standardized as 'inline-flex'"
26883                 },
26884                 {
26885                     "name": "-webkit-inline-flex",
26886                     "description": "Inline-level flex container."
26887                 }
26888             ],
26889             "syntax": "[ <display-outside> || <display-inside> ] | <display-listitem> | <display-internal> | <display-box> | <display-legacy>",
26890             "relevance": 96,
26891             "references": [
26892                 {
26893                     "name": "MDN Reference",
26894                     "url": "https://developer.mozilla.org/docs/Web/CSS/display"
26895                 }
26896             ],
26897             "description": "In combination with 'float' and 'position', determines the type of box or boxes that are generated for an element.",
26898             "restrictions": [
26899                 "enum"
26900             ]
26901         },
26902         {
26903             "name": "empty-cells",
26904             "values": [
26905                 {
26906                     "name": "hide",
26907                     "description": "No borders or backgrounds are drawn around/behind empty cells."
26908                 },
26909                 {
26910                     "name": "-moz-show-background"
26911                 },
26912                 {
26913                     "name": "show",
26914                     "description": "Borders and backgrounds are drawn around/behind empty cells (like normal cells)."
26915                 }
26916             ],
26917             "syntax": "show | hide",
26918             "relevance": 51,
26919             "references": [
26920                 {
26921                     "name": "MDN Reference",
26922                     "url": "https://developer.mozilla.org/docs/Web/CSS/empty-cells"
26923                 }
26924             ],
26925             "description": "In the separated borders model, this property controls the rendering of borders and backgrounds around cells that have no visible content.",
26926             "restrictions": [
26927                 "enum"
26928             ]
26929         },
26930         {
26931             "name": "enable-background",
26932             "values": [
26933                 {
26934                     "name": "accumulate",
26935                     "description": "If the ancestor container element has a property of new, then all graphics elements within the current container are rendered both on the parent's background image and onto the target."
26936                 },
26937                 {
26938                     "name": "new",
26939                     "description": "Create a new background image canvas. All children of the current container element can access the background, and they will be rendered onto both the parent's background image canvas in addition to the target device."
26940                 }
26941             ],
26942             "relevance": 50,
26943             "description": "Deprecated. Use 'isolation' property instead when support allows. Specifies how the accumulation of the background image is managed.",
26944             "restrictions": [
26945                 "integer",
26946                 "length",
26947                 "percentage",
26948                 "enum"
26949             ]
26950         },
26951         {
26952             "name": "fallback",
26953             "browsers": [
26954                 "FF33"
26955             ],
26956             "syntax": "<counter-style-name>",
26957             "relevance": 50,
26958             "description": "@counter-style descriptor. Specifies a fallback counter style to be used when the current counter style can’t create a representation for a given counter value.",
26959             "restrictions": [
26960                 "identifier"
26961             ]
26962         },
26963         {
26964             "name": "fill",
26965             "values": [
26966                 {
26967                     "name": "url()",
26968                     "description": "A URL reference to a paint server element, which is an element that defines a paint server: ‘hatch’, ‘linearGradient’, ‘mesh’, ‘pattern’, ‘radialGradient’ and ‘solidcolor’."
26969                 },
26970                 {
26971                     "name": "none",
26972                     "description": "No paint is applied in this layer."
26973                 }
26974             ],
26975             "relevance": 74,
26976             "description": "Paints the interior of the given graphical element.",
26977             "restrictions": [
26978                 "color",
26979                 "enum",
26980                 "url"
26981             ]
26982         },
26983         {
26984             "name": "fill-opacity",
26985             "relevance": 52,
26986             "description": "Specifies the opacity of the painting operation used to paint the interior the current object.",
26987             "restrictions": [
26988                 "number(0-1)"
26989             ]
26990         },
26991         {
26992             "name": "fill-rule",
26993             "values": [
26994                 {
26995                     "name": "evenodd",
26996                     "description": "Determines the ‘insideness’ of a point on the canvas by drawing a ray from that point to infinity in any direction and counting the number of path segments from the given shape that the ray crosses."
26997                 },
26998                 {
26999                     "name": "nonzero",
27000                     "description": "Determines the ‘insideness’ of a point on the canvas by drawing a ray from that point to infinity in any direction and then examining the places where a segment of the shape crosses the ray."
27001                 }
27002             ],
27003             "relevance": 50,
27004             "description": "Indicates the algorithm (or winding rule) which is to be used to determine what parts of the canvas are included inside the shape.",
27005             "restrictions": [
27006                 "enum"
27007             ]
27008         },
27009         {
27010             "name": "filter",
27011             "browsers": [
27012                 "E12",
27013                 "FF35",
27014                 "S9.1",
27015                 "C53",
27016                 "O40"
27017             ],
27018             "values": [
27019                 {
27020                     "name": "none",
27021                     "description": "No filter effects are applied."
27022                 },
27023                 {
27024                     "name": "blur()",
27025                     "description": "Applies a Gaussian blur to the input image."
27026                 },
27027                 {
27028                     "name": "brightness()",
27029                     "description": "Applies a linear multiplier to input image, making it appear more or less bright."
27030                 },
27031                 {
27032                     "name": "contrast()",
27033                     "description": "Adjusts the contrast of the input."
27034                 },
27035                 {
27036                     "name": "drop-shadow()",
27037                     "description": "Applies a drop shadow effect to the input image."
27038                 },
27039                 {
27040                     "name": "grayscale()",
27041                     "description": "Converts the input image to grayscale."
27042                 },
27043                 {
27044                     "name": "hue-rotate()",
27045                     "description": "Applies a hue rotation on the input image. "
27046                 },
27047                 {
27048                     "name": "invert()",
27049                     "description": "Inverts the samples in the input image."
27050                 },
27051                 {
27052                     "name": "opacity()",
27053                     "description": "Applies transparency to the samples in the input image."
27054                 },
27055                 {
27056                     "name": "saturate()",
27057                     "description": "Saturates the input image."
27058                 },
27059                 {
27060                     "name": "sepia()",
27061                     "description": "Converts the input image to sepia."
27062                 },
27063                 {
27064                     "name": "url()",
27065                     "browsers": [
27066                         "E12",
27067                         "FF35",
27068                         "S9.1",
27069                         "C53",
27070                         "O40"
27071                     ],
27072                     "description": "A filter reference to a <filter> element."
27073                 }
27074             ],
27075             "syntax": "none | <filter-function-list>",
27076             "relevance": 64,
27077             "references": [
27078                 {
27079                     "name": "MDN Reference",
27080                     "url": "https://developer.mozilla.org/docs/Web/CSS/filter"
27081                 }
27082             ],
27083             "description": "Processes an element’s rendering before it is displayed in the document, by applying one or more filter effects.",
27084             "restrictions": [
27085                 "enum",
27086                 "url"
27087             ]
27088         },
27089         {
27090             "name": "flex",
27091             "values": [
27092                 {
27093                     "name": "auto",
27094                     "description": "Retrieves the value of the main size property as the used 'flex-basis'."
27095                 },
27096                 {
27097                     "name": "content",
27098                     "description": "Indicates automatic sizing, based on the flex item’s content."
27099                 },
27100                 {
27101                     "name": "none",
27102                     "description": "Expands to '0 0 auto'."
27103                 }
27104             ],
27105             "syntax": "none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]",
27106             "relevance": 77,
27107             "references": [
27108                 {
27109                     "name": "MDN Reference",
27110                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex"
27111                 }
27112             ],
27113             "description": "Specifies the components of a flexible length: the flex grow factor and flex shrink factor, and the flex basis.",
27114             "restrictions": [
27115                 "length",
27116                 "number",
27117                 "percentage"
27118             ]
27119         },
27120         {
27121             "name": "flex-basis",
27122             "values": [
27123                 {
27124                     "name": "auto",
27125                     "description": "Retrieves the value of the main size property as the used 'flex-basis'."
27126                 },
27127                 {
27128                     "name": "content",
27129                     "description": "Indicates automatic sizing, based on the flex item’s content."
27130                 }
27131             ],
27132             "syntax": "content | <'width'>",
27133             "relevance": 62,
27134             "references": [
27135                 {
27136                     "name": "MDN Reference",
27137                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-basis"
27138                 }
27139             ],
27140             "description": "Sets the flex basis.",
27141             "restrictions": [
27142                 "length",
27143                 "number",
27144                 "percentage"
27145             ]
27146         },
27147         {
27148             "name": "flex-direction",
27149             "values": [
27150                 {
27151                     "name": "column",
27152                     "description": "The flex container’s main axis has the same orientation as the block axis of the current writing mode."
27153                 },
27154                 {
27155                     "name": "column-reverse",
27156                     "description": "Same as 'column', except the main-start and main-end directions are swapped."
27157                 },
27158                 {
27159                     "name": "row",
27160                     "description": "The flex container’s main axis has the same orientation as the inline axis of the current writing mode."
27161                 },
27162                 {
27163                     "name": "row-reverse",
27164                     "description": "Same as 'row', except the main-start and main-end directions are swapped."
27165                 }
27166             ],
27167             "syntax": "row | row-reverse | column | column-reverse",
27168             "relevance": 78,
27169             "references": [
27170                 {
27171                     "name": "MDN Reference",
27172                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-direction"
27173                 }
27174             ],
27175             "description": "Specifies how flex items are placed in the flex container, by setting the direction of the flex container’s main axis.",
27176             "restrictions": [
27177                 "enum"
27178             ]
27179         },
27180         {
27181             "name": "flex-flow",
27182             "values": [
27183                 {
27184                     "name": "column",
27185                     "description": "The flex container’s main axis has the same orientation as the block axis of the current writing mode."
27186                 },
27187                 {
27188                     "name": "column-reverse",
27189                     "description": "Same as 'column', except the main-start and main-end directions are swapped."
27190                 },
27191                 {
27192                     "name": "nowrap",
27193                     "description": "The flex container is single-line."
27194                 },
27195                 {
27196                     "name": "row",
27197                     "description": "The flex container’s main axis has the same orientation as the inline axis of the current writing mode."
27198                 },
27199                 {
27200                     "name": "row-reverse",
27201                     "description": "Same as 'row', except the main-start and main-end directions are swapped."
27202                 },
27203                 {
27204                     "name": "wrap",
27205                     "description": "The flexbox is multi-line."
27206                 },
27207                 {
27208                     "name": "wrap-reverse",
27209                     "description": "Same as 'wrap', except the cross-start and cross-end directions are swapped."
27210                 }
27211             ],
27212             "syntax": "<'flex-direction'> || <'flex-wrap'>",
27213             "relevance": 58,
27214             "references": [
27215                 {
27216                     "name": "MDN Reference",
27217                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-flow"
27218                 }
27219             ],
27220             "description": "Specifies how flexbox items are placed in the flexbox.",
27221             "restrictions": [
27222                 "enum"
27223             ]
27224         },
27225         {
27226             "name": "flex-grow",
27227             "syntax": "<number>",
27228             "relevance": 71,
27229             "references": [
27230                 {
27231                     "name": "MDN Reference",
27232                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-grow"
27233                 }
27234             ],
27235             "description": "Sets the flex grow factor. Negative numbers are invalid.",
27236             "restrictions": [
27237                 "number"
27238             ]
27239         },
27240         {
27241             "name": "flex-shrink",
27242             "syntax": "<number>",
27243             "relevance": 69,
27244             "references": [
27245                 {
27246                     "name": "MDN Reference",
27247                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-shrink"
27248                 }
27249             ],
27250             "description": "Sets the flex shrink factor. Negative numbers are invalid.",
27251             "restrictions": [
27252                 "number"
27253             ]
27254         },
27255         {
27256             "name": "flex-wrap",
27257             "values": [
27258                 {
27259                     "name": "nowrap",
27260                     "description": "The flex container is single-line."
27261                 },
27262                 {
27263                     "name": "wrap",
27264                     "description": "The flexbox is multi-line."
27265                 },
27266                 {
27267                     "name": "wrap-reverse",
27268                     "description": "Same as 'wrap', except the cross-start and cross-end directions are swapped."
27269                 }
27270             ],
27271             "syntax": "nowrap | wrap | wrap-reverse",
27272             "relevance": 74,
27273             "references": [
27274                 {
27275                     "name": "MDN Reference",
27276                     "url": "https://developer.mozilla.org/docs/Web/CSS/flex-wrap"
27277                 }
27278             ],
27279             "description": "Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.",
27280             "restrictions": [
27281                 "enum"
27282             ]
27283         },
27284         {
27285             "name": "float",
27286             "values": [
27287                 {
27288                     "name": "inline-end",
27289                     "description": "A keyword indicating that the element must float on the end side of its containing block. That is the right side with ltr scripts, and the left side with rtl scripts."
27290                 },
27291                 {
27292                     "name": "inline-start",
27293                     "description": "A keyword indicating that the element must float on the start side of its containing block. That is the left side with ltr scripts, and the right side with rtl scripts."
27294                 },
27295                 {
27296                     "name": "left",
27297                     "description": "The element generates a block box that is floated to the left. Content flows on the right side of the box, starting at the top (subject to the 'clear' property)."
27298                 },
27299                 {
27300                     "name": "none",
27301                     "description": "The box is not floated."
27302                 },
27303                 {
27304                     "name": "right",
27305                     "description": "Similar to 'left', except the box is floated to the right, and content flows on the left side of the box, starting at the top."
27306                 }
27307             ],
27308             "syntax": "left | right | none | inline-start | inline-end",
27309             "relevance": 92,
27310             "references": [
27311                 {
27312                     "name": "MDN Reference",
27313                     "url": "https://developer.mozilla.org/docs/Web/CSS/float"
27314                 }
27315             ],
27316             "description": "Specifies how a box should be floated. It may be set for any element, but only applies to elements that generate boxes that are not absolutely positioned.",
27317             "restrictions": [
27318                 "enum"
27319             ]
27320         },
27321         {
27322             "name": "flood-color",
27323             "browsers": [
27324                 "E",
27325                 "C5",
27326                 "FF3",
27327                 "IE10",
27328                 "O9",
27329                 "S6"
27330             ],
27331             "relevance": 50,
27332             "description": "Indicates what color to use to flood the current filter primitive subregion.",
27333             "restrictions": [
27334                 "color"
27335             ]
27336         },
27337         {
27338             "name": "flood-opacity",
27339             "browsers": [
27340                 "E",
27341                 "C5",
27342                 "FF3",
27343                 "IE10",
27344                 "O9",
27345                 "S6"
27346             ],
27347             "relevance": 50,
27348             "description": "Indicates what opacity to use to flood the current filter primitive subregion.",
27349             "restrictions": [
27350                 "number(0-1)",
27351                 "percentage"
27352             ]
27353         },
27354         {
27355             "name": "font",
27356             "values": [
27357                 {
27358                     "name": "100",
27359                     "description": "Thin"
27360                 },
27361                 {
27362                     "name": "200",
27363                     "description": "Extra Light (Ultra Light)"
27364                 },
27365                 {
27366                     "name": "300",
27367                     "description": "Light"
27368                 },
27369                 {
27370                     "name": "400",
27371                     "description": "Normal"
27372                 },
27373                 {
27374                     "name": "500",
27375                     "description": "Medium"
27376                 },
27377                 {
27378                     "name": "600",
27379                     "description": "Semi Bold (Demi Bold)"
27380                 },
27381                 {
27382                     "name": "700",
27383                     "description": "Bold"
27384                 },
27385                 {
27386                     "name": "800",
27387                     "description": "Extra Bold (Ultra Bold)"
27388                 },
27389                 {
27390                     "name": "900",
27391                     "description": "Black (Heavy)"
27392                 },
27393                 {
27394                     "name": "bold",
27395                     "description": "Same as 700"
27396                 },
27397                 {
27398                     "name": "bolder",
27399                     "description": "Specifies the weight of the face bolder than the inherited value."
27400                 },
27401                 {
27402                     "name": "caption",
27403                     "description": "The font used for captioned controls (e.g., buttons, drop-downs, etc.)."
27404                 },
27405                 {
27406                     "name": "icon",
27407                     "description": "The font used to label icons."
27408                 },
27409                 {
27410                     "name": "italic",
27411                     "description": "Selects a font that is labeled 'italic', or, if that is not available, one labeled 'oblique'."
27412                 },
27413                 {
27414                     "name": "large"
27415                 },
27416                 {
27417                     "name": "larger"
27418                 },
27419                 {
27420                     "name": "lighter",
27421                     "description": "Specifies the weight of the face lighter than the inherited value."
27422                 },
27423                 {
27424                     "name": "medium"
27425                 },
27426                 {
27427                     "name": "menu",
27428                     "description": "The font used in menus (e.g., dropdown menus and menu lists)."
27429                 },
27430                 {
27431                     "name": "message-box",
27432                     "description": "The font used in dialog boxes."
27433                 },
27434                 {
27435                     "name": "normal",
27436                     "description": "Specifies a face that is not labeled as a small-caps font."
27437                 },
27438                 {
27439                     "name": "oblique",
27440                     "description": "Selects a font that is labeled 'oblique'."
27441                 },
27442                 {
27443                     "name": "small"
27444                 },
27445                 {
27446                     "name": "small-caps",
27447                     "description": "Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font."
27448                 },
27449                 {
27450                     "name": "small-caption",
27451                     "description": "The font used for labeling small controls."
27452                 },
27453                 {
27454                     "name": "smaller"
27455                 },
27456                 {
27457                     "name": "status-bar",
27458                     "description": "The font used in window status bars."
27459                 },
27460                 {
27461                     "name": "x-large"
27462                 },
27463                 {
27464                     "name": "x-small"
27465                 },
27466                 {
27467                     "name": "xx-large"
27468                 },
27469                 {
27470                     "name": "xx-small"
27471                 }
27472             ],
27473             "syntax": "[ [ <'font-style'> || <font-variant-css21> || <'font-weight'> || <'font-stretch'> ]? <'font-size'> [ / <'line-height'> ]? <'font-family'> ] | caption | icon | menu | message-box | small-caption | status-bar",
27474             "relevance": 82,
27475             "references": [
27476                 {
27477                     "name": "MDN Reference",
27478                     "url": "https://developer.mozilla.org/docs/Web/CSS/font"
27479                 }
27480             ],
27481             "description": "Shorthand property for setting 'font-style', 'font-variant', 'font-weight', 'font-size', 'line-height', and 'font-family', at the same place in the style sheet. The syntax of this property is based on a traditional typographical shorthand notation to set multiple properties related to fonts.",
27482             "restrictions": [
27483                 "font"
27484             ]
27485         },
27486         {
27487             "name": "font-family",
27488             "values": [
27489                 {
27490                     "name": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif"
27491                 },
27492                 {
27493                     "name": "Arial, Helvetica, sans-serif"
27494                 },
27495                 {
27496                     "name": "Cambria, Cochin, Georgia, Times, 'Times New Roman', serif"
27497                 },
27498                 {
27499                     "name": "'Courier New', Courier, monospace"
27500                 },
27501                 {
27502                     "name": "cursive"
27503                 },
27504                 {
27505                     "name": "fantasy"
27506                 },
27507                 {
27508                     "name": "'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif"
27509                 },
27510                 {
27511                     "name": "Georgia, 'Times New Roman', Times, serif"
27512                 },
27513                 {
27514                     "name": "'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif"
27515                 },
27516                 {
27517                     "name": "Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif"
27518                 },
27519                 {
27520                     "name": "'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif"
27521                 },
27522                 {
27523                     "name": "monospace"
27524                 },
27525                 {
27526                     "name": "sans-serif"
27527                 },
27528                 {
27529                     "name": "'Segoe UI', Tahoma, Geneva, Verdana, sans-serif"
27530                 },
27531                 {
27532                     "name": "serif"
27533                 },
27534                 {
27535                     "name": "'Times New Roman', Times, serif"
27536                 },
27537                 {
27538                     "name": "'Trebuchet MS', 'Lucida Sans Unicode', 'Lucida Grande', 'Lucida Sans', Arial, sans-serif"
27539                 },
27540                 {
27541                     "name": "Verdana, Geneva, Tahoma, sans-serif"
27542                 }
27543             ],
27544             "syntax": "<family-name>",
27545             "relevance": 92,
27546             "references": [
27547                 {
27548                     "name": "MDN Reference",
27549                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-family"
27550                 }
27551             ],
27552             "description": "Specifies a prioritized list of font family names or generic family names. A user agent iterates through the list of family names until it matches an available font that contains a glyph for the character to be rendered.",
27553             "restrictions": [
27554                 "font"
27555             ]
27556         },
27557         {
27558             "name": "font-feature-settings",
27559             "values": [
27560                 {
27561                     "name": "\"aalt\"",
27562                     "description": "Access All Alternates."
27563                 },
27564                 {
27565                     "name": "\"abvf\"",
27566                     "description": "Above-base Forms. Required in Khmer script."
27567                 },
27568                 {
27569                     "name": "\"abvm\"",
27570                     "description": "Above-base Mark Positioning. Required in Indic scripts."
27571                 },
27572                 {
27573                     "name": "\"abvs\"",
27574                     "description": "Above-base Substitutions. Required in Indic scripts."
27575                 },
27576                 {
27577                     "name": "\"afrc\"",
27578                     "description": "Alternative Fractions."
27579                 },
27580                 {
27581                     "name": "\"akhn\"",
27582                     "description": "Akhand. Required in most Indic scripts."
27583                 },
27584                 {
27585                     "name": "\"blwf\"",
27586                     "description": "Below-base Form. Required in a number of Indic scripts."
27587                 },
27588                 {
27589                     "name": "\"blwm\"",
27590                     "description": "Below-base Mark Positioning. Required in Indic scripts."
27591                 },
27592                 {
27593                     "name": "\"blws\"",
27594                     "description": "Below-base Substitutions. Required in Indic scripts."
27595                 },
27596                 {
27597                     "name": "\"calt\"",
27598                     "description": "Contextual Alternates."
27599                 },
27600                 {
27601                     "name": "\"case\"",
27602                     "description": "Case-Sensitive Forms. Applies only to European scripts; particularly prominent in Spanish-language setting."
27603                 },
27604                 {
27605                     "name": "\"ccmp\"",
27606                     "description": "Glyph Composition/Decomposition."
27607                 },
27608                 {
27609                     "name": "\"cfar\"",
27610                     "description": "Conjunct Form After Ro. Required in Khmer scripts."
27611                 },
27612                 {
27613                     "name": "\"cjct\"",
27614                     "description": "Conjunct Forms. Required in Indic scripts that show similarity to Devanagari."
27615                 },
27616                 {
27617                     "name": "\"clig\"",
27618                     "description": "Contextual Ligatures."
27619                 },
27620                 {
27621                     "name": "\"cpct\"",
27622                     "description": "Centered CJK Punctuation. Used primarily in Chinese fonts."
27623                 },
27624                 {
27625                     "name": "\"cpsp\"",
27626                     "description": "Capital Spacing. Should not be used in connecting scripts (e.g. most Arabic)."
27627                 },
27628                 {
27629                     "name": "\"cswh\"",
27630                     "description": "Contextual Swash."
27631                 },
27632                 {
27633                     "name": "\"curs\"",
27634                     "description": "Cursive Positioning. Can be used in any cursive script."
27635                 },
27636                 {
27637                     "name": "\"c2pc\"",
27638                     "description": "Petite Capitals From Capitals. Applies only to bicameral scripts."
27639                 },
27640                 {
27641                     "name": "\"c2sc\"",
27642                     "description": "Small Capitals From Capitals. Applies only to bicameral scripts."
27643                 },
27644                 {
27645                     "name": "\"dist\"",
27646                     "description": "Distances. Required in Indic scripts."
27647                 },
27648                 {
27649                     "name": "\"dlig\"",
27650                     "description": "Discretionary ligatures."
27651                 },
27652                 {
27653                     "name": "\"dnom\"",
27654                     "description": "Denominators."
27655                 },
27656                 {
27657                     "name": "\"dtls\"",
27658                     "description": "Dotless Forms. Applied to math formula layout."
27659                 },
27660                 {
27661                     "name": "\"expt\"",
27662                     "description": "Expert Forms. Applies only to Japanese."
27663                 },
27664                 {
27665                     "name": "\"falt\"",
27666                     "description": "Final Glyph on Line Alternates. Can be used in any cursive script."
27667                 },
27668                 {
27669                     "name": "\"fin2\"",
27670                     "description": "Terminal Form #2. Used only with the Syriac script."
27671                 },
27672                 {
27673                     "name": "\"fin3\"",
27674                     "description": "Terminal Form #3. Used only with the Syriac script."
27675                 },
27676                 {
27677                     "name": "\"fina\"",
27678                     "description": "Terminal Forms. Can be used in any alphabetic script."
27679                 },
27680                 {
27681                     "name": "\"flac\"",
27682                     "description": "Flattened ascent forms. Applied to math formula layout."
27683                 },
27684                 {
27685                     "name": "\"frac\"",
27686                     "description": "Fractions."
27687                 },
27688                 {
27689                     "name": "\"fwid\"",
27690                     "description": "Full Widths. Applies to any script which can use monospaced forms."
27691                 },
27692                 {
27693                     "name": "\"half\"",
27694                     "description": "Half Forms. Required in Indic scripts that show similarity to Devanagari."
27695                 },
27696                 {
27697                     "name": "\"haln\"",
27698                     "description": "Halant Forms. Required in Indic scripts."
27699                 },
27700                 {
27701                     "name": "\"halt\"",
27702                     "description": "Alternate Half Widths. Used only in CJKV fonts."
27703                 },
27704                 {
27705                     "name": "\"hist\"",
27706                     "description": "Historical Forms."
27707                 },
27708                 {
27709                     "name": "\"hkna\"",
27710                     "description": "Horizontal Kana Alternates. Applies only to fonts that support kana (hiragana and katakana)."
27711                 },
27712                 {
27713                     "name": "\"hlig\"",
27714                     "description": "Historical Ligatures."
27715                 },
27716                 {
27717                     "name": "\"hngl\"",
27718                     "description": "Hangul. Korean only."
27719                 },
27720                 {
27721                     "name": "\"hojo\"",
27722                     "description": "Hojo Kanji Forms (JIS X 0212-1990 Kanji Forms). Used only with Kanji script."
27723                 },
27724                 {
27725                     "name": "\"hwid\"",
27726                     "description": "Half Widths. Generally used only in CJKV fonts."
27727                 },
27728                 {
27729                     "name": "\"init\"",
27730                     "description": "Initial Forms. Can be used in any alphabetic script."
27731                 },
27732                 {
27733                     "name": "\"isol\"",
27734                     "description": "Isolated Forms. Can be used in any cursive script."
27735                 },
27736                 {
27737                     "name": "\"ital\"",
27738                     "description": "Italics. Applies mostly to Latin; note that many non-Latin fonts contain Latin as well."
27739                 },
27740                 {
27741                     "name": "\"jalt\"",
27742                     "description": "Justification Alternates. Can be used in any cursive script."
27743                 },
27744                 {
27745                     "name": "\"jp78\"",
27746                     "description": "JIS78 Forms. Applies only to Japanese."
27747                 },
27748                 {
27749                     "name": "\"jp83\"",
27750                     "description": "JIS83 Forms. Applies only to Japanese."
27751                 },
27752                 {
27753                     "name": "\"jp90\"",
27754                     "description": "JIS90 Forms. Applies only to Japanese."
27755                 },
27756                 {
27757                     "name": "\"jp04\"",
27758                     "description": "JIS2004 Forms. Applies only to Japanese."
27759                 },
27760                 {
27761                     "name": "\"kern\"",
27762                     "description": "Kerning."
27763                 },
27764                 {
27765                     "name": "\"lfbd\"",
27766                     "description": "Left Bounds."
27767                 },
27768                 {
27769                     "name": "\"liga\"",
27770                     "description": "Standard Ligatures."
27771                 },
27772                 {
27773                     "name": "\"ljmo\"",
27774                     "description": "Leading Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."
27775                 },
27776                 {
27777                     "name": "\"lnum\"",
27778                     "description": "Lining Figures."
27779                 },
27780                 {
27781                     "name": "\"locl\"",
27782                     "description": "Localized Forms."
27783                 },
27784                 {
27785                     "name": "\"ltra\"",
27786                     "description": "Left-to-right glyph alternates."
27787                 },
27788                 {
27789                     "name": "\"ltrm\"",
27790                     "description": "Left-to-right mirrored forms."
27791                 },
27792                 {
27793                     "name": "\"mark\"",
27794                     "description": "Mark Positioning."
27795                 },
27796                 {
27797                     "name": "\"med2\"",
27798                     "description": "Medial Form #2. Used only with the Syriac script."
27799                 },
27800                 {
27801                     "name": "\"medi\"",
27802                     "description": "Medial Forms."
27803                 },
27804                 {
27805                     "name": "\"mgrk\"",
27806                     "description": "Mathematical Greek."
27807                 },
27808                 {
27809                     "name": "\"mkmk\"",
27810                     "description": "Mark to Mark Positioning."
27811                 },
27812                 {
27813                     "name": "\"nalt\"",
27814                     "description": "Alternate Annotation Forms."
27815                 },
27816                 {
27817                     "name": "\"nlck\"",
27818                     "description": "NLC Kanji Forms. Used only with Kanji script."
27819                 },
27820                 {
27821                     "name": "\"nukt\"",
27822                     "description": "Nukta Forms. Required in Indic scripts.."
27823                 },
27824                 {
27825                     "name": "\"numr\"",
27826                     "description": "Numerators."
27827                 },
27828                 {
27829                     "name": "\"onum\"",
27830                     "description": "Oldstyle Figures."
27831                 },
27832                 {
27833                     "name": "\"opbd\"",
27834                     "description": "Optical Bounds."
27835                 },
27836                 {
27837                     "name": "\"ordn\"",
27838                     "description": "Ordinals. Applies mostly to Latin script."
27839                 },
27840                 {
27841                     "name": "\"ornm\"",
27842                     "description": "Ornaments."
27843                 },
27844                 {
27845                     "name": "\"palt\"",
27846                     "description": "Proportional Alternate Widths. Used mostly in CJKV fonts."
27847                 },
27848                 {
27849                     "name": "\"pcap\"",
27850                     "description": "Petite Capitals."
27851                 },
27852                 {
27853                     "name": "\"pkna\"",
27854                     "description": "Proportional Kana. Generally used only in Japanese fonts."
27855                 },
27856                 {
27857                     "name": "\"pnum\"",
27858                     "description": "Proportional Figures."
27859                 },
27860                 {
27861                     "name": "\"pref\"",
27862                     "description": "Pre-base Forms. Required in Khmer and Myanmar (Burmese) scripts and southern Indic scripts that may display a pre-base form of Ra."
27863                 },
27864                 {
27865                     "name": "\"pres\"",
27866                     "description": "Pre-base Substitutions. Required in Indic scripts."
27867                 },
27868                 {
27869                     "name": "\"pstf\"",
27870                     "description": "Post-base Forms. Required in scripts of south and southeast Asia that have post-base forms for consonants eg: Gurmukhi, Malayalam, Khmer."
27871                 },
27872                 {
27873                     "name": "\"psts\"",
27874                     "description": "Post-base Substitutions."
27875                 },
27876                 {
27877                     "name": "\"pwid\"",
27878                     "description": "Proportional Widths."
27879                 },
27880                 {
27881                     "name": "\"qwid\"",
27882                     "description": "Quarter Widths. Generally used only in CJKV fonts."
27883                 },
27884                 {
27885                     "name": "\"rand\"",
27886                     "description": "Randomize."
27887                 },
27888                 {
27889                     "name": "\"rclt\"",
27890                     "description": "Required Contextual Alternates. May apply to any script, but is especially important for many styles of Arabic."
27891                 },
27892                 {
27893                     "name": "\"rlig\"",
27894                     "description": "Required Ligatures. Applies to Arabic and Syriac. May apply to some other scripts."
27895                 },
27896                 {
27897                     "name": "\"rkrf\"",
27898                     "description": "Rakar Forms. Required in Devanagari and Gujarati scripts."
27899                 },
27900                 {
27901                     "name": "\"rphf\"",
27902                     "description": "Reph Form. Required in Indic scripts. E.g. Devanagari, Kannada."
27903                 },
27904                 {
27905                     "name": "\"rtbd\"",
27906                     "description": "Right Bounds."
27907                 },
27908                 {
27909                     "name": "\"rtla\"",
27910                     "description": "Right-to-left alternates."
27911                 },
27912                 {
27913                     "name": "\"rtlm\"",
27914                     "description": "Right-to-left mirrored forms."
27915                 },
27916                 {
27917                     "name": "\"ruby\"",
27918                     "description": "Ruby Notation Forms. Applies only to Japanese."
27919                 },
27920                 {
27921                     "name": "\"salt\"",
27922                     "description": "Stylistic Alternates."
27923                 },
27924                 {
27925                     "name": "\"sinf\"",
27926                     "description": "Scientific Inferiors."
27927                 },
27928                 {
27929                     "name": "\"size\"",
27930                     "description": "Optical size."
27931                 },
27932                 {
27933                     "name": "\"smcp\"",
27934                     "description": "Small Capitals. Applies only to bicameral scripts."
27935                 },
27936                 {
27937                     "name": "\"smpl\"",
27938                     "description": "Simplified Forms. Applies only to Chinese and Japanese."
27939                 },
27940                 {
27941                     "name": "\"ssty\"",
27942                     "description": "Math script style alternates."
27943                 },
27944                 {
27945                     "name": "\"stch\"",
27946                     "description": "Stretching Glyph Decomposition."
27947                 },
27948                 {
27949                     "name": "\"subs\"",
27950                     "description": "Subscript."
27951                 },
27952                 {
27953                     "name": "\"sups\"",
27954                     "description": "Superscript."
27955                 },
27956                 {
27957                     "name": "\"swsh\"",
27958                     "description": "Swash. Does not apply to ideographic scripts."
27959                 },
27960                 {
27961                     "name": "\"titl\"",
27962                     "description": "Titling."
27963                 },
27964                 {
27965                     "name": "\"tjmo\"",
27966                     "description": "Trailing Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."
27967                 },
27968                 {
27969                     "name": "\"tnam\"",
27970                     "description": "Traditional Name Forms. Applies only to Japanese."
27971                 },
27972                 {
27973                     "name": "\"tnum\"",
27974                     "description": "Tabular Figures."
27975                 },
27976                 {
27977                     "name": "\"trad\"",
27978                     "description": "Traditional Forms. Applies only to Chinese and Japanese."
27979                 },
27980                 {
27981                     "name": "\"twid\"",
27982                     "description": "Third Widths. Generally used only in CJKV fonts."
27983                 },
27984                 {
27985                     "name": "\"unic\"",
27986                     "description": "Unicase."
27987                 },
27988                 {
27989                     "name": "\"valt\"",
27990                     "description": "Alternate Vertical Metrics. Applies only to scripts with vertical writing modes."
27991                 },
27992                 {
27993                     "name": "\"vatu\"",
27994                     "description": "Vattu Variants. Used for Indic scripts. E.g. Devanagari."
27995                 },
27996                 {
27997                     "name": "\"vert\"",
27998                     "description": "Vertical Alternates. Applies only to scripts with vertical writing modes."
27999                 },
28000                 {
28001                     "name": "\"vhal\"",
28002                     "description": "Alternate Vertical Half Metrics. Used only in CJKV fonts."
28003                 },
28004                 {
28005                     "name": "\"vjmo\"",
28006                     "description": "Vowel Jamo Forms. Required for Hangul script when Ancient Hangul writing system is supported."
28007                 },
28008                 {
28009                     "name": "\"vkna\"",
28010                     "description": "Vertical Kana Alternates. Applies only to fonts that support kana (hiragana and katakana)."
28011                 },
28012                 {
28013                     "name": "\"vkrn\"",
28014                     "description": "Vertical Kerning."
28015                 },
28016                 {
28017                     "name": "\"vpal\"",
28018                     "description": "Proportional Alternate Vertical Metrics. Used mostly in CJKV fonts."
28019                 },
28020                 {
28021                     "name": "\"vrt2\"",
28022                     "description": "Vertical Alternates and Rotation. Applies only to scripts with vertical writing modes."
28023                 },
28024                 {
28025                     "name": "\"zero\"",
28026                     "description": "Slashed Zero."
28027                 },
28028                 {
28029                     "name": "normal",
28030                     "description": "No change in glyph substitution or positioning occurs."
28031                 },
28032                 {
28033                     "name": "off",
28034                     "description": "Disable feature."
28035                 },
28036                 {
28037                     "name": "on",
28038                     "description": "Enable feature."
28039                 }
28040             ],
28041             "syntax": "normal | <feature-tag-value>#",
28042             "relevance": 55,
28043             "references": [
28044                 {
28045                     "name": "MDN Reference",
28046                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-feature-settings"
28047                 }
28048             ],
28049             "description": "Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",
28050             "restrictions": [
28051                 "string",
28052                 "integer"
28053             ]
28054         },
28055         {
28056             "name": "font-kerning",
28057             "browsers": [
28058                 "E79",
28059                 "FF32",
28060                 "S9",
28061                 "C33",
28062                 "O20"
28063             ],
28064             "values": [
28065                 {
28066                     "name": "auto",
28067                     "description": "Specifies that kerning is applied at the discretion of the user agent."
28068                 },
28069                 {
28070                     "name": "none",
28071                     "description": "Specifies that kerning is not applied."
28072                 },
28073                 {
28074                     "name": "normal",
28075                     "description": "Specifies that kerning is applied."
28076                 }
28077             ],
28078             "syntax": "auto | normal | none",
28079             "relevance": 51,
28080             "references": [
28081                 {
28082                     "name": "MDN Reference",
28083                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-kerning"
28084                 }
28085             ],
28086             "description": "Kerning is the contextual adjustment of inter-glyph spacing. This property controls metric kerning, kerning that utilizes adjustment data contained in the font.",
28087             "restrictions": [
28088                 "enum"
28089             ]
28090         },
28091         {
28092             "name": "font-language-override",
28093             "browsers": [
28094                 "FF34"
28095             ],
28096             "values": [
28097                 {
28098                     "name": "normal",
28099                     "description": "Implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering."
28100                 }
28101             ],
28102             "syntax": "normal | <string>",
28103             "relevance": 50,
28104             "references": [
28105                 {
28106                     "name": "MDN Reference",
28107                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-language-override"
28108                 }
28109             ],
28110             "description": "The value of 'normal' implies that when rendering with OpenType fonts the language of the document is used to infer the OpenType language system, used to select language specific features when rendering.",
28111             "restrictions": [
28112                 "string"
28113             ]
28114         },
28115         {
28116             "name": "font-size",
28117             "values": [
28118                 {
28119                     "name": "large"
28120                 },
28121                 {
28122                     "name": "larger"
28123                 },
28124                 {
28125                     "name": "medium"
28126                 },
28127                 {
28128                     "name": "small"
28129                 },
28130                 {
28131                     "name": "smaller"
28132                 },
28133                 {
28134                     "name": "x-large"
28135                 },
28136                 {
28137                     "name": "x-small"
28138                 },
28139                 {
28140                     "name": "xx-large"
28141                 },
28142                 {
28143                     "name": "xx-small"
28144                 }
28145             ],
28146             "syntax": "<absolute-size> | <relative-size> | <length-percentage>",
28147             "relevance": 94,
28148             "references": [
28149                 {
28150                     "name": "MDN Reference",
28151                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-size"
28152                 }
28153             ],
28154             "description": "Indicates the desired height of glyphs from the font. For scalable fonts, the font-size is a scale factor applied to the EM unit of the font. (Note that certain glyphs may bleed outside their EM box.) For non-scalable fonts, the font-size is converted into absolute units and matched against the declared font-size of the font, using the same absolute coordinate space for both of the matched values.",
28155             "restrictions": [
28156                 "length",
28157                 "percentage"
28158             ]
28159         },
28160         {
28161             "name": "font-size-adjust",
28162             "browsers": [
28163                 "E79",
28164                 "FF40",
28165                 "C43",
28166                 "O30"
28167             ],
28168             "values": [
28169                 {
28170                     "name": "none",
28171                     "description": "Do not preserve the font’s x-height."
28172                 }
28173             ],
28174             "syntax": "none | <number>",
28175             "relevance": 50,
28176             "references": [
28177                 {
28178                     "name": "MDN Reference",
28179                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-size-adjust"
28180                 }
28181             ],
28182             "description": "Preserves the readability of text when font fallback occurs by adjusting the font-size so that the x-height is the same regardless of the font used.",
28183             "restrictions": [
28184                 "number"
28185             ]
28186         },
28187         {
28188             "name": "font-stretch",
28189             "values": [
28190                 {
28191                     "name": "condensed"
28192                 },
28193                 {
28194                     "name": "expanded"
28195                 },
28196                 {
28197                     "name": "extra-condensed"
28198                 },
28199                 {
28200                     "name": "extra-expanded"
28201                 },
28202                 {
28203                     "name": "narrower",
28204                     "description": "Indicates a narrower value relative to the width of the parent element."
28205                 },
28206                 {
28207                     "name": "normal"
28208                 },
28209                 {
28210                     "name": "semi-condensed"
28211                 },
28212                 {
28213                     "name": "semi-expanded"
28214                 },
28215                 {
28216                     "name": "ultra-condensed"
28217                 },
28218                 {
28219                     "name": "ultra-expanded"
28220                 },
28221                 {
28222                     "name": "wider",
28223                     "description": "Indicates a wider value relative to the width of the parent element."
28224                 }
28225             ],
28226             "syntax": "<font-stretch-absolute>{1,2}",
28227             "relevance": 53,
28228             "references": [
28229                 {
28230                     "name": "MDN Reference",
28231                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-stretch"
28232                 }
28233             ],
28234             "description": "Selects a normal, condensed, or expanded face from a font family.",
28235             "restrictions": [
28236                 "enum"
28237             ]
28238         },
28239         {
28240             "name": "font-style",
28241             "values": [
28242                 {
28243                     "name": "italic",
28244                     "description": "Selects a font that is labeled as an 'italic' face, or an 'oblique' face if one is not"
28245                 },
28246                 {
28247                     "name": "normal",
28248                     "description": "Selects a face that is classified as 'normal'."
28249                 },
28250                 {
28251                     "name": "oblique",
28252                     "description": "Selects a font that is labeled as an 'oblique' face, or an 'italic' face if one is not."
28253                 }
28254             ],
28255             "syntax": "normal | italic | oblique <angle>{0,2}",
28256             "relevance": 83,
28257             "references": [
28258                 {
28259                     "name": "MDN Reference",
28260                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-style"
28261                 }
28262             ],
28263             "description": "Allows italic or oblique faces to be selected. Italic forms are generally cursive in nature while oblique faces are typically sloped versions of the regular face.",
28264             "restrictions": [
28265                 "enum"
28266             ]
28267         },
28268         {
28269             "name": "font-synthesis",
28270             "browsers": [
28271                 "FF34",
28272                 "S9"
28273             ],
28274             "values": [
28275                 {
28276                     "name": "none",
28277                     "description": "Disallow all synthetic faces."
28278                 },
28279                 {
28280                     "name": "style",
28281                     "description": "Allow synthetic italic faces."
28282                 },
28283                 {
28284                     "name": "weight",
28285                     "description": "Allow synthetic bold faces."
28286                 }
28287             ],
28288             "syntax": "none | [ weight || style ]",
28289             "relevance": 50,
28290             "references": [
28291                 {
28292                     "name": "MDN Reference",
28293                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-synthesis"
28294                 }
28295             ],
28296             "description": "Controls whether user agents are allowed to synthesize bold or oblique font faces when a font family lacks bold or italic faces.",
28297             "restrictions": [
28298                 "enum"
28299             ]
28300         },
28301         {
28302             "name": "font-variant",
28303             "values": [
28304                 {
28305                     "name": "normal",
28306                     "description": "Specifies a face that is not labeled as a small-caps font."
28307                 },
28308                 {
28309                     "name": "small-caps",
28310                     "description": "Specifies a font that is labeled as a small-caps font. If a genuine small-caps font is not available, user agents should simulate a small-caps font."
28311                 }
28312             ],
28313             "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> || stylistic(<feature-value-name>) || historical-forms || styleset(<feature-value-name>#) || character-variant(<feature-value-name>#) || swash(<feature-value-name>) || ornaments(<feature-value-name>) || annotation(<feature-value-name>) || [ small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps ] || <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero || <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
28314             "relevance": 63,
28315             "references": [
28316                 {
28317                     "name": "MDN Reference",
28318                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant"
28319                 }
28320             ],
28321             "description": "Specifies variant representations of the font",
28322             "restrictions": [
28323                 "enum"
28324             ]
28325         },
28326         {
28327             "name": "font-variant-alternates",
28328             "browsers": [
28329                 "FF34"
28330             ],
28331             "values": [
28332                 {
28333                     "name": "annotation()",
28334                     "description": "Enables display of alternate annotation forms."
28335                 },
28336                 {
28337                     "name": "character-variant()",
28338                     "description": "Enables display of specific character variants."
28339                 },
28340                 {
28341                     "name": "historical-forms",
28342                     "description": "Enables display of historical forms."
28343                 },
28344                 {
28345                     "name": "normal",
28346                     "description": "None of the features are enabled."
28347                 },
28348                 {
28349                     "name": "ornaments()",
28350                     "description": "Enables replacement of default glyphs with ornaments, if provided in the font."
28351                 },
28352                 {
28353                     "name": "styleset()",
28354                     "description": "Enables display with stylistic sets."
28355                 },
28356                 {
28357                     "name": "stylistic()",
28358                     "description": "Enables display of stylistic alternates."
28359                 },
28360                 {
28361                     "name": "swash()",
28362                     "description": "Enables display of swash glyphs."
28363                 }
28364             ],
28365             "syntax": "normal | [ stylistic( <feature-value-name> ) || historical-forms || styleset( <feature-value-name># ) || character-variant( <feature-value-name># ) || swash( <feature-value-name> ) || ornaments( <feature-value-name> ) || annotation( <feature-value-name> ) ]",
28366             "relevance": 50,
28367             "references": [
28368                 {
28369                     "name": "MDN Reference",
28370                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-alternates"
28371                 }
28372             ],
28373             "description": "For any given character, fonts can provide a variety of alternate glyphs in addition to the default glyph for that character. This property provides control over the selection of these alternate glyphs.",
28374             "restrictions": [
28375                 "enum"
28376             ]
28377         },
28378         {
28379             "name": "font-variant-caps",
28380             "browsers": [
28381                 "E79",
28382                 "FF34",
28383                 "C52",
28384                 "O39"
28385             ],
28386             "values": [
28387                 {
28388                     "name": "all-petite-caps",
28389                     "description": "Enables display of petite capitals for both upper and lowercase letters."
28390                 },
28391                 {
28392                     "name": "all-small-caps",
28393                     "description": "Enables display of small capitals for both upper and lowercase letters."
28394                 },
28395                 {
28396                     "name": "normal",
28397                     "description": "None of the features are enabled."
28398                 },
28399                 {
28400                     "name": "petite-caps",
28401                     "description": "Enables display of petite capitals."
28402                 },
28403                 {
28404                     "name": "small-caps",
28405                     "description": "Enables display of small capitals. Small-caps glyphs typically use the form of uppercase letters but are reduced to the size of lowercase letters."
28406                 },
28407                 {
28408                     "name": "titling-caps",
28409                     "description": "Enables display of titling capitals."
28410                 },
28411                 {
28412                     "name": "unicase",
28413                     "description": "Enables display of mixture of small capitals for uppercase letters with normal lowercase letters."
28414                 }
28415             ],
28416             "syntax": "normal | small-caps | all-small-caps | petite-caps | all-petite-caps | unicase | titling-caps",
28417             "relevance": 50,
28418             "references": [
28419                 {
28420                     "name": "MDN Reference",
28421                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-caps"
28422                 }
28423             ],
28424             "description": "Specifies control over capitalized forms.",
28425             "restrictions": [
28426                 "enum"
28427             ]
28428         },
28429         {
28430             "name": "font-variant-east-asian",
28431             "browsers": [
28432                 "E79",
28433                 "FF34",
28434                 "C63",
28435                 "O50"
28436             ],
28437             "values": [
28438                 {
28439                     "name": "full-width",
28440                     "description": "Enables rendering of full-width variants."
28441                 },
28442                 {
28443                     "name": "jis04",
28444                     "description": "Enables rendering of JIS04 forms."
28445                 },
28446                 {
28447                     "name": "jis78",
28448                     "description": "Enables rendering of JIS78 forms."
28449                 },
28450                 {
28451                     "name": "jis83",
28452                     "description": "Enables rendering of JIS83 forms."
28453                 },
28454                 {
28455                     "name": "jis90",
28456                     "description": "Enables rendering of JIS90 forms."
28457                 },
28458                 {
28459                     "name": "normal",
28460                     "description": "None of the features are enabled."
28461                 },
28462                 {
28463                     "name": "proportional-width",
28464                     "description": "Enables rendering of proportionally-spaced variants."
28465                 },
28466                 {
28467                     "name": "ruby",
28468                     "description": "Enables display of ruby variant glyphs."
28469                 },
28470                 {
28471                     "name": "simplified",
28472                     "description": "Enables rendering of simplified forms."
28473                 },
28474                 {
28475                     "name": "traditional",
28476                     "description": "Enables rendering of traditional forms."
28477                 }
28478             ],
28479             "syntax": "normal | [ <east-asian-variant-values> || <east-asian-width-values> || ruby ]",
28480             "relevance": 50,
28481             "references": [
28482                 {
28483                     "name": "MDN Reference",
28484                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-east-asian"
28485                 }
28486             ],
28487             "description": "Allows control of glyph substitute and positioning in East Asian text.",
28488             "restrictions": [
28489                 "enum"
28490             ]
28491         },
28492         {
28493             "name": "font-variant-ligatures",
28494             "browsers": [
28495                 "E79",
28496                 "FF34",
28497                 "S9.1",
28498                 "C34",
28499                 "O21"
28500             ],
28501             "values": [
28502                 {
28503                     "name": "additional-ligatures",
28504                     "description": "Enables display of additional ligatures."
28505                 },
28506                 {
28507                     "name": "common-ligatures",
28508                     "description": "Enables display of common ligatures."
28509                 },
28510                 {
28511                     "name": "contextual",
28512                     "browsers": [
28513                         "E79",
28514                         "FF34",
28515                         "S9.1",
28516                         "C34",
28517                         "O21"
28518                     ],
28519                     "description": "Enables display of contextual alternates."
28520                 },
28521                 {
28522                     "name": "discretionary-ligatures",
28523                     "description": "Enables display of discretionary ligatures."
28524                 },
28525                 {
28526                     "name": "historical-ligatures",
28527                     "description": "Enables display of historical ligatures."
28528                 },
28529                 {
28530                     "name": "no-additional-ligatures",
28531                     "description": "Disables display of additional ligatures."
28532                 },
28533                 {
28534                     "name": "no-common-ligatures",
28535                     "description": "Disables display of common ligatures."
28536                 },
28537                 {
28538                     "name": "no-contextual",
28539                     "browsers": [
28540                         "E79",
28541                         "FF34",
28542                         "S9.1",
28543                         "C34",
28544                         "O21"
28545                     ],
28546                     "description": "Disables display of contextual alternates."
28547                 },
28548                 {
28549                     "name": "no-discretionary-ligatures",
28550                     "description": "Disables display of discretionary ligatures."
28551                 },
28552                 {
28553                     "name": "no-historical-ligatures",
28554                     "description": "Disables display of historical ligatures."
28555                 },
28556                 {
28557                     "name": "none",
28558                     "browsers": [
28559                         "E79",
28560                         "FF34",
28561                         "S9.1",
28562                         "C34",
28563                         "O21"
28564                     ],
28565                     "description": "Disables all ligatures."
28566                 },
28567                 {
28568                     "name": "normal",
28569                     "description": "Implies that the defaults set by the font are used."
28570                 }
28571             ],
28572             "syntax": "normal | none | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> || <contextual-alt-values> ]",
28573             "relevance": 51,
28574             "references": [
28575                 {
28576                     "name": "MDN Reference",
28577                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-ligatures"
28578                 }
28579             ],
28580             "description": "Specifies control over which ligatures are enabled or disabled. A value of ‘normal’ implies that the defaults set by the font are used.",
28581             "restrictions": [
28582                 "enum"
28583             ]
28584         },
28585         {
28586             "name": "font-variant-numeric",
28587             "browsers": [
28588                 "E79",
28589                 "FF34",
28590                 "S9.1",
28591                 "C52",
28592                 "O39"
28593             ],
28594             "values": [
28595                 {
28596                     "name": "diagonal-fractions",
28597                     "description": "Enables display of lining diagonal fractions."
28598                 },
28599                 {
28600                     "name": "lining-nums",
28601                     "description": "Enables display of lining numerals."
28602                 },
28603                 {
28604                     "name": "normal",
28605                     "description": "None of the features are enabled."
28606                 },
28607                 {
28608                     "name": "oldstyle-nums",
28609                     "description": "Enables display of old-style numerals."
28610                 },
28611                 {
28612                     "name": "ordinal",
28613                     "description": "Enables display of letter forms used with ordinal numbers."
28614                 },
28615                 {
28616                     "name": "proportional-nums",
28617                     "description": "Enables display of proportional numerals."
28618                 },
28619                 {
28620                     "name": "slashed-zero",
28621                     "description": "Enables display of slashed zeros."
28622                 },
28623                 {
28624                     "name": "stacked-fractions",
28625                     "description": "Enables display of lining stacked fractions."
28626                 },
28627                 {
28628                     "name": "tabular-nums",
28629                     "description": "Enables display of tabular numerals."
28630                 }
28631             ],
28632             "syntax": "normal | [ <numeric-figure-values> || <numeric-spacing-values> || <numeric-fraction-values> || ordinal || slashed-zero ]",
28633             "relevance": 50,
28634             "references": [
28635                 {
28636                     "name": "MDN Reference",
28637                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-numeric"
28638                 }
28639             ],
28640             "description": "Specifies control over numerical forms.",
28641             "restrictions": [
28642                 "enum"
28643             ]
28644         },
28645         {
28646             "name": "font-variant-position",
28647             "browsers": [
28648                 "FF34"
28649             ],
28650             "values": [
28651                 {
28652                     "name": "normal",
28653                     "description": "None of the features are enabled."
28654                 },
28655                 {
28656                     "name": "sub",
28657                     "description": "Enables display of subscript variants (OpenType feature: subs)."
28658                 },
28659                 {
28660                     "name": "super",
28661                     "description": "Enables display of superscript variants (OpenType feature: sups)."
28662                 }
28663             ],
28664             "syntax": "normal | sub | super",
28665             "relevance": 50,
28666             "references": [
28667                 {
28668                     "name": "MDN Reference",
28669                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variant-position"
28670                 }
28671             ],
28672             "description": "Specifies the vertical position",
28673             "restrictions": [
28674                 "enum"
28675             ]
28676         },
28677         {
28678             "name": "font-weight",
28679             "values": [
28680                 {
28681                     "name": "100",
28682                     "description": "Thin"
28683                 },
28684                 {
28685                     "name": "200",
28686                     "description": "Extra Light (Ultra Light)"
28687                 },
28688                 {
28689                     "name": "300",
28690                     "description": "Light"
28691                 },
28692                 {
28693                     "name": "400",
28694                     "description": "Normal"
28695                 },
28696                 {
28697                     "name": "500",
28698                     "description": "Medium"
28699                 },
28700                 {
28701                     "name": "600",
28702                     "description": "Semi Bold (Demi Bold)"
28703                 },
28704                 {
28705                     "name": "700",
28706                     "description": "Bold"
28707                 },
28708                 {
28709                     "name": "800",
28710                     "description": "Extra Bold (Ultra Bold)"
28711                 },
28712                 {
28713                     "name": "900",
28714                     "description": "Black (Heavy)"
28715                 },
28716                 {
28717                     "name": "bold",
28718                     "description": "Same as 700"
28719                 },
28720                 {
28721                     "name": "bolder",
28722                     "description": "Specifies the weight of the face bolder than the inherited value."
28723                 },
28724                 {
28725                     "name": "lighter",
28726                     "description": "Specifies the weight of the face lighter than the inherited value."
28727                 },
28728                 {
28729                     "name": "normal",
28730                     "description": "Same as 400"
28731                 }
28732             ],
28733             "syntax": "<font-weight-absolute>{1,2}",
28734             "relevance": 93,
28735             "references": [
28736                 {
28737                     "name": "MDN Reference",
28738                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-weight"
28739                 }
28740             ],
28741             "description": "Specifies weight of glyphs in the font, their degree of blackness or stroke thickness.",
28742             "restrictions": [
28743                 "enum"
28744             ]
28745         },
28746         {
28747             "name": "glyph-orientation-horizontal",
28748             "relevance": 50,
28749             "description": "Controls glyph orientation when the inline-progression-direction is horizontal.",
28750             "restrictions": [
28751                 "angle",
28752                 "number"
28753             ]
28754         },
28755         {
28756             "name": "glyph-orientation-vertical",
28757             "values": [
28758                 {
28759                     "name": "auto",
28760                     "description": "Sets the orientation based on the fullwidth or non-fullwidth characters and the most common orientation."
28761                 }
28762             ],
28763             "relevance": 50,
28764             "description": "Controls glyph orientation when the inline-progression-direction is vertical.",
28765             "restrictions": [
28766                 "angle",
28767                 "number",
28768                 "enum"
28769             ]
28770         },
28771         {
28772             "name": "grid-area",
28773             "browsers": [
28774                 "E16",
28775                 "FF52",
28776                 "S10.1",
28777                 "C57",
28778                 "O44"
28779             ],
28780             "values": [
28781                 {
28782                     "name": "auto",
28783                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
28784                 },
28785                 {
28786                     "name": "span",
28787                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
28788                 }
28789             ],
28790             "syntax": "<grid-line> [ / <grid-line> ]{0,3}",
28791             "relevance": 51,
28792             "references": [
28793                 {
28794                     "name": "MDN Reference",
28795                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-area"
28796                 }
28797             ],
28798             "description": "Determine a grid item’s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement. Shorthand for 'grid-row-start', 'grid-column-start', 'grid-row-end', and 'grid-column-end'.",
28799             "restrictions": [
28800                 "identifier",
28801                 "integer"
28802             ]
28803         },
28804         {
28805             "name": "grid",
28806             "browsers": [
28807                 "E16",
28808                 "FF52",
28809                 "S10.1",
28810                 "C57",
28811                 "O44"
28812             ],
28813             "syntax": "<'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>",
28814             "relevance": 50,
28815             "references": [
28816                 {
28817                     "name": "MDN Reference",
28818                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid"
28819                 }
28820             ],
28821             "description": "The grid CSS property is a shorthand property that sets all of the explicit grid properties ('grid-template-rows', 'grid-template-columns', and 'grid-template-areas'), and all the implicit grid properties ('grid-auto-rows', 'grid-auto-columns', and 'grid-auto-flow'), in a single declaration.",
28822             "restrictions": [
28823                 "identifier",
28824                 "length",
28825                 "percentage",
28826                 "string",
28827                 "enum"
28828             ]
28829         },
28830         {
28831             "name": "grid-auto-columns",
28832             "values": [
28833                 {
28834                     "name": "min-content",
28835                     "description": "Represents the largest min-content contribution of the grid items occupying the grid track."
28836                 },
28837                 {
28838                     "name": "max-content",
28839                     "description": "Represents the largest max-content contribution of the grid items occupying the grid track."
28840                 },
28841                 {
28842                     "name": "auto",
28843                     "description": "As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."
28844                 },
28845                 {
28846                     "name": "minmax()",
28847                     "description": "Defines a size range greater than or equal to min and less than or equal to max."
28848                 }
28849             ],
28850             "syntax": "<track-size>+",
28851             "relevance": 50,
28852             "references": [
28853                 {
28854                     "name": "MDN Reference",
28855                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-columns"
28856                 }
28857             ],
28858             "description": "Specifies the size of implicitly created columns.",
28859             "restrictions": [
28860                 "length",
28861                 "percentage"
28862             ]
28863         },
28864         {
28865             "name": "grid-auto-flow",
28866             "browsers": [
28867                 "E16",
28868                 "FF52",
28869                 "S10.1",
28870                 "C57",
28871                 "O44"
28872             ],
28873             "values": [
28874                 {
28875                     "name": "row",
28876                     "description": "The auto-placement algorithm places items by filling each row in turn, adding new rows as necessary."
28877                 },
28878                 {
28879                     "name": "column",
28880                     "description": "The auto-placement algorithm places items by filling each column in turn, adding new columns as necessary."
28881                 },
28882                 {
28883                     "name": "dense",
28884                     "description": "If specified, the auto-placement algorithm uses a “dense” packing algorithm, which attempts to fill in holes earlier in the grid if smaller items come up later."
28885                 }
28886             ],
28887             "syntax": "[ row | column ] || dense",
28888             "relevance": 50,
28889             "references": [
28890                 {
28891                     "name": "MDN Reference",
28892                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-flow"
28893                 }
28894             ],
28895             "description": "Controls how the auto-placement algorithm works, specifying exactly how auto-placed items get flowed into the grid.",
28896             "restrictions": [
28897                 "enum"
28898             ]
28899         },
28900         {
28901             "name": "grid-auto-rows",
28902             "values": [
28903                 {
28904                     "name": "min-content",
28905                     "description": "Represents the largest min-content contribution of the grid items occupying the grid track."
28906                 },
28907                 {
28908                     "name": "max-content",
28909                     "description": "Represents the largest max-content contribution of the grid items occupying the grid track."
28910                 },
28911                 {
28912                     "name": "auto",
28913                     "description": "As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."
28914                 },
28915                 {
28916                     "name": "minmax()",
28917                     "description": "Defines a size range greater than or equal to min and less than or equal to max."
28918                 }
28919             ],
28920             "syntax": "<track-size>+",
28921             "relevance": 50,
28922             "references": [
28923                 {
28924                     "name": "MDN Reference",
28925                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-auto-rows"
28926                 }
28927             ],
28928             "description": "Specifies the size of implicitly created rows.",
28929             "restrictions": [
28930                 "length",
28931                 "percentage"
28932             ]
28933         },
28934         {
28935             "name": "grid-column",
28936             "browsers": [
28937                 "E16",
28938                 "FF52",
28939                 "S10.1",
28940                 "C57",
28941                 "O44"
28942             ],
28943             "values": [
28944                 {
28945                     "name": "auto",
28946                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
28947                 },
28948                 {
28949                     "name": "span",
28950                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
28951                 }
28952             ],
28953             "syntax": "<grid-line> [ / <grid-line> ]?",
28954             "relevance": 51,
28955             "references": [
28956                 {
28957                     "name": "MDN Reference",
28958                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-column"
28959                 }
28960             ],
28961             "description": "Shorthand for 'grid-column-start' and 'grid-column-end'.",
28962             "restrictions": [
28963                 "identifier",
28964                 "integer",
28965                 "enum"
28966             ]
28967         },
28968         {
28969             "name": "grid-column-end",
28970             "browsers": [
28971                 "E16",
28972                 "FF52",
28973                 "S10.1",
28974                 "C57",
28975                 "O44"
28976             ],
28977             "values": [
28978                 {
28979                     "name": "auto",
28980                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
28981                 },
28982                 {
28983                     "name": "span",
28984                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
28985                 }
28986             ],
28987             "syntax": "<grid-line>",
28988             "relevance": 50,
28989             "references": [
28990                 {
28991                     "name": "MDN Reference",
28992                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-end"
28993                 }
28994             ],
28995             "description": "Determine a grid item’s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",
28996             "restrictions": [
28997                 "identifier",
28998                 "integer",
28999                 "enum"
29000             ]
29001         },
29002         {
29003             "name": "grid-column-gap",
29004             "browsers": [
29005                 "FF52",
29006                 "C57",
29007                 "S10.1",
29008                 "O44"
29009             ],
29010             "status": "obsolete",
29011             "syntax": "<length-percentage>",
29012             "relevance": 1,
29013             "description": "Specifies the gutters between grid columns. Replaced by 'column-gap' property.",
29014             "restrictions": [
29015                 "length"
29016             ]
29017         },
29018         {
29019             "name": "grid-column-start",
29020             "browsers": [
29021                 "E16",
29022                 "FF52",
29023                 "S10.1",
29024                 "C57",
29025                 "O44"
29026             ],
29027             "values": [
29028                 {
29029                     "name": "auto",
29030                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
29031                 },
29032                 {
29033                     "name": "span",
29034                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
29035                 }
29036             ],
29037             "syntax": "<grid-line>",
29038             "relevance": 50,
29039             "references": [
29040                 {
29041                     "name": "MDN Reference",
29042                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-column-start"
29043                 }
29044             ],
29045             "description": "Determine a grid item’s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",
29046             "restrictions": [
29047                 "identifier",
29048                 "integer",
29049                 "enum"
29050             ]
29051         },
29052         {
29053             "name": "grid-gap",
29054             "browsers": [
29055                 "FF52",
29056                 "C57",
29057                 "S10.1",
29058                 "O44"
29059             ],
29060             "status": "obsolete",
29061             "syntax": "<'grid-row-gap'> <'grid-column-gap'>?",
29062             "relevance": 1,
29063             "description": "Shorthand that specifies the gutters between grid columns and grid rows in one declaration. Replaced by 'gap' property.",
29064             "restrictions": [
29065                 "length"
29066             ]
29067         },
29068         {
29069             "name": "grid-row",
29070             "browsers": [
29071                 "E16",
29072                 "FF52",
29073                 "S10.1",
29074                 "C57",
29075                 "O44"
29076             ],
29077             "values": [
29078                 {
29079                     "name": "auto",
29080                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
29081                 },
29082                 {
29083                     "name": "span",
29084                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
29085                 }
29086             ],
29087             "syntax": "<grid-line> [ / <grid-line> ]?",
29088             "relevance": 51,
29089             "references": [
29090                 {
29091                     "name": "MDN Reference",
29092                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-row"
29093                 }
29094             ],
29095             "description": "Shorthand for 'grid-row-start' and 'grid-row-end'.",
29096             "restrictions": [
29097                 "identifier",
29098                 "integer",
29099                 "enum"
29100             ]
29101         },
29102         {
29103             "name": "grid-row-end",
29104             "browsers": [
29105                 "E16",
29106                 "FF52",
29107                 "S10.1",
29108                 "C57",
29109                 "O44"
29110             ],
29111             "values": [
29112                 {
29113                     "name": "auto",
29114                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
29115                 },
29116                 {
29117                     "name": "span",
29118                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
29119                 }
29120             ],
29121             "syntax": "<grid-line>",
29122             "relevance": 50,
29123             "references": [
29124                 {
29125                     "name": "MDN Reference",
29126                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-end"
29127                 }
29128             ],
29129             "description": "Determine a grid item’s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",
29130             "restrictions": [
29131                 "identifier",
29132                 "integer",
29133                 "enum"
29134             ]
29135         },
29136         {
29137             "name": "grid-row-gap",
29138             "browsers": [
29139                 "FF52",
29140                 "C57",
29141                 "S10.1",
29142                 "O44"
29143             ],
29144             "status": "obsolete",
29145             "syntax": "<length-percentage>",
29146             "relevance": 1,
29147             "description": "Specifies the gutters between grid rows. Replaced by 'row-gap' property.",
29148             "restrictions": [
29149                 "length"
29150             ]
29151         },
29152         {
29153             "name": "grid-row-start",
29154             "browsers": [
29155                 "E16",
29156                 "FF52",
29157                 "S10.1",
29158                 "C57",
29159                 "O44"
29160             ],
29161             "values": [
29162                 {
29163                     "name": "auto",
29164                     "description": "The property contributes nothing to the grid item’s placement, indicating auto-placement, an automatic span, or a default span of one."
29165                 },
29166                 {
29167                     "name": "span",
29168                     "description": "Contributes a grid span to the grid item’s placement such that the corresponding edge of the grid item’s grid area is N lines from its opposite edge."
29169                 }
29170             ],
29171             "syntax": "<grid-line>",
29172             "relevance": 50,
29173             "references": [
29174                 {
29175                     "name": "MDN Reference",
29176                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-row-start"
29177                 }
29178             ],
29179             "description": "Determine a grid item’s size and location within the grid by contributing a line, a span, or nothing (automatic) to its grid placement.",
29180             "restrictions": [
29181                 "identifier",
29182                 "integer",
29183                 "enum"
29184             ]
29185         },
29186         {
29187             "name": "grid-template",
29188             "browsers": [
29189                 "E16",
29190                 "FF52",
29191                 "S10.1",
29192                 "C57",
29193                 "O44"
29194             ],
29195             "values": [
29196                 {
29197                     "name": "none",
29198                     "description": "Sets all three properties to their initial values."
29199                 },
29200                 {
29201                     "name": "min-content",
29202                     "description": "Represents the largest min-content contribution of the grid items occupying the grid track."
29203                 },
29204                 {
29205                     "name": "max-content",
29206                     "description": "Represents the largest max-content contribution of the grid items occupying the grid track."
29207                 },
29208                 {
29209                     "name": "auto",
29210                     "description": "As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."
29211                 },
29212                 {
29213                     "name": "subgrid",
29214                     "description": "Sets 'grid-template-rows' and 'grid-template-columns' to 'subgrid', and 'grid-template-areas' to its initial value."
29215                 },
29216                 {
29217                     "name": "minmax()",
29218                     "description": "Defines a size range greater than or equal to min and less than or equal to max."
29219                 },
29220                 {
29221                     "name": "repeat()",
29222                     "description": "Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."
29223                 }
29224             ],
29225             "syntax": "none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?",
29226             "relevance": 50,
29227             "references": [
29228                 {
29229                     "name": "MDN Reference",
29230                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-template"
29231                 }
29232             ],
29233             "description": "Shorthand for setting grid-template-columns, grid-template-rows, and grid-template-areas in a single declaration.",
29234             "restrictions": [
29235                 "identifier",
29236                 "length",
29237                 "percentage",
29238                 "string",
29239                 "enum"
29240             ]
29241         },
29242         {
29243             "name": "grid-template-areas",
29244             "browsers": [
29245                 "E16",
29246                 "FF52",
29247                 "S10.1",
29248                 "C57",
29249                 "O44"
29250             ],
29251             "values": [
29252                 {
29253                     "name": "none",
29254                     "description": "The grid container doesn’t define any named grid areas."
29255                 }
29256             ],
29257             "syntax": "none | <string>+",
29258             "relevance": 50,
29259             "references": [
29260                 {
29261                     "name": "MDN Reference",
29262                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-areas"
29263                 }
29264             ],
29265             "description": "Specifies named grid areas, which are not associated with any particular grid item, but can be referenced from the grid-placement properties.",
29266             "restrictions": [
29267                 "string"
29268             ]
29269         },
29270         {
29271             "name": "grid-template-columns",
29272             "browsers": [
29273                 "E16",
29274                 "FF52",
29275                 "S10.1",
29276                 "C57",
29277                 "O44"
29278             ],
29279             "values": [
29280                 {
29281                     "name": "none",
29282                     "description": "There is no explicit grid; any rows/columns will be implicitly generated."
29283                 },
29284                 {
29285                     "name": "min-content",
29286                     "description": "Represents the largest min-content contribution of the grid items occupying the grid track."
29287                 },
29288                 {
29289                     "name": "max-content",
29290                     "description": "Represents the largest max-content contribution of the grid items occupying the grid track."
29291                 },
29292                 {
29293                     "name": "auto",
29294                     "description": "As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."
29295                 },
29296                 {
29297                     "name": "subgrid",
29298                     "description": "Indicates that the grid will align to its parent grid in that axis."
29299                 },
29300                 {
29301                     "name": "minmax()",
29302                     "description": "Defines a size range greater than or equal to min and less than or equal to max."
29303                 },
29304                 {
29305                     "name": "repeat()",
29306                     "description": "Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."
29307                 }
29308             ],
29309             "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
29310             "relevance": 55,
29311             "references": [
29312                 {
29313                     "name": "MDN Reference",
29314                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-columns"
29315                 }
29316             ],
29317             "description": "specifies, as a space-separated track list, the line names and track sizing functions of the grid.",
29318             "restrictions": [
29319                 "identifier",
29320                 "length",
29321                 "percentage",
29322                 "enum"
29323             ]
29324         },
29325         {
29326             "name": "grid-template-rows",
29327             "browsers": [
29328                 "E16",
29329                 "FF52",
29330                 "S10.1",
29331                 "C57",
29332                 "O44"
29333             ],
29334             "values": [
29335                 {
29336                     "name": "none",
29337                     "description": "There is no explicit grid; any rows/columns will be implicitly generated."
29338                 },
29339                 {
29340                     "name": "min-content",
29341                     "description": "Represents the largest min-content contribution of the grid items occupying the grid track."
29342                 },
29343                 {
29344                     "name": "max-content",
29345                     "description": "Represents the largest max-content contribution of the grid items occupying the grid track."
29346                 },
29347                 {
29348                     "name": "auto",
29349                     "description": "As a maximum, identical to 'max-content'. As a minimum, represents the largest minimum size (as specified by min-width/min-height) of the grid items occupying the grid track."
29350                 },
29351                 {
29352                     "name": "subgrid",
29353                     "description": "Indicates that the grid will align to its parent grid in that axis."
29354                 },
29355                 {
29356                     "name": "minmax()",
29357                     "description": "Defines a size range greater than or equal to min and less than or equal to max."
29358                 },
29359                 {
29360                     "name": "repeat()",
29361                     "description": "Represents a repeated fragment of the track list, allowing a large number of columns or rows that exhibit a recurring pattern to be written in a more compact form."
29362                 }
29363             ],
29364             "syntax": "none | <track-list> | <auto-track-list> | subgrid <line-name-list>?",
29365             "relevance": 52,
29366             "references": [
29367                 {
29368                     "name": "MDN Reference",
29369                     "url": "https://developer.mozilla.org/docs/Web/CSS/grid-template-rows"
29370                 }
29371             ],
29372             "description": "specifies, as a space-separated track list, the line names and track sizing functions of the grid.",
29373             "restrictions": [
29374                 "identifier",
29375                 "length",
29376                 "percentage",
29377                 "string",
29378                 "enum"
29379             ]
29380         },
29381         {
29382             "name": "height",
29383             "values": [
29384                 {
29385                     "name": "auto",
29386                     "description": "The height depends on the values of other properties."
29387                 },
29388                 {
29389                     "name": "fit-content",
29390                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
29391                 },
29392                 {
29393                     "name": "max-content",
29394                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
29395                 },
29396                 {
29397                     "name": "min-content",
29398                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
29399                 }
29400             ],
29401             "syntax": "<viewport-length>{1,2}",
29402             "relevance": 96,
29403             "references": [
29404                 {
29405                     "name": "MDN Reference",
29406                     "url": "https://developer.mozilla.org/docs/Web/CSS/height"
29407                 }
29408             ],
29409             "description": "Specifies the height of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.",
29410             "restrictions": [
29411                 "length",
29412                 "percentage"
29413             ]
29414         },
29415         {
29416             "name": "hyphens",
29417             "values": [
29418                 {
29419                     "name": "auto",
29420                     "description": "Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."
29421                 },
29422                 {
29423                     "name": "manual",
29424                     "description": "Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"
29425                 },
29426                 {
29427                     "name": "none",
29428                     "description": "Words are not broken at line breaks, even if characters inside the word suggest line break points."
29429                 }
29430             ],
29431             "syntax": "none | manual | auto",
29432             "relevance": 53,
29433             "references": [
29434                 {
29435                     "name": "MDN Reference",
29436                     "url": "https://developer.mozilla.org/docs/Web/CSS/hyphens"
29437                 }
29438             ],
29439             "description": "Controls whether hyphenation is allowed to create more break opportunities within a line of text.",
29440             "restrictions": [
29441                 "enum"
29442             ]
29443         },
29444         {
29445             "name": "image-orientation",
29446             "browsers": [
29447                 "E81",
29448                 "FF26",
29449                 "S13.1",
29450                 "C81",
29451                 "O67"
29452             ],
29453             "values": [
29454                 {
29455                     "name": "flip",
29456                     "description": "After rotating by the precededing angle, the image is flipped horizontally. Defaults to 0deg if the angle is ommitted."
29457                 },
29458                 {
29459                     "name": "from-image",
29460                     "description": "If the image has an orientation specified in its metadata, such as EXIF, this value computes to the angle that the metadata specifies is necessary to correctly orient the image."
29461                 }
29462             ],
29463             "syntax": "from-image | <angle> | [ <angle>? flip ]",
29464             "relevance": 50,
29465             "references": [
29466                 {
29467                     "name": "MDN Reference",
29468                     "url": "https://developer.mozilla.org/docs/Web/CSS/image-orientation"
29469                 }
29470             ],
29471             "description": "Specifies an orthogonal rotation to be applied to an image before it is laid out.",
29472             "restrictions": [
29473                 "angle"
29474             ]
29475         },
29476         {
29477             "name": "image-rendering",
29478             "browsers": [
29479                 "E79",
29480                 "FF3.6",
29481                 "S6",
29482                 "C13",
29483                 "O15"
29484             ],
29485             "values": [
29486                 {
29487                     "name": "auto",
29488                     "description": "The image should be scaled with an algorithm that maximizes the appearance of the image."
29489                 },
29490                 {
29491                     "name": "crisp-edges",
29492                     "description": "The image must be scaled with an algorithm that preserves contrast and edges in the image, and which does not smooth colors or introduce blur to the image in the process."
29493                 },
29494                 {
29495                     "name": "-moz-crisp-edges",
29496                     "browsers": [
29497                         "E79",
29498                         "FF3.6",
29499                         "S6",
29500                         "C13",
29501                         "O15"
29502                     ]
29503                 },
29504                 {
29505                     "name": "optimizeQuality",
29506                     "description": "Deprecated."
29507                 },
29508                 {
29509                     "name": "optimizeSpeed",
29510                     "description": "Deprecated."
29511                 },
29512                 {
29513                     "name": "pixelated",
29514                     "description": "When scaling the image up, the 'nearest neighbor' or similar algorithm must be used, so that the image appears to be simply composed of very large pixels."
29515                 }
29516             ],
29517             "syntax": "auto | crisp-edges | pixelated",
29518             "relevance": 55,
29519             "references": [
29520                 {
29521                     "name": "MDN Reference",
29522                     "url": "https://developer.mozilla.org/docs/Web/CSS/image-rendering"
29523                 }
29524             ],
29525             "description": "Provides a hint to the user-agent about what aspects of an image are most important to preserve when the image is scaled, to aid the user-agent in the choice of an appropriate scaling algorithm.",
29526             "restrictions": [
29527                 "enum"
29528             ]
29529         },
29530         {
29531             "name": "ime-mode",
29532             "browsers": [
29533                 "E12",
29534                 "FF3",
29535                 "IE5"
29536             ],
29537             "values": [
29538                 {
29539                     "name": "active",
29540                     "description": "The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it."
29541                 },
29542                 {
29543                     "name": "auto",
29544                     "description": "No change is made to the current input method editor state. This is the default."
29545                 },
29546                 {
29547                     "name": "disabled",
29548                     "description": "The input method editor is disabled and may not be activated by the user."
29549                 },
29550                 {
29551                     "name": "inactive",
29552                     "description": "The input method editor is initially inactive, but the user may activate it if they wish."
29553                 },
29554                 {
29555                     "name": "normal",
29556                     "description": "The IME state should be normal; this value can be used in a user style sheet to override the page setting."
29557                 }
29558             ],
29559             "status": "obsolete",
29560             "syntax": "auto | normal | active | inactive | disabled",
29561             "relevance": 0,
29562             "references": [
29563                 {
29564                     "name": "MDN Reference",
29565                     "url": "https://developer.mozilla.org/docs/Web/CSS/ime-mode"
29566                 }
29567             ],
29568             "description": "Controls the state of the input method editor for text fields.",
29569             "restrictions": [
29570                 "enum"
29571             ]
29572         },
29573         {
29574             "name": "inline-size",
29575             "browsers": [
29576                 "E79",
29577                 "FF41",
29578                 "S12.1",
29579                 "C57",
29580                 "O44"
29581             ],
29582             "values": [
29583                 {
29584                     "name": "auto",
29585                     "description": "Depends on the values of other properties."
29586                 }
29587             ],
29588             "syntax": "<'width'>",
29589             "relevance": 50,
29590             "references": [
29591                 {
29592                     "name": "MDN Reference",
29593                     "url": "https://developer.mozilla.org/docs/Web/CSS/inline-size"
29594                 }
29595             ],
29596             "description": "Logical 'height'. Mapping depends on the element’s 'writing-mode'.",
29597             "restrictions": [
29598                 "length",
29599                 "percentage"
29600             ]
29601         },
29602         {
29603             "name": "isolation",
29604             "browsers": [
29605                 "E79",
29606                 "FF36",
29607                 "S8",
29608                 "C41",
29609                 "O30"
29610             ],
29611             "values": [
29612                 {
29613                     "name": "auto",
29614                     "description": "Elements are not isolated unless an operation is applied that causes the creation of a stacking context."
29615                 },
29616                 {
29617                     "name": "isolate",
29618                     "description": "In CSS will turn the element into a stacking context."
29619                 }
29620             ],
29621             "syntax": "auto | isolate",
29622             "relevance": 50,
29623             "references": [
29624                 {
29625                     "name": "MDN Reference",
29626                     "url": "https://developer.mozilla.org/docs/Web/CSS/isolation"
29627                 }
29628             ],
29629             "description": "In CSS setting to 'isolate' will turn the element into a stacking context. In SVG, it defines whether an element is isolated or not.",
29630             "restrictions": [
29631                 "enum"
29632             ]
29633         },
29634         {
29635             "name": "justify-content",
29636             "values": [
29637                 {
29638                     "name": "center",
29639                     "description": "Flex items are packed toward the center of the line."
29640                 },
29641                 {
29642                     "name": "start",
29643                     "description": "The items are packed flush to each other toward the start edge of the alignment container in the main axis."
29644                 },
29645                 {
29646                     "name": "end",
29647                     "description": "The items are packed flush to each other toward the end edge of the alignment container in the main axis."
29648                 },
29649                 {
29650                     "name": "left",
29651                     "description": "The items are packed flush to each other toward the left edge of the alignment container in the main axis."
29652                 },
29653                 {
29654                     "name": "right",
29655                     "description": "The items are packed flush to each other toward the right edge of the alignment container in the main axis."
29656                 },
29657                 {
29658                     "name": "safe",
29659                     "description": "If the size of the item overflows the alignment container, the item is instead aligned as if the alignment mode were start."
29660                 },
29661                 {
29662                     "name": "unsafe",
29663                     "description": "Regardless of the relative sizes of the item and alignment container, the given alignment value is honored."
29664                 },
29665                 {
29666                     "name": "stretch",
29667                     "description": "If the combined size of the alignment subjects is less than the size of the alignment container, any auto-sized alignment subjects have their size increased equally (not proportionally), while still respecting the constraints imposed by max-height/max-width (or equivalent functionality), so that the combined size exactly fills the alignment container."
29668                 },
29669                 {
29670                     "name": "space-evenly",
29671                     "description": "The items are evenly distributed within the alignment container along the main axis."
29672                 },
29673                 {
29674                     "name": "flex-end",
29675                     "description": "Flex items are packed toward the end of the line."
29676                 },
29677                 {
29678                     "name": "flex-start",
29679                     "description": "Flex items are packed toward the start of the line."
29680                 },
29681                 {
29682                     "name": "space-around",
29683                     "description": "Flex items are evenly distributed in the line, with half-size spaces on either end."
29684                 },
29685                 {
29686                     "name": "space-between",
29687                     "description": "Flex items are evenly distributed in the line."
29688                 },
29689                 {
29690                     "name": "baseline",
29691                     "description": "Specifies participation in first-baseline alignment."
29692                 },
29693                 {
29694                     "name": "first baseline",
29695                     "description": "Specifies participation in first-baseline alignment."
29696                 },
29697                 {
29698                     "name": "last baseline",
29699                     "description": "Specifies participation in last-baseline alignment."
29700                 }
29701             ],
29702             "syntax": "normal | <content-distribution> | <overflow-position>? [ <content-position> | left | right ]",
29703             "relevance": 82,
29704             "description": "Aligns flex items along the main axis of the current line of the flex container.",
29705             "restrictions": [
29706                 "enum"
29707             ]
29708         },
29709         {
29710             "name": "kerning",
29711             "values": [
29712                 {
29713                     "name": "auto",
29714                     "description": "Indicates that the user agent should adjust inter-glyph spacing based on kerning tables that are included in the font that will be used."
29715                 }
29716             ],
29717             "relevance": 50,
29718             "description": "Indicates whether the user agent should adjust inter-glyph spacing based on kerning tables that are included in the relevant font or instead disable auto-kerning and set inter-character spacing to a specific length.",
29719             "restrictions": [
29720                 "length",
29721                 "enum"
29722             ]
29723         },
29724         {
29725             "name": "left",
29726             "values": [
29727                 {
29728                     "name": "auto",
29729                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"
29730                 }
29731             ],
29732             "syntax": "<length> | <percentage> | auto",
29733             "relevance": 95,
29734             "references": [
29735                 {
29736                     "name": "MDN Reference",
29737                     "url": "https://developer.mozilla.org/docs/Web/CSS/left"
29738                 }
29739             ],
29740             "description": "Specifies how far an absolutely positioned box's left margin edge is offset to the right of the left edge of the box's 'containing block'.",
29741             "restrictions": [
29742                 "length",
29743                 "percentage"
29744             ]
29745         },
29746         {
29747             "name": "letter-spacing",
29748             "values": [
29749                 {
29750                     "name": "normal",
29751                     "description": "The spacing is the normal spacing for the current font. It is typically zero-length."
29752                 }
29753             ],
29754             "syntax": "normal | <length>",
29755             "relevance": 79,
29756             "references": [
29757                 {
29758                     "name": "MDN Reference",
29759                     "url": "https://developer.mozilla.org/docs/Web/CSS/letter-spacing"
29760                 }
29761             ],
29762             "description": "Specifies the minimum, maximum, and optimal spacing between grapheme clusters.",
29763             "restrictions": [
29764                 "length"
29765             ]
29766         },
29767         {
29768             "name": "lighting-color",
29769             "browsers": [
29770                 "E",
29771                 "C5",
29772                 "FF3",
29773                 "IE10",
29774                 "O9",
29775                 "S6"
29776             ],
29777             "relevance": 50,
29778             "description": "Defines the color of the light source for filter primitives 'feDiffuseLighting' and 'feSpecularLighting'.",
29779             "restrictions": [
29780                 "color"
29781             ]
29782         },
29783         {
29784             "name": "line-break",
29785             "values": [
29786                 {
29787                     "name": "auto",
29788                     "description": "The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines."
29789                 },
29790                 {
29791                     "name": "loose",
29792                     "description": "Breaks text using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers."
29793                 },
29794                 {
29795                     "name": "normal",
29796                     "description": "Breaks text using the most common set of line-breaking rules."
29797                 },
29798                 {
29799                     "name": "strict",
29800                     "description": "Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'."
29801                 }
29802             ],
29803             "syntax": "auto | loose | normal | strict | anywhere",
29804             "relevance": 51,
29805             "references": [
29806                 {
29807                     "name": "MDN Reference",
29808                     "url": "https://developer.mozilla.org/docs/Web/CSS/line-break"
29809                 }
29810             ],
29811             "description": "Specifies what set of line breaking restrictions are in effect within the element.",
29812             "restrictions": [
29813                 "enum"
29814             ]
29815         },
29816         {
29817             "name": "line-height",
29818             "values": [
29819                 {
29820                     "name": "normal",
29821                     "description": "Tells user agents to set the computed value to a 'reasonable' value based on the font size of the element."
29822                 }
29823             ],
29824             "syntax": "normal | <number> | <length> | <percentage>",
29825             "relevance": 92,
29826             "references": [
29827                 {
29828                     "name": "MDN Reference",
29829                     "url": "https://developer.mozilla.org/docs/Web/CSS/line-height"
29830                 }
29831             ],
29832             "description": "Determines the block-progression dimension of the text content area of an inline box.",
29833             "restrictions": [
29834                 "number",
29835                 "length",
29836                 "percentage"
29837             ]
29838         },
29839         {
29840             "name": "list-style",
29841             "values": [
29842                 {
29843                     "name": "armenian"
29844                 },
29845                 {
29846                     "name": "circle",
29847                     "description": "A hollow circle."
29848                 },
29849                 {
29850                     "name": "decimal"
29851                 },
29852                 {
29853                     "name": "decimal-leading-zero"
29854                 },
29855                 {
29856                     "name": "disc",
29857                     "description": "A filled circle."
29858                 },
29859                 {
29860                     "name": "georgian"
29861                 },
29862                 {
29863                     "name": "inside",
29864                     "description": "The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below."
29865                 },
29866                 {
29867                     "name": "lower-alpha"
29868                 },
29869                 {
29870                     "name": "lower-greek"
29871                 },
29872                 {
29873                     "name": "lower-latin"
29874                 },
29875                 {
29876                     "name": "lower-roman"
29877                 },
29878                 {
29879                     "name": "none"
29880                 },
29881                 {
29882                     "name": "outside",
29883                     "description": "The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows."
29884                 },
29885                 {
29886                     "name": "square",
29887                     "description": "A filled square."
29888                 },
29889                 {
29890                     "name": "symbols()",
29891                     "description": "Allows a counter style to be defined inline."
29892                 },
29893                 {
29894                     "name": "upper-alpha"
29895                 },
29896                 {
29897                     "name": "upper-latin"
29898                 },
29899                 {
29900                     "name": "upper-roman"
29901                 },
29902                 {
29903                     "name": "url()"
29904                 }
29905             ],
29906             "syntax": "<'list-style-type'> || <'list-style-position'> || <'list-style-image'>",
29907             "relevance": 84,
29908             "references": [
29909                 {
29910                     "name": "MDN Reference",
29911                     "url": "https://developer.mozilla.org/docs/Web/CSS/list-style"
29912                 }
29913             ],
29914             "description": "Shorthand for setting 'list-style-type', 'list-style-position' and 'list-style-image'",
29915             "restrictions": [
29916                 "image",
29917                 "enum",
29918                 "url"
29919             ]
29920         },
29921         {
29922             "name": "list-style-image",
29923             "values": [
29924                 {
29925                     "name": "none",
29926                     "description": "The default contents of the of the list item’s marker are given by 'list-style-type' instead."
29927                 }
29928             ],
29929             "syntax": "<url> | none",
29930             "relevance": 52,
29931             "references": [
29932                 {
29933                     "name": "MDN Reference",
29934                     "url": "https://developer.mozilla.org/docs/Web/CSS/list-style-image"
29935                 }
29936             ],
29937             "description": "Sets the image that will be used as the list item marker. When the image is available, it will replace the marker set with the 'list-style-type' marker.",
29938             "restrictions": [
29939                 "image"
29940             ]
29941         },
29942         {
29943             "name": "list-style-position",
29944             "values": [
29945                 {
29946                     "name": "inside",
29947                     "description": "The marker box is outside the principal block box, as described in the section on the ::marker pseudo-element below."
29948                 },
29949                 {
29950                     "name": "outside",
29951                     "description": "The ::marker pseudo-element is an inline element placed immediately before all ::before pseudo-elements in the principal block box, after which the element's content flows."
29952                 }
29953             ],
29954             "syntax": "inside | outside",
29955             "relevance": 55,
29956             "references": [
29957                 {
29958                     "name": "MDN Reference",
29959                     "url": "https://developer.mozilla.org/docs/Web/CSS/list-style-position"
29960                 }
29961             ],
29962             "description": "Specifies the position of the '::marker' pseudo-element's box in the list item.",
29963             "restrictions": [
29964                 "enum"
29965             ]
29966         },
29967         {
29968             "name": "list-style-type",
29969             "values": [
29970                 {
29971                     "name": "armenian",
29972                     "description": "Traditional uppercase Armenian numbering."
29973                 },
29974                 {
29975                     "name": "circle",
29976                     "description": "A hollow circle."
29977                 },
29978                 {
29979                     "name": "decimal",
29980                     "description": "Western decimal numbers."
29981                 },
29982                 {
29983                     "name": "decimal-leading-zero",
29984                     "description": "Decimal numbers padded by initial zeros."
29985                 },
29986                 {
29987                     "name": "disc",
29988                     "description": "A filled circle."
29989                 },
29990                 {
29991                     "name": "georgian",
29992                     "description": "Traditional Georgian numbering."
29993                 },
29994                 {
29995                     "name": "lower-alpha",
29996                     "description": "Lowercase ASCII letters."
29997                 },
29998                 {
29999                     "name": "lower-greek",
30000                     "description": "Lowercase classical Greek."
30001                 },
30002                 {
30003                     "name": "lower-latin",
30004                     "description": "Lowercase ASCII letters."
30005                 },
30006                 {
30007                     "name": "lower-roman",
30008                     "description": "Lowercase ASCII Roman numerals."
30009                 },
30010                 {
30011                     "name": "none",
30012                     "description": "No marker"
30013                 },
30014                 {
30015                     "name": "square",
30016                     "description": "A filled square."
30017                 },
30018                 {
30019                     "name": "symbols()",
30020                     "description": "Allows a counter style to be defined inline."
30021                 },
30022                 {
30023                     "name": "upper-alpha",
30024                     "description": "Uppercase ASCII letters."
30025                 },
30026                 {
30027                     "name": "upper-latin",
30028                     "description": "Uppercase ASCII letters."
30029                 },
30030                 {
30031                     "name": "upper-roman",
30032                     "description": "Uppercase ASCII Roman numerals."
30033                 }
30034             ],
30035             "syntax": "<counter-style> | <string> | none",
30036             "relevance": 74,
30037             "references": [
30038                 {
30039                     "name": "MDN Reference",
30040                     "url": "https://developer.mozilla.org/docs/Web/CSS/list-style-type"
30041                 }
30042             ],
30043             "description": "Used to construct the default contents of a list item’s marker",
30044             "restrictions": [
30045                 "enum",
30046                 "string"
30047             ]
30048         },
30049         {
30050             "name": "margin",
30051             "values": [
30052                 {
30053                     "name": "auto"
30054                 }
30055             ],
30056             "syntax": "[ <length> | <percentage> | auto ]{1,4}",
30057             "relevance": 95,
30058             "references": [
30059                 {
30060                     "name": "MDN Reference",
30061                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin"
30062                 }
30063             ],
30064             "description": "Shorthand property to set values the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits.",
30065             "restrictions": [
30066                 "length",
30067                 "percentage"
30068             ]
30069         },
30070         {
30071             "name": "margin-block-end",
30072             "browsers": [
30073                 "E79",
30074                 "FF41",
30075                 "S12.1",
30076                 "C69",
30077                 "O56"
30078             ],
30079             "values": [
30080                 {
30081                     "name": "auto"
30082                 }
30083             ],
30084             "syntax": "<'margin-left'>",
30085             "relevance": 53,
30086             "references": [
30087                 {
30088                     "name": "MDN Reference",
30089                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-end"
30090                 }
30091             ],
30092             "description": "Logical 'margin-bottom'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
30093             "restrictions": [
30094                 "length",
30095                 "percentage"
30096             ]
30097         },
30098         {
30099             "name": "margin-block-start",
30100             "browsers": [
30101                 "E79",
30102                 "FF41",
30103                 "S12.1",
30104                 "C69",
30105                 "O56"
30106             ],
30107             "values": [
30108                 {
30109                     "name": "auto"
30110                 }
30111             ],
30112             "syntax": "<'margin-left'>",
30113             "relevance": 52,
30114             "references": [
30115                 {
30116                     "name": "MDN Reference",
30117                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-block-start"
30118                 }
30119             ],
30120             "description": "Logical 'margin-top'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
30121             "restrictions": [
30122                 "length",
30123                 "percentage"
30124             ]
30125         },
30126         {
30127             "name": "margin-bottom",
30128             "values": [
30129                 {
30130                     "name": "auto"
30131                 }
30132             ],
30133             "syntax": "<length> | <percentage> | auto",
30134             "relevance": 91,
30135             "references": [
30136                 {
30137                     "name": "MDN Reference",
30138                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-bottom"
30139                 }
30140             ],
30141             "description": "Shorthand property to set values the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",
30142             "restrictions": [
30143                 "length",
30144                 "percentage"
30145             ]
30146         },
30147         {
30148             "name": "margin-inline-end",
30149             "browsers": [
30150                 "E79",
30151                 "FF41",
30152                 "S12.1",
30153                 "C69",
30154                 "O56"
30155             ],
30156             "values": [
30157                 {
30158                     "name": "auto"
30159                 }
30160             ],
30161             "syntax": "<'margin-left'>",
30162             "relevance": 51,
30163             "references": [
30164                 {
30165                     "name": "MDN Reference",
30166                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-end"
30167                 }
30168             ],
30169             "description": "Logical 'margin-right'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
30170             "restrictions": [
30171                 "length",
30172                 "percentage"
30173             ]
30174         },
30175         {
30176             "name": "margin-inline-start",
30177             "browsers": [
30178                 "E79",
30179                 "FF41",
30180                 "S12.1",
30181                 "C69",
30182                 "O56"
30183             ],
30184             "values": [
30185                 {
30186                     "name": "auto"
30187                 }
30188             ],
30189             "syntax": "<'margin-left'>",
30190             "relevance": 51,
30191             "references": [
30192                 {
30193                     "name": "MDN Reference",
30194                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline-start"
30195                 }
30196             ],
30197             "description": "Logical 'margin-left'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
30198             "restrictions": [
30199                 "length",
30200                 "percentage"
30201             ]
30202         },
30203         {
30204             "name": "margin-left",
30205             "values": [
30206                 {
30207                     "name": "auto"
30208                 }
30209             ],
30210             "syntax": "<length> | <percentage> | auto",
30211             "relevance": 91,
30212             "references": [
30213                 {
30214                     "name": "MDN Reference",
30215                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-left"
30216                 }
30217             ],
30218             "description": "Shorthand property to set values the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",
30219             "restrictions": [
30220                 "length",
30221                 "percentage"
30222             ]
30223         },
30224         {
30225             "name": "margin-right",
30226             "values": [
30227                 {
30228                     "name": "auto"
30229                 }
30230             ],
30231             "syntax": "<length> | <percentage> | auto",
30232             "relevance": 90,
30233             "references": [
30234                 {
30235                     "name": "MDN Reference",
30236                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-right"
30237                 }
30238             ],
30239             "description": "Shorthand property to set values the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",
30240             "restrictions": [
30241                 "length",
30242                 "percentage"
30243             ]
30244         },
30245         {
30246             "name": "margin-top",
30247             "values": [
30248                 {
30249                     "name": "auto"
30250                 }
30251             ],
30252             "syntax": "<length> | <percentage> | auto",
30253             "relevance": 95,
30254             "references": [
30255                 {
30256                     "name": "MDN Reference",
30257                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-top"
30258                 }
30259             ],
30260             "description": "Shorthand property to set values the thickness of the margin area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. Negative values for margin properties are allowed, but there may be implementation-specific limits..",
30261             "restrictions": [
30262                 "length",
30263                 "percentage"
30264             ]
30265         },
30266         {
30267             "name": "marker",
30268             "values": [
30269                 {
30270                     "name": "none",
30271                     "description": "Indicates that no marker symbol will be drawn at the given vertex or vertices."
30272                 },
30273                 {
30274                     "name": "url()",
30275                     "description": "Indicates that the <marker> element referenced will be used."
30276                 }
30277             ],
30278             "relevance": 50,
30279             "description": "Specifies the marker symbol that shall be used for all points on the sets the value for all vertices on the given ‘path’ element or basic shape.",
30280             "restrictions": [
30281                 "url"
30282             ]
30283         },
30284         {
30285             "name": "marker-end",
30286             "values": [
30287                 {
30288                     "name": "none",
30289                     "description": "Indicates that no marker symbol will be drawn at the given vertex or vertices."
30290                 },
30291                 {
30292                     "name": "url()",
30293                     "description": "Indicates that the <marker> element referenced will be used."
30294                 }
30295             ],
30296             "relevance": 50,
30297             "description": "Specifies the marker that will be drawn at the last vertices of the given markable element.",
30298             "restrictions": [
30299                 "url"
30300             ]
30301         },
30302         {
30303             "name": "marker-mid",
30304             "values": [
30305                 {
30306                     "name": "none",
30307                     "description": "Indicates that no marker symbol will be drawn at the given vertex or vertices."
30308                 },
30309                 {
30310                     "name": "url()",
30311                     "description": "Indicates that the <marker> element referenced will be used."
30312                 }
30313             ],
30314             "relevance": 50,
30315             "description": "Specifies the marker that will be drawn at all vertices except the first and last.",
30316             "restrictions": [
30317                 "url"
30318             ]
30319         },
30320         {
30321             "name": "marker-start",
30322             "values": [
30323                 {
30324                     "name": "none",
30325                     "description": "Indicates that no marker symbol will be drawn at the given vertex or vertices."
30326                 },
30327                 {
30328                     "name": "url()",
30329                     "description": "Indicates that the <marker> element referenced will be used."
30330                 }
30331             ],
30332             "relevance": 50,
30333             "description": "Specifies the marker that will be drawn at the first vertices of the given markable element.",
30334             "restrictions": [
30335                 "url"
30336             ]
30337         },
30338         {
30339             "name": "mask-image",
30340             "browsers": [
30341                 "E16",
30342                 "FF53",
30343                 "S4",
30344                 "C1",
30345                 "O15"
30346             ],
30347             "values": [
30348                 {
30349                     "name": "none",
30350                     "description": "Counts as a transparent black image layer."
30351                 },
30352                 {
30353                     "name": "url()",
30354                     "description": "Reference to a <mask element or to a CSS image."
30355                 }
30356             ],
30357             "syntax": "<mask-reference>#",
30358             "relevance": 50,
30359             "references": [
30360                 {
30361                     "name": "MDN Reference",
30362                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-image"
30363                 }
30364             ],
30365             "description": "Sets the mask layer image of an element.",
30366             "restrictions": [
30367                 "url",
30368                 "image",
30369                 "enum"
30370             ]
30371         },
30372         {
30373             "name": "mask-mode",
30374             "browsers": [
30375                 "FF53"
30376             ],
30377             "values": [
30378                 {
30379                     "name": "alpha",
30380                     "description": "Alpha values of the mask layer image should be used as the mask values."
30381                 },
30382                 {
30383                     "name": "auto",
30384                     "description": "Use alpha values if 'mask-image' is an image, luminance if a <mask> element or a CSS image."
30385                 },
30386                 {
30387                     "name": "luminance",
30388                     "description": "Luminance values of the mask layer image should be used as the mask values."
30389                 }
30390             ],
30391             "syntax": "<masking-mode>#",
30392             "relevance": 50,
30393             "references": [
30394                 {
30395                     "name": "MDN Reference",
30396                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-mode"
30397                 }
30398             ],
30399             "description": "Indicates whether the mask layer image is treated as luminance mask or alpha mask.",
30400             "restrictions": [
30401                 "url",
30402                 "image",
30403                 "enum"
30404             ]
30405         },
30406         {
30407             "name": "mask-origin",
30408             "browsers": [
30409                 "E79",
30410                 "FF53",
30411                 "S4",
30412                 "C1",
30413                 "O15"
30414             ],
30415             "syntax": "<geometry-box>#",
30416             "relevance": 50,
30417             "references": [
30418                 {
30419                     "name": "MDN Reference",
30420                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-origin"
30421                 }
30422             ],
30423             "description": "Specifies the mask positioning area.",
30424             "restrictions": [
30425                 "geometry-box",
30426                 "enum"
30427             ]
30428         },
30429         {
30430             "name": "mask-position",
30431             "browsers": [
30432                 "E18",
30433                 "FF53",
30434                 "S3.2",
30435                 "C1",
30436                 "O15"
30437             ],
30438             "syntax": "<position>#",
30439             "relevance": 50,
30440             "references": [
30441                 {
30442                     "name": "MDN Reference",
30443                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-position"
30444                 }
30445             ],
30446             "description": "Specifies how mask layer images are positioned.",
30447             "restrictions": [
30448                 "position",
30449                 "length",
30450                 "percentage"
30451             ]
30452         },
30453         {
30454             "name": "mask-repeat",
30455             "browsers": [
30456                 "E18",
30457                 "FF53",
30458                 "S3.2",
30459                 "C1",
30460                 "O15"
30461             ],
30462             "syntax": "<repeat-style>#",
30463             "relevance": 50,
30464             "references": [
30465                 {
30466                     "name": "MDN Reference",
30467                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-repeat"
30468                 }
30469             ],
30470             "description": "Specifies how mask layer images are tiled after they have been sized and positioned.",
30471             "restrictions": [
30472                 "repeat"
30473             ]
30474         },
30475         {
30476             "name": "mask-size",
30477             "browsers": [
30478                 "E18",
30479                 "FF53",
30480                 "S4",
30481                 "C4",
30482                 "O15"
30483             ],
30484             "values": [
30485                 {
30486                     "name": "auto",
30487                     "description": "Resolved by using the image’s intrinsic ratio and the size of the other dimension, or failing that, using the image’s intrinsic size, or failing that, treating it as 100%."
30488                 },
30489                 {
30490                     "name": "contain",
30491                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."
30492                 },
30493                 {
30494                     "name": "cover",
30495                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."
30496                 }
30497             ],
30498             "syntax": "<bg-size>#",
30499             "relevance": 50,
30500             "references": [
30501                 {
30502                     "name": "MDN Reference",
30503                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-size"
30504                 }
30505             ],
30506             "description": "Specifies the size of the mask layer images.",
30507             "restrictions": [
30508                 "length",
30509                 "percentage",
30510                 "enum"
30511             ]
30512         },
30513         {
30514             "name": "mask-type",
30515             "browsers": [
30516                 "E79",
30517                 "FF35",
30518                 "S6.1",
30519                 "C24",
30520                 "O15"
30521             ],
30522             "values": [
30523                 {
30524                     "name": "alpha",
30525                     "description": "Indicates that the alpha values of the mask should be used."
30526                 },
30527                 {
30528                     "name": "luminance",
30529                     "description": "Indicates that the luminance values of the mask should be used."
30530                 }
30531             ],
30532             "syntax": "luminance | alpha",
30533             "relevance": 50,
30534             "references": [
30535                 {
30536                     "name": "MDN Reference",
30537                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-type"
30538                 }
30539             ],
30540             "description": "Defines whether the content of the <mask> element is treated as as luminance mask or alpha mask.",
30541             "restrictions": [
30542                 "enum"
30543             ]
30544         },
30545         {
30546             "name": "max-block-size",
30547             "browsers": [
30548                 "E79",
30549                 "FF41",
30550                 "S12.1",
30551                 "C57",
30552                 "O44"
30553             ],
30554             "values": [
30555                 {
30556                     "name": "none",
30557                     "description": "No limit on the width of the box."
30558                 }
30559             ],
30560             "syntax": "<'max-width'>",
30561             "relevance": 50,
30562             "references": [
30563                 {
30564                     "name": "MDN Reference",
30565                     "url": "https://developer.mozilla.org/docs/Web/CSS/max-block-size"
30566                 }
30567             ],
30568             "description": "Logical 'max-width'. Mapping depends on the element’s 'writing-mode'.",
30569             "restrictions": [
30570                 "length",
30571                 "percentage"
30572             ]
30573         },
30574         {
30575             "name": "max-height",
30576             "values": [
30577                 {
30578                     "name": "none",
30579                     "description": "No limit on the height of the box."
30580                 },
30581                 {
30582                     "name": "fit-content",
30583                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
30584                 },
30585                 {
30586                     "name": "max-content",
30587                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
30588                 },
30589                 {
30590                     "name": "min-content",
30591                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
30592                 }
30593             ],
30594             "syntax": "<viewport-length>",
30595             "relevance": 84,
30596             "references": [
30597                 {
30598                     "name": "MDN Reference",
30599                     "url": "https://developer.mozilla.org/docs/Web/CSS/max-height"
30600                 }
30601             ],
30602             "description": "Allows authors to constrain content height to a certain range.",
30603             "restrictions": [
30604                 "length",
30605                 "percentage"
30606             ]
30607         },
30608         {
30609             "name": "max-inline-size",
30610             "browsers": [
30611                 "E79",
30612                 "FF41",
30613                 "S10.1",
30614                 "C57",
30615                 "O44"
30616             ],
30617             "values": [
30618                 {
30619                     "name": "none",
30620                     "description": "No limit on the height of the box."
30621                 }
30622             ],
30623             "syntax": "<'max-width'>",
30624             "relevance": 50,
30625             "references": [
30626                 {
30627                     "name": "MDN Reference",
30628                     "url": "https://developer.mozilla.org/docs/Web/CSS/max-inline-size"
30629                 }
30630             ],
30631             "description": "Logical 'max-height'. Mapping depends on the element’s 'writing-mode'.",
30632             "restrictions": [
30633                 "length",
30634                 "percentage"
30635             ]
30636         },
30637         {
30638             "name": "max-width",
30639             "values": [
30640                 {
30641                     "name": "none",
30642                     "description": "No limit on the width of the box."
30643                 },
30644                 {
30645                     "name": "fit-content",
30646                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
30647                 },
30648                 {
30649                     "name": "max-content",
30650                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
30651                 },
30652                 {
30653                     "name": "min-content",
30654                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
30655                 }
30656             ],
30657             "syntax": "<viewport-length>",
30658             "relevance": 89,
30659             "references": [
30660                 {
30661                     "name": "MDN Reference",
30662                     "url": "https://developer.mozilla.org/docs/Web/CSS/max-width"
30663                 }
30664             ],
30665             "description": "Allows authors to constrain content width to a certain range.",
30666             "restrictions": [
30667                 "length",
30668                 "percentage"
30669             ]
30670         },
30671         {
30672             "name": "min-block-size",
30673             "browsers": [
30674                 "E79",
30675                 "FF41",
30676                 "S12.1",
30677                 "C57",
30678                 "O44"
30679             ],
30680             "syntax": "<'min-width'>",
30681             "relevance": 50,
30682             "references": [
30683                 {
30684                     "name": "MDN Reference",
30685                     "url": "https://developer.mozilla.org/docs/Web/CSS/min-block-size"
30686                 }
30687             ],
30688             "description": "Logical 'min-width'. Mapping depends on the element’s 'writing-mode'.",
30689             "restrictions": [
30690                 "length",
30691                 "percentage"
30692             ]
30693         },
30694         {
30695             "name": "min-height",
30696             "values": [
30697                 {
30698                     "name": "auto"
30699                 },
30700                 {
30701                     "name": "fit-content",
30702                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
30703                 },
30704                 {
30705                     "name": "max-content",
30706                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
30707                 },
30708                 {
30709                     "name": "min-content",
30710                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
30711                 }
30712             ],
30713             "syntax": "<viewport-length>",
30714             "relevance": 88,
30715             "references": [
30716                 {
30717                     "name": "MDN Reference",
30718                     "url": "https://developer.mozilla.org/docs/Web/CSS/min-height"
30719                 }
30720             ],
30721             "description": "Allows authors to constrain content height to a certain range.",
30722             "restrictions": [
30723                 "length",
30724                 "percentage"
30725             ]
30726         },
30727         {
30728             "name": "min-inline-size",
30729             "browsers": [
30730                 "E79",
30731                 "FF41",
30732                 "S12.1",
30733                 "C57",
30734                 "O44"
30735             ],
30736             "syntax": "<'min-width'>",
30737             "relevance": 50,
30738             "references": [
30739                 {
30740                     "name": "MDN Reference",
30741                     "url": "https://developer.mozilla.org/docs/Web/CSS/min-inline-size"
30742                 }
30743             ],
30744             "description": "Logical 'min-height'. Mapping depends on the element’s 'writing-mode'.",
30745             "restrictions": [
30746                 "length",
30747                 "percentage"
30748             ]
30749         },
30750         {
30751             "name": "min-width",
30752             "values": [
30753                 {
30754                     "name": "auto"
30755                 },
30756                 {
30757                     "name": "fit-content",
30758                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
30759                 },
30760                 {
30761                     "name": "max-content",
30762                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
30763                 },
30764                 {
30765                     "name": "min-content",
30766                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
30767                 }
30768             ],
30769             "syntax": "<viewport-length>",
30770             "relevance": 87,
30771             "references": [
30772                 {
30773                     "name": "MDN Reference",
30774                     "url": "https://developer.mozilla.org/docs/Web/CSS/min-width"
30775                 }
30776             ],
30777             "description": "Allows authors to constrain content width to a certain range.",
30778             "restrictions": [
30779                 "length",
30780                 "percentage"
30781             ]
30782         },
30783         {
30784             "name": "mix-blend-mode",
30785             "browsers": [
30786                 "E79",
30787                 "FF32",
30788                 "S8",
30789                 "C41",
30790                 "O28"
30791             ],
30792             "values": [
30793                 {
30794                     "name": "normal",
30795                     "description": "Default attribute which specifies no blending"
30796                 },
30797                 {
30798                     "name": "multiply",
30799                     "description": "The source color is multiplied by the destination color and replaces the destination."
30800                 },
30801                 {
30802                     "name": "screen",
30803                     "description": "Multiplies the complements of the backdrop and source color values, then complements the result."
30804                 },
30805                 {
30806                     "name": "overlay",
30807                     "description": "Multiplies or screens the colors, depending on the backdrop color value."
30808                 },
30809                 {
30810                     "name": "darken",
30811                     "description": "Selects the darker of the backdrop and source colors."
30812                 },
30813                 {
30814                     "name": "lighten",
30815                     "description": "Selects the lighter of the backdrop and source colors."
30816                 },
30817                 {
30818                     "name": "color-dodge",
30819                     "description": "Brightens the backdrop color to reflect the source color."
30820                 },
30821                 {
30822                     "name": "color-burn",
30823                     "description": "Darkens the backdrop color to reflect the source color."
30824                 },
30825                 {
30826                     "name": "hard-light",
30827                     "description": "Multiplies or screens the colors, depending on the source color value."
30828                 },
30829                 {
30830                     "name": "soft-light",
30831                     "description": "Darkens or lightens the colors, depending on the source color value."
30832                 },
30833                 {
30834                     "name": "difference",
30835                     "description": "Subtracts the darker of the two constituent colors from the lighter color.."
30836                 },
30837                 {
30838                     "name": "exclusion",
30839                     "description": "Produces an effect similar to that of the Difference mode but lower in contrast."
30840                 },
30841                 {
30842                     "name": "hue",
30843                     "browsers": [
30844                         "E79",
30845                         "FF32",
30846                         "S8",
30847                         "C41",
30848                         "O28"
30849                     ],
30850                     "description": "Creates a color with the hue of the source color and the saturation and luminosity of the backdrop color."
30851                 },
30852                 {
30853                     "name": "saturation",
30854                     "browsers": [
30855                         "E79",
30856                         "FF32",
30857                         "S8",
30858                         "C41",
30859                         "O28"
30860                     ],
30861                     "description": "Creates a color with the saturation of the source color and the hue and luminosity of the backdrop color."
30862                 },
30863                 {
30864                     "name": "color",
30865                     "browsers": [
30866                         "E79",
30867                         "FF32",
30868                         "S8",
30869                         "C41",
30870                         "O28"
30871                     ],
30872                     "description": "Creates a color with the hue and saturation of the source color and the luminosity of the backdrop color."
30873                 },
30874                 {
30875                     "name": "luminosity",
30876                     "browsers": [
30877                         "E79",
30878                         "FF32",
30879                         "S8",
30880                         "C41",
30881                         "O28"
30882                     ],
30883                     "description": "Creates a color with the luminosity of the source color and the hue and saturation of the backdrop color."
30884                 }
30885             ],
30886             "syntax": "<blend-mode>",
30887             "relevance": 51,
30888             "references": [
30889                 {
30890                     "name": "MDN Reference",
30891                     "url": "https://developer.mozilla.org/docs/Web/CSS/mix-blend-mode"
30892                 }
30893             ],
30894             "description": "Defines the formula that must be used to mix the colors with the backdrop.",
30895             "restrictions": [
30896                 "enum"
30897             ]
30898         },
30899         {
30900             "name": "motion",
30901             "browsers": [
30902                 "C46",
30903                 "O33"
30904             ],
30905             "values": [
30906                 {
30907                     "name": "none",
30908                     "description": "No motion path gets created."
30909                 },
30910                 {
30911                     "name": "path()",
30912                     "description": "Defines an SVG path as a string, with optional 'fill-rule' as the first argument."
30913                 },
30914                 {
30915                     "name": "auto",
30916                     "description": "Indicates that the object is rotated by the angle of the direction of the motion path."
30917                 },
30918                 {
30919                     "name": "reverse",
30920                     "description": "Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees."
30921                 }
30922             ],
30923             "relevance": 50,
30924             "description": "Shorthand property for setting 'motion-path', 'motion-offset' and 'motion-rotation'.",
30925             "restrictions": [
30926                 "url",
30927                 "length",
30928                 "percentage",
30929                 "angle",
30930                 "shape",
30931                 "geometry-box",
30932                 "enum"
30933             ]
30934         },
30935         {
30936             "name": "motion-offset",
30937             "browsers": [
30938                 "C46",
30939                 "O33"
30940             ],
30941             "relevance": 50,
30942             "description": "A distance that describes the position along the specified motion path.",
30943             "restrictions": [
30944                 "length",
30945                 "percentage"
30946             ]
30947         },
30948         {
30949             "name": "motion-path",
30950             "browsers": [
30951                 "C46",
30952                 "O33"
30953             ],
30954             "values": [
30955                 {
30956                     "name": "none",
30957                     "description": "No motion path gets created."
30958                 },
30959                 {
30960                     "name": "path()",
30961                     "description": "Defines an SVG path as a string, with optional 'fill-rule' as the first argument."
30962                 }
30963             ],
30964             "relevance": 50,
30965             "description": "Specifies the motion path the element gets positioned at.",
30966             "restrictions": [
30967                 "url",
30968                 "shape",
30969                 "geometry-box",
30970                 "enum"
30971             ]
30972         },
30973         {
30974             "name": "motion-rotation",
30975             "browsers": [
30976                 "C46",
30977                 "O33"
30978             ],
30979             "values": [
30980                 {
30981                     "name": "auto",
30982                     "description": "Indicates that the object is rotated by the angle of the direction of the motion path."
30983                 },
30984                 {
30985                     "name": "reverse",
30986                     "description": "Indicates that the object is rotated by the angle of the direction of the motion path plus 180 degrees."
30987                 }
30988             ],
30989             "relevance": 50,
30990             "description": "Defines the direction of the element while positioning along the motion path.",
30991             "restrictions": [
30992                 "angle"
30993             ]
30994         },
30995         {
30996             "name": "-moz-animation",
30997             "browsers": [
30998                 "FF9"
30999             ],
31000             "values": [
31001                 {
31002                     "name": "alternate",
31003                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
31004                 },
31005                 {
31006                     "name": "alternate-reverse",
31007                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
31008                 },
31009                 {
31010                     "name": "backwards",
31011                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
31012                 },
31013                 {
31014                     "name": "both",
31015                     "description": "Both forwards and backwards fill modes are applied."
31016                 },
31017                 {
31018                     "name": "forwards",
31019                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
31020                 },
31021                 {
31022                     "name": "infinite",
31023                     "description": "Causes the animation to repeat forever."
31024                 },
31025                 {
31026                     "name": "none",
31027                     "description": "No animation is performed"
31028                 },
31029                 {
31030                     "name": "normal",
31031                     "description": "Normal playback."
31032                 },
31033                 {
31034                     "name": "reverse",
31035                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
31036                 }
31037             ],
31038             "relevance": 50,
31039             "description": "Shorthand property combines six of the animation properties into a single property.",
31040             "restrictions": [
31041                 "time",
31042                 "enum",
31043                 "timing-function",
31044                 "identifier",
31045                 "number"
31046             ]
31047         },
31048         {
31049             "name": "-moz-animation-delay",
31050             "browsers": [
31051                 "FF9"
31052             ],
31053             "relevance": 50,
31054             "description": "Defines when the animation will start.",
31055             "restrictions": [
31056                 "time"
31057             ]
31058         },
31059         {
31060             "name": "-moz-animation-direction",
31061             "browsers": [
31062                 "FF9"
31063             ],
31064             "values": [
31065                 {
31066                     "name": "alternate",
31067                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
31068                 },
31069                 {
31070                     "name": "alternate-reverse",
31071                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
31072                 },
31073                 {
31074                     "name": "normal",
31075                     "description": "Normal playback."
31076                 },
31077                 {
31078                     "name": "reverse",
31079                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
31080                 }
31081             ],
31082             "relevance": 50,
31083             "description": "Defines whether or not the animation should play in reverse on alternate cycles.",
31084             "restrictions": [
31085                 "enum"
31086             ]
31087         },
31088         {
31089             "name": "-moz-animation-duration",
31090             "browsers": [
31091                 "FF9"
31092             ],
31093             "relevance": 50,
31094             "description": "Defines the length of time that an animation takes to complete one cycle.",
31095             "restrictions": [
31096                 "time"
31097             ]
31098         },
31099         {
31100             "name": "-moz-animation-iteration-count",
31101             "browsers": [
31102                 "FF9"
31103             ],
31104             "values": [
31105                 {
31106                     "name": "infinite",
31107                     "description": "Causes the animation to repeat forever."
31108                 }
31109             ],
31110             "relevance": 50,
31111             "description": "Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",
31112             "restrictions": [
31113                 "number",
31114                 "enum"
31115             ]
31116         },
31117         {
31118             "name": "-moz-animation-name",
31119             "browsers": [
31120                 "FF9"
31121             ],
31122             "values": [
31123                 {
31124                     "name": "none",
31125                     "description": "No animation is performed"
31126                 }
31127             ],
31128             "relevance": 50,
31129             "description": "Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",
31130             "restrictions": [
31131                 "identifier",
31132                 "enum"
31133             ]
31134         },
31135         {
31136             "name": "-moz-animation-play-state",
31137             "browsers": [
31138                 "FF9"
31139             ],
31140             "values": [
31141                 {
31142                     "name": "paused",
31143                     "description": "A running animation will be paused."
31144                 },
31145                 {
31146                     "name": "running",
31147                     "description": "Resume playback of a paused animation."
31148                 }
31149             ],
31150             "relevance": 50,
31151             "description": "Defines whether the animation is running or paused.",
31152             "restrictions": [
31153                 "enum"
31154             ]
31155         },
31156         {
31157             "name": "-moz-animation-timing-function",
31158             "browsers": [
31159                 "FF9"
31160             ],
31161             "relevance": 50,
31162             "description": "Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",
31163             "restrictions": [
31164                 "timing-function"
31165             ]
31166         },
31167         {
31168             "name": "-moz-appearance",
31169             "browsers": [
31170                 "FF1"
31171             ],
31172             "values": [
31173                 {
31174                     "name": "button"
31175                 },
31176                 {
31177                     "name": "button-arrow-down"
31178                 },
31179                 {
31180                     "name": "button-arrow-next"
31181                 },
31182                 {
31183                     "name": "button-arrow-previous"
31184                 },
31185                 {
31186                     "name": "button-arrow-up"
31187                 },
31188                 {
31189                     "name": "button-bevel"
31190                 },
31191                 {
31192                     "name": "checkbox"
31193                 },
31194                 {
31195                     "name": "checkbox-container"
31196                 },
31197                 {
31198                     "name": "checkbox-label"
31199                 },
31200                 {
31201                     "name": "dialog"
31202                 },
31203                 {
31204                     "name": "groupbox"
31205                 },
31206                 {
31207                     "name": "listbox"
31208                 },
31209                 {
31210                     "name": "menuarrow"
31211                 },
31212                 {
31213                     "name": "menuimage"
31214                 },
31215                 {
31216                     "name": "menuitem"
31217                 },
31218                 {
31219                     "name": "menuitemtext"
31220                 },
31221                 {
31222                     "name": "menulist"
31223                 },
31224                 {
31225                     "name": "menulist-button"
31226                 },
31227                 {
31228                     "name": "menulist-text"
31229                 },
31230                 {
31231                     "name": "menulist-textfield"
31232                 },
31233                 {
31234                     "name": "menupopup"
31235                 },
31236                 {
31237                     "name": "menuradio"
31238                 },
31239                 {
31240                     "name": "menuseparator"
31241                 },
31242                 {
31243                     "name": "-moz-mac-unified-toolbar"
31244                 },
31245                 {
31246                     "name": "-moz-win-borderless-glass"
31247                 },
31248                 {
31249                     "name": "-moz-win-browsertabbar-toolbox"
31250                 },
31251                 {
31252                     "name": "-moz-win-communications-toolbox"
31253                 },
31254                 {
31255                     "name": "-moz-win-glass"
31256                 },
31257                 {
31258                     "name": "-moz-win-media-toolbox"
31259                 },
31260                 {
31261                     "name": "none"
31262                 },
31263                 {
31264                     "name": "progressbar"
31265                 },
31266                 {
31267                     "name": "progresschunk"
31268                 },
31269                 {
31270                     "name": "radio"
31271                 },
31272                 {
31273                     "name": "radio-container"
31274                 },
31275                 {
31276                     "name": "radio-label"
31277                 },
31278                 {
31279                     "name": "radiomenuitem"
31280                 },
31281                 {
31282                     "name": "resizer"
31283                 },
31284                 {
31285                     "name": "resizerpanel"
31286                 },
31287                 {
31288                     "name": "scrollbarbutton-down"
31289                 },
31290                 {
31291                     "name": "scrollbarbutton-left"
31292                 },
31293                 {
31294                     "name": "scrollbarbutton-right"
31295                 },
31296                 {
31297                     "name": "scrollbarbutton-up"
31298                 },
31299                 {
31300                     "name": "scrollbar-small"
31301                 },
31302                 {
31303                     "name": "scrollbartrack-horizontal"
31304                 },
31305                 {
31306                     "name": "scrollbartrack-vertical"
31307                 },
31308                 {
31309                     "name": "separator"
31310                 },
31311                 {
31312                     "name": "spinner"
31313                 },
31314                 {
31315                     "name": "spinner-downbutton"
31316                 },
31317                 {
31318                     "name": "spinner-textfield"
31319                 },
31320                 {
31321                     "name": "spinner-upbutton"
31322                 },
31323                 {
31324                     "name": "statusbar"
31325                 },
31326                 {
31327                     "name": "statusbarpanel"
31328                 },
31329                 {
31330                     "name": "tab"
31331                 },
31332                 {
31333                     "name": "tabpanels"
31334                 },
31335                 {
31336                     "name": "tab-scroll-arrow-back"
31337                 },
31338                 {
31339                     "name": "tab-scroll-arrow-forward"
31340                 },
31341                 {
31342                     "name": "textfield"
31343                 },
31344                 {
31345                     "name": "textfield-multiline"
31346                 },
31347                 {
31348                     "name": "toolbar"
31349                 },
31350                 {
31351                     "name": "toolbox"
31352                 },
31353                 {
31354                     "name": "tooltip"
31355                 },
31356                 {
31357                     "name": "treeheadercell"
31358                 },
31359                 {
31360                     "name": "treeheadersortarrow"
31361                 },
31362                 {
31363                     "name": "treeitem"
31364                 },
31365                 {
31366                     "name": "treetwistyopen"
31367                 },
31368                 {
31369                     "name": "treeview"
31370                 },
31371                 {
31372                     "name": "treewisty"
31373                 },
31374                 {
31375                     "name": "window"
31376                 }
31377             ],
31378             "status": "nonstandard",
31379             "syntax": "none | button | button-arrow-down | button-arrow-next | button-arrow-previous | button-arrow-up | button-bevel | button-focus | caret | checkbox | checkbox-container | checkbox-label | checkmenuitem | dualbutton | groupbox | listbox | listitem | menuarrow | menubar | menucheckbox | menuimage | menuitem | menuitemtext | menulist | menulist-button | menulist-text | menulist-textfield | menupopup | menuradio | menuseparator | meterbar | meterchunk | progressbar | progressbar-vertical | progresschunk | progresschunk-vertical | radio | radio-container | radio-label | radiomenuitem | range | range-thumb | resizer | resizerpanel | scale-horizontal | scalethumbend | scalethumb-horizontal | scalethumbstart | scalethumbtick | scalethumb-vertical | scale-vertical | scrollbarbutton-down | scrollbarbutton-left | scrollbarbutton-right | scrollbarbutton-up | scrollbarthumb-horizontal | scrollbarthumb-vertical | scrollbartrack-horizontal | scrollbartrack-vertical | searchfield | separator | sheet | spinner | spinner-downbutton | spinner-textfield | spinner-upbutton | splitter | statusbar | statusbarpanel | tab | tabpanel | tabpanels | tab-scroll-arrow-back | tab-scroll-arrow-forward | textfield | textfield-multiline | toolbar | toolbarbutton | toolbarbutton-dropdown | toolbargripper | toolbox | tooltip | treeheader | treeheadercell | treeheadersortarrow | treeitem | treeline | treetwisty | treetwistyopen | treeview | -moz-mac-unified-toolbar | -moz-win-borderless-glass | -moz-win-browsertabbar-toolbox | -moz-win-communicationstext | -moz-win-communications-toolbox | -moz-win-exclude-glass | -moz-win-glass | -moz-win-mediatext | -moz-win-media-toolbox | -moz-window-button-box | -moz-window-button-box-maximized | -moz-window-button-close | -moz-window-button-maximize | -moz-window-button-minimize | -moz-window-button-restore | -moz-window-frame-bottom | -moz-window-frame-left | -moz-window-frame-right | -moz-window-titlebar | -moz-window-titlebar-maximized",
31380             "relevance": 0,
31381             "description": "Used in Gecko (Firefox) to display an element using a platform-native styling based on the operating system's theme.",
31382             "restrictions": [
31383                 "enum"
31384             ]
31385         },
31386         {
31387             "name": "-moz-backface-visibility",
31388             "browsers": [
31389                 "FF10"
31390             ],
31391             "values": [
31392                 {
31393                     "name": "hidden"
31394                 },
31395                 {
31396                     "name": "visible"
31397                 }
31398             ],
31399             "relevance": 50,
31400             "description": "Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",
31401             "restrictions": [
31402                 "enum"
31403             ]
31404         },
31405         {
31406             "name": "-moz-background-clip",
31407             "browsers": [
31408                 "FF1-3.6"
31409             ],
31410             "values": [
31411                 {
31412                     "name": "padding"
31413                 }
31414             ],
31415             "relevance": 50,
31416             "description": "Determines the background painting area.",
31417             "restrictions": [
31418                 "box",
31419                 "enum"
31420             ]
31421         },
31422         {
31423             "name": "-moz-background-inline-policy",
31424             "browsers": [
31425                 "FF1"
31426             ],
31427             "values": [
31428                 {
31429                     "name": "bounding-box"
31430                 },
31431                 {
31432                     "name": "continuous"
31433                 },
31434                 {
31435                     "name": "each-box"
31436                 }
31437             ],
31438             "relevance": 50,
31439             "description": "In Gecko-based applications like Firefox, the -moz-background-inline-policy CSS property specifies how the background image of an inline element is determined when the content of the inline element wraps onto multiple lines. The choice of position has significant effects on repetition.",
31440             "restrictions": [
31441                 "enum"
31442             ]
31443         },
31444         {
31445             "name": "-moz-background-origin",
31446             "browsers": [
31447                 "FF1"
31448             ],
31449             "relevance": 50,
31450             "description": "For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",
31451             "restrictions": [
31452                 "box"
31453             ]
31454         },
31455         {
31456             "name": "-moz-border-bottom-colors",
31457             "browsers": [
31458                 "FF1"
31459             ],
31460             "status": "nonstandard",
31461             "syntax": "<color>+ | none",
31462             "relevance": 0,
31463             "description": "Sets a list of colors for the bottom border.",
31464             "restrictions": [
31465                 "color"
31466             ]
31467         },
31468         {
31469             "name": "-moz-border-image",
31470             "browsers": [
31471                 "FF3.6"
31472             ],
31473             "values": [
31474                 {
31475                     "name": "auto",
31476                     "description": "If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."
31477                 },
31478                 {
31479                     "name": "fill",
31480                     "description": "Causes the middle part of the border-image to be preserved."
31481                 },
31482                 {
31483                     "name": "none"
31484                 },
31485                 {
31486                     "name": "repeat",
31487                     "description": "The image is tiled (repeated) to fill the area."
31488                 },
31489                 {
31490                     "name": "round",
31491                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."
31492                 },
31493                 {
31494                     "name": "space",
31495                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."
31496                 },
31497                 {
31498                     "name": "stretch",
31499                     "description": "The image is stretched to fill the area."
31500                 },
31501                 {
31502                     "name": "url()"
31503                 }
31504             ],
31505             "relevance": 50,
31506             "description": "Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",
31507             "restrictions": [
31508                 "length",
31509                 "percentage",
31510                 "number",
31511                 "url",
31512                 "enum"
31513             ]
31514         },
31515         {
31516             "name": "-moz-border-left-colors",
31517             "browsers": [
31518                 "FF1"
31519             ],
31520             "status": "nonstandard",
31521             "syntax": "<color>+ | none",
31522             "relevance": 0,
31523             "description": "Sets a list of colors for the bottom border.",
31524             "restrictions": [
31525                 "color"
31526             ]
31527         },
31528         {
31529             "name": "-moz-border-right-colors",
31530             "browsers": [
31531                 "FF1"
31532             ],
31533             "status": "nonstandard",
31534             "syntax": "<color>+ | none",
31535             "relevance": 0,
31536             "description": "Sets a list of colors for the bottom border.",
31537             "restrictions": [
31538                 "color"
31539             ]
31540         },
31541         {
31542             "name": "-moz-border-top-colors",
31543             "browsers": [
31544                 "FF1"
31545             ],
31546             "status": "nonstandard",
31547             "syntax": "<color>+ | none",
31548             "relevance": 0,
31549             "description": "Ske Firefox, -moz-border-bottom-colors sets a list of colors for the bottom border.",
31550             "restrictions": [
31551                 "color"
31552             ]
31553         },
31554         {
31555             "name": "-moz-box-align",
31556             "browsers": [
31557                 "FF1"
31558             ],
31559             "values": [
31560                 {
31561                     "name": "baseline",
31562                     "description": "If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used."
31563                 },
31564                 {
31565                     "name": "center",
31566                     "description": "Any extra space is divided evenly, with half placed above the child and the other half placed after the child."
31567                 },
31568                 {
31569                     "name": "end",
31570                     "description": "For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element."
31571                 },
31572                 {
31573                     "name": "start",
31574                     "description": "For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element."
31575                 },
31576                 {
31577                     "name": "stretch",
31578                     "description": "The height of each child is adjusted to that of the containing block."
31579                 }
31580             ],
31581             "relevance": 50,
31582             "description": "Specifies how a XUL box aligns its contents across (perpendicular to) the direction of its layout. The effect of this is only visible if there is extra space in the box.",
31583             "restrictions": [
31584                 "enum"
31585             ]
31586         },
31587         {
31588             "name": "-moz-box-direction",
31589             "browsers": [
31590                 "FF1"
31591             ],
31592             "values": [
31593                 {
31594                     "name": "normal",
31595                     "description": "A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom."
31596                 },
31597                 {
31598                     "name": "reverse",
31599                     "description": "A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top."
31600                 }
31601             ],
31602             "relevance": 50,
31603             "description": "Specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).",
31604             "restrictions": [
31605                 "enum"
31606             ]
31607         },
31608         {
31609             "name": "-moz-box-flex",
31610             "browsers": [
31611                 "FF1"
31612             ],
31613             "relevance": 50,
31614             "description": "Specifies how a box grows to fill the box that contains it, in the direction of the containing box's layout.",
31615             "restrictions": [
31616                 "number"
31617             ]
31618         },
31619         {
31620             "name": "-moz-box-flexgroup",
31621             "browsers": [
31622                 "FF1"
31623             ],
31624             "relevance": 50,
31625             "description": "Flexible elements can be assigned to flex groups using the 'box-flex-group' property.",
31626             "restrictions": [
31627                 "integer"
31628             ]
31629         },
31630         {
31631             "name": "-moz-box-ordinal-group",
31632             "browsers": [
31633                 "FF1"
31634             ],
31635             "relevance": 50,
31636             "description": "Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.",
31637             "restrictions": [
31638                 "integer"
31639             ]
31640         },
31641         {
31642             "name": "-moz-box-orient",
31643             "browsers": [
31644                 "FF1"
31645             ],
31646             "values": [
31647                 {
31648                     "name": "block-axis",
31649                     "description": "Elements are oriented along the box's axis."
31650                 },
31651                 {
31652                     "name": "horizontal",
31653                     "description": "The box displays its children from left to right in a horizontal line."
31654                 },
31655                 {
31656                     "name": "inline-axis",
31657                     "description": "Elements are oriented vertically."
31658                 },
31659                 {
31660                     "name": "vertical",
31661                     "description": "The box displays its children from stacked from top to bottom vertically."
31662                 }
31663             ],
31664             "relevance": 50,
31665             "description": "In Mozilla applications, -moz-box-orient specifies whether a box lays out its contents horizontally or vertically.",
31666             "restrictions": [
31667                 "enum"
31668             ]
31669         },
31670         {
31671             "name": "-moz-box-pack",
31672             "browsers": [
31673                 "FF1"
31674             ],
31675             "values": [
31676                 {
31677                     "name": "center",
31678                     "description": "The extra space is divided evenly, with half placed before the first child and the other half placed after the last child."
31679                 },
31680                 {
31681                     "name": "end",
31682                     "description": "For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child."
31683                 },
31684                 {
31685                     "name": "justify",
31686                     "description": "The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start."
31687                 },
31688                 {
31689                     "name": "start",
31690                     "description": "For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child."
31691                 }
31692             ],
31693             "relevance": 50,
31694             "description": "Specifies how a box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box.",
31695             "restrictions": [
31696                 "enum"
31697             ]
31698         },
31699         {
31700             "name": "-moz-box-sizing",
31701             "browsers": [
31702                 "FF1"
31703             ],
31704             "values": [
31705                 {
31706                     "name": "border-box",
31707                     "description": "The specified width and height (and respective min/max properties) on this element determine the border box of the element."
31708                 },
31709                 {
31710                     "name": "content-box",
31711                     "description": "Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."
31712                 },
31713                 {
31714                     "name": "padding-box",
31715                     "description": "The specified width and height (and respective min/max properties) on this element determine the padding box of the element."
31716                 }
31717             ],
31718             "relevance": 50,
31719             "description": "Box Model addition in CSS3.",
31720             "restrictions": [
31721                 "enum"
31722             ]
31723         },
31724         {
31725             "name": "-moz-column-count",
31726             "browsers": [
31727                 "FF3.5"
31728             ],
31729             "values": [
31730                 {
31731                     "name": "auto",
31732                     "description": "Determines the number of columns by the 'column-width' property and the element width."
31733                 }
31734             ],
31735             "relevance": 50,
31736             "description": "Describes the optimal number of columns into which the content of the element will be flowed.",
31737             "restrictions": [
31738                 "integer"
31739             ]
31740         },
31741         {
31742             "name": "-moz-column-gap",
31743             "browsers": [
31744                 "FF3.5"
31745             ],
31746             "values": [
31747                 {
31748                     "name": "normal",
31749                     "description": "User agent specific and typically equivalent to 1em."
31750                 }
31751             ],
31752             "relevance": 50,
31753             "description": "Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",
31754             "restrictions": [
31755                 "length"
31756             ]
31757         },
31758         {
31759             "name": "-moz-column-rule",
31760             "browsers": [
31761                 "FF3.5"
31762             ],
31763             "relevance": 50,
31764             "description": "Shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",
31765             "restrictions": [
31766                 "length",
31767                 "line-width",
31768                 "line-style",
31769                 "color"
31770             ]
31771         },
31772         {
31773             "name": "-moz-column-rule-color",
31774             "browsers": [
31775                 "FF3.5"
31776             ],
31777             "relevance": 50,
31778             "description": "Sets the color of the column rule",
31779             "restrictions": [
31780                 "color"
31781             ]
31782         },
31783         {
31784             "name": "-moz-column-rule-style",
31785             "browsers": [
31786                 "FF3.5"
31787             ],
31788             "relevance": 50,
31789             "description": "Sets the style of the rule between columns of an element.",
31790             "restrictions": [
31791                 "line-style"
31792             ]
31793         },
31794         {
31795             "name": "-moz-column-rule-width",
31796             "browsers": [
31797                 "FF3.5"
31798             ],
31799             "relevance": 50,
31800             "description": "Sets the width of the rule between columns. Negative values are not allowed.",
31801             "restrictions": [
31802                 "length",
31803                 "line-width"
31804             ]
31805         },
31806         {
31807             "name": "-moz-columns",
31808             "browsers": [
31809                 "FF9"
31810             ],
31811             "values": [
31812                 {
31813                     "name": "auto",
31814                     "description": "The width depends on the values of other properties."
31815                 }
31816             ],
31817             "relevance": 50,
31818             "description": "A shorthand property which sets both 'column-width' and 'column-count'.",
31819             "restrictions": [
31820                 "length",
31821                 "integer"
31822             ]
31823         },
31824         {
31825             "name": "-moz-column-width",
31826             "browsers": [
31827                 "FF3.5"
31828             ],
31829             "values": [
31830                 {
31831                     "name": "auto",
31832                     "description": "The width depends on the values of other properties."
31833                 }
31834             ],
31835             "relevance": 50,
31836             "description": "This property describes the width of columns in multicol elements.",
31837             "restrictions": [
31838                 "length"
31839             ]
31840         },
31841         {
31842             "name": "-moz-font-feature-settings",
31843             "browsers": [
31844                 "FF4"
31845             ],
31846             "values": [
31847                 {
31848                     "name": "\"c2cs\""
31849                 },
31850                 {
31851                     "name": "\"dlig\""
31852                 },
31853                 {
31854                     "name": "\"kern\""
31855                 },
31856                 {
31857                     "name": "\"liga\""
31858                 },
31859                 {
31860                     "name": "\"lnum\""
31861                 },
31862                 {
31863                     "name": "\"onum\""
31864                 },
31865                 {
31866                     "name": "\"smcp\""
31867                 },
31868                 {
31869                     "name": "\"swsh\""
31870                 },
31871                 {
31872                     "name": "\"tnum\""
31873                 },
31874                 {
31875                     "name": "normal",
31876                     "description": "No change in glyph substitution or positioning occurs."
31877                 },
31878                 {
31879                     "name": "off",
31880                     "browsers": [
31881                         "FF4"
31882                     ]
31883                 },
31884                 {
31885                     "name": "on",
31886                     "browsers": [
31887                         "FF4"
31888                     ]
31889                 }
31890             ],
31891             "relevance": 50,
31892             "description": "Provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",
31893             "restrictions": [
31894                 "string",
31895                 "integer"
31896             ]
31897         },
31898         {
31899             "name": "-moz-hyphens",
31900             "browsers": [
31901                 "FF9"
31902             ],
31903             "values": [
31904                 {
31905                     "name": "auto",
31906                     "description": "Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."
31907                 },
31908                 {
31909                     "name": "manual",
31910                     "description": "Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"
31911                 },
31912                 {
31913                     "name": "none",
31914                     "description": "Words are not broken at line breaks, even if characters inside the word suggest line break points."
31915                 }
31916             ],
31917             "relevance": 50,
31918             "description": "Controls whether hyphenation is allowed to create more break opportunities within a line of text.",
31919             "restrictions": [
31920                 "enum"
31921             ]
31922         },
31923         {
31924             "name": "-moz-perspective",
31925             "browsers": [
31926                 "FF10"
31927             ],
31928             "values": [
31929                 {
31930                     "name": "none",
31931                     "description": "No perspective transform is applied."
31932                 }
31933             ],
31934             "relevance": 50,
31935             "description": "Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",
31936             "restrictions": [
31937                 "length"
31938             ]
31939         },
31940         {
31941             "name": "-moz-perspective-origin",
31942             "browsers": [
31943                 "FF10"
31944             ],
31945             "relevance": 50,
31946             "description": "Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",
31947             "restrictions": [
31948                 "position",
31949                 "percentage",
31950                 "length"
31951             ]
31952         },
31953         {
31954             "name": "-moz-text-align-last",
31955             "browsers": [
31956                 "FF12"
31957             ],
31958             "values": [
31959                 {
31960                     "name": "auto"
31961                 },
31962                 {
31963                     "name": "center",
31964                     "description": "The inline contents are centered within the line box."
31965                 },
31966                 {
31967                     "name": "justify",
31968                     "description": "The text is justified according to the method specified by the 'text-justify' property."
31969                 },
31970                 {
31971                     "name": "left",
31972                     "description": "The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."
31973                 },
31974                 {
31975                     "name": "right",
31976                     "description": "The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."
31977                 }
31978             ],
31979             "relevance": 50,
31980             "description": "Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",
31981             "restrictions": [
31982                 "enum"
31983             ]
31984         },
31985         {
31986             "name": "-moz-text-decoration-color",
31987             "browsers": [
31988                 "FF6"
31989             ],
31990             "relevance": 50,
31991             "description": "Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.",
31992             "restrictions": [
31993                 "color"
31994             ]
31995         },
31996         {
31997             "name": "-moz-text-decoration-line",
31998             "browsers": [
31999                 "FF6"
32000             ],
32001             "values": [
32002                 {
32003                     "name": "line-through",
32004                     "description": "Each line of text has a line through the middle."
32005                 },
32006                 {
32007                     "name": "none",
32008                     "description": "Neither produces nor inhibits text decoration."
32009                 },
32010                 {
32011                     "name": "overline",
32012                     "description": "Each line of text has a line above it."
32013                 },
32014                 {
32015                     "name": "underline",
32016                     "description": "Each line of text is underlined."
32017                 }
32018             ],
32019             "relevance": 50,
32020             "description": "Specifies what line decorations, if any, are added to the element.",
32021             "restrictions": [
32022                 "enum"
32023             ]
32024         },
32025         {
32026             "name": "-moz-text-decoration-style",
32027             "browsers": [
32028                 "FF6"
32029             ],
32030             "values": [
32031                 {
32032                     "name": "dashed",
32033                     "description": "Produces a dashed line style."
32034                 },
32035                 {
32036                     "name": "dotted",
32037                     "description": "Produces a dotted line."
32038                 },
32039                 {
32040                     "name": "double",
32041                     "description": "Produces a double line."
32042                 },
32043                 {
32044                     "name": "none",
32045                     "description": "Produces no line."
32046                 },
32047                 {
32048                     "name": "solid",
32049                     "description": "Produces a solid line."
32050                 },
32051                 {
32052                     "name": "wavy",
32053                     "description": "Produces a wavy line."
32054                 }
32055             ],
32056             "relevance": 50,
32057             "description": "Specifies the line style for underline, line-through and overline text decoration.",
32058             "restrictions": [
32059                 "enum"
32060             ]
32061         },
32062         {
32063             "name": "-moz-text-size-adjust",
32064             "browsers": [
32065                 "FF"
32066             ],
32067             "values": [
32068                 {
32069                     "name": "auto",
32070                     "description": "Renderers must use the default size adjustment when displaying on a small device."
32071                 },
32072                 {
32073                     "name": "none",
32074                     "description": "Renderers must not do size adjustment when displaying on a small device."
32075                 }
32076             ],
32077             "relevance": 50,
32078             "description": "Specifies a size adjustment for displaying text content in mobile browsers.",
32079             "restrictions": [
32080                 "enum",
32081                 "percentage"
32082             ]
32083         },
32084         {
32085             "name": "-moz-transform",
32086             "browsers": [
32087                 "FF3.5"
32088             ],
32089             "values": [
32090                 {
32091                     "name": "matrix()",
32092                     "description": "Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"
32093                 },
32094                 {
32095                     "name": "matrix3d()",
32096                     "description": "Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."
32097                 },
32098                 {
32099                     "name": "none"
32100                 },
32101                 {
32102                     "name": "perspective",
32103                     "description": "Specifies a perspective projection matrix."
32104                 },
32105                 {
32106                     "name": "rotate()",
32107                     "description": "Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."
32108                 },
32109                 {
32110                     "name": "rotate3d()",
32111                     "description": "Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."
32112                 },
32113                 {
32114                     "name": "rotateX('angle')",
32115                     "description": "Specifies a clockwise rotation by the given angle about the X axis."
32116                 },
32117                 {
32118                     "name": "rotateY('angle')",
32119                     "description": "Specifies a clockwise rotation by the given angle about the Y axis."
32120                 },
32121                 {
32122                     "name": "rotateZ('angle')",
32123                     "description": "Specifies a clockwise rotation by the given angle about the Z axis."
32124                 },
32125                 {
32126                     "name": "scale()",
32127                     "description": "Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."
32128                 },
32129                 {
32130                     "name": "scale3d()",
32131                     "description": "Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."
32132                 },
32133                 {
32134                     "name": "scaleX()",
32135                     "description": "Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."
32136                 },
32137                 {
32138                     "name": "scaleY()",
32139                     "description": "Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."
32140                 },
32141                 {
32142                     "name": "scaleZ()",
32143                     "description": "Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."
32144                 },
32145                 {
32146                     "name": "skew()",
32147                     "description": "Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."
32148                 },
32149                 {
32150                     "name": "skewX()",
32151                     "description": "Specifies a skew transformation along the X axis by the given angle."
32152                 },
32153                 {
32154                     "name": "skewY()",
32155                     "description": "Specifies a skew transformation along the Y axis by the given angle."
32156                 },
32157                 {
32158                     "name": "translate()",
32159                     "description": "Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."
32160                 },
32161                 {
32162                     "name": "translate3d()",
32163                     "description": "Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."
32164                 },
32165                 {
32166                     "name": "translateX()",
32167                     "description": "Specifies a translation by the given amount in the X direction."
32168                 },
32169                 {
32170                     "name": "translateY()",
32171                     "description": "Specifies a translation by the given amount in the Y direction."
32172                 },
32173                 {
32174                     "name": "translateZ()",
32175                     "description": "Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."
32176                 }
32177             ],
32178             "relevance": 50,
32179             "description": "A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",
32180             "restrictions": [
32181                 "enum"
32182             ]
32183         },
32184         {
32185             "name": "-moz-transform-origin",
32186             "browsers": [
32187                 "FF3.5"
32188             ],
32189             "relevance": 50,
32190             "description": "Establishes the origin of transformation for an element.",
32191             "restrictions": [
32192                 "position",
32193                 "length",
32194                 "percentage"
32195             ]
32196         },
32197         {
32198             "name": "-moz-transition",
32199             "browsers": [
32200                 "FF4"
32201             ],
32202             "values": [
32203                 {
32204                     "name": "all",
32205                     "description": "Every property that is able to undergo a transition will do so."
32206                 },
32207                 {
32208                     "name": "none",
32209                     "description": "No property will transition."
32210                 }
32211             ],
32212             "relevance": 50,
32213             "description": "Shorthand property combines four of the transition properties into a single property.",
32214             "restrictions": [
32215                 "time",
32216                 "property",
32217                 "timing-function",
32218                 "enum"
32219             ]
32220         },
32221         {
32222             "name": "-moz-transition-delay",
32223             "browsers": [
32224                 "FF4"
32225             ],
32226             "relevance": 50,
32227             "description": "Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",
32228             "restrictions": [
32229                 "time"
32230             ]
32231         },
32232         {
32233             "name": "-moz-transition-duration",
32234             "browsers": [
32235                 "FF4"
32236             ],
32237             "relevance": 50,
32238             "description": "Specifies how long the transition from the old value to the new value should take.",
32239             "restrictions": [
32240                 "time"
32241             ]
32242         },
32243         {
32244             "name": "-moz-transition-property",
32245             "browsers": [
32246                 "FF4"
32247             ],
32248             "values": [
32249                 {
32250                     "name": "all",
32251                     "description": "Every property that is able to undergo a transition will do so."
32252                 },
32253                 {
32254                     "name": "none",
32255                     "description": "No property will transition."
32256                 }
32257             ],
32258             "relevance": 50,
32259             "description": "Specifies the name of the CSS property to which the transition is applied.",
32260             "restrictions": [
32261                 "property"
32262             ]
32263         },
32264         {
32265             "name": "-moz-transition-timing-function",
32266             "browsers": [
32267                 "FF4"
32268             ],
32269             "relevance": 50,
32270             "description": "Describes how the intermediate values used during a transition will be calculated.",
32271             "restrictions": [
32272                 "timing-function"
32273             ]
32274         },
32275         {
32276             "name": "-moz-user-focus",
32277             "browsers": [
32278                 "FF1"
32279             ],
32280             "values": [
32281                 {
32282                     "name": "ignore"
32283                 },
32284                 {
32285                     "name": "normal"
32286                 }
32287             ],
32288             "status": "nonstandard",
32289             "syntax": "ignore | normal | select-after | select-before | select-menu | select-same | select-all | none",
32290             "relevance": 0,
32291             "references": [
32292                 {
32293                     "name": "MDN Reference",
32294                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-focus"
32295                 }
32296             ],
32297             "description": "Used to indicate whether the element can have focus."
32298         },
32299         {
32300             "name": "-moz-user-select",
32301             "browsers": [
32302                 "FF1.5"
32303             ],
32304             "values": [
32305                 {
32306                     "name": "all"
32307                 },
32308                 {
32309                     "name": "element"
32310                 },
32311                 {
32312                     "name": "elements"
32313                 },
32314                 {
32315                     "name": "-moz-all"
32316                 },
32317                 {
32318                     "name": "-moz-none"
32319                 },
32320                 {
32321                     "name": "none"
32322                 },
32323                 {
32324                     "name": "text"
32325                 },
32326                 {
32327                     "name": "toggle"
32328                 }
32329             ],
32330             "relevance": 50,
32331             "description": "Controls the appearance of selection.",
32332             "restrictions": [
32333                 "enum"
32334             ]
32335         },
32336         {
32337             "name": "-ms-accelerator",
32338             "browsers": [
32339                 "E",
32340                 "IE10"
32341             ],
32342             "values": [
32343                 {
32344                     "name": "false",
32345                     "description": "The element does not contain an accelerator key sequence."
32346                 },
32347                 {
32348                     "name": "true",
32349                     "description": "The element contains an accelerator key sequence."
32350                 }
32351             ],
32352             "status": "nonstandard",
32353             "syntax": "false | true",
32354             "relevance": 0,
32355             "description": "IE only. Has the ability to turn off its system underlines for accelerator keys until the ALT key is pressed",
32356             "restrictions": [
32357                 "enum"
32358             ]
32359         },
32360         {
32361             "name": "-ms-behavior",
32362             "browsers": [
32363                 "IE8"
32364             ],
32365             "relevance": 50,
32366             "description": "IE only. Used to extend behaviors of the browser",
32367             "restrictions": [
32368                 "url"
32369             ]
32370         },
32371         {
32372             "name": "-ms-block-progression",
32373             "browsers": [
32374                 "IE8"
32375             ],
32376             "values": [
32377                 {
32378                     "name": "bt",
32379                     "description": "Bottom-to-top block flow. Layout is horizontal."
32380                 },
32381                 {
32382                     "name": "lr",
32383                     "description": "Left-to-right direction. The flow orientation is vertical."
32384                 },
32385                 {
32386                     "name": "rl",
32387                     "description": "Right-to-left direction. The flow orientation is vertical."
32388                 },
32389                 {
32390                     "name": "tb",
32391                     "description": "Top-to-bottom direction. The flow orientation is horizontal."
32392                 }
32393             ],
32394             "status": "nonstandard",
32395             "syntax": "tb | rl | bt | lr",
32396             "relevance": 0,
32397             "description": "Sets the block-progression value and the flow orientation",
32398             "restrictions": [
32399                 "enum"
32400             ]
32401         },
32402         {
32403             "name": "-ms-content-zoom-chaining",
32404             "browsers": [
32405                 "E",
32406                 "IE10"
32407             ],
32408             "values": [
32409                 {
32410                     "name": "chained",
32411                     "description": "The nearest zoomable parent element begins zooming when the user hits a zoom limit during a manipulation. No bounce effect is shown."
32412                 },
32413                 {
32414                     "name": "none",
32415                     "description": "A bounce effect is shown when the user hits a zoom limit during a manipulation."
32416                 }
32417             ],
32418             "status": "nonstandard",
32419             "syntax": "none | chained",
32420             "relevance": 0,
32421             "description": "Specifies the zoom behavior that occurs when a user hits the zoom limit during a manipulation."
32422         },
32423         {
32424             "name": "-ms-content-zooming",
32425             "browsers": [
32426                 "E",
32427                 "IE10"
32428             ],
32429             "values": [
32430                 {
32431                     "name": "none",
32432                     "description": "The element is not zoomable."
32433                 },
32434                 {
32435                     "name": "zoom",
32436                     "description": "The element is zoomable."
32437                 }
32438             ],
32439             "status": "nonstandard",
32440             "syntax": "none | zoom",
32441             "relevance": 0,
32442             "description": "Specifies whether zooming is enabled.",
32443             "restrictions": [
32444                 "enum"
32445             ]
32446         },
32447         {
32448             "name": "-ms-content-zoom-limit",
32449             "browsers": [
32450                 "E",
32451                 "IE10"
32452             ],
32453             "status": "nonstandard",
32454             "syntax": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>",
32455             "relevance": 0,
32456             "description": "Shorthand property for the -ms-content-zoom-limit-min and -ms-content-zoom-limit-max properties.",
32457             "restrictions": [
32458                 "percentage"
32459             ]
32460         },
32461         {
32462             "name": "-ms-content-zoom-limit-max",
32463             "browsers": [
32464                 "E",
32465                 "IE10"
32466             ],
32467             "status": "nonstandard",
32468             "syntax": "<percentage>",
32469             "relevance": 0,
32470             "description": "Specifies the maximum zoom factor.",
32471             "restrictions": [
32472                 "percentage"
32473             ]
32474         },
32475         {
32476             "name": "-ms-content-zoom-limit-min",
32477             "browsers": [
32478                 "E",
32479                 "IE10"
32480             ],
32481             "status": "nonstandard",
32482             "syntax": "<percentage>",
32483             "relevance": 0,
32484             "description": "Specifies the minimum zoom factor.",
32485             "restrictions": [
32486                 "percentage"
32487             ]
32488         },
32489         {
32490             "name": "-ms-content-zoom-snap",
32491             "browsers": [
32492                 "E",
32493                 "IE10"
32494             ],
32495             "values": [
32496                 {
32497                     "name": "mandatory",
32498                     "description": "Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point."
32499                 },
32500                 {
32501                     "name": "none",
32502                     "description": "Indicates that zooming is unaffected by any defined snap-points."
32503                 },
32504                 {
32505                     "name": "proximity",
32506                     "description": "Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \"close enough\" to a snap-point."
32507                 },
32508                 {
32509                     "name": "snapInterval(100%, 100%)",
32510                     "description": "Specifies where the snap-points will be placed."
32511                 },
32512                 {
32513                     "name": "snapList()",
32514                     "description": "Specifies the position of individual snap-points as a comma-separated list of zoom factors."
32515                 }
32516             ],
32517             "status": "nonstandard",
32518             "syntax": "<'-ms-content-zoom-snap-type'> || <'-ms-content-zoom-snap-points'>",
32519             "relevance": 0,
32520             "description": "Shorthand property for the -ms-content-zoom-snap-type and -ms-content-zoom-snap-points properties."
32521         },
32522         {
32523             "name": "-ms-content-zoom-snap-points",
32524             "browsers": [
32525                 "E",
32526                 "IE10"
32527             ],
32528             "values": [
32529                 {
32530                     "name": "snapInterval(100%, 100%)",
32531                     "description": "Specifies where the snap-points will be placed."
32532                 },
32533                 {
32534                     "name": "snapList()",
32535                     "description": "Specifies the position of individual snap-points as a comma-separated list of zoom factors."
32536                 }
32537             ],
32538             "status": "nonstandard",
32539             "syntax": "snapInterval( <percentage>, <percentage> ) | snapList( <percentage># )",
32540             "relevance": 0,
32541             "description": "Defines where zoom snap-points are located."
32542         },
32543         {
32544             "name": "-ms-content-zoom-snap-type",
32545             "browsers": [
32546                 "E",
32547                 "IE10"
32548             ],
32549             "values": [
32550                 {
32551                     "name": "mandatory",
32552                     "description": "Indicates that the motion of the content after the contact is picked up is always adjusted so that it lands on a snap-point."
32553                 },
32554                 {
32555                     "name": "none",
32556                     "description": "Indicates that zooming is unaffected by any defined snap-points."
32557                 },
32558                 {
32559                     "name": "proximity",
32560                     "description": "Indicates that the motion of the content after the contact is picked up may be adjusted if the content would normally stop \"close enough\" to a snap-point."
32561                 }
32562             ],
32563             "status": "nonstandard",
32564             "syntax": "none | proximity | mandatory",
32565             "relevance": 0,
32566             "description": "Specifies how zooming is affected by defined snap-points.",
32567             "restrictions": [
32568                 "enum"
32569             ]
32570         },
32571         {
32572             "name": "-ms-filter",
32573             "browsers": [
32574                 "IE8-9"
32575             ],
32576             "status": "nonstandard",
32577             "syntax": "<string>",
32578             "relevance": 0,
32579             "description": "IE only. Used to produce visual effects.",
32580             "restrictions": [
32581                 "string"
32582             ]
32583         },
32584         {
32585             "name": "-ms-flex",
32586             "browsers": [
32587                 "IE10"
32588             ],
32589             "values": [
32590                 {
32591                     "name": "auto",
32592                     "description": "Retrieves the value of the main size property as the used 'flex-basis'."
32593                 },
32594                 {
32595                     "name": "none",
32596                     "description": "Expands to '0 0 auto'."
32597                 }
32598             ],
32599             "relevance": 50,
32600             "description": "specifies the parameters of a flexible length: the positive and negative flexibility, and the preferred size.",
32601             "restrictions": [
32602                 "length",
32603                 "number",
32604                 "percentage"
32605             ]
32606         },
32607         {
32608             "name": "-ms-flex-align",
32609             "browsers": [
32610                 "IE10"
32611             ],
32612             "values": [
32613                 {
32614                     "name": "baseline",
32615                     "description": "If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."
32616                 },
32617                 {
32618                     "name": "center",
32619                     "description": "The flex item’s margin box is centered in the cross axis within the line."
32620                 },
32621                 {
32622                     "name": "end",
32623                     "description": "The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."
32624                 },
32625                 {
32626                     "name": "start",
32627                     "description": "The cross-start margin edge of the flexbox item is placed flush with the cross-start edge of the line."
32628                 },
32629                 {
32630                     "name": "stretch",
32631                     "description": "If the cross size property of the flexbox item is anything other than 'auto', this value is identical to 'start'."
32632                 }
32633             ],
32634             "relevance": 50,
32635             "description": "Aligns flex items along the cross axis of the current line of the flex container.",
32636             "restrictions": [
32637                 "enum"
32638             ]
32639         },
32640         {
32641             "name": "-ms-flex-direction",
32642             "browsers": [
32643                 "IE10"
32644             ],
32645             "values": [
32646                 {
32647                     "name": "column",
32648                     "description": "The flex container’s main axis has the same orientation as the block axis of the current writing mode."
32649                 },
32650                 {
32651                     "name": "column-reverse",
32652                     "description": "Same as 'column', except the main-start and main-end directions are swapped."
32653                 },
32654                 {
32655                     "name": "row",
32656                     "description": "The flex container’s main axis has the same orientation as the inline axis of the current writing mode."
32657                 },
32658                 {
32659                     "name": "row-reverse",
32660                     "description": "Same as 'row', except the main-start and main-end directions are swapped."
32661                 }
32662             ],
32663             "relevance": 50,
32664             "description": "Specifies how flex items are placed in the flex container, by setting the direction of the flex container’s main axis.",
32665             "restrictions": [
32666                 "enum"
32667             ]
32668         },
32669         {
32670             "name": "-ms-flex-flow",
32671             "browsers": [
32672                 "IE10"
32673             ],
32674             "values": [
32675                 {
32676                     "name": "column",
32677                     "description": "The flex container’s main axis has the same orientation as the block axis of the current writing mode."
32678                 },
32679                 {
32680                     "name": "column-reverse",
32681                     "description": "Same as 'column', except the main-start and main-end directions are swapped."
32682                 },
32683                 {
32684                     "name": "nowrap",
32685                     "description": "The flex container is single-line."
32686                 },
32687                 {
32688                     "name": "row",
32689                     "description": "The flex container’s main axis has the same orientation as the inline axis of the current writing mode."
32690                 },
32691                 {
32692                     "name": "wrap",
32693                     "description": "The flexbox is multi-line."
32694                 },
32695                 {
32696                     "name": "wrap-reverse",
32697                     "description": "Same as 'wrap', except the cross-start and cross-end directions are swapped."
32698                 }
32699             ],
32700             "relevance": 50,
32701             "description": "Specifies how flexbox items are placed in the flexbox.",
32702             "restrictions": [
32703                 "enum"
32704             ]
32705         },
32706         {
32707             "name": "-ms-flex-item-align",
32708             "browsers": [
32709                 "IE10"
32710             ],
32711             "values": [
32712                 {
32713                     "name": "auto",
32714                     "description": "Computes to the value of 'align-items' on the element’s parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."
32715                 },
32716                 {
32717                     "name": "baseline",
32718                     "description": "If the flex item’s inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."
32719                 },
32720                 {
32721                     "name": "center",
32722                     "description": "The flex item’s margin box is centered in the cross axis within the line."
32723                 },
32724                 {
32725                     "name": "end",
32726                     "description": "The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."
32727                 },
32728                 {
32729                     "name": "start",
32730                     "description": "The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."
32731                 },
32732                 {
32733                     "name": "stretch",
32734                     "description": "If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."
32735                 }
32736             ],
32737             "relevance": 50,
32738             "description": "Allows the default alignment along the cross axis to be overridden for individual flex items.",
32739             "restrictions": [
32740                 "enum"
32741             ]
32742         },
32743         {
32744             "name": "-ms-flex-line-pack",
32745             "browsers": [
32746                 "IE10"
32747             ],
32748             "values": [
32749                 {
32750                     "name": "center",
32751                     "description": "Lines are packed toward the center of the flex container."
32752                 },
32753                 {
32754                     "name": "distribute",
32755                     "description": "Lines are evenly distributed in the flex container, with half-size spaces on either end."
32756                 },
32757                 {
32758                     "name": "end",
32759                     "description": "Lines are packed toward the end of the flex container."
32760                 },
32761                 {
32762                     "name": "justify",
32763                     "description": "Lines are evenly distributed in the flex container."
32764                 },
32765                 {
32766                     "name": "start",
32767                     "description": "Lines are packed toward the start of the flex container."
32768                 },
32769                 {
32770                     "name": "stretch",
32771                     "description": "Lines stretch to take up the remaining space."
32772                 }
32773             ],
32774             "relevance": 50,
32775             "description": "Aligns a flex container’s lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",
32776             "restrictions": [
32777                 "enum"
32778             ]
32779         },
32780         {
32781             "name": "-ms-flex-order",
32782             "browsers": [
32783                 "IE10"
32784             ],
32785             "relevance": 50,
32786             "description": "Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.",
32787             "restrictions": [
32788                 "integer"
32789             ]
32790         },
32791         {
32792             "name": "-ms-flex-pack",
32793             "browsers": [
32794                 "IE10"
32795             ],
32796             "values": [
32797                 {
32798                     "name": "center",
32799                     "description": "Flex items are packed toward the center of the line."
32800                 },
32801                 {
32802                     "name": "distribute",
32803                     "description": "Flex items are evenly distributed in the line, with half-size spaces on either end."
32804                 },
32805                 {
32806                     "name": "end",
32807                     "description": "Flex items are packed toward the end of the line."
32808                 },
32809                 {
32810                     "name": "justify",
32811                     "description": "Flex items are evenly distributed in the line."
32812                 },
32813                 {
32814                     "name": "start",
32815                     "description": "Flex items are packed toward the start of the line."
32816                 }
32817             ],
32818             "relevance": 50,
32819             "description": "Aligns flex items along the main axis of the current line of the flex container.",
32820             "restrictions": [
32821                 "enum"
32822             ]
32823         },
32824         {
32825             "name": "-ms-flex-wrap",
32826             "browsers": [
32827                 "IE10"
32828             ],
32829             "values": [
32830                 {
32831                     "name": "nowrap",
32832                     "description": "The flex container is single-line."
32833                 },
32834                 {
32835                     "name": "wrap",
32836                     "description": "The flexbox is multi-line."
32837                 },
32838                 {
32839                     "name": "wrap-reverse",
32840                     "description": "Same as 'wrap', except the cross-start and cross-end directions are swapped."
32841                 }
32842             ],
32843             "relevance": 50,
32844             "description": "Controls whether the flex container is single-line or multi-line, and the direction of the cross-axis, which determines the direction new lines are stacked in.",
32845             "restrictions": [
32846                 "enum"
32847             ]
32848         },
32849         {
32850             "name": "-ms-flow-from",
32851             "browsers": [
32852                 "E",
32853                 "IE10"
32854             ],
32855             "values": [
32856                 {
32857                     "name": "none",
32858                     "description": "The block container is not a CSS Region."
32859                 }
32860             ],
32861             "status": "nonstandard",
32862             "syntax": "[ none | <custom-ident> ]#",
32863             "relevance": 0,
32864             "description": "Makes a block container a region and associates it with a named flow.",
32865             "restrictions": [
32866                 "identifier"
32867             ]
32868         },
32869         {
32870             "name": "-ms-flow-into",
32871             "browsers": [
32872                 "E",
32873                 "IE10"
32874             ],
32875             "values": [
32876                 {
32877                     "name": "none",
32878                     "description": "The element is not moved to a named flow and normal CSS processing takes place."
32879                 }
32880             ],
32881             "status": "nonstandard",
32882             "syntax": "[ none | <custom-ident> ]#",
32883             "relevance": 0,
32884             "description": "Places an element or its contents into a named flow.",
32885             "restrictions": [
32886                 "identifier"
32887             ]
32888         },
32889         {
32890             "name": "-ms-grid-column",
32891             "browsers": [
32892                 "E12",
32893                 "IE10"
32894             ],
32895             "values": [
32896                 {
32897                     "name": "auto"
32898                 },
32899                 {
32900                     "name": "end"
32901                 },
32902                 {
32903                     "name": "start"
32904                 }
32905             ],
32906             "relevance": 50,
32907             "description": "Used to place grid items and explicitly defined grid cells in the Grid.",
32908             "restrictions": [
32909                 "integer",
32910                 "string",
32911                 "enum"
32912             ]
32913         },
32914         {
32915             "name": "-ms-grid-column-align",
32916             "browsers": [
32917                 "E12",
32918                 "IE10"
32919             ],
32920             "values": [
32921                 {
32922                     "name": "center",
32923                     "description": "Places the center of the Grid Item's margin box at the center of the Grid Item's column."
32924                 },
32925                 {
32926                     "name": "end",
32927                     "description": "Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's column."
32928                 },
32929                 {
32930                     "name": "start",
32931                     "description": "Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's column."
32932                 },
32933                 {
32934                     "name": "stretch",
32935                     "description": "Ensures that the Grid Item's margin box is equal to the size of the Grid Item's column."
32936                 }
32937             ],
32938             "relevance": 50,
32939             "description": "Aligns the columns in a grid.",
32940             "restrictions": [
32941                 "enum"
32942             ]
32943         },
32944         {
32945             "name": "-ms-grid-columns",
32946             "browsers": [
32947                 "E12",
32948                 "IE10"
32949             ],
32950             "relevance": 50,
32951             "description": "Lays out the columns of the grid."
32952         },
32953         {
32954             "name": "-ms-grid-column-span",
32955             "browsers": [
32956                 "E12",
32957                 "IE10"
32958             ],
32959             "relevance": 50,
32960             "description": "Specifies the number of columns to span.",
32961             "restrictions": [
32962                 "integer"
32963             ]
32964         },
32965         {
32966             "name": "-ms-grid-layer",
32967             "browsers": [
32968                 "E",
32969                 "IE10"
32970             ],
32971             "relevance": 50,
32972             "description": "Grid-layer is similar in concept to z-index, but avoids overloading the meaning of the z-index property, which is applicable only to positioned elements.",
32973             "restrictions": [
32974                 "integer"
32975             ]
32976         },
32977         {
32978             "name": "-ms-grid-row",
32979             "browsers": [
32980                 "E12",
32981                 "IE10"
32982             ],
32983             "values": [
32984                 {
32985                     "name": "auto"
32986                 },
32987                 {
32988                     "name": "end"
32989                 },
32990                 {
32991                     "name": "start"
32992                 }
32993             ],
32994             "relevance": 50,
32995             "description": "grid-row is used to place grid items and explicitly defined grid cells in the Grid.",
32996             "restrictions": [
32997                 "integer",
32998                 "string",
32999                 "enum"
33000             ]
33001         },
33002         {
33003             "name": "-ms-grid-row-align",
33004             "browsers": [
33005                 "E12",
33006                 "IE10"
33007             ],
33008             "values": [
33009                 {
33010                     "name": "center",
33011                     "description": "Places the center of the Grid Item's margin box at the center of the Grid Item's row."
33012                 },
33013                 {
33014                     "name": "end",
33015                     "description": "Aligns the end edge of the Grid Item's margin box to the end edge of the Grid Item's row."
33016                 },
33017                 {
33018                     "name": "start",
33019                     "description": "Aligns the starting edge of the Grid Item's margin box to the starting edge of the Grid Item's row."
33020                 },
33021                 {
33022                     "name": "stretch",
33023                     "description": "Ensures that the Grid Item's margin box is equal to the size of the Grid Item's row."
33024                 }
33025             ],
33026             "relevance": 50,
33027             "description": "Aligns the rows in a grid.",
33028             "restrictions": [
33029                 "enum"
33030             ]
33031         },
33032         {
33033             "name": "-ms-grid-rows",
33034             "browsers": [
33035                 "E12",
33036                 "IE10"
33037             ],
33038             "relevance": 50,
33039             "description": "Lays out the columns of the grid."
33040         },
33041         {
33042             "name": "-ms-grid-row-span",
33043             "browsers": [
33044                 "E12",
33045                 "IE10"
33046             ],
33047             "relevance": 50,
33048             "description": "Specifies the number of rows to span.",
33049             "restrictions": [
33050                 "integer"
33051             ]
33052         },
33053         {
33054             "name": "-ms-high-contrast-adjust",
33055             "browsers": [
33056                 "E",
33057                 "IE10"
33058             ],
33059             "values": [
33060                 {
33061                     "name": "auto",
33062                     "description": "Properties will be adjusted as applicable."
33063                 },
33064                 {
33065                     "name": "none",
33066                     "description": "No adjustments will be applied."
33067                 }
33068             ],
33069             "status": "nonstandard",
33070             "syntax": "auto | none",
33071             "relevance": 0,
33072             "description": "Specifies if properties should be adjusted in high contrast mode.",
33073             "restrictions": [
33074                 "enum"
33075             ]
33076         },
33077         {
33078             "name": "-ms-hyphenate-limit-chars",
33079             "browsers": [
33080                 "E",
33081                 "IE10"
33082             ],
33083             "values": [
33084                 {
33085                     "name": "auto",
33086                     "description": "The user agent chooses a value that adapts to the current layout."
33087                 }
33088             ],
33089             "status": "nonstandard",
33090             "syntax": "auto | <integer>{1,3}",
33091             "relevance": 0,
33092             "description": "Specifies the minimum number of characters in a hyphenated word.",
33093             "restrictions": [
33094                 "integer"
33095             ]
33096         },
33097         {
33098             "name": "-ms-hyphenate-limit-lines",
33099             "browsers": [
33100                 "E",
33101                 "IE10"
33102             ],
33103             "values": [
33104                 {
33105                     "name": "no-limit",
33106                     "description": "There is no limit."
33107                 }
33108             ],
33109             "status": "nonstandard",
33110             "syntax": "no-limit | <integer>",
33111             "relevance": 0,
33112             "description": "Indicates the maximum number of successive hyphenated lines in an element.",
33113             "restrictions": [
33114                 "integer"
33115             ]
33116         },
33117         {
33118             "name": "-ms-hyphenate-limit-zone",
33119             "browsers": [
33120                 "E",
33121                 "IE10"
33122             ],
33123             "status": "nonstandard",
33124             "syntax": "<percentage> | <length>",
33125             "relevance": 0,
33126             "description": "Specifies the maximum amount of unfilled space (before justification) that may be left in the line box before hyphenation is triggered to pull part of a word from the next line back up into the current line.",
33127             "restrictions": [
33128                 "percentage",
33129                 "length"
33130             ]
33131         },
33132         {
33133             "name": "-ms-hyphens",
33134             "browsers": [
33135                 "E",
33136                 "IE10"
33137             ],
33138             "values": [
33139                 {
33140                     "name": "auto",
33141                     "description": "Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."
33142                 },
33143                 {
33144                     "name": "manual",
33145                     "description": "Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"
33146                 },
33147                 {
33148                     "name": "none",
33149                     "description": "Words are not broken at line breaks, even if characters inside the word suggest line break points."
33150                 }
33151             ],
33152             "relevance": 50,
33153             "description": "Controls whether hyphenation is allowed to create more break opportunities within a line of text.",
33154             "restrictions": [
33155                 "enum"
33156             ]
33157         },
33158         {
33159             "name": "-ms-ime-mode",
33160             "browsers": [
33161                 "IE10"
33162             ],
33163             "values": [
33164                 {
33165                     "name": "active",
33166                     "description": "The input method editor is initially active; text entry is performed using it unless the user specifically dismisses it."
33167                 },
33168                 {
33169                     "name": "auto",
33170                     "description": "No change is made to the current input method editor state. This is the default."
33171                 },
33172                 {
33173                     "name": "disabled",
33174                     "description": "The input method editor is disabled and may not be activated by the user."
33175                 },
33176                 {
33177                     "name": "inactive",
33178                     "description": "The input method editor is initially inactive, but the user may activate it if they wish."
33179                 },
33180                 {
33181                     "name": "normal",
33182                     "description": "The IME state should be normal; this value can be used in a user style sheet to override the page setting."
33183                 }
33184             ],
33185             "relevance": 50,
33186             "description": "Controls the state of the input method editor for text fields.",
33187             "restrictions": [
33188                 "enum"
33189             ]
33190         },
33191         {
33192             "name": "-ms-interpolation-mode",
33193             "browsers": [
33194                 "IE7"
33195             ],
33196             "values": [
33197                 {
33198                     "name": "bicubic"
33199                 },
33200                 {
33201                     "name": "nearest-neighbor"
33202                 }
33203             ],
33204             "relevance": 50,
33205             "description": "Gets or sets the interpolation (resampling) method used to stretch images.",
33206             "restrictions": [
33207                 "enum"
33208             ]
33209         },
33210         {
33211             "name": "-ms-layout-grid",
33212             "browsers": [
33213                 "E",
33214                 "IE10"
33215             ],
33216             "values": [
33217                 {
33218                     "name": "char",
33219                     "description": "Any of the range of character values available to the -ms-layout-grid-char property."
33220                 },
33221                 {
33222                     "name": "line",
33223                     "description": "Any of the range of line values available to the -ms-layout-grid-line property."
33224                 },
33225                 {
33226                     "name": "mode",
33227                     "description": "Any of the range of mode values available to the -ms-layout-grid-mode property."
33228                 },
33229                 {
33230                     "name": "type",
33231                     "description": "Any of the range of type values available to the -ms-layout-grid-type property."
33232                 }
33233             ],
33234             "relevance": 50,
33235             "description": "Sets or retrieves the composite document grid properties that specify the layout of text characters."
33236         },
33237         {
33238             "name": "-ms-layout-grid-char",
33239             "browsers": [
33240                 "E",
33241                 "IE10"
33242             ],
33243             "values": [
33244                 {
33245                     "name": "auto",
33246                     "description": "Largest character in the font of the element is used to set the character grid."
33247                 },
33248                 {
33249                     "name": "none",
33250                     "description": "Default. No character grid is set."
33251                 }
33252             ],
33253             "relevance": 50,
33254             "description": "Sets or retrieves the size of the character grid used for rendering the text content of an element.",
33255             "restrictions": [
33256                 "enum",
33257                 "length",
33258                 "percentage"
33259             ]
33260         },
33261         {
33262             "name": "-ms-layout-grid-line",
33263             "browsers": [
33264                 "E",
33265                 "IE10"
33266             ],
33267             "values": [
33268                 {
33269                     "name": "auto",
33270                     "description": "Largest character in the font of the element is used to set the character grid."
33271                 },
33272                 {
33273                     "name": "none",
33274                     "description": "Default. No grid line is set."
33275                 }
33276             ],
33277             "relevance": 50,
33278             "description": "Sets or retrieves the gridline value used for rendering the text content of an element.",
33279             "restrictions": [
33280                 "length"
33281             ]
33282         },
33283         {
33284             "name": "-ms-layout-grid-mode",
33285             "browsers": [
33286                 "E",
33287                 "IE10"
33288             ],
33289             "values": [
33290                 {
33291                     "name": "both",
33292                     "description": "Default. Both the char and line grid modes are enabled. This setting is necessary to fully enable the layout grid on an element."
33293                 },
33294                 {
33295                     "name": "char",
33296                     "description": "Only a character grid is used. This is recommended for use with block-level elements, such as a blockquote, where the line grid is intended to be disabled."
33297                 },
33298                 {
33299                     "name": "line",
33300                     "description": "Only a line grid is used. This is recommended for use with inline elements, such as a span, to disable the horizontal grid on runs of text that act as a single entity in the grid layout."
33301                 },
33302                 {
33303                     "name": "none",
33304                     "description": "No grid is used."
33305                 }
33306             ],
33307             "relevance": 50,
33308             "description": "Gets or sets whether the text layout grid uses two dimensions.",
33309             "restrictions": [
33310                 "enum"
33311             ]
33312         },
33313         {
33314             "name": "-ms-layout-grid-type",
33315             "browsers": [
33316                 "E",
33317                 "IE10"
33318             ],
33319             "values": [
33320                 {
33321                     "name": "fixed",
33322                     "description": "Grid used for monospaced layout. All noncursive characters are treated as equal; every character is centered within a single grid space by default."
33323                 },
33324                 {
33325                     "name": "loose",
33326                     "description": "Default. Grid used for Japanese and Korean characters."
33327                 },
33328                 {
33329                     "name": "strict",
33330                     "description": "Grid used for Chinese, as well as Japanese (Genko) and Korean characters. Only the ideographs, kanas, and wide characters are snapped to the grid."
33331                 }
33332             ],
33333             "relevance": 50,
33334             "description": "Sets or retrieves the type of grid used for rendering the text content of an element.",
33335             "restrictions": [
33336                 "enum"
33337             ]
33338         },
33339         {
33340             "name": "-ms-line-break",
33341             "browsers": [
33342                 "E",
33343                 "IE10"
33344             ],
33345             "values": [
33346                 {
33347                     "name": "auto",
33348                     "description": "The UA determines the set of line-breaking restrictions to use for CJK scripts, and it may vary the restrictions based on the length of the line; e.g., use a less restrictive set of line-break rules for short lines."
33349                 },
33350                 {
33351                     "name": "keep-all",
33352                     "description": "Sequences of CJK characters can no longer break on implied break points. This option should only be used where the presence of word separator characters still creates line-breaking opportunities, as in Korean."
33353                 },
33354                 {
33355                     "name": "newspaper",
33356                     "description": "Breaks CJK scripts using the least restrictive set of line-breaking rules. Typically used for short lines, such as in newspapers."
33357                 },
33358                 {
33359                     "name": "normal",
33360                     "description": "Breaks CJK scripts using a normal set of line-breaking rules."
33361                 },
33362                 {
33363                     "name": "strict",
33364                     "description": "Breaks CJK scripts using a more restrictive set of line-breaking rules than 'normal'."
33365                 }
33366             ],
33367             "relevance": 50,
33368             "description": "Specifies what set of line breaking restrictions are in effect within the element.",
33369             "restrictions": [
33370                 "enum"
33371             ]
33372         },
33373         {
33374             "name": "-ms-overflow-style",
33375             "browsers": [
33376                 "E",
33377                 "IE10"
33378             ],
33379             "values": [
33380                 {
33381                     "name": "auto",
33382                     "description": "No preference, UA should use the first scrolling method in the list that it supports."
33383                 },
33384                 {
33385                     "name": "-ms-autohiding-scrollbar",
33386                     "description": "Indicates the element displays auto-hiding scrollbars during mouse interactions and panning indicators during touch and keyboard interactions."
33387                 },
33388                 {
33389                     "name": "none",
33390                     "description": "Indicates the element does not display scrollbars or panning indicators, even when its content overflows."
33391                 },
33392                 {
33393                     "name": "scrollbar",
33394                     "description": "Scrollbars are typically narrow strips inserted on one or two edges of an element and which often have arrows to click on and a \"thumb\" to drag up and down (or left and right) to move the contents of the element."
33395                 }
33396             ],
33397             "status": "nonstandard",
33398             "syntax": "auto | none | scrollbar | -ms-autohiding-scrollbar",
33399             "relevance": 0,
33400             "description": "Specify whether content is clipped when it overflows the element's content area.",
33401             "restrictions": [
33402                 "enum"
33403             ]
33404         },
33405         {
33406             "name": "-ms-perspective",
33407             "browsers": [
33408                 "IE10"
33409             ],
33410             "values": [
33411                 {
33412                     "name": "none",
33413                     "description": "No perspective transform is applied."
33414                 }
33415             ],
33416             "relevance": 50,
33417             "description": "Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",
33418             "restrictions": [
33419                 "length"
33420             ]
33421         },
33422         {
33423             "name": "-ms-perspective-origin",
33424             "browsers": [
33425                 "IE10"
33426             ],
33427             "relevance": 50,
33428             "description": "Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",
33429             "restrictions": [
33430                 "position",
33431                 "percentage",
33432                 "length"
33433             ]
33434         },
33435         {
33436             "name": "-ms-perspective-origin-x",
33437             "browsers": [
33438                 "IE10"
33439             ],
33440             "relevance": 50,
33441             "description": "Establishes the origin for the perspective property. It effectively sets the X  position at which the viewer appears to be looking at the children of the element.",
33442             "restrictions": [
33443                 "position",
33444                 "percentage",
33445                 "length"
33446             ]
33447         },
33448         {
33449             "name": "-ms-perspective-origin-y",
33450             "browsers": [
33451                 "IE10"
33452             ],
33453             "relevance": 50,
33454             "description": "Establishes the origin for the perspective property. It effectively sets the Y position at which the viewer appears to be looking at the children of the element.",
33455             "restrictions": [
33456                 "position",
33457                 "percentage",
33458                 "length"
33459             ]
33460         },
33461         {
33462             "name": "-ms-progress-appearance",
33463             "browsers": [
33464                 "IE10"
33465             ],
33466             "values": [
33467                 {
33468                     "name": "bar"
33469                 },
33470                 {
33471                     "name": "ring"
33472                 }
33473             ],
33474             "relevance": 50,
33475             "description": "Gets or sets a value that specifies whether a progress control displays as a bar or a ring.",
33476             "restrictions": [
33477                 "enum"
33478             ]
33479         },
33480         {
33481             "name": "-ms-scrollbar-3dlight-color",
33482             "browsers": [
33483                 "IE8"
33484             ],
33485             "status": "nonstandard",
33486             "syntax": "<color>",
33487             "relevance": 0,
33488             "description": "Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",
33489             "restrictions": [
33490                 "color"
33491             ]
33492         },
33493         {
33494             "name": "-ms-scrollbar-arrow-color",
33495             "browsers": [
33496                 "IE8"
33497             ],
33498             "status": "nonstandard",
33499             "syntax": "<color>",
33500             "relevance": 0,
33501             "description": "Determines the color of the arrow elements of a scroll arrow.",
33502             "restrictions": [
33503                 "color"
33504             ]
33505         },
33506         {
33507             "name": "-ms-scrollbar-base-color",
33508             "browsers": [
33509                 "IE8"
33510             ],
33511             "status": "nonstandard",
33512             "syntax": "<color>",
33513             "relevance": 0,
33514             "description": "Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.",
33515             "restrictions": [
33516                 "color"
33517             ]
33518         },
33519         {
33520             "name": "-ms-scrollbar-darkshadow-color",
33521             "browsers": [
33522                 "IE8"
33523             ],
33524             "status": "nonstandard",
33525             "syntax": "<color>",
33526             "relevance": 0,
33527             "description": "Determines the color of the gutter of a scroll bar.",
33528             "restrictions": [
33529                 "color"
33530             ]
33531         },
33532         {
33533             "name": "-ms-scrollbar-face-color",
33534             "browsers": [
33535                 "IE8"
33536             ],
33537             "status": "nonstandard",
33538             "syntax": "<color>",
33539             "relevance": 0,
33540             "description": "Determines the color of the scroll box and scroll arrows of a scroll bar.",
33541             "restrictions": [
33542                 "color"
33543             ]
33544         },
33545         {
33546             "name": "-ms-scrollbar-highlight-color",
33547             "browsers": [
33548                 "IE8"
33549             ],
33550             "status": "nonstandard",
33551             "syntax": "<color>",
33552             "relevance": 0,
33553             "description": "Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",
33554             "restrictions": [
33555                 "color"
33556             ]
33557         },
33558         {
33559             "name": "-ms-scrollbar-shadow-color",
33560             "browsers": [
33561                 "IE8"
33562             ],
33563             "status": "nonstandard",
33564             "syntax": "<color>",
33565             "relevance": 0,
33566             "description": "Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.",
33567             "restrictions": [
33568                 "color"
33569             ]
33570         },
33571         {
33572             "name": "-ms-scrollbar-track-color",
33573             "browsers": [
33574                 "IE5"
33575             ],
33576             "status": "nonstandard",
33577             "syntax": "<color>",
33578             "relevance": 0,
33579             "references": [
33580                 {
33581                     "name": "MDN Reference",
33582                     "url": "https://developer.mozilla.org/docs/Web/CSS/-ms-scrollbar-track-color"
33583                 }
33584             ],
33585             "description": "Determines the color of the track element of a scroll bar.",
33586             "restrictions": [
33587                 "color"
33588             ]
33589         },
33590         {
33591             "name": "-ms-scroll-chaining",
33592             "browsers": [
33593                 "E",
33594                 "IE10"
33595             ],
33596             "values": [
33597                 {
33598                     "name": "chained"
33599                 },
33600                 {
33601                     "name": "none"
33602                 }
33603             ],
33604             "status": "nonstandard",
33605             "syntax": "chained | none",
33606             "relevance": 0,
33607             "description": "Gets or sets a value that indicates the scrolling behavior that occurs when a user hits the content boundary during a manipulation.",
33608             "restrictions": [
33609                 "enum",
33610                 "length"
33611             ]
33612         },
33613         {
33614             "name": "-ms-scroll-limit",
33615             "browsers": [
33616                 "E",
33617                 "IE10"
33618             ],
33619             "values": [
33620                 {
33621                     "name": "auto"
33622                 }
33623             ],
33624             "status": "nonstandard",
33625             "syntax": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>",
33626             "relevance": 0,
33627             "description": "Gets or sets a shorthand value that sets values for the -ms-scroll-limit-x-min, -ms-scroll-limit-y-min, -ms-scroll-limit-x-max, and -ms-scroll-limit-y-max properties.",
33628             "restrictions": [
33629                 "length"
33630             ]
33631         },
33632         {
33633             "name": "-ms-scroll-limit-x-max",
33634             "browsers": [
33635                 "E",
33636                 "IE10"
33637             ],
33638             "values": [
33639                 {
33640                     "name": "auto"
33641                 }
33642             ],
33643             "status": "nonstandard",
33644             "syntax": "auto | <length>",
33645             "relevance": 0,
33646             "description": "Gets or sets a value that specifies the maximum value for the scrollLeft property.",
33647             "restrictions": [
33648                 "length"
33649             ]
33650         },
33651         {
33652             "name": "-ms-scroll-limit-x-min",
33653             "browsers": [
33654                 "E",
33655                 "IE10"
33656             ],
33657             "status": "nonstandard",
33658             "syntax": "<length>",
33659             "relevance": 0,
33660             "description": "Gets or sets a value that specifies the minimum value for the scrollLeft property.",
33661             "restrictions": [
33662                 "length"
33663             ]
33664         },
33665         {
33666             "name": "-ms-scroll-limit-y-max",
33667             "browsers": [
33668                 "E",
33669                 "IE10"
33670             ],
33671             "values": [
33672                 {
33673                     "name": "auto"
33674                 }
33675             ],
33676             "status": "nonstandard",
33677             "syntax": "auto | <length>",
33678             "relevance": 0,
33679             "description": "Gets or sets a value that specifies the maximum value for the scrollTop property.",
33680             "restrictions": [
33681                 "length"
33682             ]
33683         },
33684         {
33685             "name": "-ms-scroll-limit-y-min",
33686             "browsers": [
33687                 "E",
33688                 "IE10"
33689             ],
33690             "status": "nonstandard",
33691             "syntax": "<length>",
33692             "relevance": 0,
33693             "description": "Gets or sets a value that specifies the minimum value for the scrollTop property.",
33694             "restrictions": [
33695                 "length"
33696             ]
33697         },
33698         {
33699             "name": "-ms-scroll-rails",
33700             "browsers": [
33701                 "E",
33702                 "IE10"
33703             ],
33704             "values": [
33705                 {
33706                     "name": "none"
33707                 },
33708                 {
33709                     "name": "railed"
33710                 }
33711             ],
33712             "status": "nonstandard",
33713             "syntax": "none | railed",
33714             "relevance": 0,
33715             "description": "Gets or sets a value that indicates whether or not small motions perpendicular to the primary axis of motion will result in either changes to both the scrollTop and scrollLeft properties or a change to the primary axis (for instance, either the scrollTop or scrollLeft properties will change, but not both).",
33716             "restrictions": [
33717                 "enum",
33718                 "length"
33719             ]
33720         },
33721         {
33722             "name": "-ms-scroll-snap-points-x",
33723             "browsers": [
33724                 "E",
33725                 "IE10"
33726             ],
33727             "values": [
33728                 {
33729                     "name": "snapInterval(100%, 100%)"
33730                 },
33731                 {
33732                     "name": "snapList()"
33733                 }
33734             ],
33735             "status": "nonstandard",
33736             "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
33737             "relevance": 0,
33738             "description": "Gets or sets a value that defines where snap-points will be located along the x-axis.",
33739             "restrictions": [
33740                 "enum"
33741             ]
33742         },
33743         {
33744             "name": "-ms-scroll-snap-points-y",
33745             "browsers": [
33746                 "E",
33747                 "IE10"
33748             ],
33749             "values": [
33750                 {
33751                     "name": "snapInterval(100%, 100%)"
33752                 },
33753                 {
33754                     "name": "snapList()"
33755                 }
33756             ],
33757             "status": "nonstandard",
33758             "syntax": "snapInterval( <length-percentage>, <length-percentage> ) | snapList( <length-percentage># )",
33759             "relevance": 0,
33760             "description": "Gets or sets a value that defines where snap-points will be located along the y-axis.",
33761             "restrictions": [
33762                 "enum"
33763             ]
33764         },
33765         {
33766             "name": "-ms-scroll-snap-type",
33767             "browsers": [
33768                 "E",
33769                 "IE10"
33770             ],
33771             "values": [
33772                 {
33773                     "name": "none",
33774                     "description": "The visual viewport of this scroll container must ignore snap points, if any, when scrolled."
33775                 },
33776                 {
33777                     "name": "mandatory",
33778                     "description": "The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations."
33779                 },
33780                 {
33781                     "name": "proximity",
33782                     "description": "The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll."
33783                 }
33784             ],
33785             "status": "nonstandard",
33786             "syntax": "none | proximity | mandatory",
33787             "relevance": 0,
33788             "description": "Gets or sets a value that defines what type of snap-point should be used for the current element. There are two type of snap-points, with the primary difference being whether or not the user is guaranteed to always stop on a snap-point.",
33789             "restrictions": [
33790                 "enum"
33791             ]
33792         },
33793         {
33794             "name": "-ms-scroll-snap-x",
33795             "browsers": [
33796                 "E",
33797                 "IE10"
33798             ],
33799             "values": [
33800                 {
33801                     "name": "mandatory"
33802                 },
33803                 {
33804                     "name": "none"
33805                 },
33806                 {
33807                     "name": "proximity"
33808                 },
33809                 {
33810                     "name": "snapInterval(100%, 100%)"
33811                 },
33812                 {
33813                     "name": "snapList()"
33814                 }
33815             ],
33816             "status": "nonstandard",
33817             "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>",
33818             "relevance": 0,
33819             "description": "Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-x properties.",
33820             "restrictions": [
33821                 "enum"
33822             ]
33823         },
33824         {
33825             "name": "-ms-scroll-snap-y",
33826             "browsers": [
33827                 "E",
33828                 "IE10"
33829             ],
33830             "values": [
33831                 {
33832                     "name": "mandatory"
33833                 },
33834                 {
33835                     "name": "none"
33836                 },
33837                 {
33838                     "name": "proximity"
33839                 },
33840                 {
33841                     "name": "snapInterval(100%, 100%)"
33842                 },
33843                 {
33844                     "name": "snapList()"
33845                 }
33846             ],
33847             "status": "nonstandard",
33848             "syntax": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>",
33849             "relevance": 0,
33850             "description": "Gets or sets a shorthand value that sets values for the -ms-scroll-snap-type and -ms-scroll-snap-points-y properties.",
33851             "restrictions": [
33852                 "enum"
33853             ]
33854         },
33855         {
33856             "name": "-ms-scroll-translation",
33857             "browsers": [
33858                 "E",
33859                 "IE10"
33860             ],
33861             "values": [
33862                 {
33863                     "name": "none"
33864                 },
33865                 {
33866                     "name": "vertical-to-horizontal"
33867                 }
33868             ],
33869             "status": "nonstandard",
33870             "syntax": "none | vertical-to-horizontal",
33871             "relevance": 0,
33872             "description": "Gets or sets a value that specifies whether vertical-to-horizontal scroll wheel translation occurs on the specified element.",
33873             "restrictions": [
33874                 "enum"
33875             ]
33876         },
33877         {
33878             "name": "-ms-text-align-last",
33879             "browsers": [
33880                 "E",
33881                 "IE8"
33882             ],
33883             "values": [
33884                 {
33885                     "name": "auto"
33886                 },
33887                 {
33888                     "name": "center",
33889                     "description": "The inline contents are centered within the line box."
33890                 },
33891                 {
33892                     "name": "justify",
33893                     "description": "The text is justified according to the method specified by the 'text-justify' property."
33894                 },
33895                 {
33896                     "name": "left",
33897                     "description": "The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."
33898                 },
33899                 {
33900                     "name": "right",
33901                     "description": "The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."
33902                 }
33903             ],
33904             "relevance": 50,
33905             "description": "Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",
33906             "restrictions": [
33907                 "enum"
33908             ]
33909         },
33910         {
33911             "name": "-ms-text-autospace",
33912             "browsers": [
33913                 "E",
33914                 "IE8"
33915             ],
33916             "values": [
33917                 {
33918                     "name": "ideograph-alpha",
33919                     "description": "Creates 1/4em extra spacing between runs of ideographic letters and non-ideographic letters, such as Latin-based, Cyrillic, Greek, Arabic or Hebrew."
33920                 },
33921                 {
33922                     "name": "ideograph-numeric",
33923                     "description": "Creates 1/4em extra spacing between runs of ideographic letters and numeric glyphs."
33924                 },
33925                 {
33926                     "name": "ideograph-parenthesis",
33927                     "description": "Creates extra spacing between normal (non wide) parenthesis and ideographs."
33928                 },
33929                 {
33930                     "name": "ideograph-space",
33931                     "description": "Extends the width of the space character while surrounded by ideographs."
33932                 },
33933                 {
33934                     "name": "none",
33935                     "description": "No extra space is created."
33936                 },
33937                 {
33938                     "name": "punctuation",
33939                     "description": "Creates extra non-breaking spacing around punctuation as required by language-specific typographic conventions."
33940                 }
33941             ],
33942             "status": "nonstandard",
33943             "syntax": "none | ideograph-alpha | ideograph-numeric | ideograph-parenthesis | ideograph-space",
33944             "relevance": 0,
33945             "description": "Determines whether or not a full-width punctuation mark character should be trimmed if it appears at the beginning of a line, so that its 'ink' lines up with the first glyph in the line above and below.",
33946             "restrictions": [
33947                 "enum"
33948             ]
33949         },
33950         {
33951             "name": "-ms-text-combine-horizontal",
33952             "browsers": [
33953                 "E",
33954                 "IE11"
33955             ],
33956             "values": [
33957                 {
33958                     "name": "all",
33959                     "description": "Attempt to typeset horizontally all consecutive characters within the box such that they take up the space of a single character within the vertical line box."
33960                 },
33961                 {
33962                     "name": "digits",
33963                     "description": "Attempt to typeset horizontally each maximal sequence of consecutive ASCII digits (U+0030–U+0039) that has as many or fewer characters than the specified integer such that it takes up the space of a single character within the vertical line box."
33964                 },
33965                 {
33966                     "name": "none",
33967                     "description": "No special processing."
33968                 }
33969             ],
33970             "relevance": 50,
33971             "description": "This property specifies the combination of multiple characters into the space of a single character.",
33972             "restrictions": [
33973                 "enum",
33974                 "integer"
33975             ]
33976         },
33977         {
33978             "name": "-ms-text-justify",
33979             "browsers": [
33980                 "E",
33981                 "IE8"
33982             ],
33983             "values": [
33984                 {
33985                     "name": "auto",
33986                     "description": "The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality."
33987                 },
33988                 {
33989                     "name": "distribute",
33990                     "description": "Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property."
33991                 },
33992                 {
33993                     "name": "inter-cluster",
33994                     "description": "Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai."
33995                 },
33996                 {
33997                     "name": "inter-ideograph",
33998                     "description": "Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages."
33999                 },
34000                 {
34001                     "name": "inter-word",
34002                     "description": "Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean."
34003                 },
34004                 {
34005                     "name": "kashida",
34006                     "description": "Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation."
34007                 }
34008             ],
34009             "relevance": 50,
34010             "description": "Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.",
34011             "restrictions": [
34012                 "enum"
34013             ]
34014         },
34015         {
34016             "name": "-ms-text-kashida-space",
34017             "browsers": [
34018                 "E",
34019                 "IE10"
34020             ],
34021             "relevance": 50,
34022             "description": "Sets or retrieves the ratio of kashida expansion to white space expansion when justifying lines of text in the object.",
34023             "restrictions": [
34024                 "percentage"
34025             ]
34026         },
34027         {
34028             "name": "-ms-text-overflow",
34029             "browsers": [
34030                 "IE10"
34031             ],
34032             "values": [
34033                 {
34034                     "name": "clip",
34035                     "description": "Clip inline content that overflows. Characters may be only partially rendered."
34036                 },
34037                 {
34038                     "name": "ellipsis",
34039                     "description": "Render an ellipsis character (U+2026) to represent clipped inline content."
34040                 }
34041             ],
34042             "relevance": 50,
34043             "description": "Text can overflow for example when it is prevented from wrapping",
34044             "restrictions": [
34045                 "enum"
34046             ]
34047         },
34048         {
34049             "name": "-ms-text-size-adjust",
34050             "browsers": [
34051                 "E",
34052                 "IE10"
34053             ],
34054             "values": [
34055                 {
34056                     "name": "auto",
34057                     "description": "Renderers must use the default size adjustment when displaying on a small device."
34058                 },
34059                 {
34060                     "name": "none",
34061                     "description": "Renderers must not do size adjustment when displaying on a small device."
34062                 }
34063             ],
34064             "relevance": 50,
34065             "description": "Specifies a size adjustment for displaying text content in mobile browsers.",
34066             "restrictions": [
34067                 "enum",
34068                 "percentage"
34069             ]
34070         },
34071         {
34072             "name": "-ms-text-underline-position",
34073             "browsers": [
34074                 "E",
34075                 "IE10"
34076             ],
34077             "values": [
34078                 {
34079                     "name": "alphabetic",
34080                     "description": "The underline is aligned with the alphabetic baseline. In this case the underline is likely to cross some descenders."
34081                 },
34082                 {
34083                     "name": "auto",
34084                     "description": "The user agent may use any algorithm to determine the underline's position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over."
34085                 },
34086                 {
34087                     "name": "over",
34088                     "description": "The underline is aligned with the 'top' (right in vertical writing) edge of the element's em-box. In this mode, an overline also switches sides."
34089                 },
34090                 {
34091                     "name": "under",
34092                     "description": "The underline is aligned with the 'bottom' (left in vertical writing) edge of the element's em-box. In this case the underline usually does not cross the descenders. This is sometimes called 'accounting' underline."
34093                 }
34094             ],
34095             "relevance": 50,
34096             "description": "Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements.This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text",
34097             "restrictions": [
34098                 "enum"
34099             ]
34100         },
34101         {
34102             "name": "-ms-touch-action",
34103             "browsers": [
34104                 "IE10"
34105             ],
34106             "values": [
34107                 {
34108                     "name": "auto",
34109                     "description": "The element is a passive element, with several exceptions."
34110                 },
34111                 {
34112                     "name": "double-tap-zoom",
34113                     "description": "The element will zoom on double-tap."
34114                 },
34115                 {
34116                     "name": "manipulation",
34117                     "description": "The element is a manipulation-causing element."
34118                 },
34119                 {
34120                     "name": "none",
34121                     "description": "The element is a manipulation-blocking element."
34122                 },
34123                 {
34124                     "name": "pan-x",
34125                     "description": "The element permits touch-driven panning on the horizontal axis. The touch pan is performed on the nearest ancestor with horizontally scrollable content."
34126                 },
34127                 {
34128                     "name": "pan-y",
34129                     "description": "The element permits touch-driven panning on the vertical axis. The touch pan is performed on the nearest ancestor with vertically scrollable content."
34130                 },
34131                 {
34132                     "name": "pinch-zoom",
34133                     "description": "The element permits pinch-zooming. The pinch-zoom is performed on the nearest ancestor with zoomable content."
34134                 }
34135             ],
34136             "relevance": 50,
34137             "description": "Gets or sets a value that indicates whether and how a given region can be manipulated by the user.",
34138             "restrictions": [
34139                 "enum"
34140             ]
34141         },
34142         {
34143             "name": "-ms-touch-select",
34144             "browsers": [
34145                 "E",
34146                 "IE10"
34147             ],
34148             "values": [
34149                 {
34150                     "name": "grippers",
34151                     "description": "Grippers are always on."
34152                 },
34153                 {
34154                     "name": "none",
34155                     "description": "Grippers are always off."
34156                 }
34157             ],
34158             "status": "nonstandard",
34159             "syntax": "grippers | none",
34160             "relevance": 0,
34161             "description": "Gets or sets a value that toggles the 'gripper' visual elements that enable touch text selection.",
34162             "restrictions": [
34163                 "enum"
34164             ]
34165         },
34166         {
34167             "name": "-ms-transform",
34168             "browsers": [
34169                 "IE9-9"
34170             ],
34171             "values": [
34172                 {
34173                     "name": "matrix()",
34174                     "description": "Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"
34175                 },
34176                 {
34177                     "name": "matrix3d()",
34178                     "description": "Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."
34179                 },
34180                 {
34181                     "name": "none"
34182                 },
34183                 {
34184                     "name": "rotate()",
34185                     "description": "Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."
34186                 },
34187                 {
34188                     "name": "rotate3d()",
34189                     "description": "Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."
34190                 },
34191                 {
34192                     "name": "rotateX('angle')",
34193                     "description": "Specifies a clockwise rotation by the given angle about the X axis."
34194                 },
34195                 {
34196                     "name": "rotateY('angle')",
34197                     "description": "Specifies a clockwise rotation by the given angle about the Y axis."
34198                 },
34199                 {
34200                     "name": "rotateZ('angle')",
34201                     "description": "Specifies a clockwise rotation by the given angle about the Z axis."
34202                 },
34203                 {
34204                     "name": "scale()",
34205                     "description": "Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."
34206                 },
34207                 {
34208                     "name": "scale3d()",
34209                     "description": "Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."
34210                 },
34211                 {
34212                     "name": "scaleX()",
34213                     "description": "Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."
34214                 },
34215                 {
34216                     "name": "scaleY()",
34217                     "description": "Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."
34218                 },
34219                 {
34220                     "name": "scaleZ()",
34221                     "description": "Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."
34222                 },
34223                 {
34224                     "name": "skew()",
34225                     "description": "Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."
34226                 },
34227                 {
34228                     "name": "skewX()",
34229                     "description": "Specifies a skew transformation along the X axis by the given angle."
34230                 },
34231                 {
34232                     "name": "skewY()",
34233                     "description": "Specifies a skew transformation along the Y axis by the given angle."
34234                 },
34235                 {
34236                     "name": "translate()",
34237                     "description": "Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."
34238                 },
34239                 {
34240                     "name": "translate3d()",
34241                     "description": "Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."
34242                 },
34243                 {
34244                     "name": "translateX()",
34245                     "description": "Specifies a translation by the given amount in the X direction."
34246                 },
34247                 {
34248                     "name": "translateY()",
34249                     "description": "Specifies a translation by the given amount in the Y direction."
34250                 },
34251                 {
34252                     "name": "translateZ()",
34253                     "description": "Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."
34254                 }
34255             ],
34256             "relevance": 50,
34257             "description": "A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",
34258             "restrictions": [
34259                 "enum"
34260             ]
34261         },
34262         {
34263             "name": "-ms-transform-origin",
34264             "browsers": [
34265                 "IE9-9"
34266             ],
34267             "relevance": 50,
34268             "description": "Establishes the origin of transformation for an element.",
34269             "restrictions": [
34270                 "position",
34271                 "length",
34272                 "percentage"
34273             ]
34274         },
34275         {
34276             "name": "-ms-transform-origin-x",
34277             "browsers": [
34278                 "IE10"
34279             ],
34280             "relevance": 50,
34281             "description": "The x coordinate of the origin for transforms applied to an element with respect to its border box.",
34282             "restrictions": [
34283                 "length",
34284                 "percentage"
34285             ]
34286         },
34287         {
34288             "name": "-ms-transform-origin-y",
34289             "browsers": [
34290                 "IE10"
34291             ],
34292             "relevance": 50,
34293             "description": "The y coordinate of the origin for transforms applied to an element with respect to its border box.",
34294             "restrictions": [
34295                 "length",
34296                 "percentage"
34297             ]
34298         },
34299         {
34300             "name": "-ms-transform-origin-z",
34301             "browsers": [
34302                 "IE10"
34303             ],
34304             "relevance": 50,
34305             "description": "The z coordinate of the origin for transforms applied to an element with respect to its border box.",
34306             "restrictions": [
34307                 "length",
34308                 "percentage"
34309             ]
34310         },
34311         {
34312             "name": "-ms-user-select",
34313             "browsers": [
34314                 "E",
34315                 "IE10"
34316             ],
34317             "values": [
34318                 {
34319                     "name": "element"
34320                 },
34321                 {
34322                     "name": "none"
34323                 },
34324                 {
34325                     "name": "text"
34326                 }
34327             ],
34328             "status": "nonstandard",
34329             "syntax": "none | element | text",
34330             "relevance": 0,
34331             "description": "Controls the appearance of selection.",
34332             "restrictions": [
34333                 "enum"
34334             ]
34335         },
34336         {
34337             "name": "-ms-word-break",
34338             "browsers": [
34339                 "IE8"
34340             ],
34341             "values": [
34342                 {
34343                     "name": "break-all",
34344                     "description": "Lines may break between any two grapheme clusters for non-CJK scripts."
34345                 },
34346                 {
34347                     "name": "keep-all",
34348                     "description": "Block characters can no longer create implied break points."
34349                 },
34350                 {
34351                     "name": "normal",
34352                     "description": "Breaks non-CJK scripts according to their own rules."
34353                 }
34354             ],
34355             "relevance": 50,
34356             "description": "Specifies line break opportunities for non-CJK scripts.",
34357             "restrictions": [
34358                 "enum"
34359             ]
34360         },
34361         {
34362             "name": "-ms-word-wrap",
34363             "browsers": [
34364                 "IE8"
34365             ],
34366             "values": [
34367                 {
34368                     "name": "break-word",
34369                     "description": "An unbreakable 'word' may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."
34370                 },
34371                 {
34372                     "name": "normal",
34373                     "description": "Lines may break only at allowed break points."
34374                 }
34375             ],
34376             "relevance": 50,
34377             "description": "Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.",
34378             "restrictions": [
34379                 "enum"
34380             ]
34381         },
34382         {
34383             "name": "-ms-wrap-flow",
34384             "browsers": [
34385                 "E",
34386                 "IE10"
34387             ],
34388             "values": [
34389                 {
34390                     "name": "auto",
34391                     "description": "For floats an exclusion is created, for all other elements an exclusion is not created."
34392                 },
34393                 {
34394                     "name": "both",
34395                     "description": "Inline flow content can flow on all sides of the exclusion."
34396                 },
34397                 {
34398                     "name": "clear",
34399                     "description": "Inline flow content can only wrap on top and bottom of the exclusion and must leave the areas to the start and end edges of the exclusion box empty."
34400                 },
34401                 {
34402                     "name": "end",
34403                     "description": "Inline flow content can wrap on the end side of the exclusion area but must leave the area to the start edge of the exclusion area empty."
34404                 },
34405                 {
34406                     "name": "maximum",
34407                     "description": "Inline flow content can wrap on the side of the exclusion with the largest available space for the given line, and must leave the other side of the exclusion empty."
34408                 },
34409                 {
34410                     "name": "minimum",
34411                     "description": "Inline flow content can flow around the edge of the exclusion with the smallest available space within the flow content’s containing block, and must leave the other edge of the exclusion empty."
34412                 },
34413                 {
34414                     "name": "start",
34415                     "description": "Inline flow content can wrap on the start edge of the exclusion area but must leave the area to end edge of the exclusion area empty."
34416                 }
34417             ],
34418             "status": "nonstandard",
34419             "syntax": "auto | both | start | end | maximum | clear",
34420             "relevance": 0,
34421             "description": "An element becomes an exclusion when its 'wrap-flow' property has a computed value other than 'auto'.",
34422             "restrictions": [
34423                 "enum"
34424             ]
34425         },
34426         {
34427             "name": "-ms-wrap-margin",
34428             "browsers": [
34429                 "E",
34430                 "IE10"
34431             ],
34432             "status": "nonstandard",
34433             "syntax": "<length>",
34434             "relevance": 0,
34435             "description": "Gets or sets a value that is used to offset the inner wrap shape from other shapes.",
34436             "restrictions": [
34437                 "length",
34438                 "percentage"
34439             ]
34440         },
34441         {
34442             "name": "-ms-wrap-through",
34443             "browsers": [
34444                 "E",
34445                 "IE10"
34446             ],
34447             "values": [
34448                 {
34449                     "name": "none",
34450                     "description": "The exclusion element does not inherit its parent node's wrapping context. Its descendants are only subject to exclusion shapes defined inside the element."
34451                 },
34452                 {
34453                     "name": "wrap",
34454                     "description": "The exclusion element inherits its parent node's wrapping context. Its descendant inline content wraps around exclusions defined outside the element."
34455                 }
34456             ],
34457             "status": "nonstandard",
34458             "syntax": "wrap | none",
34459             "relevance": 0,
34460             "description": "Specifies if an element inherits its parent wrapping context. In other words if it is subject to the exclusions defined outside the element.",
34461             "restrictions": [
34462                 "enum"
34463             ]
34464         },
34465         {
34466             "name": "-ms-writing-mode",
34467             "browsers": [
34468                 "IE8"
34469             ],
34470             "values": [
34471                 {
34472                     "name": "bt-lr"
34473                 },
34474                 {
34475                     "name": "bt-rl"
34476                 },
34477                 {
34478                     "name": "lr-bt"
34479                 },
34480                 {
34481                     "name": "lr-tb"
34482                 },
34483                 {
34484                     "name": "rl-bt"
34485                 },
34486                 {
34487                     "name": "rl-tb"
34488                 },
34489                 {
34490                     "name": "tb-lr"
34491                 },
34492                 {
34493                     "name": "tb-rl"
34494                 }
34495             ],
34496             "relevance": 50,
34497             "description": "Shorthand property for both 'direction' and 'block-progression'.",
34498             "restrictions": [
34499                 "enum"
34500             ]
34501         },
34502         {
34503             "name": "-ms-zoom",
34504             "browsers": [
34505                 "IE8"
34506             ],
34507             "values": [
34508                 {
34509                     "name": "normal"
34510                 }
34511             ],
34512             "relevance": 50,
34513             "description": "Sets or retrieves the magnification scale of the object.",
34514             "restrictions": [
34515                 "enum",
34516                 "integer",
34517                 "number",
34518                 "percentage"
34519             ]
34520         },
34521         {
34522             "name": "-ms-zoom-animation",
34523             "browsers": [
34524                 "IE10"
34525             ],
34526             "values": [
34527                 {
34528                     "name": "default"
34529                 },
34530                 {
34531                     "name": "none"
34532                 }
34533             ],
34534             "relevance": 50,
34535             "description": "Gets or sets a value that indicates whether an animation is used when zooming.",
34536             "restrictions": [
34537                 "enum"
34538             ]
34539         },
34540         {
34541             "name": "nav-down",
34542             "browsers": [
34543                 "O9.5"
34544             ],
34545             "values": [
34546                 {
34547                     "name": "auto",
34548                     "description": "The user agent automatically determines which element to navigate the focus to in response to directional navigational input."
34549                 },
34550                 {
34551                     "name": "current",
34552                     "description": "Indicates that the user agent should target the frame that the element is in."
34553                 },
34554                 {
34555                     "name": "root",
34556                     "description": "Indicates that the user agent should target the full window."
34557                 }
34558             ],
34559             "relevance": 50,
34560             "description": "Provides an way to control directional focus navigation.",
34561             "restrictions": [
34562                 "enum",
34563                 "identifier",
34564                 "string"
34565             ]
34566         },
34567         {
34568             "name": "nav-index",
34569             "browsers": [
34570                 "O9.5"
34571             ],
34572             "values": [
34573                 {
34574                     "name": "auto",
34575                     "description": "The element's sequential navigation order is assigned automatically by the user agent."
34576                 }
34577             ],
34578             "relevance": 50,
34579             "description": "Provides an input-method-neutral way of specifying the sequential navigation order (also known as 'tabbing order').",
34580             "restrictions": [
34581                 "number"
34582             ]
34583         },
34584         {
34585             "name": "nav-left",
34586             "browsers": [
34587                 "O9.5"
34588             ],
34589             "values": [
34590                 {
34591                     "name": "auto",
34592                     "description": "The user agent automatically determines which element to navigate the focus to in response to directional navigational input."
34593                 },
34594                 {
34595                     "name": "current",
34596                     "description": "Indicates that the user agent should target the frame that the element is in."
34597                 },
34598                 {
34599                     "name": "root",
34600                     "description": "Indicates that the user agent should target the full window."
34601                 }
34602             ],
34603             "relevance": 50,
34604             "description": "Provides an way to control directional focus navigation.",
34605             "restrictions": [
34606                 "enum",
34607                 "identifier",
34608                 "string"
34609             ]
34610         },
34611         {
34612             "name": "nav-right",
34613             "browsers": [
34614                 "O9.5"
34615             ],
34616             "values": [
34617                 {
34618                     "name": "auto",
34619                     "description": "The user agent automatically determines which element to navigate the focus to in response to directional navigational input."
34620                 },
34621                 {
34622                     "name": "current",
34623                     "description": "Indicates that the user agent should target the frame that the element is in."
34624                 },
34625                 {
34626                     "name": "root",
34627                     "description": "Indicates that the user agent should target the full window."
34628                 }
34629             ],
34630             "relevance": 50,
34631             "description": "Provides an way to control directional focus navigation.",
34632             "restrictions": [
34633                 "enum",
34634                 "identifier",
34635                 "string"
34636             ]
34637         },
34638         {
34639             "name": "nav-up",
34640             "browsers": [
34641                 "O9.5"
34642             ],
34643             "values": [
34644                 {
34645                     "name": "auto",
34646                     "description": "The user agent automatically determines which element to navigate the focus to in response to directional navigational input."
34647                 },
34648                 {
34649                     "name": "current",
34650                     "description": "Indicates that the user agent should target the frame that the element is in."
34651                 },
34652                 {
34653                     "name": "root",
34654                     "description": "Indicates that the user agent should target the full window."
34655                 }
34656             ],
34657             "relevance": 50,
34658             "description": "Provides an way to control directional focus navigation.",
34659             "restrictions": [
34660                 "enum",
34661                 "identifier",
34662                 "string"
34663             ]
34664         },
34665         {
34666             "name": "negative",
34667             "browsers": [
34668                 "FF33"
34669             ],
34670             "syntax": "<symbol> <symbol>?",
34671             "relevance": 50,
34672             "description": "@counter-style descriptor. Defines how to alter the representation when the counter value is negative.",
34673             "restrictions": [
34674                 "image",
34675                 "identifier",
34676                 "string"
34677             ]
34678         },
34679         {
34680             "name": "-o-animation",
34681             "browsers": [
34682                 "O12"
34683             ],
34684             "values": [
34685                 {
34686                     "name": "alternate",
34687                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
34688                 },
34689                 {
34690                     "name": "alternate-reverse",
34691                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
34692                 },
34693                 {
34694                     "name": "backwards",
34695                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
34696                 },
34697                 {
34698                     "name": "both",
34699                     "description": "Both forwards and backwards fill modes are applied."
34700                 },
34701                 {
34702                     "name": "forwards",
34703                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
34704                 },
34705                 {
34706                     "name": "infinite",
34707                     "description": "Causes the animation to repeat forever."
34708                 },
34709                 {
34710                     "name": "none",
34711                     "description": "No animation is performed"
34712                 },
34713                 {
34714                     "name": "normal",
34715                     "description": "Normal playback."
34716                 },
34717                 {
34718                     "name": "reverse",
34719                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
34720                 }
34721             ],
34722             "relevance": 50,
34723             "description": "Shorthand property combines six of the animation properties into a single property.",
34724             "restrictions": [
34725                 "time",
34726                 "enum",
34727                 "timing-function",
34728                 "identifier",
34729                 "number"
34730             ]
34731         },
34732         {
34733             "name": "-o-animation-delay",
34734             "browsers": [
34735                 "O12"
34736             ],
34737             "relevance": 50,
34738             "description": "Defines when the animation will start.",
34739             "restrictions": [
34740                 "time"
34741             ]
34742         },
34743         {
34744             "name": "-o-animation-direction",
34745             "browsers": [
34746                 "O12"
34747             ],
34748             "values": [
34749                 {
34750                     "name": "alternate",
34751                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
34752                 },
34753                 {
34754                     "name": "alternate-reverse",
34755                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
34756                 },
34757                 {
34758                     "name": "normal",
34759                     "description": "Normal playback."
34760                 },
34761                 {
34762                     "name": "reverse",
34763                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
34764                 }
34765             ],
34766             "relevance": 50,
34767             "description": "Defines whether or not the animation should play in reverse on alternate cycles.",
34768             "restrictions": [
34769                 "enum"
34770             ]
34771         },
34772         {
34773             "name": "-o-animation-duration",
34774             "browsers": [
34775                 "O12"
34776             ],
34777             "relevance": 50,
34778             "description": "Defines the length of time that an animation takes to complete one cycle.",
34779             "restrictions": [
34780                 "time"
34781             ]
34782         },
34783         {
34784             "name": "-o-animation-fill-mode",
34785             "browsers": [
34786                 "O12"
34787             ],
34788             "values": [
34789                 {
34790                     "name": "backwards",
34791                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
34792                 },
34793                 {
34794                     "name": "both",
34795                     "description": "Both forwards and backwards fill modes are applied."
34796                 },
34797                 {
34798                     "name": "forwards",
34799                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
34800                 },
34801                 {
34802                     "name": "none",
34803                     "description": "There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."
34804                 }
34805             ],
34806             "relevance": 50,
34807             "description": "Defines what values are applied by the animation outside the time it is executing.",
34808             "restrictions": [
34809                 "enum"
34810             ]
34811         },
34812         {
34813             "name": "-o-animation-iteration-count",
34814             "browsers": [
34815                 "O12"
34816             ],
34817             "values": [
34818                 {
34819                     "name": "infinite",
34820                     "description": "Causes the animation to repeat forever."
34821                 }
34822             ],
34823             "relevance": 50,
34824             "description": "Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",
34825             "restrictions": [
34826                 "number",
34827                 "enum"
34828             ]
34829         },
34830         {
34831             "name": "-o-animation-name",
34832             "browsers": [
34833                 "O12"
34834             ],
34835             "values": [
34836                 {
34837                     "name": "none",
34838                     "description": "No animation is performed"
34839                 }
34840             ],
34841             "relevance": 50,
34842             "description": "Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",
34843             "restrictions": [
34844                 "identifier",
34845                 "enum"
34846             ]
34847         },
34848         {
34849             "name": "-o-animation-play-state",
34850             "browsers": [
34851                 "O12"
34852             ],
34853             "values": [
34854                 {
34855                     "name": "paused",
34856                     "description": "A running animation will be paused."
34857                 },
34858                 {
34859                     "name": "running",
34860                     "description": "Resume playback of a paused animation."
34861                 }
34862             ],
34863             "relevance": 50,
34864             "description": "Defines whether the animation is running or paused.",
34865             "restrictions": [
34866                 "enum"
34867             ]
34868         },
34869         {
34870             "name": "-o-animation-timing-function",
34871             "browsers": [
34872                 "O12"
34873             ],
34874             "relevance": 50,
34875             "description": "Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",
34876             "restrictions": [
34877                 "timing-function"
34878             ]
34879         },
34880         {
34881             "name": "object-fit",
34882             "browsers": [
34883                 "E16",
34884                 "FF36",
34885                 "S10",
34886                 "C31",
34887                 "O19"
34888             ],
34889             "values": [
34890                 {
34891                     "name": "contain",
34892                     "description": "The replaced content is sized to maintain its aspect ratio while fitting within the element’s content box: its concrete object size is resolved as a contain constraint against the element's used width and height."
34893                 },
34894                 {
34895                     "name": "cover",
34896                     "description": "The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element’s used width and height."
34897                 },
34898                 {
34899                     "name": "fill",
34900                     "description": "The replaced content is sized to fill the element’s content box: the object's concrete object size is the element's used width and height."
34901                 },
34902                 {
34903                     "name": "none",
34904                     "description": "The replaced content is not resized to fit inside the element's content box"
34905                 },
34906                 {
34907                     "name": "scale-down",
34908                     "description": "Size the content as if ‘none’ or ‘contain’ were specified, whichever would result in a smaller concrete object size."
34909                 }
34910             ],
34911             "syntax": "fill | contain | cover | none | scale-down",
34912             "relevance": 61,
34913             "references": [
34914                 {
34915                     "name": "MDN Reference",
34916                     "url": "https://developer.mozilla.org/docs/Web/CSS/object-fit"
34917                 }
34918             ],
34919             "description": "Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.",
34920             "restrictions": [
34921                 "enum"
34922             ]
34923         },
34924         {
34925             "name": "object-position",
34926             "browsers": [
34927                 "E16",
34928                 "FF36",
34929                 "S10",
34930                 "C31",
34931                 "O19"
34932             ],
34933             "syntax": "<position>",
34934             "relevance": 52,
34935             "references": [
34936                 {
34937                     "name": "MDN Reference",
34938                     "url": "https://developer.mozilla.org/docs/Web/CSS/object-position"
34939                 }
34940             ],
34941             "description": "Determines the alignment of the replaced element inside its box.",
34942             "restrictions": [
34943                 "position",
34944                 "length",
34945                 "percentage"
34946             ]
34947         },
34948         {
34949             "name": "-o-border-image",
34950             "browsers": [
34951                 "O11.6"
34952             ],
34953             "values": [
34954                 {
34955                     "name": "auto",
34956                     "description": "If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."
34957                 },
34958                 {
34959                     "name": "fill",
34960                     "description": "Causes the middle part of the border-image to be preserved."
34961                 },
34962                 {
34963                     "name": "none"
34964                 },
34965                 {
34966                     "name": "repeat",
34967                     "description": "The image is tiled (repeated) to fill the area."
34968                 },
34969                 {
34970                     "name": "round",
34971                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."
34972                 },
34973                 {
34974                     "name": "space",
34975                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."
34976                 },
34977                 {
34978                     "name": "stretch",
34979                     "description": "The image is stretched to fill the area."
34980                 }
34981             ],
34982             "relevance": 50,
34983             "description": "Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",
34984             "restrictions": [
34985                 "length",
34986                 "percentage",
34987                 "number",
34988                 "image",
34989                 "enum"
34990             ]
34991         },
34992         {
34993             "name": "-o-object-fit",
34994             "browsers": [
34995                 "O10.6"
34996             ],
34997             "values": [
34998                 {
34999                     "name": "contain",
35000                     "description": "The replaced content is sized to maintain its aspect ratio while fitting within the element’s content box: its concrete object size is resolved as a contain constraint against the element's used width and height."
35001                 },
35002                 {
35003                     "name": "cover",
35004                     "description": "The replaced content is sized to maintain its aspect ratio while filling the element's entire content box: its concrete object size is resolved as a cover constraint against the element’s used width and height."
35005                 },
35006                 {
35007                     "name": "fill",
35008                     "description": "The replaced content is sized to fill the element’s content box: the object's concrete object size is the element's used width and height."
35009                 },
35010                 {
35011                     "name": "none",
35012                     "description": "The replaced content is not resized to fit inside the element's content box"
35013                 },
35014                 {
35015                     "name": "scale-down",
35016                     "description": "Size the content as if ‘none’ or ‘contain’ were specified, whichever would result in a smaller concrete object size."
35017                 }
35018             ],
35019             "relevance": 50,
35020             "description": "Specifies how the contents of a replaced element should be scaled relative to the box established by its used height and width.",
35021             "restrictions": [
35022                 "enum"
35023             ]
35024         },
35025         {
35026             "name": "-o-object-position",
35027             "browsers": [
35028                 "O10.6"
35029             ],
35030             "relevance": 50,
35031             "description": "Determines the alignment of the replaced element inside its box.",
35032             "restrictions": [
35033                 "position",
35034                 "length",
35035                 "percentage"
35036             ]
35037         },
35038         {
35039             "name": "opacity",
35040             "syntax": "<alpha-value>",
35041             "relevance": 93,
35042             "references": [
35043                 {
35044                     "name": "MDN Reference",
35045                     "url": "https://developer.mozilla.org/docs/Web/CSS/opacity"
35046                 }
35047             ],
35048             "description": "Opacity of an element's text, where 1 is opaque and 0 is entirely transparent.",
35049             "restrictions": [
35050                 "number(0-1)"
35051             ]
35052         },
35053         {
35054             "name": "order",
35055             "syntax": "<integer>",
35056             "relevance": 61,
35057             "references": [
35058                 {
35059                     "name": "MDN Reference",
35060                     "url": "https://developer.mozilla.org/docs/Web/CSS/order"
35061                 }
35062             ],
35063             "description": "Controls the order in which children of a flex container appear within the flex container, by assigning them to ordinal groups.",
35064             "restrictions": [
35065                 "integer"
35066             ]
35067         },
35068         {
35069             "name": "orphans",
35070             "browsers": [
35071                 "E12",
35072                 "S1.3",
35073                 "C25",
35074                 "IE8",
35075                 "O9.2"
35076             ],
35077             "syntax": "<integer>",
35078             "relevance": 51,
35079             "references": [
35080                 {
35081                     "name": "MDN Reference",
35082                     "url": "https://developer.mozilla.org/docs/Web/CSS/orphans"
35083                 }
35084             ],
35085             "description": "Specifies the minimum number of line boxes in a block container that must be left in a fragment before a fragmentation break.",
35086             "restrictions": [
35087                 "integer"
35088             ]
35089         },
35090         {
35091             "name": "-o-table-baseline",
35092             "browsers": [
35093                 "O9.6"
35094             ],
35095             "relevance": 50,
35096             "description": "Determines which row of a inline-table should be used as baseline of inline-table.",
35097             "restrictions": [
35098                 "integer"
35099             ]
35100         },
35101         {
35102             "name": "-o-tab-size",
35103             "browsers": [
35104                 "O10.6"
35105             ],
35106             "relevance": 50,
35107             "description": "This property determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.",
35108             "restrictions": [
35109                 "integer",
35110                 "length"
35111             ]
35112         },
35113         {
35114             "name": "-o-text-overflow",
35115             "browsers": [
35116                 "O10"
35117             ],
35118             "values": [
35119                 {
35120                     "name": "clip",
35121                     "description": "Clip inline content that overflows. Characters may be only partially rendered."
35122                 },
35123                 {
35124                     "name": "ellipsis",
35125                     "description": "Render an ellipsis character (U+2026) to represent clipped inline content."
35126                 }
35127             ],
35128             "relevance": 50,
35129             "description": "Text can overflow for example when it is prevented from wrapping",
35130             "restrictions": [
35131                 "enum"
35132             ]
35133         },
35134         {
35135             "name": "-o-transform",
35136             "browsers": [
35137                 "O10.5"
35138             ],
35139             "values": [
35140                 {
35141                     "name": "matrix()",
35142                     "description": "Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"
35143                 },
35144                 {
35145                     "name": "matrix3d()",
35146                     "description": "Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."
35147                 },
35148                 {
35149                     "name": "none"
35150                 },
35151                 {
35152                     "name": "rotate()",
35153                     "description": "Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."
35154                 },
35155                 {
35156                     "name": "rotate3d()",
35157                     "description": "Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."
35158                 },
35159                 {
35160                     "name": "rotateX('angle')",
35161                     "description": "Specifies a clockwise rotation by the given angle about the X axis."
35162                 },
35163                 {
35164                     "name": "rotateY('angle')",
35165                     "description": "Specifies a clockwise rotation by the given angle about the Y axis."
35166                 },
35167                 {
35168                     "name": "rotateZ('angle')",
35169                     "description": "Specifies a clockwise rotation by the given angle about the Z axis."
35170                 },
35171                 {
35172                     "name": "scale()",
35173                     "description": "Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."
35174                 },
35175                 {
35176                     "name": "scale3d()",
35177                     "description": "Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."
35178                 },
35179                 {
35180                     "name": "scaleX()",
35181                     "description": "Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."
35182                 },
35183                 {
35184                     "name": "scaleY()",
35185                     "description": "Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."
35186                 },
35187                 {
35188                     "name": "scaleZ()",
35189                     "description": "Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."
35190                 },
35191                 {
35192                     "name": "skew()",
35193                     "description": "Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."
35194                 },
35195                 {
35196                     "name": "skewX()",
35197                     "description": "Specifies a skew transformation along the X axis by the given angle."
35198                 },
35199                 {
35200                     "name": "skewY()",
35201                     "description": "Specifies a skew transformation along the Y axis by the given angle."
35202                 },
35203                 {
35204                     "name": "translate()",
35205                     "description": "Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."
35206                 },
35207                 {
35208                     "name": "translate3d()",
35209                     "description": "Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."
35210                 },
35211                 {
35212                     "name": "translateX()",
35213                     "description": "Specifies a translation by the given amount in the X direction."
35214                 },
35215                 {
35216                     "name": "translateY()",
35217                     "description": "Specifies a translation by the given amount in the Y direction."
35218                 },
35219                 {
35220                     "name": "translateZ()",
35221                     "description": "Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."
35222                 }
35223             ],
35224             "relevance": 50,
35225             "description": "A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",
35226             "restrictions": [
35227                 "enum"
35228             ]
35229         },
35230         {
35231             "name": "-o-transform-origin",
35232             "browsers": [
35233                 "O10.5"
35234             ],
35235             "relevance": 50,
35236             "description": "Establishes the origin of transformation for an element.",
35237             "restrictions": [
35238                 "positon",
35239                 "length",
35240                 "percentage"
35241             ]
35242         },
35243         {
35244             "name": "-o-transition",
35245             "browsers": [
35246                 "O11.5"
35247             ],
35248             "values": [
35249                 {
35250                     "name": "all",
35251                     "description": "Every property that is able to undergo a transition will do so."
35252                 },
35253                 {
35254                     "name": "none",
35255                     "description": "No property will transition."
35256                 }
35257             ],
35258             "relevance": 50,
35259             "description": "Shorthand property combines four of the transition properties into a single property.",
35260             "restrictions": [
35261                 "time",
35262                 "property",
35263                 "timing-function",
35264                 "enum"
35265             ]
35266         },
35267         {
35268             "name": "-o-transition-delay",
35269             "browsers": [
35270                 "O11.5"
35271             ],
35272             "relevance": 50,
35273             "description": "Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",
35274             "restrictions": [
35275                 "time"
35276             ]
35277         },
35278         {
35279             "name": "-o-transition-duration",
35280             "browsers": [
35281                 "O11.5"
35282             ],
35283             "relevance": 50,
35284             "description": "Specifies how long the transition from the old value to the new value should take.",
35285             "restrictions": [
35286                 "time"
35287             ]
35288         },
35289         {
35290             "name": "-o-transition-property",
35291             "browsers": [
35292                 "O11.5"
35293             ],
35294             "values": [
35295                 {
35296                     "name": "all",
35297                     "description": "Every property that is able to undergo a transition will do so."
35298                 },
35299                 {
35300                     "name": "none",
35301                     "description": "No property will transition."
35302                 }
35303             ],
35304             "relevance": 50,
35305             "description": "Specifies the name of the CSS property to which the transition is applied.",
35306             "restrictions": [
35307                 "property"
35308             ]
35309         },
35310         {
35311             "name": "-o-transition-timing-function",
35312             "browsers": [
35313                 "O11.5"
35314             ],
35315             "relevance": 50,
35316             "description": "Describes how the intermediate values used during a transition will be calculated.",
35317             "restrictions": [
35318                 "timing-function"
35319             ]
35320         },
35321         {
35322             "name": "offset-block-end",
35323             "browsers": [
35324                 "FF41"
35325             ],
35326             "values": [
35327                 {
35328                     "name": "auto",
35329                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."
35330                 }
35331             ],
35332             "relevance": 50,
35333             "description": "Logical 'bottom'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35334             "restrictions": [
35335                 "length",
35336                 "percentage"
35337             ]
35338         },
35339         {
35340             "name": "offset-block-start",
35341             "browsers": [
35342                 "FF41"
35343             ],
35344             "values": [
35345                 {
35346                     "name": "auto",
35347                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."
35348                 }
35349             ],
35350             "relevance": 50,
35351             "description": "Logical 'top'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35352             "restrictions": [
35353                 "length",
35354                 "percentage"
35355             ]
35356         },
35357         {
35358             "name": "offset-inline-end",
35359             "browsers": [
35360                 "FF41"
35361             ],
35362             "values": [
35363                 {
35364                     "name": "auto",
35365                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."
35366                 }
35367             ],
35368             "relevance": 50,
35369             "description": "Logical 'right'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35370             "restrictions": [
35371                 "length",
35372                 "percentage"
35373             ]
35374         },
35375         {
35376             "name": "offset-inline-start",
35377             "browsers": [
35378                 "FF41"
35379             ],
35380             "values": [
35381                 {
35382                     "name": "auto",
35383                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well."
35384                 }
35385             ],
35386             "relevance": 50,
35387             "description": "Logical 'left'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35388             "restrictions": [
35389                 "length",
35390                 "percentage"
35391             ]
35392         },
35393         {
35394             "name": "outline",
35395             "values": [
35396                 {
35397                     "name": "auto",
35398                     "description": "Permits the user agent to render a custom outline style, typically the default platform style."
35399                 },
35400                 {
35401                     "name": "invert",
35402                     "description": "Performs a color inversion on the pixels on the screen."
35403                 }
35404             ],
35405             "syntax": "[ <'outline-color'> || <'outline-style'> || <'outline-width'> ]",
35406             "relevance": 87,
35407             "references": [
35408                 {
35409                     "name": "MDN Reference",
35410                     "url": "https://developer.mozilla.org/docs/Web/CSS/outline"
35411                 }
35412             ],
35413             "description": "Shorthand property for 'outline-style', 'outline-width', and 'outline-color'.",
35414             "restrictions": [
35415                 "length",
35416                 "line-width",
35417                 "line-style",
35418                 "color",
35419                 "enum"
35420             ]
35421         },
35422         {
35423             "name": "outline-color",
35424             "values": [
35425                 {
35426                     "name": "invert",
35427                     "description": "Performs a color inversion on the pixels on the screen."
35428                 }
35429             ],
35430             "syntax": "<color> | invert",
35431             "relevance": 53,
35432             "references": [
35433                 {
35434                     "name": "MDN Reference",
35435                     "url": "https://developer.mozilla.org/docs/Web/CSS/outline-color"
35436                 }
35437             ],
35438             "description": "The color of the outline.",
35439             "restrictions": [
35440                 "enum",
35441                 "color"
35442             ]
35443         },
35444         {
35445             "name": "outline-offset",
35446             "browsers": [
35447                 "E15",
35448                 "FF1.5",
35449                 "S1.2",
35450                 "C1",
35451                 "O9.5"
35452             ],
35453             "syntax": "<length>",
35454             "relevance": 59,
35455             "references": [
35456                 {
35457                     "name": "MDN Reference",
35458                     "url": "https://developer.mozilla.org/docs/Web/CSS/outline-offset"
35459                 }
35460             ],
35461             "description": "Offset the outline and draw it beyond the border edge.",
35462             "restrictions": [
35463                 "length"
35464             ]
35465         },
35466         {
35467             "name": "outline-style",
35468             "values": [
35469                 {
35470                     "name": "auto",
35471                     "description": "Permits the user agent to render a custom outline style, typically the default platform style."
35472                 }
35473             ],
35474             "syntax": "auto | <'border-style'>",
35475             "relevance": 60,
35476             "references": [
35477                 {
35478                     "name": "MDN Reference",
35479                     "url": "https://developer.mozilla.org/docs/Web/CSS/outline-style"
35480                 }
35481             ],
35482             "description": "Style of the outline.",
35483             "restrictions": [
35484                 "line-style",
35485                 "enum"
35486             ]
35487         },
35488         {
35489             "name": "outline-width",
35490             "syntax": "<line-width>",
35491             "relevance": 60,
35492             "references": [
35493                 {
35494                     "name": "MDN Reference",
35495                     "url": "https://developer.mozilla.org/docs/Web/CSS/outline-width"
35496                 }
35497             ],
35498             "description": "Width of the outline.",
35499             "restrictions": [
35500                 "length",
35501                 "line-width"
35502             ]
35503         },
35504         {
35505             "name": "overflow",
35506             "values": [
35507                 {
35508                     "name": "auto",
35509                     "description": "The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."
35510                 },
35511                 {
35512                     "name": "hidden",
35513                     "description": "Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."
35514                 },
35515                 {
35516                     "name": "-moz-hidden-unscrollable",
35517                     "description": "Same as the standardized 'clip', except doesn’t establish a block formatting context."
35518                 },
35519                 {
35520                     "name": "scroll",
35521                     "description": "Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."
35522                 },
35523                 {
35524                     "name": "visible",
35525                     "description": "Content is not clipped, i.e., it may be rendered outside the content box."
35526                 }
35527             ],
35528             "syntax": "[ visible | hidden | clip | scroll | auto ]{1,2}",
35529             "relevance": 92,
35530             "references": [
35531                 {
35532                     "name": "MDN Reference",
35533                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow"
35534                 }
35535             ],
35536             "description": "Shorthand for setting 'overflow-x' and 'overflow-y'.",
35537             "restrictions": [
35538                 "enum"
35539             ]
35540         },
35541         {
35542             "name": "overflow-wrap",
35543             "values": [
35544                 {
35545                     "name": "break-word",
35546                     "description": "An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."
35547                 },
35548                 {
35549                     "name": "normal",
35550                     "description": "Lines may break only at allowed break points."
35551                 }
35552             ],
35553             "syntax": "normal | break-word | anywhere",
35554             "relevance": 63,
35555             "references": [
35556                 {
35557                     "name": "MDN Reference",
35558                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
35559                 }
35560             ],
35561             "description": "Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit within the line box.",
35562             "restrictions": [
35563                 "enum"
35564             ]
35565         },
35566         {
35567             "name": "overflow-x",
35568             "values": [
35569                 {
35570                     "name": "auto",
35571                     "description": "The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."
35572                 },
35573                 {
35574                     "name": "hidden",
35575                     "description": "Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."
35576                 },
35577                 {
35578                     "name": "scroll",
35579                     "description": "Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."
35580                 },
35581                 {
35582                     "name": "visible",
35583                     "description": "Content is not clipped, i.e., it may be rendered outside the content box."
35584                 }
35585             ],
35586             "syntax": "visible | hidden | clip | scroll | auto",
35587             "relevance": 79,
35588             "references": [
35589                 {
35590                     "name": "MDN Reference",
35591                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-x"
35592                 }
35593             ],
35594             "description": "Specifies the handling of overflow in the horizontal direction.",
35595             "restrictions": [
35596                 "enum"
35597             ]
35598         },
35599         {
35600             "name": "overflow-y",
35601             "values": [
35602                 {
35603                     "name": "auto",
35604                     "description": "The behavior of the 'auto' value is UA-dependent, but should cause a scrolling mechanism to be provided for overflowing boxes."
35605                 },
35606                 {
35607                     "name": "hidden",
35608                     "description": "Content is clipped and no scrolling mechanism should be provided to view the content outside the clipping region."
35609                 },
35610                 {
35611                     "name": "scroll",
35612                     "description": "Content is clipped and if the user agent uses a scrolling mechanism that is visible on the screen (such as a scroll bar or a panner), that mechanism should be displayed for a box whether or not any of its content is clipped."
35613                 },
35614                 {
35615                     "name": "visible",
35616                     "description": "Content is not clipped, i.e., it may be rendered outside the content box."
35617                 }
35618             ],
35619             "syntax": "visible | hidden | clip | scroll | auto",
35620             "relevance": 81,
35621             "references": [
35622                 {
35623                     "name": "MDN Reference",
35624                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-y"
35625                 }
35626             ],
35627             "description": "Specifies the handling of overflow in the vertical direction.",
35628             "restrictions": [
35629                 "enum"
35630             ]
35631         },
35632         {
35633             "name": "pad",
35634             "browsers": [
35635                 "FF33"
35636             ],
35637             "syntax": "<integer> && <symbol>",
35638             "relevance": 50,
35639             "description": "@counter-style descriptor. Specifies a “fixed-width” counter style, where representations shorter than the pad value are padded with a particular <symbol>",
35640             "restrictions": [
35641                 "integer",
35642                 "image",
35643                 "string",
35644                 "identifier"
35645             ]
35646         },
35647         {
35648             "name": "padding",
35649             "values": [],
35650             "syntax": "[ <length> | <percentage> ]{1,4}",
35651             "relevance": 96,
35652             "references": [
35653                 {
35654                     "name": "MDN Reference",
35655                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding"
35656                 }
35657             ],
35658             "description": "Shorthand property to set values the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",
35659             "restrictions": [
35660                 "length",
35661                 "percentage"
35662             ]
35663         },
35664         {
35665             "name": "padding-bottom",
35666             "syntax": "<length> | <percentage>",
35667             "relevance": 88,
35668             "references": [
35669                 {
35670                     "name": "MDN Reference",
35671                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-bottom"
35672                 }
35673             ],
35674             "description": "Shorthand property to set values the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",
35675             "restrictions": [
35676                 "length",
35677                 "percentage"
35678             ]
35679         },
35680         {
35681             "name": "padding-block-end",
35682             "browsers": [
35683                 "E79",
35684                 "FF41",
35685                 "S12.1",
35686                 "C69",
35687                 "O56"
35688             ],
35689             "syntax": "<'padding-left'>",
35690             "relevance": 50,
35691             "references": [
35692                 {
35693                     "name": "MDN Reference",
35694                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-end"
35695                 }
35696             ],
35697             "description": "Logical 'padding-bottom'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35698             "restrictions": [
35699                 "length",
35700                 "percentage"
35701             ]
35702         },
35703         {
35704             "name": "padding-block-start",
35705             "browsers": [
35706                 "E79",
35707                 "FF41",
35708                 "S12.1",
35709                 "C69",
35710                 "O56"
35711             ],
35712             "syntax": "<'padding-left'>",
35713             "relevance": 50,
35714             "references": [
35715                 {
35716                     "name": "MDN Reference",
35717                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-block-start"
35718                 }
35719             ],
35720             "description": "Logical 'padding-top'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35721             "restrictions": [
35722                 "length",
35723                 "percentage"
35724             ]
35725         },
35726         {
35727             "name": "padding-inline-end",
35728             "browsers": [
35729                 "E79",
35730                 "FF41",
35731                 "S12.1",
35732                 "C69",
35733                 "O56"
35734             ],
35735             "syntax": "<'padding-left'>",
35736             "relevance": 51,
35737             "references": [
35738                 {
35739                     "name": "MDN Reference",
35740                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-end"
35741                 }
35742             ],
35743             "description": "Logical 'padding-right'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35744             "restrictions": [
35745                 "length",
35746                 "percentage"
35747             ]
35748         },
35749         {
35750             "name": "padding-inline-start",
35751             "browsers": [
35752                 "E79",
35753                 "FF41",
35754                 "S12.1",
35755                 "C69",
35756                 "O56"
35757             ],
35758             "syntax": "<'padding-left'>",
35759             "relevance": 52,
35760             "references": [
35761                 {
35762                     "name": "MDN Reference",
35763                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline-start"
35764                 }
35765             ],
35766             "description": "Logical 'padding-left'. Mapping depends on the parent element’s 'writing-mode', 'direction', and 'text-orientation'.",
35767             "restrictions": [
35768                 "length",
35769                 "percentage"
35770             ]
35771         },
35772         {
35773             "name": "padding-left",
35774             "syntax": "<length> | <percentage>",
35775             "relevance": 90,
35776             "references": [
35777                 {
35778                     "name": "MDN Reference",
35779                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-left"
35780                 }
35781             ],
35782             "description": "Shorthand property to set values the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",
35783             "restrictions": [
35784                 "length",
35785                 "percentage"
35786             ]
35787         },
35788         {
35789             "name": "padding-right",
35790             "syntax": "<length> | <percentage>",
35791             "relevance": 88,
35792             "references": [
35793                 {
35794                     "name": "MDN Reference",
35795                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-right"
35796                 }
35797             ],
35798             "description": "Shorthand property to set values the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",
35799             "restrictions": [
35800                 "length",
35801                 "percentage"
35802             ]
35803         },
35804         {
35805             "name": "padding-top",
35806             "syntax": "<length> | <percentage>",
35807             "relevance": 90,
35808             "references": [
35809                 {
35810                     "name": "MDN Reference",
35811                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-top"
35812                 }
35813             ],
35814             "description": "Shorthand property to set values the thickness of the padding area. If left is omitted, it is the same as right. If bottom is omitted it is the same as top, if right is omitted it is the same as top. The value may not be negative.",
35815             "restrictions": [
35816                 "length",
35817                 "percentage"
35818             ]
35819         },
35820         {
35821             "name": "page-break-after",
35822             "values": [
35823                 {
35824                     "name": "always",
35825                     "description": "Always force a page break after the generated box."
35826                 },
35827                 {
35828                     "name": "auto",
35829                     "description": "Neither force nor forbid a page break after generated box."
35830                 },
35831                 {
35832                     "name": "avoid",
35833                     "description": "Avoid a page break after the generated box."
35834                 },
35835                 {
35836                     "name": "left",
35837                     "description": "Force one or two page breaks after the generated box so that the next page is formatted as a left page."
35838                 },
35839                 {
35840                     "name": "right",
35841                     "description": "Force one or two page breaks after the generated box so that the next page is formatted as a right page."
35842                 }
35843             ],
35844             "syntax": "auto | always | avoid | left | right | recto | verso",
35845             "relevance": 52,
35846             "references": [
35847                 {
35848                     "name": "MDN Reference",
35849                     "url": "https://developer.mozilla.org/docs/Web/CSS/page-break-after"
35850                 }
35851             ],
35852             "description": "Defines rules for page breaks after an element.",
35853             "restrictions": [
35854                 "enum"
35855             ]
35856         },
35857         {
35858             "name": "page-break-before",
35859             "values": [
35860                 {
35861                     "name": "always",
35862                     "description": "Always force a page break before the generated box."
35863                 },
35864                 {
35865                     "name": "auto",
35866                     "description": "Neither force nor forbid a page break before the generated box."
35867                 },
35868                 {
35869                     "name": "avoid",
35870                     "description": "Avoid a page break before the generated box."
35871                 },
35872                 {
35873                     "name": "left",
35874                     "description": "Force one or two page breaks before the generated box so that the next page is formatted as a left page."
35875                 },
35876                 {
35877                     "name": "right",
35878                     "description": "Force one or two page breaks before the generated box so that the next page is formatted as a right page."
35879                 }
35880             ],
35881             "syntax": "auto | always | avoid | left | right | recto | verso",
35882             "relevance": 50,
35883             "references": [
35884                 {
35885                     "name": "MDN Reference",
35886                     "url": "https://developer.mozilla.org/docs/Web/CSS/page-break-before"
35887                 }
35888             ],
35889             "description": "Defines rules for page breaks before an element.",
35890             "restrictions": [
35891                 "enum"
35892             ]
35893         },
35894         {
35895             "name": "page-break-inside",
35896             "values": [
35897                 {
35898                     "name": "auto",
35899                     "description": "Neither force nor forbid a page break inside the generated box."
35900                 },
35901                 {
35902                     "name": "avoid",
35903                     "description": "Avoid a page break inside the generated box."
35904                 }
35905             ],
35906             "syntax": "auto | avoid",
35907             "relevance": 52,
35908             "references": [
35909                 {
35910                     "name": "MDN Reference",
35911                     "url": "https://developer.mozilla.org/docs/Web/CSS/page-break-inside"
35912                 }
35913             ],
35914             "description": "Defines rules for page breaks inside an element.",
35915             "restrictions": [
35916                 "enum"
35917             ]
35918         },
35919         {
35920             "name": "paint-order",
35921             "browsers": [
35922                 "E17",
35923                 "FF60",
35924                 "S8",
35925                 "C35",
35926                 "O22"
35927             ],
35928             "values": [
35929                 {
35930                     "name": "fill"
35931                 },
35932                 {
35933                     "name": "markers"
35934                 },
35935                 {
35936                     "name": "normal",
35937                     "description": "The element is painted with the standard order of painting operations: the 'fill' is painted first, then its 'stroke' and finally its markers."
35938                 },
35939                 {
35940                     "name": "stroke"
35941                 }
35942             ],
35943             "syntax": "normal | [ fill || stroke || markers ]",
35944             "relevance": 50,
35945             "references": [
35946                 {
35947                     "name": "MDN Reference",
35948                     "url": "https://developer.mozilla.org/docs/Web/CSS/paint-order"
35949                 }
35950             ],
35951             "description": "Controls the order that the three paint operations that shapes and text are rendered with: their fill, their stroke and any markers they might have.",
35952             "restrictions": [
35953                 "enum"
35954             ]
35955         },
35956         {
35957             "name": "perspective",
35958             "values": [
35959                 {
35960                     "name": "none",
35961                     "description": "No perspective transform is applied."
35962                 }
35963             ],
35964             "syntax": "none | <length>",
35965             "relevance": 55,
35966             "references": [
35967                 {
35968                     "name": "MDN Reference",
35969                     "url": "https://developer.mozilla.org/docs/Web/CSS/perspective"
35970                 }
35971             ],
35972             "description": "Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",
35973             "restrictions": [
35974                 "length",
35975                 "enum"
35976             ]
35977         },
35978         {
35979             "name": "perspective-origin",
35980             "syntax": "<position>",
35981             "relevance": 51,
35982             "references": [
35983                 {
35984                     "name": "MDN Reference",
35985                     "url": "https://developer.mozilla.org/docs/Web/CSS/perspective-origin"
35986                 }
35987             ],
35988             "description": "Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",
35989             "restrictions": [
35990                 "position",
35991                 "percentage",
35992                 "length"
35993             ]
35994         },
35995         {
35996             "name": "pointer-events",
35997             "values": [
35998                 {
35999                     "name": "all",
36000                     "description": "The given element can be the target element for pointer events whenever the pointer is over either the interior or the perimeter of the element."
36001                 },
36002                 {
36003                     "name": "fill",
36004                     "description": "The given element can be the target element for pointer events whenever the pointer is over the interior of the element."
36005                 },
36006                 {
36007                     "name": "none",
36008                     "description": "The given element does not receive pointer events."
36009                 },
36010                 {
36011                     "name": "painted",
36012                     "description": "The given element can be the target element for pointer events when the pointer is over a \"painted\" area. "
36013                 },
36014                 {
36015                     "name": "stroke",
36016                     "description": "The given element can be the target element for pointer events whenever the pointer is over the perimeter of the element."
36017                 },
36018                 {
36019                     "name": "visible",
36020                     "description": "The given element can be the target element for pointer events when the ‘visibility’ property is set to visible and the pointer is over either the interior or the perimete of the element."
36021                 },
36022                 {
36023                     "name": "visibleFill",
36024                     "description": "The given element can be the target element for pointer events when the ‘visibility’ property is set to visible and when the pointer is over the interior of the element."
36025                 },
36026                 {
36027                     "name": "visiblePainted",
36028                     "description": "The given element can be the target element for pointer events when the ‘visibility’ property is set to visible and when the pointer is over a ‘painted’ area."
36029                 },
36030                 {
36031                     "name": "visibleStroke",
36032                     "description": "The given element can be the target element for pointer events when the ‘visibility’ property is set to visible and when the pointer is over the perimeter of the element."
36033                 }
36034             ],
36035             "syntax": "auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit",
36036             "relevance": 80,
36037             "references": [
36038                 {
36039                     "name": "MDN Reference",
36040                     "url": "https://developer.mozilla.org/docs/Web/CSS/pointer-events"
36041                 }
36042             ],
36043             "description": "Specifies under what circumstances a given element can be the target element for a pointer event.",
36044             "restrictions": [
36045                 "enum"
36046             ]
36047         },
36048         {
36049             "name": "position",
36050             "values": [
36051                 {
36052                     "name": "absolute",
36053                     "description": "The box's position (and possibly size) is specified with the 'top', 'right', 'bottom', and 'left' properties. These properties specify offsets with respect to the box's 'containing block'."
36054                 },
36055                 {
36056                     "name": "fixed",
36057                     "description": "The box's position is calculated according to the 'absolute' model, but in addition, the box is fixed with respect to some reference. As with the 'absolute' model, the box's margins do not collapse with any other margins."
36058                 },
36059                 {
36060                     "name": "-ms-page",
36061                     "description": "The box's position is calculated according to the 'absolute' model."
36062                 },
36063                 {
36064                     "name": "relative",
36065                     "description": "The box's position is calculated according to the normal flow (this is called the position in normal flow). Then the box is offset relative to its normal position."
36066                 },
36067                 {
36068                     "name": "static",
36069                     "description": "The box is a normal box, laid out according to the normal flow. The 'top', 'right', 'bottom', and 'left' properties do not apply."
36070                 },
36071                 {
36072                     "name": "sticky",
36073                     "description": "The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes."
36074                 },
36075                 {
36076                     "name": "-webkit-sticky",
36077                     "description": "The box's position is calculated according to the normal flow. Then the box is offset relative to its flow root and containing block and in all cases, including table elements, does not affect the position of any following boxes."
36078                 }
36079             ],
36080             "syntax": "static | relative | absolute | sticky | fixed",
36081             "relevance": 96,
36082             "references": [
36083                 {
36084                     "name": "MDN Reference",
36085                     "url": "https://developer.mozilla.org/docs/Web/CSS/position"
36086                 }
36087             ],
36088             "description": "The position CSS property sets how an element is positioned in a document. The top, right, bottom, and left properties determine the final location of positioned elements.",
36089             "restrictions": [
36090                 "enum"
36091             ]
36092         },
36093         {
36094             "name": "prefix",
36095             "browsers": [
36096                 "FF33"
36097             ],
36098             "syntax": "<symbol>",
36099             "relevance": 50,
36100             "description": "@counter-style descriptor. Specifies a <symbol> that is prepended to the marker representation.",
36101             "restrictions": [
36102                 "image",
36103                 "string",
36104                 "identifier"
36105             ]
36106         },
36107         {
36108             "name": "quotes",
36109             "values": [
36110                 {
36111                     "name": "none",
36112                     "description": "The 'open-quote' and 'close-quote' values of the 'content' property produce no quotations marks, as if they were 'no-open-quote' and 'no-close-quote' respectively."
36113                 }
36114             ],
36115             "syntax": "none | auto | [ <string> <string> ]+",
36116             "relevance": 53,
36117             "references": [
36118                 {
36119                     "name": "MDN Reference",
36120                     "url": "https://developer.mozilla.org/docs/Web/CSS/quotes"
36121                 }
36122             ],
36123             "description": "Specifies quotation marks for any number of embedded quotations.",
36124             "restrictions": [
36125                 "string"
36126             ]
36127         },
36128         {
36129             "name": "range",
36130             "browsers": [
36131                 "FF33"
36132             ],
36133             "values": [
36134                 {
36135                     "name": "auto",
36136                     "description": "The range depends on the counter system."
36137                 },
36138                 {
36139                     "name": "infinite",
36140                     "description": "If used as the first value in a range, it represents negative infinity; if used as the second value, it represents positive infinity."
36141                 }
36142             ],
36143             "syntax": "[ [ <integer> | infinite ]{2} ]# | auto",
36144             "relevance": 50,
36145             "description": "@counter-style descriptor. Defines the ranges over which the counter style is defined.",
36146             "restrictions": [
36147                 "integer",
36148                 "enum"
36149             ]
36150         },
36151         {
36152             "name": "resize",
36153             "browsers": [
36154                 "E79",
36155                 "FF4",
36156                 "S3",
36157                 "C1",
36158                 "O12.1"
36159             ],
36160             "values": [
36161                 {
36162                     "name": "both",
36163                     "description": "The UA presents a bidirectional resizing mechanism to allow the user to adjust both the height and the width of the element."
36164                 },
36165                 {
36166                     "name": "horizontal",
36167                     "description": "The UA presents a unidirectional horizontal resizing mechanism to allow the user to adjust only the width of the element."
36168                 },
36169                 {
36170                     "name": "none",
36171                     "description": "The UA does not present a resizing mechanism on the element, and the user is given no direct manipulation mechanism to resize the element."
36172                 },
36173                 {
36174                     "name": "vertical",
36175                     "description": "The UA presents a unidirectional vertical resizing mechanism to allow the user to adjust only the height of the element."
36176                 }
36177             ],
36178             "syntax": "none | both | horizontal | vertical | block | inline",
36179             "relevance": 60,
36180             "references": [
36181                 {
36182                     "name": "MDN Reference",
36183                     "url": "https://developer.mozilla.org/docs/Web/CSS/resize"
36184                 }
36185             ],
36186             "description": "Specifies whether or not an element is resizable by the user, and if so, along which axis/axes.",
36187             "restrictions": [
36188                 "enum"
36189             ]
36190         },
36191         {
36192             "name": "right",
36193             "values": [
36194                 {
36195                     "name": "auto",
36196                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"
36197                 }
36198             ],
36199             "syntax": "<length> | <percentage> | auto",
36200             "relevance": 90,
36201             "references": [
36202                 {
36203                     "name": "MDN Reference",
36204                     "url": "https://developer.mozilla.org/docs/Web/CSS/right"
36205                 }
36206             ],
36207             "description": "Specifies how far an absolutely positioned box's right margin edge is offset to the left of the right edge of the box's 'containing block'.",
36208             "restrictions": [
36209                 "length",
36210                 "percentage"
36211             ]
36212         },
36213         {
36214             "name": "ruby-align",
36215             "browsers": [
36216                 "FF38"
36217             ],
36218             "values": [
36219                 {
36220                     "name": "auto",
36221                     "browsers": [
36222                         "FF38"
36223                     ],
36224                     "description": "The user agent determines how the ruby contents are aligned. This is the initial value."
36225                 },
36226                 {
36227                     "name": "center",
36228                     "description": "The ruby content is centered within its box."
36229                 },
36230                 {
36231                     "name": "distribute-letter",
36232                     "browsers": [
36233                         "FF38"
36234                     ],
36235                     "description": "If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with the first and last ruby text glyphs lining up with the corresponding first and last base glyphs. If the width of the ruby text is at least the width of the base, then the letters of the base are evenly distributed across the width of the ruby text."
36236                 },
36237                 {
36238                     "name": "distribute-space",
36239                     "browsers": [
36240                         "FF38"
36241                     ],
36242                     "description": "If the width of the ruby text is smaller than that of the base, then the ruby text contents are evenly distributed across the width of the base, with a certain amount of white space preceding the first and following the last character in the ruby text. That amount of white space is normally equal to half the amount of inter-character space of the ruby text."
36243                 },
36244                 {
36245                     "name": "left",
36246                     "description": "The ruby text content is aligned with the start edge of the base."
36247                 },
36248                 {
36249                     "name": "line-edge",
36250                     "browsers": [
36251                         "FF38"
36252                     ],
36253                     "description": "If the ruby text is not adjacent to a line edge, it is aligned as in 'auto'. If it is adjacent to a line edge, then it is still aligned as in auto, but the side of the ruby text that touches the end of the line is lined up with the corresponding edge of the base."
36254                 },
36255                 {
36256                     "name": "right",
36257                     "browsers": [
36258                         "FF38"
36259                     ],
36260                     "description": "The ruby text content is aligned with the end edge of the base."
36261                 },
36262                 {
36263                     "name": "start",
36264                     "browsers": [
36265                         "FF38"
36266                     ],
36267                     "description": "The ruby text content is aligned with the start edge of the base."
36268                 },
36269                 {
36270                     "name": "space-between",
36271                     "browsers": [
36272                         "FF38"
36273                     ],
36274                     "description": "The ruby content expands as defined for normal text justification (as defined by 'text-justify'),"
36275                 },
36276                 {
36277                     "name": "space-around",
36278                     "browsers": [
36279                         "FF38"
36280                     ],
36281                     "description": "As for 'space-between' except that there exists an extra justification opportunities whose space is distributed half before and half after the ruby content."
36282                 }
36283             ],
36284             "status": "experimental",
36285             "syntax": "start | center | space-between | space-around",
36286             "relevance": 50,
36287             "references": [
36288                 {
36289                     "name": "MDN Reference",
36290                     "url": "https://developer.mozilla.org/docs/Web/CSS/ruby-align"
36291                 }
36292             ],
36293             "description": "Specifies how text is distributed within the various ruby boxes when their contents do not exactly fill their respective boxes.",
36294             "restrictions": [
36295                 "enum"
36296             ]
36297         },
36298         {
36299             "name": "ruby-overhang",
36300             "browsers": [
36301                 "FF10",
36302                 "IE5"
36303             ],
36304             "values": [
36305                 {
36306                     "name": "auto",
36307                     "description": "The ruby text can overhang text adjacent to the base on either side. This is the initial value."
36308                 },
36309                 {
36310                     "name": "end",
36311                     "description": "The ruby text can overhang the text that follows it."
36312                 },
36313                 {
36314                     "name": "none",
36315                     "description": "The ruby text cannot overhang any text adjacent to its base, only its own base."
36316                 },
36317                 {
36318                     "name": "start",
36319                     "description": "The ruby text can overhang the text that precedes it."
36320                 }
36321             ],
36322             "relevance": 50,
36323             "description": "Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.",
36324             "restrictions": [
36325                 "enum"
36326             ]
36327         },
36328         {
36329             "name": "ruby-position",
36330             "browsers": [
36331                 "E12",
36332                 "FF38"
36333             ],
36334             "values": [
36335                 {
36336                     "name": "after",
36337                     "description": "The ruby text appears after the base. This is a relatively rare setting used in ideographic East Asian writing systems, most easily found in educational text."
36338                 },
36339                 {
36340                     "name": "before",
36341                     "description": "The ruby text appears before the base. This is the most common setting used in ideographic East Asian writing systems."
36342                 },
36343                 {
36344                     "name": "inline"
36345                 },
36346                 {
36347                     "name": "right",
36348                     "description": "The ruby text appears on the right of the base. Unlike 'before' and 'after', this value is not relative to the text flow direction."
36349                 }
36350             ],
36351             "status": "experimental",
36352             "syntax": "over | under | inter-character",
36353             "relevance": 50,
36354             "references": [
36355                 {
36356                     "name": "MDN Reference",
36357                     "url": "https://developer.mozilla.org/docs/Web/CSS/ruby-position"
36358                 }
36359             ],
36360             "description": "Used by the parent of elements with display: ruby-text to control the position of the ruby text with respect to its base.",
36361             "restrictions": [
36362                 "enum"
36363             ]
36364         },
36365         {
36366             "name": "ruby-span",
36367             "browsers": [
36368                 "FF10"
36369             ],
36370             "values": [
36371                 {
36372                     "name": "attr(x)",
36373                     "description": "The value of attribute 'x' is a string value. The string value is evaluated as a <number> to determine the number of ruby base elements to be spanned by the annotation element."
36374                 },
36375                 {
36376                     "name": "none",
36377                     "description": "No spanning. The computed value is '1'."
36378                 }
36379             ],
36380             "relevance": 50,
36381             "description": "Determines whether, and on which side, ruby text is allowed to partially overhang any adjacent text in addition to its own base, when the ruby text is wider than the ruby base.",
36382             "restrictions": [
36383                 "enum"
36384             ]
36385         },
36386         {
36387             "name": "scrollbar-3dlight-color",
36388             "browsers": [
36389                 "IE5"
36390             ],
36391             "relevance": 50,
36392             "references": [
36393                 {
36394                     "name": "MDN Reference",
36395                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-3dlight-color"
36396                 }
36397             ],
36398             "description": "Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",
36399             "restrictions": [
36400                 "color"
36401             ]
36402         },
36403         {
36404             "name": "scrollbar-arrow-color",
36405             "browsers": [
36406                 "IE5"
36407             ],
36408             "relevance": 50,
36409             "references": [
36410                 {
36411                     "name": "MDN Reference",
36412                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-arrow-color"
36413                 }
36414             ],
36415             "description": "Determines the color of the arrow elements of a scroll arrow.",
36416             "restrictions": [
36417                 "color"
36418             ]
36419         },
36420         {
36421             "name": "scrollbar-base-color",
36422             "browsers": [
36423                 "IE5"
36424             ],
36425             "relevance": 50,
36426             "references": [
36427                 {
36428                     "name": "MDN Reference",
36429                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-base-color"
36430                 }
36431             ],
36432             "description": "Determines the color of the main elements of a scroll bar, which include the scroll box, track, and scroll arrows.",
36433             "restrictions": [
36434                 "color"
36435             ]
36436         },
36437         {
36438             "name": "scrollbar-darkshadow-color",
36439             "browsers": [
36440                 "IE5"
36441             ],
36442             "relevance": 50,
36443             "references": [
36444                 {
36445                     "name": "MDN Reference",
36446                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-darkshadow-color"
36447                 }
36448             ],
36449             "description": "Determines the color of the gutter of a scroll bar.",
36450             "restrictions": [
36451                 "color"
36452             ]
36453         },
36454         {
36455             "name": "scrollbar-face-color",
36456             "browsers": [
36457                 "IE5"
36458             ],
36459             "relevance": 50,
36460             "references": [
36461                 {
36462                     "name": "MDN Reference",
36463                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-face-color"
36464                 }
36465             ],
36466             "description": "Determines the color of the scroll box and scroll arrows of a scroll bar.",
36467             "restrictions": [
36468                 "color"
36469             ]
36470         },
36471         {
36472             "name": "scrollbar-highlight-color",
36473             "browsers": [
36474                 "IE5"
36475             ],
36476             "relevance": 50,
36477             "references": [
36478                 {
36479                     "name": "MDN Reference",
36480                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-highlight-color"
36481                 }
36482             ],
36483             "description": "Determines the color of the top and left edges of the scroll box and scroll arrows of a scroll bar.",
36484             "restrictions": [
36485                 "color"
36486             ]
36487         },
36488         {
36489             "name": "scrollbar-shadow-color",
36490             "browsers": [
36491                 "IE5"
36492             ],
36493             "relevance": 50,
36494             "references": [
36495                 {
36496                     "name": "MDN Reference",
36497                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-shadow-color"
36498                 }
36499             ],
36500             "description": "Determines the color of the bottom and right edges of the scroll box and scroll arrows of a scroll bar.",
36501             "restrictions": [
36502                 "color"
36503             ]
36504         },
36505         {
36506             "name": "scrollbar-track-color",
36507             "browsers": [
36508                 "IE6"
36509             ],
36510             "relevance": 50,
36511             "description": "Determines the color of the track element of a scroll bar.",
36512             "restrictions": [
36513                 "color"
36514             ]
36515         },
36516         {
36517             "name": "scroll-behavior",
36518             "browsers": [
36519                 "E79",
36520                 "FF36",
36521                 "C61",
36522                 "O48"
36523             ],
36524             "values": [
36525                 {
36526                     "name": "auto",
36527                     "description": "Scrolls in an instant fashion."
36528                 },
36529                 {
36530                     "name": "smooth",
36531                     "description": "Scrolls in a smooth fashion using a user-agent-defined timing function and time period."
36532                 }
36533             ],
36534             "syntax": "auto | smooth",
36535             "relevance": 51,
36536             "references": [
36537                 {
36538                     "name": "MDN Reference",
36539                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-behavior"
36540                 }
36541             ],
36542             "description": "Specifies the scrolling behavior for a scrolling box, when scrolling happens due to navigation or CSSOM scrolling APIs.",
36543             "restrictions": [
36544                 "enum"
36545             ]
36546         },
36547         {
36548             "name": "scroll-snap-coordinate",
36549             "browsers": [
36550                 "FF39"
36551             ],
36552             "values": [
36553                 {
36554                     "name": "none",
36555                     "description": "Specifies that this element does not contribute a snap point."
36556                 }
36557             ],
36558             "status": "obsolete",
36559             "syntax": "none | <position>#",
36560             "relevance": 0,
36561             "references": [
36562                 {
36563                     "name": "MDN Reference",
36564                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-coordinate"
36565                 }
36566             ],
36567             "description": "Defines the x and y coordinate within the element which will align with the nearest ancestor scroll container’s snap-destination for the respective axis.",
36568             "restrictions": [
36569                 "position",
36570                 "length",
36571                 "percentage",
36572                 "enum"
36573             ]
36574         },
36575         {
36576             "name": "scroll-snap-destination",
36577             "browsers": [
36578                 "FF39"
36579             ],
36580             "status": "obsolete",
36581             "syntax": "<position>",
36582             "relevance": 0,
36583             "references": [
36584                 {
36585                     "name": "MDN Reference",
36586                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-destination"
36587                 }
36588             ],
36589             "description": "Define the x and y coordinate within the scroll container’s visual viewport which element snap points will align with.",
36590             "restrictions": [
36591                 "position",
36592                 "length",
36593                 "percentage"
36594             ]
36595         },
36596         {
36597             "name": "scroll-snap-points-x",
36598             "browsers": [
36599                 "FF39",
36600                 "S9"
36601             ],
36602             "values": [
36603                 {
36604                     "name": "none",
36605                     "description": "No snap points are defined by this scroll container."
36606                 },
36607                 {
36608                     "name": "repeat()",
36609                     "description": "Defines an interval at which snap points are defined, starting from the container’s relevant start edge."
36610                 }
36611             ],
36612             "status": "obsolete",
36613             "syntax": "none | repeat( <length-percentage> )",
36614             "relevance": 0,
36615             "references": [
36616                 {
36617                     "name": "MDN Reference",
36618                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-x"
36619                 }
36620             ],
36621             "description": "Defines the positioning of snap points along the x axis of the scroll container it is applied to.",
36622             "restrictions": [
36623                 "enum"
36624             ]
36625         },
36626         {
36627             "name": "scroll-snap-points-y",
36628             "browsers": [
36629                 "FF39",
36630                 "S9"
36631             ],
36632             "values": [
36633                 {
36634                     "name": "none",
36635                     "description": "No snap points are defined by this scroll container."
36636                 },
36637                 {
36638                     "name": "repeat()",
36639                     "description": "Defines an interval at which snap points are defined, starting from the container’s relevant start edge."
36640                 }
36641             ],
36642             "status": "obsolete",
36643             "syntax": "none | repeat( <length-percentage> )",
36644             "relevance": 0,
36645             "references": [
36646                 {
36647                     "name": "MDN Reference",
36648                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-points-y"
36649                 }
36650             ],
36651             "description": "Defines the positioning of snap points along the y axis of the scroll container it is applied to.",
36652             "restrictions": [
36653                 "enum"
36654             ]
36655         },
36656         {
36657             "name": "scroll-snap-type",
36658             "values": [
36659                 {
36660                     "name": "none",
36661                     "description": "The visual viewport of this scroll container must ignore snap points, if any, when scrolled."
36662                 },
36663                 {
36664                     "name": "mandatory",
36665                     "description": "The visual viewport of this scroll container is guaranteed to rest on a snap point when there are no active scrolling operations."
36666                 },
36667                 {
36668                     "name": "proximity",
36669                     "description": "The visual viewport of this scroll container may come to rest on a snap point at the termination of a scroll at the discretion of the UA given the parameters of the scroll."
36670                 }
36671             ],
36672             "syntax": "none | [ x | y | block | inline | both ] [ mandatory | proximity ]?",
36673             "relevance": 50,
36674             "references": [
36675                 {
36676                     "name": "MDN Reference",
36677                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type"
36678                 }
36679             ],
36680             "description": "Defines how strictly snap points are enforced on the scroll container.",
36681             "restrictions": [
36682                 "enum"
36683             ]
36684         },
36685         {
36686             "name": "shape-image-threshold",
36687             "browsers": [
36688                 "E79",
36689                 "FF62",
36690                 "S10.1",
36691                 "C37",
36692                 "O24"
36693             ],
36694             "syntax": "<alpha-value>",
36695             "relevance": 50,
36696             "references": [
36697                 {
36698                     "name": "MDN Reference",
36699                     "url": "https://developer.mozilla.org/docs/Web/CSS/shape-image-threshold"
36700                 }
36701             ],
36702             "description": "Defines the alpha channel threshold used to extract the shape using an image. A value of 0.5 means that the shape will enclose all the pixels that are more than 50% opaque.",
36703             "restrictions": [
36704                 "number"
36705             ]
36706         },
36707         {
36708             "name": "shape-margin",
36709             "browsers": [
36710                 "E79",
36711                 "FF62",
36712                 "S10.1",
36713                 "C37",
36714                 "O24"
36715             ],
36716             "syntax": "<length-percentage>",
36717             "relevance": 50,
36718             "references": [
36719                 {
36720                     "name": "MDN Reference",
36721                     "url": "https://developer.mozilla.org/docs/Web/CSS/shape-margin"
36722                 }
36723             ],
36724             "description": "Adds a margin to a 'shape-outside'. This defines a new shape that is the smallest contour that includes all the points that are the 'shape-margin' distance outward in the perpendicular direction from a point on the underlying shape.",
36725             "restrictions": [
36726                 "url",
36727                 "length",
36728                 "percentage"
36729             ]
36730         },
36731         {
36732             "name": "shape-outside",
36733             "browsers": [
36734                 "E79",
36735                 "FF62",
36736                 "S10.1",
36737                 "C37",
36738                 "O24"
36739             ],
36740             "values": [
36741                 {
36742                     "name": "margin-box",
36743                     "description": "The background is painted within (clipped to) the margin box."
36744                 },
36745                 {
36746                     "name": "none",
36747                     "description": "The float area is unaffected."
36748                 }
36749             ],
36750             "syntax": "none | <shape-box> || <basic-shape> | <image>",
36751             "relevance": 50,
36752             "references": [
36753                 {
36754                     "name": "MDN Reference",
36755                     "url": "https://developer.mozilla.org/docs/Web/CSS/shape-outside"
36756                 }
36757             ],
36758             "description": "Specifies an orthogonal rotation to be applied to an image before it is laid out.",
36759             "restrictions": [
36760                 "image",
36761                 "box",
36762                 "shape",
36763                 "enum"
36764             ]
36765         },
36766         {
36767             "name": "shape-rendering",
36768             "values": [
36769                 {
36770                     "name": "auto",
36771                     "description": "Suppresses aural rendering."
36772                 },
36773                 {
36774                     "name": "crispEdges",
36775                     "description": "Emphasize the contrast between clean edges of artwork over rendering speed and geometric precision."
36776                 },
36777                 {
36778                     "name": "geometricPrecision",
36779                     "description": "Emphasize geometric precision over speed and crisp edges."
36780                 },
36781                 {
36782                     "name": "optimizeSpeed",
36783                     "description": "Emphasize rendering speed over geometric precision and crisp edges."
36784                 }
36785             ],
36786             "relevance": 50,
36787             "description": "Provides hints about what tradeoffs to make as it renders vector graphics elements such as <path> elements and basic shapes such as circles and rectangles.",
36788             "restrictions": [
36789                 "enum"
36790             ]
36791         },
36792         {
36793             "name": "size",
36794             "browsers": [
36795                 "C",
36796                 "O8"
36797             ],
36798             "syntax": "<length>{1,2} | auto | [ <page-size> || [ portrait | landscape ] ]",
36799             "relevance": 52,
36800             "description": "The size CSS at-rule descriptor, used with the @page at-rule, defines the size and orientation of the box which is used to represent a page. Most of the time, this size corresponds to the target size of the printed page if applicable.",
36801             "restrictions": [
36802                 "length"
36803             ]
36804         },
36805         {
36806             "name": "src",
36807             "values": [
36808                 {
36809                     "name": "url()",
36810                     "description": "Reference font by URL"
36811                 },
36812                 {
36813                     "name": "format()",
36814                     "description": "Optional hint describing the format of the font resource."
36815                 },
36816                 {
36817                     "name": "local()",
36818                     "description": "Format-specific string that identifies a locally available copy of a given font."
36819                 }
36820             ],
36821             "syntax": "[ <url> [ format( <string># ) ]? | local( <family-name> ) ]#",
36822             "relevance": 67,
36823             "description": "@font-face descriptor. Specifies the resource containing font data. It is required, whether the font is downloadable or locally installed.",
36824             "restrictions": [
36825                 "enum",
36826                 "url",
36827                 "identifier"
36828             ]
36829         },
36830         {
36831             "name": "stop-color",
36832             "relevance": 51,
36833             "description": "Indicates what color to use at that gradient stop.",
36834             "restrictions": [
36835                 "color"
36836             ]
36837         },
36838         {
36839             "name": "stop-opacity",
36840             "relevance": 50,
36841             "description": "Defines the opacity of a given gradient stop.",
36842             "restrictions": [
36843                 "number(0-1)"
36844             ]
36845         },
36846         {
36847             "name": "stroke",
36848             "values": [
36849                 {
36850                     "name": "url()",
36851                     "description": "A URL reference to a paint server element, which is an element that defines a paint server: ‘hatch’, ‘linearGradient’, ‘mesh’, ‘pattern’, ‘radialGradient’ and ‘solidcolor’."
36852                 },
36853                 {
36854                     "name": "none",
36855                     "description": "No paint is applied in this layer."
36856                 }
36857             ],
36858             "relevance": 63,
36859             "description": "Paints along the outline of the given graphical element.",
36860             "restrictions": [
36861                 "color",
36862                 "enum",
36863                 "url"
36864             ]
36865         },
36866         {
36867             "name": "stroke-dasharray",
36868             "values": [
36869                 {
36870                     "name": "none",
36871                     "description": "Indicates that no dashing is used."
36872                 }
36873             ],
36874             "relevance": 58,
36875             "description": "Controls the pattern of dashes and gaps used to stroke paths.",
36876             "restrictions": [
36877                 "length",
36878                 "percentage",
36879                 "number",
36880                 "enum"
36881             ]
36882         },
36883         {
36884             "name": "stroke-dashoffset",
36885             "relevance": 58,
36886             "description": "Specifies the distance into the dash pattern to start the dash.",
36887             "restrictions": [
36888                 "percentage",
36889                 "length"
36890             ]
36891         },
36892         {
36893             "name": "stroke-linecap",
36894             "values": [
36895                 {
36896                     "name": "butt",
36897                     "description": "Indicates that the stroke for each subpath does not extend beyond its two endpoints."
36898                 },
36899                 {
36900                     "name": "round",
36901                     "description": "Indicates that at each end of each subpath, the shape representing the stroke will be extended by a half circle with a radius equal to the stroke width."
36902                 },
36903                 {
36904                     "name": "square",
36905                     "description": "Indicates that at the end of each subpath, the shape representing the stroke will be extended by a rectangle with the same width as the stroke width and whose length is half of the stroke width."
36906                 }
36907             ],
36908             "relevance": 53,
36909             "description": "Specifies the shape to be used at the end of open subpaths when they are stroked.",
36910             "restrictions": [
36911                 "enum"
36912             ]
36913         },
36914         {
36915             "name": "stroke-linejoin",
36916             "values": [
36917                 {
36918                     "name": "bevel",
36919                     "description": "Indicates that a bevelled corner is to be used to join path segments."
36920                 },
36921                 {
36922                     "name": "miter",
36923                     "description": "Indicates that a sharp corner is to be used to join path segments."
36924                 },
36925                 {
36926                     "name": "round",
36927                     "description": "Indicates that a round corner is to be used to join path segments."
36928                 }
36929             ],
36930             "relevance": 50,
36931             "description": "Specifies the shape to be used at the corners of paths or basic shapes when they are stroked.",
36932             "restrictions": [
36933                 "enum"
36934             ]
36935         },
36936         {
36937             "name": "stroke-miterlimit",
36938             "relevance": 50,
36939             "description": "When two line segments meet at a sharp angle and miter joins have been specified for 'stroke-linejoin', it is possible for the miter to extend far beyond the thickness of the line stroking the path.",
36940             "restrictions": [
36941                 "number"
36942             ]
36943         },
36944         {
36945             "name": "stroke-opacity",
36946             "relevance": 51,
36947             "description": "Specifies the opacity of the painting operation used to stroke the current object.",
36948             "restrictions": [
36949                 "number(0-1)"
36950             ]
36951         },
36952         {
36953             "name": "stroke-width",
36954             "relevance": 60,
36955             "description": "Specifies the width of the stroke on the current object.",
36956             "restrictions": [
36957                 "percentage",
36958                 "length"
36959             ]
36960         },
36961         {
36962             "name": "suffix",
36963             "browsers": [
36964                 "FF33"
36965             ],
36966             "syntax": "<symbol>",
36967             "relevance": 50,
36968             "description": "@counter-style descriptor. Specifies a <symbol> that is appended to the marker representation.",
36969             "restrictions": [
36970                 "image",
36971                 "string",
36972                 "identifier"
36973             ]
36974         },
36975         {
36976             "name": "system",
36977             "browsers": [
36978                 "FF33"
36979             ],
36980             "values": [
36981                 {
36982                     "name": "additive",
36983                     "description": "Represents “sign-value” numbering systems, which, rather than using reusing digits in different positions to change their value, define additional digits with much larger values, so that the value of the number can be obtained by adding all the digits together."
36984                 },
36985                 {
36986                     "name": "alphabetic",
36987                     "description": "Interprets the list of counter symbols as digits to an alphabetic numbering system, similar to the default lower-alpha counter style, which wraps from \"a\", \"b\", \"c\", to \"aa\", \"ab\", \"ac\"."
36988                 },
36989                 {
36990                     "name": "cyclic",
36991                     "description": "Cycles repeatedly through its provided symbols, looping back to the beginning when it reaches the end of the list."
36992                 },
36993                 {
36994                     "name": "extends",
36995                     "description": "Use the algorithm of another counter style, but alter other aspects."
36996                 },
36997                 {
36998                     "name": "fixed",
36999                     "description": "Runs through its list of counter symbols once, then falls back."
37000                 },
37001                 {
37002                     "name": "numeric",
37003                     "description": "interprets the list of counter symbols as digits to a \"place-value\" numbering system, similar to the default 'decimal' counter style."
37004                 },
37005                 {
37006                     "name": "symbolic",
37007                     "description": "Cycles repeatedly through its provided symbols, doubling, tripling, etc. the symbols on each successive pass through the list."
37008                 }
37009             ],
37010             "syntax": "cyclic | numeric | alphabetic | symbolic | additive | [ fixed <integer>? ] | [ extends <counter-style-name> ]",
37011             "relevance": 50,
37012             "description": "@counter-style descriptor. Specifies which algorithm will be used to construct the counter’s representation based on the counter value.",
37013             "restrictions": [
37014                 "enum",
37015                 "integer"
37016             ]
37017         },
37018         {
37019             "name": "symbols",
37020             "browsers": [
37021                 "FF33"
37022             ],
37023             "syntax": "<symbol>+",
37024             "relevance": 50,
37025             "description": "@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor.",
37026             "restrictions": [
37027                 "image",
37028                 "string",
37029                 "identifier"
37030             ]
37031         },
37032         {
37033             "name": "table-layout",
37034             "values": [
37035                 {
37036                     "name": "auto",
37037                     "description": "Use any automatic table layout algorithm."
37038                 },
37039                 {
37040                     "name": "fixed",
37041                     "description": "Use the fixed table layout algorithm."
37042                 }
37043             ],
37044             "syntax": "auto | fixed",
37045             "relevance": 61,
37046             "references": [
37047                 {
37048                     "name": "MDN Reference",
37049                     "url": "https://developer.mozilla.org/docs/Web/CSS/table-layout"
37050                 }
37051             ],
37052             "description": "Controls the algorithm used to lay out the table cells, rows, and columns.",
37053             "restrictions": [
37054                 "enum"
37055             ]
37056         },
37057         {
37058             "name": "tab-size",
37059             "browsers": [
37060                 "E79",
37061                 "FF4",
37062                 "S6.1",
37063                 "C21",
37064                 "O15"
37065             ],
37066             "syntax": "<integer> | <length>",
37067             "relevance": 51,
37068             "references": [
37069                 {
37070                     "name": "MDN Reference",
37071                     "url": "https://developer.mozilla.org/docs/Web/CSS/tab-size"
37072                 }
37073             ],
37074             "description": "Determines the width of the tab character (U+0009), in space characters (U+0020), when rendered.",
37075             "restrictions": [
37076                 "integer",
37077                 "length"
37078             ]
37079         },
37080         {
37081             "name": "text-align",
37082             "values": [
37083                 {
37084                     "name": "center",
37085                     "description": "The inline contents are centered within the line box."
37086                 },
37087                 {
37088                     "name": "end",
37089                     "description": "The inline contents are aligned to the end edge of the line box."
37090                 },
37091                 {
37092                     "name": "justify",
37093                     "description": "The text is justified according to the method specified by the 'text-justify' property."
37094                 },
37095                 {
37096                     "name": "left",
37097                     "description": "The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."
37098                 },
37099                 {
37100                     "name": "right",
37101                     "description": "The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."
37102                 },
37103                 {
37104                     "name": "start",
37105                     "description": "The inline contents are aligned to the start edge of the line box."
37106                 }
37107             ],
37108             "syntax": "start | end | left | right | center | justify | match-parent",
37109             "relevance": 93,
37110             "references": [
37111                 {
37112                     "name": "MDN Reference",
37113                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-align"
37114                 }
37115             ],
37116             "description": "Describes how inline contents of a block are horizontally aligned if the contents do not completely fill the line box.",
37117             "restrictions": [
37118                 "string"
37119             ]
37120         },
37121         {
37122             "name": "text-align-last",
37123             "browsers": [
37124                 "E12",
37125                 "FF49",
37126                 "C47",
37127                 "IE5.5",
37128                 "O34"
37129             ],
37130             "values": [
37131                 {
37132                     "name": "auto",
37133                     "description": "Content on the affected line is aligned per 'text-align' unless 'text-align' is set to 'justify', in which case it is 'start-aligned'."
37134                 },
37135                 {
37136                     "name": "center",
37137                     "description": "The inline contents are centered within the line box."
37138                 },
37139                 {
37140                     "name": "justify",
37141                     "description": "The text is justified according to the method specified by the 'text-justify' property."
37142                 },
37143                 {
37144                     "name": "left",
37145                     "description": "The inline contents are aligned to the left edge of the line box. In vertical text, 'left' aligns to the edge of the line box that would be the start edge for left-to-right text."
37146                 },
37147                 {
37148                     "name": "right",
37149                     "description": "The inline contents are aligned to the right edge of the line box. In vertical text, 'right' aligns to the edge of the line box that would be the end edge for left-to-right text."
37150                 }
37151             ],
37152             "syntax": "auto | start | end | left | right | center | justify",
37153             "relevance": 50,
37154             "references": [
37155                 {
37156                     "name": "MDN Reference",
37157                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-align-last"
37158                 }
37159             ],
37160             "description": "Describes how the last line of a block or a line right before a forced line break is aligned when 'text-align' is set to 'justify'.",
37161             "restrictions": [
37162                 "enum"
37163             ]
37164         },
37165         {
37166             "name": "text-anchor",
37167             "values": [
37168                 {
37169                     "name": "end",
37170                     "description": "The rendered characters are aligned such that the end of the resulting rendered text is at the initial current text position."
37171                 },
37172                 {
37173                     "name": "middle",
37174                     "description": "The rendered characters are aligned such that the geometric middle of the resulting rendered text is at the initial current text position."
37175                 },
37176                 {
37177                     "name": "start",
37178                     "description": "The rendered characters are aligned such that the start of the resulting rendered text is at the initial current text position."
37179                 }
37180             ],
37181             "relevance": 50,
37182             "description": "Used to align (start-, middle- or end-alignment) a string of text relative to a given point.",
37183             "restrictions": [
37184                 "enum"
37185             ]
37186         },
37187         {
37188             "name": "text-decoration",
37189             "values": [
37190                 {
37191                     "name": "dashed",
37192                     "description": "Produces a dashed line style."
37193                 },
37194                 {
37195                     "name": "dotted",
37196                     "description": "Produces a dotted line."
37197                 },
37198                 {
37199                     "name": "double",
37200                     "description": "Produces a double line."
37201                 },
37202                 {
37203                     "name": "line-through",
37204                     "description": "Each line of text has a line through the middle."
37205                 },
37206                 {
37207                     "name": "none",
37208                     "description": "Produces no line."
37209                 },
37210                 {
37211                     "name": "overline",
37212                     "description": "Each line of text has a line above it."
37213                 },
37214                 {
37215                     "name": "solid",
37216                     "description": "Produces a solid line."
37217                 },
37218                 {
37219                     "name": "underline",
37220                     "description": "Each line of text is underlined."
37221                 },
37222                 {
37223                     "name": "wavy",
37224                     "description": "Produces a wavy line."
37225                 }
37226             ],
37227             "syntax": "<'text-decoration-line'> || <'text-decoration-style'> || <'text-decoration-color'> || <'text-decoration-thickness'>",
37228             "relevance": 91,
37229             "references": [
37230                 {
37231                     "name": "MDN Reference",
37232                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration"
37233                 }
37234             ],
37235             "description": "Decorations applied to font used for an element's text.",
37236             "restrictions": [
37237                 "enum",
37238                 "color"
37239             ]
37240         },
37241         {
37242             "name": "text-decoration-color",
37243             "browsers": [
37244                 "E79",
37245                 "FF36",
37246                 "S12.1",
37247                 "C57",
37248                 "O44"
37249             ],
37250             "syntax": "<color>",
37251             "relevance": 52,
37252             "references": [
37253                 {
37254                     "name": "MDN Reference",
37255                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-color"
37256                 }
37257             ],
37258             "description": "Specifies the color of text decoration (underlines overlines, and line-throughs) set on the element with text-decoration-line.",
37259             "restrictions": [
37260                 "color"
37261             ]
37262         },
37263         {
37264             "name": "text-decoration-line",
37265             "browsers": [
37266                 "E79",
37267                 "FF36",
37268                 "S12.1",
37269                 "C57",
37270                 "O44"
37271             ],
37272             "values": [
37273                 {
37274                     "name": "line-through",
37275                     "description": "Each line of text has a line through the middle."
37276                 },
37277                 {
37278                     "name": "none",
37279                     "description": "Neither produces nor inhibits text decoration."
37280                 },
37281                 {
37282                     "name": "overline",
37283                     "description": "Each line of text has a line above it."
37284                 },
37285                 {
37286                     "name": "underline",
37287                     "description": "Each line of text is underlined."
37288                 }
37289             ],
37290             "syntax": "none | [ underline || overline || line-through || blink ] | spelling-error | grammar-error",
37291             "relevance": 50,
37292             "references": [
37293                 {
37294                     "name": "MDN Reference",
37295                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-line"
37296                 }
37297             ],
37298             "description": "Specifies what line decorations, if any, are added to the element.",
37299             "restrictions": [
37300                 "enum"
37301             ]
37302         },
37303         {
37304             "name": "text-decoration-style",
37305             "browsers": [
37306                 "E79",
37307                 "FF36",
37308                 "S12.1",
37309                 "C57",
37310                 "O44"
37311             ],
37312             "values": [
37313                 {
37314                     "name": "dashed",
37315                     "description": "Produces a dashed line style."
37316                 },
37317                 {
37318                     "name": "dotted",
37319                     "description": "Produces a dotted line."
37320                 },
37321                 {
37322                     "name": "double",
37323                     "description": "Produces a double line."
37324                 },
37325                 {
37326                     "name": "none",
37327                     "description": "Produces no line."
37328                 },
37329                 {
37330                     "name": "solid",
37331                     "description": "Produces a solid line."
37332                 },
37333                 {
37334                     "name": "wavy",
37335                     "description": "Produces a wavy line."
37336                 }
37337             ],
37338             "syntax": "solid | double | dotted | dashed | wavy",
37339             "relevance": 50,
37340             "references": [
37341                 {
37342                     "name": "MDN Reference",
37343                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-style"
37344                 }
37345             ],
37346             "description": "Specifies the line style for underline, line-through and overline text decoration.",
37347             "restrictions": [
37348                 "enum"
37349             ]
37350         },
37351         {
37352             "name": "text-indent",
37353             "values": [],
37354             "syntax": "<length-percentage> && hanging? && each-line?",
37355             "relevance": 68,
37356             "references": [
37357                 {
37358                     "name": "MDN Reference",
37359                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-indent"
37360                 }
37361             ],
37362             "description": "Specifies the indentation applied to lines of inline content in a block. The indentation only affects the first line of inline content in the block unless the 'hanging' keyword is specified, in which case it affects all lines except the first.",
37363             "restrictions": [
37364                 "percentage",
37365                 "length"
37366             ]
37367         },
37368         {
37369             "name": "text-justify",
37370             "browsers": [
37371                 "E12",
37372                 "FF55",
37373                 "C32",
37374                 "IE11",
37375                 "O19"
37376             ],
37377             "values": [
37378                 {
37379                     "name": "auto",
37380                     "description": "The UA determines the justification algorithm to follow, based on a balance between performance and adequate presentation quality."
37381                 },
37382                 {
37383                     "name": "distribute",
37384                     "description": "Justification primarily changes spacing both at word separators and at grapheme cluster boundaries in all scripts except those in the connected and cursive groups. This value is sometimes used in e.g. Japanese, often with the 'text-align-last' property."
37385                 },
37386                 {
37387                     "name": "distribute-all-lines"
37388                 },
37389                 {
37390                     "name": "inter-cluster",
37391                     "description": "Justification primarily changes spacing at word separators and at grapheme cluster boundaries in clustered scripts. This value is typically used for Southeast Asian scripts such as Thai."
37392                 },
37393                 {
37394                     "name": "inter-ideograph",
37395                     "description": "Justification primarily changes spacing at word separators and at inter-graphemic boundaries in scripts that use no word spaces. This value is typically used for CJK languages."
37396                 },
37397                 {
37398                     "name": "inter-word",
37399                     "description": "Justification primarily changes spacing at word separators. This value is typically used for languages that separate words using spaces, like English or (sometimes) Korean."
37400                 },
37401                 {
37402                     "name": "kashida",
37403                     "description": "Justification primarily stretches Arabic and related scripts through the use of kashida or other calligraphic elongation."
37404                 },
37405                 {
37406                     "name": "newspaper"
37407                 }
37408             ],
37409             "syntax": "auto | inter-character | inter-word | none",
37410             "relevance": 50,
37411             "references": [
37412                 {
37413                     "name": "MDN Reference",
37414                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-justify"
37415                 }
37416             ],
37417             "description": "Selects the justification algorithm used when 'text-align' is set to 'justify'. The property applies to block containers, but the UA may (but is not required to) also support it on inline elements.",
37418             "restrictions": [
37419                 "enum"
37420             ]
37421         },
37422         {
37423             "name": "text-orientation",
37424             "browsers": [
37425                 "E79",
37426                 "FF41",
37427                 "S5.1",
37428                 "C48",
37429                 "O15"
37430             ],
37431             "values": [
37432                 {
37433                     "name": "sideways",
37434                     "browsers": [
37435                         "E79",
37436                         "FF41",
37437                         "S5.1",
37438                         "C48",
37439                         "O15"
37440                     ],
37441                     "description": "This value is equivalent to 'sideways-right' in 'vertical-rl' writing mode and equivalent to 'sideways-left' in 'vertical-lr' writing mode."
37442                 },
37443                 {
37444                     "name": "sideways-right",
37445                     "browsers": [
37446                         "E79",
37447                         "FF41",
37448                         "S5.1",
37449                         "C48",
37450                         "O15"
37451                     ],
37452                     "description": "In vertical writing modes, this causes text to be set as if in a horizontal layout, but rotated 90° clockwise."
37453                 },
37454                 {
37455                     "name": "upright",
37456                     "description": "In vertical writing modes, characters from horizontal-only scripts are rendered upright, i.e. in their standard horizontal orientation."
37457                 }
37458             ],
37459             "syntax": "mixed | upright | sideways",
37460             "relevance": 50,
37461             "references": [
37462                 {
37463                     "name": "MDN Reference",
37464                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-orientation"
37465                 }
37466             ],
37467             "description": "Specifies the orientation of text within a line.",
37468             "restrictions": [
37469                 "enum"
37470             ]
37471         },
37472         {
37473             "name": "text-overflow",
37474             "values": [
37475                 {
37476                     "name": "clip",
37477                     "description": "Clip inline content that overflows. Characters may be only partially rendered."
37478                 },
37479                 {
37480                     "name": "ellipsis",
37481                     "description": "Render an ellipsis character (U+2026) to represent clipped inline content."
37482                 }
37483             ],
37484             "syntax": "[ clip | ellipsis | <string> ]{1,2}",
37485             "relevance": 81,
37486             "references": [
37487                 {
37488                     "name": "MDN Reference",
37489                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-overflow"
37490                 }
37491             ],
37492             "description": "Text can overflow for example when it is prevented from wrapping.",
37493             "restrictions": [
37494                 "enum",
37495                 "string"
37496             ]
37497         },
37498         {
37499             "name": "text-rendering",
37500             "browsers": [
37501                 "E79",
37502                 "FF1",
37503                 "S5",
37504                 "C4",
37505                 "O15"
37506             ],
37507             "values": [
37508                 {
37509                     "name": "auto"
37510                 },
37511                 {
37512                     "name": "geometricPrecision",
37513                     "description": "Indicates that the user agent shall emphasize geometric precision over legibility and rendering speed."
37514                 },
37515                 {
37516                     "name": "optimizeLegibility",
37517                     "description": "Indicates that the user agent shall emphasize legibility over rendering speed and geometric precision."
37518                 },
37519                 {
37520                     "name": "optimizeSpeed",
37521                     "description": "Indicates that the user agent shall emphasize rendering speed over legibility and geometric precision."
37522                 }
37523             ],
37524             "syntax": "auto | optimizeSpeed | optimizeLegibility | geometricPrecision",
37525             "relevance": 68,
37526             "references": [
37527                 {
37528                     "name": "MDN Reference",
37529                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-rendering"
37530                 }
37531             ],
37532             "description": "The creator of SVG content might want to provide a hint to the implementation about what tradeoffs to make as it renders text. The ‘text-rendering’ property provides these hints.",
37533             "restrictions": [
37534                 "enum"
37535             ]
37536         },
37537         {
37538             "name": "text-shadow",
37539             "values": [
37540                 {
37541                     "name": "none",
37542                     "description": "No shadow."
37543                 }
37544             ],
37545             "syntax": "none | <shadow-t>#",
37546             "relevance": 74,
37547             "references": [
37548                 {
37549                     "name": "MDN Reference",
37550                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-shadow"
37551                 }
37552             ],
37553             "description": "Enables shadow effects to be applied to the text of the element.",
37554             "restrictions": [
37555                 "length",
37556                 "color"
37557             ]
37558         },
37559         {
37560             "name": "text-transform",
37561             "values": [
37562                 {
37563                     "name": "capitalize",
37564                     "description": "Puts the first typographic letter unit of each word in titlecase."
37565                 },
37566                 {
37567                     "name": "lowercase",
37568                     "description": "Puts all letters in lowercase."
37569                 },
37570                 {
37571                     "name": "none",
37572                     "description": "No effects."
37573                 },
37574                 {
37575                     "name": "uppercase",
37576                     "description": "Puts all letters in uppercase."
37577                 }
37578             ],
37579             "syntax": "none | capitalize | uppercase | lowercase | full-width | full-size-kana",
37580             "relevance": 84,
37581             "references": [
37582                 {
37583                     "name": "MDN Reference",
37584                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-transform"
37585                 }
37586             ],
37587             "description": "Controls capitalization effects of an element’s text.",
37588             "restrictions": [
37589                 "enum"
37590             ]
37591         },
37592         {
37593             "name": "text-underline-position",
37594             "values": [
37595                 {
37596                     "name": "above"
37597                 },
37598                 {
37599                     "name": "auto",
37600                     "description": "The user agent may use any algorithm to determine the underline’s position. In horizontal line layout, the underline should be aligned as for alphabetic. In vertical line layout, if the language is set to Japanese or Korean, the underline should be aligned as for over."
37601                 },
37602                 {
37603                     "name": "below",
37604                     "description": "The underline is aligned with the under edge of the element’s content box."
37605                 }
37606             ],
37607             "syntax": "auto | from-font | [ under || [ left | right ] ]",
37608             "relevance": 50,
37609             "references": [
37610                 {
37611                     "name": "MDN Reference",
37612                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-position"
37613                 }
37614             ],
37615             "description": "Sets the position of an underline specified on the same element: it does not affect underlines specified by ancestor elements. This property is typically used in vertical writing contexts such as in Japanese documents where it often desired to have the underline appear 'over' (to the right of) the affected run of text",
37616             "restrictions": [
37617                 "enum"
37618             ]
37619         },
37620         {
37621             "name": "top",
37622             "values": [
37623                 {
37624                     "name": "auto",
37625                     "description": "For non-replaced elements, the effect of this value depends on which of related properties have the value 'auto' as well"
37626                 }
37627             ],
37628             "syntax": "<length> | <percentage> | auto",
37629             "relevance": 95,
37630             "references": [
37631                 {
37632                     "name": "MDN Reference",
37633                     "url": "https://developer.mozilla.org/docs/Web/CSS/top"
37634                 }
37635             ],
37636             "description": "Specifies how far an absolutely positioned box's top margin edge is offset below the top edge of the box's 'containing block'.",
37637             "restrictions": [
37638                 "length",
37639                 "percentage"
37640             ]
37641         },
37642         {
37643             "name": "touch-action",
37644             "values": [
37645                 {
37646                     "name": "auto",
37647                     "description": "The user agent may determine any permitted touch behaviors for touches that begin on the element."
37648                 },
37649                 {
37650                     "name": "cross-slide-x"
37651                 },
37652                 {
37653                     "name": "cross-slide-y"
37654                 },
37655                 {
37656                     "name": "double-tap-zoom"
37657                 },
37658                 {
37659                     "name": "manipulation",
37660                     "description": "The user agent may consider touches that begin on the element only for the purposes of scrolling and continuous zooming."
37661                 },
37662                 {
37663                     "name": "none",
37664                     "description": "Touches that begin on the element must not trigger default touch behaviors."
37665                 },
37666                 {
37667                     "name": "pan-x",
37668                     "description": "The user agent may consider touches that begin on the element only for the purposes of horizontally scrolling the element’s nearest ancestor with horizontally scrollable content."
37669                 },
37670                 {
37671                     "name": "pan-y",
37672                     "description": "The user agent may consider touches that begin on the element only for the purposes of vertically scrolling the element’s nearest ancestor with vertically scrollable content."
37673                 },
37674                 {
37675                     "name": "pinch-zoom"
37676                 }
37677             ],
37678             "syntax": "auto | none | [ [ pan-x | pan-left | pan-right ] || [ pan-y | pan-up | pan-down ] || pinch-zoom ] | manipulation",
37679             "relevance": 65,
37680             "references": [
37681                 {
37682                     "name": "MDN Reference",
37683                     "url": "https://developer.mozilla.org/docs/Web/CSS/touch-action"
37684                 }
37685             ],
37686             "description": "Determines whether touch input may trigger default behavior supplied by user agent.",
37687             "restrictions": [
37688                 "enum"
37689             ]
37690         },
37691         {
37692             "name": "transform",
37693             "values": [
37694                 {
37695                     "name": "matrix()",
37696                     "description": "Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"
37697                 },
37698                 {
37699                     "name": "matrix3d()",
37700                     "description": "Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."
37701                 },
37702                 {
37703                     "name": "none"
37704                 },
37705                 {
37706                     "name": "perspective()",
37707                     "description": "Specifies a perspective projection matrix."
37708                 },
37709                 {
37710                     "name": "rotate()",
37711                     "description": "Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."
37712                 },
37713                 {
37714                     "name": "rotate3d()",
37715                     "description": "Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."
37716                 },
37717                 {
37718                     "name": "rotateX('angle')",
37719                     "description": "Specifies a clockwise rotation by the given angle about the X axis."
37720                 },
37721                 {
37722                     "name": "rotateY('angle')",
37723                     "description": "Specifies a clockwise rotation by the given angle about the Y axis."
37724                 },
37725                 {
37726                     "name": "rotateZ('angle')",
37727                     "description": "Specifies a clockwise rotation by the given angle about the Z axis."
37728                 },
37729                 {
37730                     "name": "scale()",
37731                     "description": "Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."
37732                 },
37733                 {
37734                     "name": "scale3d()",
37735                     "description": "Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."
37736                 },
37737                 {
37738                     "name": "scaleX()",
37739                     "description": "Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."
37740                 },
37741                 {
37742                     "name": "scaleY()",
37743                     "description": "Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."
37744                 },
37745                 {
37746                     "name": "scaleZ()",
37747                     "description": "Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."
37748                 },
37749                 {
37750                     "name": "skew()",
37751                     "description": "Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."
37752                 },
37753                 {
37754                     "name": "skewX()",
37755                     "description": "Specifies a skew transformation along the X axis by the given angle."
37756                 },
37757                 {
37758                     "name": "skewY()",
37759                     "description": "Specifies a skew transformation along the Y axis by the given angle."
37760                 },
37761                 {
37762                     "name": "translate()",
37763                     "description": "Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."
37764                 },
37765                 {
37766                     "name": "translate3d()",
37767                     "description": "Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."
37768                 },
37769                 {
37770                     "name": "translateX()",
37771                     "description": "Specifies a translation by the given amount in the X direction."
37772                 },
37773                 {
37774                     "name": "translateY()",
37775                     "description": "Specifies a translation by the given amount in the Y direction."
37776                 },
37777                 {
37778                     "name": "translateZ()",
37779                     "description": "Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."
37780                 }
37781             ],
37782             "syntax": "none | <transform-list>",
37783             "relevance": 88,
37784             "references": [
37785                 {
37786                     "name": "MDN Reference",
37787                     "url": "https://developer.mozilla.org/docs/Web/CSS/transform"
37788                 }
37789             ],
37790             "description": "A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",
37791             "restrictions": [
37792                 "enum"
37793             ]
37794         },
37795         {
37796             "name": "transform-origin",
37797             "syntax": "[ <length-percentage> | left | center | right | top | bottom ] | [ [ <length-percentage> | left | center | right ] && [ <length-percentage> | top | center | bottom ] ] <length>?",
37798             "relevance": 74,
37799             "references": [
37800                 {
37801                     "name": "MDN Reference",
37802                     "url": "https://developer.mozilla.org/docs/Web/CSS/transform-origin"
37803                 }
37804             ],
37805             "description": "Establishes the origin of transformation for an element.",
37806             "restrictions": [
37807                 "position",
37808                 "length",
37809                 "percentage"
37810             ]
37811         },
37812         {
37813             "name": "transform-style",
37814             "browsers": [
37815                 "E12",
37816                 "FF16",
37817                 "S9",
37818                 "C36",
37819                 "O23"
37820             ],
37821             "values": [
37822                 {
37823                     "name": "flat",
37824                     "description": "All children of this element are rendered flattened into the 2D plane of the element."
37825                 },
37826                 {
37827                     "name": "preserve-3d",
37828                     "browsers": [
37829                         "E12",
37830                         "FF16",
37831                         "S9",
37832                         "C36",
37833                         "O23"
37834                     ],
37835                     "description": "Flattening is not performed, so children maintain their position in 3D space."
37836                 }
37837             ],
37838             "syntax": "flat | preserve-3d",
37839             "relevance": 54,
37840             "references": [
37841                 {
37842                     "name": "MDN Reference",
37843                     "url": "https://developer.mozilla.org/docs/Web/CSS/transform-style"
37844                 }
37845             ],
37846             "description": "Defines how nested elements are rendered in 3D space.",
37847             "restrictions": [
37848                 "enum"
37849             ]
37850         },
37851         {
37852             "name": "transition",
37853             "values": [
37854                 {
37855                     "name": "all",
37856                     "description": "Every property that is able to undergo a transition will do so."
37857                 },
37858                 {
37859                     "name": "none",
37860                     "description": "No property will transition."
37861                 }
37862             ],
37863             "syntax": "<single-transition>#",
37864             "relevance": 87,
37865             "references": [
37866                 {
37867                     "name": "MDN Reference",
37868                     "url": "https://developer.mozilla.org/docs/Web/CSS/transition"
37869                 }
37870             ],
37871             "description": "Shorthand property combines four of the transition properties into a single property.",
37872             "restrictions": [
37873                 "time",
37874                 "property",
37875                 "timing-function",
37876                 "enum"
37877             ]
37878         },
37879         {
37880             "name": "transition-delay",
37881             "syntax": "<time>#",
37882             "relevance": 62,
37883             "references": [
37884                 {
37885                     "name": "MDN Reference",
37886                     "url": "https://developer.mozilla.org/docs/Web/CSS/transition-delay"
37887                 }
37888             ],
37889             "description": "Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",
37890             "restrictions": [
37891                 "time"
37892             ]
37893         },
37894         {
37895             "name": "transition-duration",
37896             "syntax": "<time>#",
37897             "relevance": 62,
37898             "references": [
37899                 {
37900                     "name": "MDN Reference",
37901                     "url": "https://developer.mozilla.org/docs/Web/CSS/transition-duration"
37902                 }
37903             ],
37904             "description": "Specifies how long the transition from the old value to the new value should take.",
37905             "restrictions": [
37906                 "time"
37907             ]
37908         },
37909         {
37910             "name": "transition-property",
37911             "values": [
37912                 {
37913                     "name": "all",
37914                     "description": "Every property that is able to undergo a transition will do so."
37915                 },
37916                 {
37917                     "name": "none",
37918                     "description": "No property will transition."
37919                 }
37920             ],
37921             "syntax": "none | <single-transition-property>#",
37922             "relevance": 64,
37923             "references": [
37924                 {
37925                     "name": "MDN Reference",
37926                     "url": "https://developer.mozilla.org/docs/Web/CSS/transition-property"
37927                 }
37928             ],
37929             "description": "Specifies the name of the CSS property to which the transition is applied.",
37930             "restrictions": [
37931                 "property"
37932             ]
37933         },
37934         {
37935             "name": "transition-timing-function",
37936             "syntax": "<timing-function>#",
37937             "relevance": 60,
37938             "references": [
37939                 {
37940                     "name": "MDN Reference",
37941                     "url": "https://developer.mozilla.org/docs/Web/CSS/transition-timing-function"
37942                 }
37943             ],
37944             "description": "Describes how the intermediate values used during a transition will be calculated.",
37945             "restrictions": [
37946                 "timing-function"
37947             ]
37948         },
37949         {
37950             "name": "unicode-bidi",
37951             "values": [
37952                 {
37953                     "name": "bidi-override",
37954                     "description": "Inside the element, reordering is strictly in sequence according to the 'direction' property; the implicit part of the bidirectional algorithm is ignored."
37955                 },
37956                 {
37957                     "name": "embed",
37958                     "description": "If the element is inline-level, this value opens an additional level of embedding with respect to the bidirectional algorithm. The direction of this embedding level is given by the 'direction' property."
37959                 },
37960                 {
37961                     "name": "isolate",
37962                     "description": "The contents of the element are considered to be inside a separate, independent paragraph."
37963                 },
37964                 {
37965                     "name": "isolate-override",
37966                     "description": "This combines the isolation behavior of 'isolate' with the directional override behavior of 'bidi-override'"
37967                 },
37968                 {
37969                     "name": "normal",
37970                     "description": "The element does not open an additional level of embedding with respect to the bidirectional algorithm. For inline-level elements, implicit reordering works across element boundaries."
37971                 },
37972                 {
37973                     "name": "plaintext",
37974                     "description": "For the purposes of the Unicode bidirectional algorithm, the base directionality of each bidi paragraph for which the element forms the containing block is determined not by the element's computed 'direction'."
37975                 }
37976             ],
37977             "syntax": "normal | embed | isolate | bidi-override | isolate-override | plaintext",
37978             "relevance": 57,
37979             "references": [
37980                 {
37981                     "name": "MDN Reference",
37982                     "url": "https://developer.mozilla.org/docs/Web/CSS/unicode-bidi"
37983                 }
37984             ],
37985             "description": "The level of embedding with respect to the bidirectional algorithm.",
37986             "restrictions": [
37987                 "enum"
37988             ]
37989         },
37990         {
37991             "name": "unicode-range",
37992             "values": [
37993                 {
37994                     "name": "U+26",
37995                     "description": "Ampersand."
37996                 },
37997                 {
37998                     "name": "U+20-24F, U+2B0-2FF, U+370-4FF, U+1E00-1EFF, U+2000-20CF, U+2100-23FF, U+2500-26FF, U+E000-F8FF, U+FB00–FB4F",
37999                     "description": "WGL4 character set (Pan-European)."
38000                 },
38001                 {
38002                     "name": "U+20-17F, U+2B0-2FF, U+2000-206F, U+20A0-20CF, U+2100-21FF, U+2600-26FF",
38003                     "description": "The Multilingual European Subset No. 1. Latin. Covers ~44 languages."
38004                 },
38005                 {
38006                     "name": "U+20-2FF, U+370-4FF, U+1E00-20CF, U+2100-23FF, U+2500-26FF, U+FB00-FB4F, U+FFF0-FFFD",
38007                     "description": "The Multilingual European Subset No. 2. Latin, Greek, and Cyrillic. Covers ~128 language."
38008                 },
38009                 {
38010                     "name": "U+20-4FF, U+530-58F, U+10D0-10FF, U+1E00-23FF, U+2440-245F, U+2500-26FF, U+FB00-FB4F, U+FE20-FE2F, U+FFF0-FFFD",
38011                     "description": "The Multilingual European Subset No. 3. Covers all characters belonging to European scripts."
38012                 },
38013                 {
38014                     "name": "U+00-7F",
38015                     "description": "Basic Latin (ASCII)."
38016                 },
38017                 {
38018                     "name": "U+80-FF",
38019                     "description": "Latin-1 Supplement. Accented characters for Western European languages, common punctuation characters, multiplication and division signs."
38020                 },
38021                 {
38022                     "name": "U+100-17F",
38023                     "description": "Latin Extended-A. Accented characters for for Czech, Dutch, Polish, and Turkish."
38024                 },
38025                 {
38026                     "name": "U+180-24F",
38027                     "description": "Latin Extended-B. Croatian, Slovenian, Romanian, Non-European and historic latin, Khoisan, Pinyin, Livonian, Sinology."
38028                 },
38029                 {
38030                     "name": "U+1E00-1EFF",
38031                     "description": "Latin Extended Additional. Vietnamese, German captial sharp s, Medievalist, Latin general use."
38032                 },
38033                 {
38034                     "name": "U+250-2AF",
38035                     "description": "International Phonetic Alphabet Extensions."
38036                 },
38037                 {
38038                     "name": "U+370-3FF",
38039                     "description": "Greek and Coptic."
38040                 },
38041                 {
38042                     "name": "U+1F00-1FFF",
38043                     "description": "Greek Extended. Accented characters for polytonic Greek."
38044                 },
38045                 {
38046                     "name": "U+400-4FF",
38047                     "description": "Cyrillic."
38048                 },
38049                 {
38050                     "name": "U+500-52F",
38051                     "description": "Cyrillic Supplement. Extra letters for Komi, Khanty, Chukchi, Mordvin, Kurdish, Aleut, Chuvash, Abkhaz, Azerbaijani, and Orok."
38052                 },
38053                 {
38054                     "name": "U+00-52F, U+1E00-1FFF, U+2200–22FF",
38055                     "description": "Latin, Greek, Cyrillic, some punctuation and symbols."
38056                 },
38057                 {
38058                     "name": "U+530–58F",
38059                     "description": "Armenian."
38060                 },
38061                 {
38062                     "name": "U+590–5FF",
38063                     "description": "Hebrew."
38064                 },
38065                 {
38066                     "name": "U+600–6FF",
38067                     "description": "Arabic."
38068                 },
38069                 {
38070                     "name": "U+750–77F",
38071                     "description": "Arabic Supplement. Additional letters for African languages, Khowar, Torwali, Burushaski, and early Persian."
38072                 },
38073                 {
38074                     "name": "U+8A0–8FF",
38075                     "description": "Arabic Extended-A. Additional letters for African languages, European and Central Asian languages, Rohingya, Tamazight, Arwi, and Koranic annotation signs."
38076                 },
38077                 {
38078                     "name": "U+700–74F",
38079                     "description": "Syriac."
38080                 },
38081                 {
38082                     "name": "U+900–97F",
38083                     "description": "Devanagari."
38084                 },
38085                 {
38086                     "name": "U+980–9FF",
38087                     "description": "Bengali."
38088                 },
38089                 {
38090                     "name": "U+A00–A7F",
38091                     "description": "Gurmukhi."
38092                 },
38093                 {
38094                     "name": "U+A80–AFF",
38095                     "description": "Gujarati."
38096                 },
38097                 {
38098                     "name": "U+B00–B7F",
38099                     "description": "Oriya."
38100                 },
38101                 {
38102                     "name": "U+B80–BFF",
38103                     "description": "Tamil."
38104                 },
38105                 {
38106                     "name": "U+C00–C7F",
38107                     "description": "Telugu."
38108                 },
38109                 {
38110                     "name": "U+C80–CFF",
38111                     "description": "Kannada."
38112                 },
38113                 {
38114                     "name": "U+D00–D7F",
38115                     "description": "Malayalam."
38116                 },
38117                 {
38118                     "name": "U+D80–DFF",
38119                     "description": "Sinhala."
38120                 },
38121                 {
38122                     "name": "U+118A0–118FF",
38123                     "description": "Warang Citi."
38124                 },
38125                 {
38126                     "name": "U+E00–E7F",
38127                     "description": "Thai."
38128                 },
38129                 {
38130                     "name": "U+1A20–1AAF",
38131                     "description": "Tai Tham."
38132                 },
38133                 {
38134                     "name": "U+AA80–AADF",
38135                     "description": "Tai Viet."
38136                 },
38137                 {
38138                     "name": "U+E80–EFF",
38139                     "description": "Lao."
38140                 },
38141                 {
38142                     "name": "U+F00–FFF",
38143                     "description": "Tibetan."
38144                 },
38145                 {
38146                     "name": "U+1000–109F",
38147                     "description": "Myanmar (Burmese)."
38148                 },
38149                 {
38150                     "name": "U+10A0–10FF",
38151                     "description": "Georgian."
38152                 },
38153                 {
38154                     "name": "U+1200–137F",
38155                     "description": "Ethiopic."
38156                 },
38157                 {
38158                     "name": "U+1380–139F",
38159                     "description": "Ethiopic Supplement. Extra Syllables for Sebatbeit, and Tonal marks"
38160                 },
38161                 {
38162                     "name": "U+2D80–2DDF",
38163                     "description": "Ethiopic Extended. Extra Syllables for Me'en, Blin, and Sebatbeit."
38164                 },
38165                 {
38166                     "name": "U+AB00–AB2F",
38167                     "description": "Ethiopic Extended-A. Extra characters for Gamo-Gofa-Dawro, Basketo, and Gumuz."
38168                 },
38169                 {
38170                     "name": "U+1780–17FF",
38171                     "description": "Khmer."
38172                 },
38173                 {
38174                     "name": "U+1800–18AF",
38175                     "description": "Mongolian."
38176                 },
38177                 {
38178                     "name": "U+1B80–1BBF",
38179                     "description": "Sundanese."
38180                 },
38181                 {
38182                     "name": "U+1CC0–1CCF",
38183                     "description": "Sundanese Supplement. Punctuation."
38184                 },
38185                 {
38186                     "name": "U+4E00–9FD5",
38187                     "description": "CJK (Chinese, Japanese, Korean) Unified Ideographs. Most common ideographs for modern Chinese and Japanese."
38188                 },
38189                 {
38190                     "name": "U+3400–4DB5",
38191                     "description": "CJK Unified Ideographs Extension A. Rare ideographs."
38192                 },
38193                 {
38194                     "name": "U+2F00–2FDF",
38195                     "description": "Kangxi Radicals."
38196                 },
38197                 {
38198                     "name": "U+2E80–2EFF",
38199                     "description": "CJK Radicals Supplement. Alternative forms of Kangxi Radicals."
38200                 },
38201                 {
38202                     "name": "U+1100–11FF",
38203                     "description": "Hangul Jamo."
38204                 },
38205                 {
38206                     "name": "U+AC00–D7AF",
38207                     "description": "Hangul Syllables."
38208                 },
38209                 {
38210                     "name": "U+3040–309F",
38211                     "description": "Hiragana."
38212                 },
38213                 {
38214                     "name": "U+30A0–30FF",
38215                     "description": "Katakana."
38216                 },
38217                 {
38218                     "name": "U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F",
38219                     "description": "Japanese Kanji, Hiragana and Katakana characters plus Yen/Yuan symbol."
38220                 },
38221                 {
38222                     "name": "U+A4D0–A4FF",
38223                     "description": "Lisu."
38224                 },
38225                 {
38226                     "name": "U+A000–A48F",
38227                     "description": "Yi Syllables."
38228                 },
38229                 {
38230                     "name": "U+A490–A4CF",
38231                     "description": "Yi Radicals."
38232                 },
38233                 {
38234                     "name": "U+2000-206F",
38235                     "description": "General Punctuation."
38236                 },
38237                 {
38238                     "name": "U+3000–303F",
38239                     "description": "CJK Symbols and Punctuation."
38240                 },
38241                 {
38242                     "name": "U+2070–209F",
38243                     "description": "Superscripts and Subscripts."
38244                 },
38245                 {
38246                     "name": "U+20A0–20CF",
38247                     "description": "Currency Symbols."
38248                 },
38249                 {
38250                     "name": "U+2100–214F",
38251                     "description": "Letterlike Symbols."
38252                 },
38253                 {
38254                     "name": "U+2150–218F",
38255                     "description": "Number Forms."
38256                 },
38257                 {
38258                     "name": "U+2190–21FF",
38259                     "description": "Arrows."
38260                 },
38261                 {
38262                     "name": "U+2200–22FF",
38263                     "description": "Mathematical Operators."
38264                 },
38265                 {
38266                     "name": "U+2300–23FF",
38267                     "description": "Miscellaneous Technical."
38268                 },
38269                 {
38270                     "name": "U+E000-F8FF",
38271                     "description": "Private Use Area."
38272                 },
38273                 {
38274                     "name": "U+FB00–FB4F",
38275                     "description": "Alphabetic Presentation Forms. Ligatures for latin, Armenian, and Hebrew."
38276                 },
38277                 {
38278                     "name": "U+FB50–FDFF",
38279                     "description": "Arabic Presentation Forms-A. Contextual forms / ligatures for Persian, Urdu, Sindhi, Central Asian languages, etc, Arabic pedagogical symbols, word ligatures."
38280                 },
38281                 {
38282                     "name": "U+1F600–1F64F",
38283                     "description": "Emoji: Emoticons."
38284                 },
38285                 {
38286                     "name": "U+2600–26FF",
38287                     "description": "Emoji: Miscellaneous Symbols."
38288                 },
38289                 {
38290                     "name": "U+1F300–1F5FF",
38291                     "description": "Emoji: Miscellaneous Symbols and Pictographs."
38292                 },
38293                 {
38294                     "name": "U+1F900–1F9FF",
38295                     "description": "Emoji: Supplemental Symbols and Pictographs."
38296                 },
38297                 {
38298                     "name": "U+1F680–1F6FF",
38299                     "description": "Emoji: Transport and Map Symbols."
38300                 }
38301             ],
38302             "syntax": "<unicode-range>#",
38303             "relevance": 58,
38304             "description": "@font-face descriptor. Defines the set of Unicode codepoints that may be supported by the font face for which it is declared.",
38305             "restrictions": [
38306                 "unicode-range"
38307             ]
38308         },
38309         {
38310             "name": "user-select",
38311             "values": [
38312                 {
38313                     "name": "all",
38314                     "description": "The content of the element must be selected atomically"
38315                 },
38316                 {
38317                     "name": "auto"
38318                 },
38319                 {
38320                     "name": "contain",
38321                     "description": "UAs must not allow a selection which is started in this element to be extended outside of this element."
38322                 },
38323                 {
38324                     "name": "none",
38325                     "description": "The UA must not allow selections to be started in this element."
38326                 },
38327                 {
38328                     "name": "text",
38329                     "description": "The element imposes no constraint on the selection."
38330                 }
38331             ],
38332             "status": "nonstandard",
38333             "syntax": "auto | text | none | contain | all",
38334             "relevance": 24,
38335             "references": [
38336                 {
38337                     "name": "MDN Reference",
38338                     "url": "https://developer.mozilla.org/docs/Web/CSS/user-select"
38339                 }
38340             ],
38341             "description": "Controls the appearance of selection.",
38342             "restrictions": [
38343                 "enum"
38344             ]
38345         },
38346         {
38347             "name": "vertical-align",
38348             "values": [
38349                 {
38350                     "name": "auto",
38351                     "description": "Align the dominant baseline of the parent box with the equivalent, or heuristically reconstructed, baseline of the element inline box."
38352                 },
38353                 {
38354                     "name": "baseline",
38355                     "description": "Align the 'alphabetic' baseline of the element with the 'alphabetic' baseline of the parent element."
38356                 },
38357                 {
38358                     "name": "bottom",
38359                     "description": "Align the after edge of the extended inline box with the after-edge of the line box."
38360                 },
38361                 {
38362                     "name": "middle",
38363                     "description": "Align the 'middle' baseline of the inline element with the middle baseline of the parent."
38364                 },
38365                 {
38366                     "name": "sub",
38367                     "description": "Lower the baseline of the box to the proper position for subscripts of the parent's box. (This value has no effect on the font size of the element's text.)"
38368                 },
38369                 {
38370                     "name": "super",
38371                     "description": "Raise the baseline of the box to the proper position for superscripts of the parent's box. (This value has no effect on the font size of the element's text.)"
38372                 },
38373                 {
38374                     "name": "text-bottom",
38375                     "description": "Align the bottom of the box with the after-edge of the parent element's font."
38376                 },
38377                 {
38378                     "name": "text-top",
38379                     "description": "Align the top of the box with the before-edge of the parent element's font."
38380                 },
38381                 {
38382                     "name": "top",
38383                     "description": "Align the before edge of the extended inline box with the before-edge of the line box."
38384                 },
38385                 {
38386                     "name": "-webkit-baseline-middle"
38387                 }
38388             ],
38389             "syntax": "baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>",
38390             "relevance": 91,
38391             "references": [
38392                 {
38393                     "name": "MDN Reference",
38394                     "url": "https://developer.mozilla.org/docs/Web/CSS/vertical-align"
38395                 }
38396             ],
38397             "description": "Affects the vertical positioning of the inline boxes generated by an inline-level element inside a line box.",
38398             "restrictions": [
38399                 "percentage",
38400                 "length"
38401             ]
38402         },
38403         {
38404             "name": "visibility",
38405             "values": [
38406                 {
38407                     "name": "collapse",
38408                     "description": "Table-specific. If used on elements other than rows, row groups, columns, or column groups, 'collapse' has the same meaning as 'hidden'."
38409                 },
38410                 {
38411                     "name": "hidden",
38412                     "description": "The generated box is invisible (fully transparent, nothing is drawn), but still affects layout."
38413                 },
38414                 {
38415                     "name": "visible",
38416                     "description": "The generated box is visible."
38417                 }
38418             ],
38419             "syntax": "visible | hidden | collapse",
38420             "relevance": 88,
38421             "references": [
38422                 {
38423                     "name": "MDN Reference",
38424                     "url": "https://developer.mozilla.org/docs/Web/CSS/visibility"
38425                 }
38426             ],
38427             "description": "Specifies whether the boxes generated by an element are rendered. Invisible boxes still affect layout (set the ‘display’ property to ‘none’ to suppress box generation altogether).",
38428             "restrictions": [
38429                 "enum"
38430             ]
38431         },
38432         {
38433             "name": "-webkit-animation",
38434             "browsers": [
38435                 "C",
38436                 "S5"
38437             ],
38438             "values": [
38439                 {
38440                     "name": "alternate",
38441                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
38442                 },
38443                 {
38444                     "name": "alternate-reverse",
38445                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
38446                 },
38447                 {
38448                     "name": "backwards",
38449                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
38450                 },
38451                 {
38452                     "name": "both",
38453                     "description": "Both forwards and backwards fill modes are applied."
38454                 },
38455                 {
38456                     "name": "forwards",
38457                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
38458                 },
38459                 {
38460                     "name": "infinite",
38461                     "description": "Causes the animation to repeat forever."
38462                 },
38463                 {
38464                     "name": "none",
38465                     "description": "No animation is performed"
38466                 },
38467                 {
38468                     "name": "normal",
38469                     "description": "Normal playback."
38470                 },
38471                 {
38472                     "name": "reverse",
38473                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
38474                 }
38475             ],
38476             "relevance": 50,
38477             "description": "Shorthand property combines six of the animation properties into a single property.",
38478             "restrictions": [
38479                 "time",
38480                 "enum",
38481                 "timing-function",
38482                 "identifier",
38483                 "number"
38484             ]
38485         },
38486         {
38487             "name": "-webkit-animation-delay",
38488             "browsers": [
38489                 "C",
38490                 "S5"
38491             ],
38492             "relevance": 50,
38493             "description": "Defines when the animation will start.",
38494             "restrictions": [
38495                 "time"
38496             ]
38497         },
38498         {
38499             "name": "-webkit-animation-direction",
38500             "browsers": [
38501                 "C",
38502                 "S5"
38503             ],
38504             "values": [
38505                 {
38506                     "name": "alternate",
38507                     "description": "The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."
38508                 },
38509                 {
38510                     "name": "alternate-reverse",
38511                     "description": "The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."
38512                 },
38513                 {
38514                     "name": "normal",
38515                     "description": "Normal playback."
38516                 },
38517                 {
38518                     "name": "reverse",
38519                     "description": "All iterations of the animation are played in the reverse direction from the way they were specified."
38520                 }
38521             ],
38522             "relevance": 50,
38523             "description": "Defines whether or not the animation should play in reverse on alternate cycles.",
38524             "restrictions": [
38525                 "enum"
38526             ]
38527         },
38528         {
38529             "name": "-webkit-animation-duration",
38530             "browsers": [
38531                 "C",
38532                 "S5"
38533             ],
38534             "relevance": 50,
38535             "description": "Defines the length of time that an animation takes to complete one cycle.",
38536             "restrictions": [
38537                 "time"
38538             ]
38539         },
38540         {
38541             "name": "-webkit-animation-fill-mode",
38542             "browsers": [
38543                 "C",
38544                 "S5"
38545             ],
38546             "values": [
38547                 {
38548                     "name": "backwards",
38549                     "description": "The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."
38550                 },
38551                 {
38552                     "name": "both",
38553                     "description": "Both forwards and backwards fill modes are applied."
38554                 },
38555                 {
38556                     "name": "forwards",
38557                     "description": "The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."
38558                 },
38559                 {
38560                     "name": "none",
38561                     "description": "There is no change to the property value between the time the animation is applied and the time the animation begins playing or after the animation completes."
38562                 }
38563             ],
38564             "relevance": 50,
38565             "description": "Defines what values are applied by the animation outside the time it is executing.",
38566             "restrictions": [
38567                 "enum"
38568             ]
38569         },
38570         {
38571             "name": "-webkit-animation-iteration-count",
38572             "browsers": [
38573                 "C",
38574                 "S5"
38575             ],
38576             "values": [
38577                 {
38578                     "name": "infinite",
38579                     "description": "Causes the animation to repeat forever."
38580                 }
38581             ],
38582             "relevance": 50,
38583             "description": "Defines the number of times an animation cycle is played. The default value is one, meaning the animation will play from beginning to end once.",
38584             "restrictions": [
38585                 "number",
38586                 "enum"
38587             ]
38588         },
38589         {
38590             "name": "-webkit-animation-name",
38591             "browsers": [
38592                 "C",
38593                 "S5"
38594             ],
38595             "values": [
38596                 {
38597                     "name": "none",
38598                     "description": "No animation is performed"
38599                 }
38600             ],
38601             "relevance": 50,
38602             "description": "Defines a list of animations that apply. Each name is used to select the keyframe at-rule that provides the property values for the animation.",
38603             "restrictions": [
38604                 "identifier",
38605                 "enum"
38606             ]
38607         },
38608         {
38609             "name": "-webkit-animation-play-state",
38610             "browsers": [
38611                 "C",
38612                 "S5"
38613             ],
38614             "values": [
38615                 {
38616                     "name": "paused",
38617                     "description": "A running animation will be paused."
38618                 },
38619                 {
38620                     "name": "running",
38621                     "description": "Resume playback of a paused animation."
38622                 }
38623             ],
38624             "relevance": 50,
38625             "description": "Defines whether the animation is running or paused.",
38626             "restrictions": [
38627                 "enum"
38628             ]
38629         },
38630         {
38631             "name": "-webkit-animation-timing-function",
38632             "browsers": [
38633                 "C",
38634                 "S5"
38635             ],
38636             "relevance": 50,
38637             "description": "Describes how the animation will progress over one cycle of its duration. See the 'transition-timing-function'.",
38638             "restrictions": [
38639                 "timing-function"
38640             ]
38641         },
38642         {
38643             "name": "-webkit-appearance",
38644             "browsers": [
38645                 "C",
38646                 "S3"
38647             ],
38648             "values": [
38649                 {
38650                     "name": "button"
38651                 },
38652                 {
38653                     "name": "button-bevel"
38654                 },
38655                 {
38656                     "name": "caps-lock-indicator"
38657                 },
38658                 {
38659                     "name": "caret"
38660                 },
38661                 {
38662                     "name": "checkbox"
38663                 },
38664                 {
38665                     "name": "default-button"
38666                 },
38667                 {
38668                     "name": "listbox"
38669                 },
38670                 {
38671                     "name": "listitem"
38672                 },
38673                 {
38674                     "name": "media-fullscreen-button"
38675                 },
38676                 {
38677                     "name": "media-mute-button"
38678                 },
38679                 {
38680                     "name": "media-play-button"
38681                 },
38682                 {
38683                     "name": "media-seek-back-button"
38684                 },
38685                 {
38686                     "name": "media-seek-forward-button"
38687                 },
38688                 {
38689                     "name": "media-slider"
38690                 },
38691                 {
38692                     "name": "media-sliderthumb"
38693                 },
38694                 {
38695                     "name": "menulist"
38696                 },
38697                 {
38698                     "name": "menulist-button"
38699                 },
38700                 {
38701                     "name": "menulist-text"
38702                 },
38703                 {
38704                     "name": "menulist-textfield"
38705                 },
38706                 {
38707                     "name": "none"
38708                 },
38709                 {
38710                     "name": "push-button"
38711                 },
38712                 {
38713                     "name": "radio"
38714                 },
38715                 {
38716                     "name": "scrollbarbutton-down"
38717                 },
38718                 {
38719                     "name": "scrollbarbutton-left"
38720                 },
38721                 {
38722                     "name": "scrollbarbutton-right"
38723                 },
38724                 {
38725                     "name": "scrollbarbutton-up"
38726                 },
38727                 {
38728                     "name": "scrollbargripper-horizontal"
38729                 },
38730                 {
38731                     "name": "scrollbargripper-vertical"
38732                 },
38733                 {
38734                     "name": "scrollbarthumb-horizontal"
38735                 },
38736                 {
38737                     "name": "scrollbarthumb-vertical"
38738                 },
38739                 {
38740                     "name": "scrollbartrack-horizontal"
38741                 },
38742                 {
38743                     "name": "scrollbartrack-vertical"
38744                 },
38745                 {
38746                     "name": "searchfield"
38747                 },
38748                 {
38749                     "name": "searchfield-cancel-button"
38750                 },
38751                 {
38752                     "name": "searchfield-decoration"
38753                 },
38754                 {
38755                     "name": "searchfield-results-button"
38756                 },
38757                 {
38758                     "name": "searchfield-results-decoration"
38759                 },
38760                 {
38761                     "name": "slider-horizontal"
38762                 },
38763                 {
38764                     "name": "sliderthumb-horizontal"
38765                 },
38766                 {
38767                     "name": "sliderthumb-vertical"
38768                 },
38769                 {
38770                     "name": "slider-vertical"
38771                 },
38772                 {
38773                     "name": "square-button"
38774                 },
38775                 {
38776                     "name": "textarea"
38777                 },
38778                 {
38779                     "name": "textfield"
38780                 }
38781             ],
38782             "status": "nonstandard",
38783             "syntax": "none | button | button-bevel | caret | checkbox | default-button | inner-spin-button | listbox | listitem | media-controls-background | media-controls-fullscreen-background | media-current-time-display | media-enter-fullscreen-button | media-exit-fullscreen-button | media-fullscreen-button | media-mute-button | media-overlay-play-button | media-play-button | media-seek-back-button | media-seek-forward-button | media-slider | media-sliderthumb | media-time-remaining-display | media-toggle-closed-captions-button | media-volume-slider | media-volume-slider-container | media-volume-sliderthumb | menulist | menulist-button | menulist-text | menulist-textfield | meter | progress-bar | progress-bar-value | push-button | radio | searchfield | searchfield-cancel-button | searchfield-decoration | searchfield-results-button | searchfield-results-decoration | slider-horizontal | slider-vertical | sliderthumb-horizontal | sliderthumb-vertical | square-button | textarea | textfield",
38784             "relevance": 0,
38785             "description": "Changes the appearance of buttons and other controls to resemble native controls.",
38786             "restrictions": [
38787                 "enum"
38788             ]
38789         },
38790         {
38791             "name": "-webkit-backdrop-filter",
38792             "browsers": [
38793                 "S9"
38794             ],
38795             "values": [
38796                 {
38797                     "name": "none",
38798                     "description": "No filter effects are applied."
38799                 },
38800                 {
38801                     "name": "blur()",
38802                     "description": "Applies a Gaussian blur to the input image."
38803                 },
38804                 {
38805                     "name": "brightness()",
38806                     "description": "Applies a linear multiplier to input image, making it appear more or less bright."
38807                 },
38808                 {
38809                     "name": "contrast()",
38810                     "description": "Adjusts the contrast of the input."
38811                 },
38812                 {
38813                     "name": "drop-shadow()",
38814                     "description": "Applies a drop shadow effect to the input image."
38815                 },
38816                 {
38817                     "name": "grayscale()",
38818                     "description": "Converts the input image to grayscale."
38819                 },
38820                 {
38821                     "name": "hue-rotate()",
38822                     "description": "Applies a hue rotation on the input image. "
38823                 },
38824                 {
38825                     "name": "invert()",
38826                     "description": "Inverts the samples in the input image."
38827                 },
38828                 {
38829                     "name": "opacity()",
38830                     "description": "Applies transparency to the samples in the input image."
38831                 },
38832                 {
38833                     "name": "saturate()",
38834                     "description": "Saturates the input image."
38835                 },
38836                 {
38837                     "name": "sepia()",
38838                     "description": "Converts the input image to sepia."
38839                 },
38840                 {
38841                     "name": "url()",
38842                     "description": "A filter reference to a <filter> element."
38843                 }
38844             ],
38845             "relevance": 50,
38846             "description": "Applies a filter effect where the first filter in the list takes the element's background image as the input image.",
38847             "restrictions": [
38848                 "enum",
38849                 "url"
38850             ]
38851         },
38852         {
38853             "name": "-webkit-backface-visibility",
38854             "browsers": [
38855                 "C",
38856                 "S5"
38857             ],
38858             "values": [
38859                 {
38860                     "name": "hidden"
38861                 },
38862                 {
38863                     "name": "visible"
38864                 }
38865             ],
38866             "relevance": 50,
38867             "description": "Determines whether or not the 'back' side of a transformed element is visible when facing the viewer. With an identity transform, the front side of an element faces the viewer.",
38868             "restrictions": [
38869                 "enum"
38870             ]
38871         },
38872         {
38873             "name": "-webkit-background-clip",
38874             "browsers": [
38875                 "C",
38876                 "S3"
38877             ],
38878             "relevance": 50,
38879             "description": "Determines the background painting area.",
38880             "restrictions": [
38881                 "box"
38882             ]
38883         },
38884         {
38885             "name": "-webkit-background-composite",
38886             "browsers": [
38887                 "C",
38888                 "S3"
38889             ],
38890             "values": [
38891                 {
38892                     "name": "border"
38893                 },
38894                 {
38895                     "name": "padding"
38896                 }
38897             ],
38898             "relevance": 50,
38899             "restrictions": [
38900                 "enum"
38901             ]
38902         },
38903         {
38904             "name": "-webkit-background-origin",
38905             "browsers": [
38906                 "C",
38907                 "S3"
38908             ],
38909             "relevance": 50,
38910             "description": "For elements rendered as a single box, specifies the background positioning area. For elements rendered as multiple boxes (e.g., inline boxes on several lines, boxes on several pages) specifies which boxes 'box-decoration-break' operates on to determine the background positioning area(s).",
38911             "restrictions": [
38912                 "box"
38913             ]
38914         },
38915         {
38916             "name": "-webkit-border-image",
38917             "browsers": [
38918                 "C",
38919                 "S5"
38920             ],
38921             "values": [
38922                 {
38923                     "name": "auto",
38924                     "description": "If 'auto' is specified then the border image width is the intrinsic width or height (whichever is applicable) of the corresponding image slice. If the image does not have the required intrinsic dimension then the corresponding border-width is used instead."
38925                 },
38926                 {
38927                     "name": "fill",
38928                     "description": "Causes the middle part of the border-image to be preserved."
38929                 },
38930                 {
38931                     "name": "none"
38932                 },
38933                 {
38934                     "name": "repeat",
38935                     "description": "The image is tiled (repeated) to fill the area."
38936                 },
38937                 {
38938                     "name": "round",
38939                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the image is rescaled so that it does."
38940                 },
38941                 {
38942                     "name": "space",
38943                     "description": "The image is tiled (repeated) to fill the area. If it does not fill the area with a whole number of tiles, the extra space is distributed around the tiles."
38944                 },
38945                 {
38946                     "name": "stretch",
38947                     "description": "The image is stretched to fill the area."
38948                 },
38949                 {
38950                     "name": "url()"
38951                 }
38952             ],
38953             "relevance": 50,
38954             "description": "Shorthand property for setting 'border-image-source', 'border-image-slice', 'border-image-width', 'border-image-outset' and 'border-image-repeat'. Omitted values are set to their initial values.",
38955             "restrictions": [
38956                 "length",
38957                 "percentage",
38958                 "number",
38959                 "url",
38960                 "enum"
38961             ]
38962         },
38963         {
38964             "name": "-webkit-box-align",
38965             "browsers": [
38966                 "C",
38967                 "S3"
38968             ],
38969             "values": [
38970                 {
38971                     "name": "baseline",
38972                     "description": "If this box orientation is inline-axis or horizontal, all children are placed with their baselines aligned, and extra space placed before or after as necessary. For block flows, the baseline of the first non-empty line box located within the element is used. For tables, the baseline of the first cell is used."
38973                 },
38974                 {
38975                     "name": "center",
38976                     "description": "Any extra space is divided evenly, with half placed above the child and the other half placed after the child."
38977                 },
38978                 {
38979                     "name": "end",
38980                     "description": "For normal direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element. For reverse direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element."
38981                 },
38982                 {
38983                     "name": "start",
38984                     "description": "For normal direction boxes, the top edge of each child is placed along the top of the box. Extra space is placed below the element. For reverse direction boxes, the bottom edge of each child is placed along the bottom of the box. Extra space is placed above the element."
38985                 },
38986                 {
38987                     "name": "stretch",
38988                     "description": "The height of each child is adjusted to that of the containing block."
38989                 }
38990             ],
38991             "relevance": 50,
38992             "description": "Specifies the alignment of nested elements within an outer flexible box element.",
38993             "restrictions": [
38994                 "enum"
38995             ]
38996         },
38997         {
38998             "name": "-webkit-box-direction",
38999             "browsers": [
39000                 "C",
39001                 "S3"
39002             ],
39003             "values": [
39004                 {
39005                     "name": "normal",
39006                     "description": "A box with a computed value of horizontal for box-orient displays its children from left to right. A box with a computed value of vertical displays its children from top to bottom."
39007                 },
39008                 {
39009                     "name": "reverse",
39010                     "description": "A box with a computed value of horizontal for box-orient displays its children from right to left. A box with a computed value of vertical displays its children from bottom to top."
39011                 }
39012             ],
39013             "relevance": 50,
39014             "description": "In webkit applications, -webkit-box-direction specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge).",
39015             "restrictions": [
39016                 "enum"
39017             ]
39018         },
39019         {
39020             "name": "-webkit-box-flex",
39021             "browsers": [
39022                 "C",
39023                 "S3"
39024             ],
39025             "relevance": 50,
39026             "description": "Specifies an element's flexibility.",
39027             "restrictions": [
39028                 "number"
39029             ]
39030         },
39031         {
39032             "name": "-webkit-box-flex-group",
39033             "browsers": [
39034                 "C",
39035                 "S3"
39036             ],
39037             "relevance": 50,
39038             "description": "Flexible elements can be assigned to flex groups using the 'box-flex-group' property.",
39039             "restrictions": [
39040                 "integer"
39041             ]
39042         },
39043         {
39044             "name": "-webkit-box-ordinal-group",
39045             "browsers": [
39046                 "C",
39047                 "S3"
39048             ],
39049             "relevance": 50,
39050             "description": "Indicates the ordinal group the element belongs to. Elements with a lower ordinal group are displayed before those with a higher ordinal group.",
39051             "restrictions": [
39052                 "integer"
39053             ]
39054         },
39055         {
39056             "name": "-webkit-box-orient",
39057             "browsers": [
39058                 "C",
39059                 "S3"
39060             ],
39061             "values": [
39062                 {
39063                     "name": "block-axis",
39064                     "description": "Elements are oriented along the box's axis."
39065                 },
39066                 {
39067                     "name": "horizontal",
39068                     "description": "The box displays its children from left to right in a horizontal line."
39069                 },
39070                 {
39071                     "name": "inline-axis",
39072                     "description": "Elements are oriented vertically."
39073                 },
39074                 {
39075                     "name": "vertical",
39076                     "description": "The box displays its children from stacked from top to bottom vertically."
39077                 }
39078             ],
39079             "relevance": 50,
39080             "description": "In webkit applications, -webkit-box-orient specifies whether a box lays out its contents horizontally or vertically.",
39081             "restrictions": [
39082                 "enum"
39083             ]
39084         },
39085         {
39086             "name": "-webkit-box-pack",
39087             "browsers": [
39088                 "C",
39089                 "S3"
39090             ],
39091             "values": [
39092                 {
39093                     "name": "center",
39094                     "description": "The extra space is divided evenly, with half placed before the first child and the other half placed after the last child."
39095                 },
39096                 {
39097                     "name": "end",
39098                     "description": "For normal direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child. For reverse direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child."
39099                 },
39100                 {
39101                     "name": "justify",
39102                     "description": "The space is divided evenly in-between each child, with none of the extra space placed before the first child or after the last child. If there is only one child, treat the pack value as if it were start."
39103                 },
39104                 {
39105                     "name": "start",
39106                     "description": "For normal direction boxes, the left edge of the first child is placed at the left side, with all extra space placed after the last child. For reverse direction boxes, the right edge of the last child is placed at the right side, with all extra space placed before the first child."
39107                 }
39108             ],
39109             "relevance": 50,
39110             "description": "Specifies alignment of child elements within the current element in the direction of orientation.",
39111             "restrictions": [
39112                 "enum"
39113             ]
39114         },
39115         {
39116             "name": "-webkit-box-reflect",
39117             "browsers": [
39118                 "E79",
39119                 "S4",
39120                 "C4",
39121                 "O15"
39122             ],
39123             "values": [
39124                 {
39125                     "name": "above",
39126                     "description": "The reflection appears above the border box."
39127                 },
39128                 {
39129                     "name": "below",
39130                     "description": "The reflection appears below the border box."
39131                 },
39132                 {
39133                     "name": "left",
39134                     "description": "The reflection appears to the left of the border box."
39135                 },
39136                 {
39137                     "name": "right",
39138                     "description": "The reflection appears to the right of the border box."
39139                 }
39140             ],
39141             "status": "nonstandard",
39142             "syntax": "[ above | below | right | left ]? <length>? <image>?",
39143             "relevance": 0,
39144             "references": [
39145                 {
39146                     "name": "MDN Reference",
39147                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-box-reflect"
39148                 }
39149             ],
39150             "description": "Defines a reflection of a border box."
39151         },
39152         {
39153             "name": "-webkit-box-sizing",
39154             "browsers": [
39155                 "C",
39156                 "S3"
39157             ],
39158             "values": [
39159                 {
39160                     "name": "border-box",
39161                     "description": "The specified width and height (and respective min/max properties) on this element determine the border box of the element."
39162                 },
39163                 {
39164                     "name": "content-box",
39165                     "description": "Behavior of width and height as specified by CSS2.1. The specified width and height (and respective min/max properties) apply to the width and height respectively of the content box of the element."
39166                 }
39167             ],
39168             "relevance": 50,
39169             "description": "Box Model addition in CSS3.",
39170             "restrictions": [
39171                 "enum"
39172             ]
39173         },
39174         {
39175             "name": "-webkit-break-after",
39176             "browsers": [
39177                 "S7"
39178             ],
39179             "values": [
39180                 {
39181                     "name": "always",
39182                     "description": "Always force a page break before/after the generated box."
39183                 },
39184                 {
39185                     "name": "auto",
39186                     "description": "Neither force nor forbid a page/column break before/after the generated box."
39187                 },
39188                 {
39189                     "name": "avoid",
39190                     "description": "Avoid a page/column break before/after the generated box."
39191                 },
39192                 {
39193                     "name": "avoid-column",
39194                     "description": "Avoid a column break before/after the generated box."
39195                 },
39196                 {
39197                     "name": "avoid-page",
39198                     "description": "Avoid a page break before/after the generated box."
39199                 },
39200                 {
39201                     "name": "avoid-region"
39202                 },
39203                 {
39204                     "name": "column",
39205                     "description": "Always force a column break before/after the generated box."
39206                 },
39207                 {
39208                     "name": "left",
39209                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
39210                 },
39211                 {
39212                     "name": "page",
39213                     "description": "Always force a page break before/after the generated box."
39214                 },
39215                 {
39216                     "name": "region"
39217                 },
39218                 {
39219                     "name": "right",
39220                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
39221                 }
39222             ],
39223             "relevance": 50,
39224             "description": "Describes the page/column break behavior before the generated box.",
39225             "restrictions": [
39226                 "enum"
39227             ]
39228         },
39229         {
39230             "name": "-webkit-break-before",
39231             "browsers": [
39232                 "S7"
39233             ],
39234             "values": [
39235                 {
39236                     "name": "always",
39237                     "description": "Always force a page break before/after the generated box."
39238                 },
39239                 {
39240                     "name": "auto",
39241                     "description": "Neither force nor forbid a page/column break before/after the generated box."
39242                 },
39243                 {
39244                     "name": "avoid",
39245                     "description": "Avoid a page/column break before/after the generated box."
39246                 },
39247                 {
39248                     "name": "avoid-column",
39249                     "description": "Avoid a column break before/after the generated box."
39250                 },
39251                 {
39252                     "name": "avoid-page",
39253                     "description": "Avoid a page break before/after the generated box."
39254                 },
39255                 {
39256                     "name": "avoid-region"
39257                 },
39258                 {
39259                     "name": "column",
39260                     "description": "Always force a column break before/after the generated box."
39261                 },
39262                 {
39263                     "name": "left",
39264                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
39265                 },
39266                 {
39267                     "name": "page",
39268                     "description": "Always force a page break before/after the generated box."
39269                 },
39270                 {
39271                     "name": "region"
39272                 },
39273                 {
39274                     "name": "right",
39275                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
39276                 }
39277             ],
39278             "relevance": 50,
39279             "description": "Describes the page/column break behavior before the generated box.",
39280             "restrictions": [
39281                 "enum"
39282             ]
39283         },
39284         {
39285             "name": "-webkit-break-inside",
39286             "browsers": [
39287                 "S7"
39288             ],
39289             "values": [
39290                 {
39291                     "name": "auto",
39292                     "description": "Neither force nor forbid a page/column break inside the generated box."
39293                 },
39294                 {
39295                     "name": "avoid",
39296                     "description": "Avoid a page/column break inside the generated box."
39297                 },
39298                 {
39299                     "name": "avoid-column",
39300                     "description": "Avoid a column break inside the generated box."
39301                 },
39302                 {
39303                     "name": "avoid-page",
39304                     "description": "Avoid a page break inside the generated box."
39305                 },
39306                 {
39307                     "name": "avoid-region"
39308                 }
39309             ],
39310             "relevance": 50,
39311             "description": "Describes the page/column break behavior inside the generated box.",
39312             "restrictions": [
39313                 "enum"
39314             ]
39315         },
39316         {
39317             "name": "-webkit-column-break-after",
39318             "browsers": [
39319                 "C",
39320                 "S3"
39321             ],
39322             "values": [
39323                 {
39324                     "name": "always",
39325                     "description": "Always force a page break before/after the generated box."
39326                 },
39327                 {
39328                     "name": "auto",
39329                     "description": "Neither force nor forbid a page/column break before/after the generated box."
39330                 },
39331                 {
39332                     "name": "avoid",
39333                     "description": "Avoid a page/column break before/after the generated box."
39334                 },
39335                 {
39336                     "name": "avoid-column",
39337                     "description": "Avoid a column break before/after the generated box."
39338                 },
39339                 {
39340                     "name": "avoid-page",
39341                     "description": "Avoid a page break before/after the generated box."
39342                 },
39343                 {
39344                     "name": "avoid-region"
39345                 },
39346                 {
39347                     "name": "column",
39348                     "description": "Always force a column break before/after the generated box."
39349                 },
39350                 {
39351                     "name": "left",
39352                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
39353                 },
39354                 {
39355                     "name": "page",
39356                     "description": "Always force a page break before/after the generated box."
39357                 },
39358                 {
39359                     "name": "region"
39360                 },
39361                 {
39362                     "name": "right",
39363                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
39364                 }
39365             ],
39366             "relevance": 50,
39367             "description": "Describes the page/column break behavior before the generated box.",
39368             "restrictions": [
39369                 "enum"
39370             ]
39371         },
39372         {
39373             "name": "-webkit-column-break-before",
39374             "browsers": [
39375                 "C",
39376                 "S3"
39377             ],
39378             "values": [
39379                 {
39380                     "name": "always",
39381                     "description": "Always force a page break before/after the generated box."
39382                 },
39383                 {
39384                     "name": "auto",
39385                     "description": "Neither force nor forbid a page/column break before/after the generated box."
39386                 },
39387                 {
39388                     "name": "avoid",
39389                     "description": "Avoid a page/column break before/after the generated box."
39390                 },
39391                 {
39392                     "name": "avoid-column",
39393                     "description": "Avoid a column break before/after the generated box."
39394                 },
39395                 {
39396                     "name": "avoid-page",
39397                     "description": "Avoid a page break before/after the generated box."
39398                 },
39399                 {
39400                     "name": "avoid-region"
39401                 },
39402                 {
39403                     "name": "column",
39404                     "description": "Always force a column break before/after the generated box."
39405                 },
39406                 {
39407                     "name": "left",
39408                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a left page."
39409                 },
39410                 {
39411                     "name": "page",
39412                     "description": "Always force a page break before/after the generated box."
39413                 },
39414                 {
39415                     "name": "region"
39416                 },
39417                 {
39418                     "name": "right",
39419                     "description": "Force one or two page breaks before/after the generated box so that the next page is formatted as a right page."
39420                 }
39421             ],
39422             "relevance": 50,
39423             "description": "Describes the page/column break behavior before the generated box.",
39424             "restrictions": [
39425                 "enum"
39426             ]
39427         },
39428         {
39429             "name": "-webkit-column-break-inside",
39430             "browsers": [
39431                 "C",
39432                 "S3"
39433             ],
39434             "values": [
39435                 {
39436                     "name": "auto",
39437                     "description": "Neither force nor forbid a page/column break inside the generated box."
39438                 },
39439                 {
39440                     "name": "avoid",
39441                     "description": "Avoid a page/column break inside the generated box."
39442                 },
39443                 {
39444                     "name": "avoid-column",
39445                     "description": "Avoid a column break inside the generated box."
39446                 },
39447                 {
39448                     "name": "avoid-page",
39449                     "description": "Avoid a page break inside the generated box."
39450                 },
39451                 {
39452                     "name": "avoid-region"
39453                 }
39454             ],
39455             "relevance": 50,
39456             "description": "Describes the page/column break behavior inside the generated box.",
39457             "restrictions": [
39458                 "enum"
39459             ]
39460         },
39461         {
39462             "name": "-webkit-column-count",
39463             "browsers": [
39464                 "C",
39465                 "S3"
39466             ],
39467             "values": [
39468                 {
39469                     "name": "auto",
39470                     "description": "Determines the number of columns by the 'column-width' property and the element width."
39471                 }
39472             ],
39473             "relevance": 50,
39474             "description": "Describes the optimal number of columns into which the content of the element will be flowed.",
39475             "restrictions": [
39476                 "integer"
39477             ]
39478         },
39479         {
39480             "name": "-webkit-column-gap",
39481             "browsers": [
39482                 "C",
39483                 "S3"
39484             ],
39485             "values": [
39486                 {
39487                     "name": "normal",
39488                     "description": "User agent specific and typically equivalent to 1em."
39489                 }
39490             ],
39491             "relevance": 50,
39492             "description": "Sets the gap between columns. If there is a column rule between columns, it will appear in the middle of the gap.",
39493             "restrictions": [
39494                 "length"
39495             ]
39496         },
39497         {
39498             "name": "-webkit-column-rule",
39499             "browsers": [
39500                 "C",
39501                 "S3"
39502             ],
39503             "relevance": 50,
39504             "description": "This property is a shorthand for setting 'column-rule-width', 'column-rule-style', and 'column-rule-color' at the same place in the style sheet. Omitted values are set to their initial values.",
39505             "restrictions": [
39506                 "length",
39507                 "line-width",
39508                 "line-style",
39509                 "color"
39510             ]
39511         },
39512         {
39513             "name": "-webkit-column-rule-color",
39514             "browsers": [
39515                 "C",
39516                 "S3"
39517             ],
39518             "relevance": 50,
39519             "description": "Sets the color of the column rule",
39520             "restrictions": [
39521                 "color"
39522             ]
39523         },
39524         {
39525             "name": "-webkit-column-rule-style",
39526             "browsers": [
39527                 "C",
39528                 "S3"
39529             ],
39530             "relevance": 50,
39531             "description": "Sets the style of the rule between columns of an element.",
39532             "restrictions": [
39533                 "line-style"
39534             ]
39535         },
39536         {
39537             "name": "-webkit-column-rule-width",
39538             "browsers": [
39539                 "C",
39540                 "S3"
39541             ],
39542             "relevance": 50,
39543             "description": "Sets the width of the rule between columns. Negative values are not allowed.",
39544             "restrictions": [
39545                 "length",
39546                 "line-width"
39547             ]
39548         },
39549         {
39550             "name": "-webkit-columns",
39551             "browsers": [
39552                 "C",
39553                 "S3"
39554             ],
39555             "values": [
39556                 {
39557                     "name": "auto",
39558                     "description": "The width depends on the values of other properties."
39559                 }
39560             ],
39561             "relevance": 50,
39562             "description": "A shorthand property which sets both 'column-width' and 'column-count'.",
39563             "restrictions": [
39564                 "length",
39565                 "integer"
39566             ]
39567         },
39568         {
39569             "name": "-webkit-column-span",
39570             "browsers": [
39571                 "C",
39572                 "S3"
39573             ],
39574             "values": [
39575                 {
39576                     "name": "all",
39577                     "description": "The element spans across all columns. Content in the normal flow that appears before the element is automatically balanced across all columns before the element appear."
39578                 },
39579                 {
39580                     "name": "none",
39581                     "description": "The element does not span multiple columns."
39582                 }
39583             ],
39584             "relevance": 50,
39585             "description": "Describes the page/column break behavior after the generated box.",
39586             "restrictions": [
39587                 "enum"
39588             ]
39589         },
39590         {
39591             "name": "-webkit-column-width",
39592             "browsers": [
39593                 "C",
39594                 "S3"
39595             ],
39596             "values": [
39597                 {
39598                     "name": "auto",
39599                     "description": "The width depends on the values of other properties."
39600                 }
39601             ],
39602             "relevance": 50,
39603             "description": "This property describes the width of columns in multicol elements.",
39604             "restrictions": [
39605                 "length"
39606             ]
39607         },
39608         {
39609             "name": "-webkit-filter",
39610             "browsers": [
39611                 "C18",
39612                 "O15",
39613                 "S6"
39614             ],
39615             "values": [
39616                 {
39617                     "name": "none",
39618                     "description": "No filter effects are applied."
39619                 },
39620                 {
39621                     "name": "blur()",
39622                     "description": "Applies a Gaussian blur to the input image."
39623                 },
39624                 {
39625                     "name": "brightness()",
39626                     "description": "Applies a linear multiplier to input image, making it appear more or less bright."
39627                 },
39628                 {
39629                     "name": "contrast()",
39630                     "description": "Adjusts the contrast of the input."
39631                 },
39632                 {
39633                     "name": "drop-shadow()",
39634                     "description": "Applies a drop shadow effect to the input image."
39635                 },
39636                 {
39637                     "name": "grayscale()",
39638                     "description": "Converts the input image to grayscale."
39639                 },
39640                 {
39641                     "name": "hue-rotate()",
39642                     "description": "Applies a hue rotation on the input image. "
39643                 },
39644                 {
39645                     "name": "invert()",
39646                     "description": "Inverts the samples in the input image."
39647                 },
39648                 {
39649                     "name": "opacity()",
39650                     "description": "Applies transparency to the samples in the input image."
39651                 },
39652                 {
39653                     "name": "saturate()",
39654                     "description": "Saturates the input image."
39655                 },
39656                 {
39657                     "name": "sepia()",
39658                     "description": "Converts the input image to sepia."
39659                 },
39660                 {
39661                     "name": "url()",
39662                     "description": "A filter reference to a <filter> element."
39663                 }
39664             ],
39665             "relevance": 50,
39666             "description": "Processes an element’s rendering before it is displayed in the document, by applying one or more filter effects.",
39667             "restrictions": [
39668                 "enum",
39669                 "url"
39670             ]
39671         },
39672         {
39673             "name": "-webkit-flow-from",
39674             "browsers": [
39675                 "S6.1"
39676             ],
39677             "values": [
39678                 {
39679                     "name": "none",
39680                     "description": "The block container is not a CSS Region."
39681                 }
39682             ],
39683             "relevance": 50,
39684             "description": "Makes a block container a region and associates it with a named flow.",
39685             "restrictions": [
39686                 "identifier"
39687             ]
39688         },
39689         {
39690             "name": "-webkit-flow-into",
39691             "browsers": [
39692                 "S6.1"
39693             ],
39694             "values": [
39695                 {
39696                     "name": "none",
39697                     "description": "The element is not moved to a named flow and normal CSS processing takes place."
39698                 }
39699             ],
39700             "relevance": 50,
39701             "description": "Places an element or its contents into a named flow.",
39702             "restrictions": [
39703                 "identifier"
39704             ]
39705         },
39706         {
39707             "name": "-webkit-font-feature-settings",
39708             "browsers": [
39709                 "C16"
39710             ],
39711             "values": [
39712                 {
39713                     "name": "\"c2cs\""
39714                 },
39715                 {
39716                     "name": "\"dlig\""
39717                 },
39718                 {
39719                     "name": "\"kern\""
39720                 },
39721                 {
39722                     "name": "\"liga\""
39723                 },
39724                 {
39725                     "name": "\"lnum\""
39726                 },
39727                 {
39728                     "name": "\"onum\""
39729                 },
39730                 {
39731                     "name": "\"smcp\""
39732                 },
39733                 {
39734                     "name": "\"swsh\""
39735                 },
39736                 {
39737                     "name": "\"tnum\""
39738                 },
39739                 {
39740                     "name": "normal",
39741                     "description": "No change in glyph substitution or positioning occurs."
39742                 },
39743                 {
39744                     "name": "off"
39745                 },
39746                 {
39747                     "name": "on"
39748                 }
39749             ],
39750             "relevance": 50,
39751             "description": "This property provides low-level control over OpenType font features. It is intended as a way of providing access to font features that are not widely used but are needed for a particular use case.",
39752             "restrictions": [
39753                 "string",
39754                 "integer"
39755             ]
39756         },
39757         {
39758             "name": "-webkit-hyphens",
39759             "browsers": [
39760                 "S5.1"
39761             ],
39762             "values": [
39763                 {
39764                     "name": "auto",
39765                     "description": "Conditional hyphenation characters inside a word, if present, take priority over automatic resources when determining hyphenation points within the word."
39766                 },
39767                 {
39768                     "name": "manual",
39769                     "description": "Words are only broken at line breaks where there are characters inside the word that suggest line break opportunities"
39770                 },
39771                 {
39772                     "name": "none",
39773                     "description": "Words are not broken at line breaks, even if characters inside the word suggest line break points."
39774                 }
39775             ],
39776             "relevance": 50,
39777             "description": "Controls whether hyphenation is allowed to create more break opportunities within a line of text.",
39778             "restrictions": [
39779                 "enum"
39780             ]
39781         },
39782         {
39783             "name": "-webkit-line-break",
39784             "browsers": [
39785                 "C",
39786                 "S3"
39787             ],
39788             "values": [
39789                 {
39790                     "name": "after-white-space"
39791                 },
39792                 {
39793                     "name": "normal"
39794                 }
39795             ],
39796             "relevance": 50,
39797             "description": "Specifies line-breaking rules for CJK (Chinese, Japanese, and Korean) text."
39798         },
39799         {
39800             "name": "-webkit-margin-bottom-collapse",
39801             "browsers": [
39802                 "C",
39803                 "S3"
39804             ],
39805             "values": [
39806                 {
39807                     "name": "collapse"
39808                 },
39809                 {
39810                     "name": "discard"
39811                 },
39812                 {
39813                     "name": "separate"
39814                 }
39815             ],
39816             "relevance": 50,
39817             "restrictions": [
39818                 "enum"
39819             ]
39820         },
39821         {
39822             "name": "-webkit-margin-collapse",
39823             "browsers": [
39824                 "C",
39825                 "S3"
39826             ],
39827             "values": [
39828                 {
39829                     "name": "collapse"
39830                 },
39831                 {
39832                     "name": "discard"
39833                 },
39834                 {
39835                     "name": "separate"
39836                 }
39837             ],
39838             "relevance": 50,
39839             "restrictions": [
39840                 "enum"
39841             ]
39842         },
39843         {
39844             "name": "-webkit-margin-start",
39845             "browsers": [
39846                 "C",
39847                 "S3"
39848             ],
39849             "values": [
39850                 {
39851                     "name": "auto"
39852                 }
39853             ],
39854             "relevance": 50,
39855             "restrictions": [
39856                 "percentage",
39857                 "length"
39858             ]
39859         },
39860         {
39861             "name": "-webkit-margin-top-collapse",
39862             "browsers": [
39863                 "C",
39864                 "S3"
39865             ],
39866             "values": [
39867                 {
39868                     "name": "collapse"
39869                 },
39870                 {
39871                     "name": "discard"
39872                 },
39873                 {
39874                     "name": "separate"
39875                 }
39876             ],
39877             "relevance": 50,
39878             "restrictions": [
39879                 "enum"
39880             ]
39881         },
39882         {
39883             "name": "-webkit-mask-clip",
39884             "browsers": [
39885                 "C",
39886                 "O15",
39887                 "S4"
39888             ],
39889             "status": "nonstandard",
39890             "syntax": "[ <box> | border | padding | content | text ]#",
39891             "relevance": 0,
39892             "description": "Determines the mask painting area, which determines the area that is affected by the mask.",
39893             "restrictions": [
39894                 "box"
39895             ]
39896         },
39897         {
39898             "name": "-webkit-mask-image",
39899             "browsers": [
39900                 "C",
39901                 "O15",
39902                 "S4"
39903             ],
39904             "values": [
39905                 {
39906                     "name": "none",
39907                     "description": "Counts as a transparent black image layer."
39908                 },
39909                 {
39910                     "name": "url()",
39911                     "description": "Reference to a <mask element or to a CSS image."
39912                 }
39913             ],
39914             "status": "nonstandard",
39915             "syntax": "<mask-reference>#",
39916             "relevance": 0,
39917             "description": "Sets the mask layer image of an element.",
39918             "restrictions": [
39919                 "url",
39920                 "image",
39921                 "enum"
39922             ]
39923         },
39924         {
39925             "name": "-webkit-mask-origin",
39926             "browsers": [
39927                 "C",
39928                 "O15",
39929                 "S4"
39930             ],
39931             "status": "nonstandard",
39932             "syntax": "[ <box> | border | padding | content ]#",
39933             "relevance": 0,
39934             "description": "Specifies the mask positioning area.",
39935             "restrictions": [
39936                 "box"
39937             ]
39938         },
39939         {
39940             "name": "-webkit-mask-repeat",
39941             "browsers": [
39942                 "C",
39943                 "O15",
39944                 "S4"
39945             ],
39946             "status": "nonstandard",
39947             "syntax": "<repeat-style>#",
39948             "relevance": 0,
39949             "description": "Specifies how mask layer images are tiled after they have been sized and positioned.",
39950             "restrictions": [
39951                 "repeat"
39952             ]
39953         },
39954         {
39955             "name": "-webkit-mask-size",
39956             "browsers": [
39957                 "C",
39958                 "O15",
39959                 "S4"
39960             ],
39961             "values": [
39962                 {
39963                     "name": "auto",
39964                     "description": "Resolved by using the image’s intrinsic ratio and the size of the other dimension, or failing that, using the image’s intrinsic size, or failing that, treating it as 100%."
39965                 },
39966                 {
39967                     "name": "contain",
39968                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the largest size such that both its width and its height can fit inside the background positioning area."
39969                 },
39970                 {
39971                     "name": "cover",
39972                     "description": "Scale the image, while preserving its intrinsic aspect ratio (if any), to the smallest size such that both its width and its height can completely cover the background positioning area."
39973                 }
39974             ],
39975             "status": "nonstandard",
39976             "syntax": "<bg-size>#",
39977             "relevance": 0,
39978             "description": "Specifies the size of the mask layer images.",
39979             "restrictions": [
39980                 "length",
39981                 "percentage",
39982                 "enum"
39983             ]
39984         },
39985         {
39986             "name": "-webkit-nbsp-mode",
39987             "browsers": [
39988                 "C",
39989                 "S3"
39990             ],
39991             "values": [
39992                 {
39993                     "name": "normal"
39994                 },
39995                 {
39996                     "name": "space"
39997                 }
39998             ],
39999             "relevance": 50,
40000             "description": "Defines the behavior of nonbreaking spaces within text."
40001         },
40002         {
40003             "name": "-webkit-overflow-scrolling",
40004             "browsers": [
40005                 "C",
40006                 "S5"
40007             ],
40008             "values": [
40009                 {
40010                     "name": "auto"
40011                 },
40012                 {
40013                     "name": "touch"
40014                 }
40015             ],
40016             "status": "nonstandard",
40017             "syntax": "auto | touch",
40018             "relevance": 0,
40019             "references": [
40020                 {
40021                     "name": "MDN Reference",
40022                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-overflow-scrolling"
40023                 }
40024             ],
40025             "description": "Specifies whether to use native-style scrolling in an overflow:scroll element."
40026         },
40027         {
40028             "name": "-webkit-padding-start",
40029             "browsers": [
40030                 "C",
40031                 "S3"
40032             ],
40033             "relevance": 50,
40034             "restrictions": [
40035                 "percentage",
40036                 "length"
40037             ]
40038         },
40039         {
40040             "name": "-webkit-perspective",
40041             "browsers": [
40042                 "C",
40043                 "S4"
40044             ],
40045             "values": [
40046                 {
40047                     "name": "none",
40048                     "description": "No perspective transform is applied."
40049                 }
40050             ],
40051             "relevance": 50,
40052             "description": "Applies the same transform as the perspective(<number>) transform function, except that it applies only to the positioned or transformed children of the element, not to the transform on the element itself.",
40053             "restrictions": [
40054                 "length"
40055             ]
40056         },
40057         {
40058             "name": "-webkit-perspective-origin",
40059             "browsers": [
40060                 "C",
40061                 "S4"
40062             ],
40063             "relevance": 50,
40064             "description": "Establishes the origin for the perspective property. It effectively sets the X and Y position at which the viewer appears to be looking at the children of the element.",
40065             "restrictions": [
40066                 "position",
40067                 "percentage",
40068                 "length"
40069             ]
40070         },
40071         {
40072             "name": "-webkit-region-fragment",
40073             "browsers": [
40074                 "S7"
40075             ],
40076             "values": [
40077                 {
40078                     "name": "auto",
40079                     "description": "Content flows as it would in a regular content box."
40080                 },
40081                 {
40082                     "name": "break",
40083                     "description": "If the content fits within the CSS Region, then this property has no effect."
40084                 }
40085             ],
40086             "relevance": 50,
40087             "description": "The 'region-fragment' property controls the behavior of the last region associated with a named flow.",
40088             "restrictions": [
40089                 "enum"
40090             ]
40091         },
40092         {
40093             "name": "-webkit-tap-highlight-color",
40094             "browsers": [
40095                 "E12",
40096                 "C16",
40097                 "O≤15"
40098             ],
40099             "status": "nonstandard",
40100             "syntax": "<color>",
40101             "relevance": 0,
40102             "references": [
40103                 {
40104                     "name": "MDN Reference",
40105                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-tap-highlight-color"
40106                 }
40107             ],
40108             "restrictions": [
40109                 "color"
40110             ]
40111         },
40112         {
40113             "name": "-webkit-text-fill-color",
40114             "browsers": [
40115                 "E12",
40116                 "FF49",
40117                 "S3",
40118                 "C1",
40119                 "O15"
40120             ],
40121             "status": "nonstandard",
40122             "syntax": "<color>",
40123             "relevance": 0,
40124             "references": [
40125                 {
40126                     "name": "MDN Reference",
40127                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-fill-color"
40128                 }
40129             ],
40130             "restrictions": [
40131                 "color"
40132             ]
40133         },
40134         {
40135             "name": "-webkit-text-size-adjust",
40136             "browsers": [
40137                 "E",
40138                 "C",
40139                 "S3"
40140             ],
40141             "values": [
40142                 {
40143                     "name": "auto",
40144                     "description": "Renderers must use the default size adjustment when displaying on a small device."
40145                 },
40146                 {
40147                     "name": "none",
40148                     "description": "Renderers must not do size adjustment when displaying on a small device."
40149                 }
40150             ],
40151             "relevance": 50,
40152             "description": "Specifies a size adjustment for displaying text content in mobile browsers.",
40153             "restrictions": [
40154                 "percentage"
40155             ]
40156         },
40157         {
40158             "name": "-webkit-text-stroke",
40159             "browsers": [
40160                 "E15",
40161                 "FF49",
40162                 "S3",
40163                 "C4",
40164                 "O15"
40165             ],
40166             "status": "nonstandard",
40167             "syntax": "<length> || <color>",
40168             "relevance": 0,
40169             "references": [
40170                 {
40171                     "name": "MDN Reference",
40172                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke"
40173                 }
40174             ],
40175             "restrictions": [
40176                 "length",
40177                 "line-width",
40178                 "color",
40179                 "percentage"
40180             ]
40181         },
40182         {
40183             "name": "-webkit-text-stroke-color",
40184             "browsers": [
40185                 "E15",
40186                 "FF49",
40187                 "S3",
40188                 "C1",
40189                 "O15"
40190             ],
40191             "status": "nonstandard",
40192             "syntax": "<color>",
40193             "relevance": 0,
40194             "references": [
40195                 {
40196                     "name": "MDN Reference",
40197                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-color"
40198                 }
40199             ],
40200             "restrictions": [
40201                 "color"
40202             ]
40203         },
40204         {
40205             "name": "-webkit-text-stroke-width",
40206             "browsers": [
40207                 "E15",
40208                 "FF49",
40209                 "S3",
40210                 "C1",
40211                 "O15"
40212             ],
40213             "status": "nonstandard",
40214             "syntax": "<length>",
40215             "relevance": 0,
40216             "references": [
40217                 {
40218                     "name": "MDN Reference",
40219                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-text-stroke-width"
40220                 }
40221             ],
40222             "restrictions": [
40223                 "length",
40224                 "line-width",
40225                 "percentage"
40226             ]
40227         },
40228         {
40229             "name": "-webkit-touch-callout",
40230             "browsers": [
40231                 "S3"
40232             ],
40233             "values": [
40234                 {
40235                     "name": "none"
40236                 }
40237             ],
40238             "status": "nonstandard",
40239             "syntax": "default | none",
40240             "relevance": 0,
40241             "references": [
40242                 {
40243                     "name": "MDN Reference",
40244                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-touch-callout"
40245                 }
40246             ],
40247             "restrictions": [
40248                 "enum"
40249             ]
40250         },
40251         {
40252             "name": "-webkit-transform",
40253             "browsers": [
40254                 "C",
40255                 "O12",
40256                 "S3.1"
40257             ],
40258             "values": [
40259                 {
40260                     "name": "matrix()",
40261                     "description": "Specifies a 2D transformation in the form of a transformation matrix of six values. matrix(a,b,c,d,e,f) is equivalent to applying the transformation matrix [a b c d e f]"
40262                 },
40263                 {
40264                     "name": "matrix3d()",
40265                     "description": "Specifies a 3D transformation as a 4x4 homogeneous matrix of 16 values in column-major order."
40266                 },
40267                 {
40268                     "name": "none"
40269                 },
40270                 {
40271                     "name": "perspective()",
40272                     "description": "Specifies a perspective projection matrix."
40273                 },
40274                 {
40275                     "name": "rotate()",
40276                     "description": "Specifies a 2D rotation by the angle specified in the parameter about the origin of the element, as defined by the transform-origin property."
40277                 },
40278                 {
40279                     "name": "rotate3d()",
40280                     "description": "Specifies a clockwise 3D rotation by the angle specified in last parameter about the [x,y,z] direction vector described by the first 3 parameters."
40281                 },
40282                 {
40283                     "name": "rotateX('angle')",
40284                     "description": "Specifies a clockwise rotation by the given angle about the X axis."
40285                 },
40286                 {
40287                     "name": "rotateY('angle')",
40288                     "description": "Specifies a clockwise rotation by the given angle about the Y axis."
40289                 },
40290                 {
40291                     "name": "rotateZ('angle')",
40292                     "description": "Specifies a clockwise rotation by the given angle about the Z axis."
40293                 },
40294                 {
40295                     "name": "scale()",
40296                     "description": "Specifies a 2D scale operation by the [sx,sy] scaling vector described by the 2 parameters. If the second parameter is not provided, it is takes a value equal to the first."
40297                 },
40298                 {
40299                     "name": "scale3d()",
40300                     "description": "Specifies a 3D scale operation by the [sx,sy,sz] scaling vector described by the 3 parameters."
40301                 },
40302                 {
40303                     "name": "scaleX()",
40304                     "description": "Specifies a scale operation using the [sx,1] scaling vector, where sx is given as the parameter."
40305                 },
40306                 {
40307                     "name": "scaleY()",
40308                     "description": "Specifies a scale operation using the [sy,1] scaling vector, where sy is given as the parameter."
40309                 },
40310                 {
40311                     "name": "scaleZ()",
40312                     "description": "Specifies a scale operation using the [1,1,sz] scaling vector, where sz is given as the parameter."
40313                 },
40314                 {
40315                     "name": "skew()",
40316                     "description": "Specifies a skew transformation along the X and Y axes. The first angle parameter specifies the skew on the X axis. The second angle parameter specifies the skew on the Y axis. If the second parameter is not given then a value of 0 is used for the Y angle (ie: no skew on the Y axis)."
40317                 },
40318                 {
40319                     "name": "skewX()",
40320                     "description": "Specifies a skew transformation along the X axis by the given angle."
40321                 },
40322                 {
40323                     "name": "skewY()",
40324                     "description": "Specifies a skew transformation along the Y axis by the given angle."
40325                 },
40326                 {
40327                     "name": "translate()",
40328                     "description": "Specifies a 2D translation by the vector [tx, ty], where tx is the first translation-value parameter and ty is the optional second translation-value parameter."
40329                 },
40330                 {
40331                     "name": "translate3d()",
40332                     "description": "Specifies a 3D translation by the vector [tx,ty,tz], with tx, ty and tz being the first, second and third translation-value parameters respectively."
40333                 },
40334                 {
40335                     "name": "translateX()",
40336                     "description": "Specifies a translation by the given amount in the X direction."
40337                 },
40338                 {
40339                     "name": "translateY()",
40340                     "description": "Specifies a translation by the given amount in the Y direction."
40341                 },
40342                 {
40343                     "name": "translateZ()",
40344                     "description": "Specifies a translation by the given amount in the Z direction. Note that percentage values are not allowed in the translateZ translation-value, and if present are evaluated as 0."
40345                 }
40346             ],
40347             "relevance": 50,
40348             "description": "A two-dimensional transformation is applied to an element through the 'transform' property. This property contains a list of transform functions similar to those allowed by SVG.",
40349             "restrictions": [
40350                 "enum"
40351             ]
40352         },
40353         {
40354             "name": "-webkit-transform-origin",
40355             "browsers": [
40356                 "C",
40357                 "O15",
40358                 "S3.1"
40359             ],
40360             "relevance": 50,
40361             "description": "Establishes the origin of transformation for an element.",
40362             "restrictions": [
40363                 "position",
40364                 "length",
40365                 "percentage"
40366             ]
40367         },
40368         {
40369             "name": "-webkit-transform-origin-x",
40370             "browsers": [
40371                 "C",
40372                 "S3.1"
40373             ],
40374             "relevance": 50,
40375             "description": "The x coordinate of the origin for transforms applied to an element with respect to its border box.",
40376             "restrictions": [
40377                 "length",
40378                 "percentage"
40379             ]
40380         },
40381         {
40382             "name": "-webkit-transform-origin-y",
40383             "browsers": [
40384                 "C",
40385                 "S3.1"
40386             ],
40387             "relevance": 50,
40388             "description": "The y coordinate of the origin for transforms applied to an element with respect to its border box.",
40389             "restrictions": [
40390                 "length",
40391                 "percentage"
40392             ]
40393         },
40394         {
40395             "name": "-webkit-transform-origin-z",
40396             "browsers": [
40397                 "C",
40398                 "S4"
40399             ],
40400             "relevance": 50,
40401             "description": "The z coordinate of the origin for transforms applied to an element with respect to its border box.",
40402             "restrictions": [
40403                 "length",
40404                 "percentage"
40405             ]
40406         },
40407         {
40408             "name": "-webkit-transform-style",
40409             "browsers": [
40410                 "C",
40411                 "S4"
40412             ],
40413             "values": [
40414                 {
40415                     "name": "flat",
40416                     "description": "All children of this element are rendered flattened into the 2D plane of the element."
40417                 }
40418             ],
40419             "relevance": 50,
40420             "description": "Defines how nested elements are rendered in 3D space.",
40421             "restrictions": [
40422                 "enum"
40423             ]
40424         },
40425         {
40426             "name": "-webkit-transition",
40427             "browsers": [
40428                 "C",
40429                 "O12",
40430                 "S5"
40431             ],
40432             "values": [
40433                 {
40434                     "name": "all",
40435                     "description": "Every property that is able to undergo a transition will do so."
40436                 },
40437                 {
40438                     "name": "none",
40439                     "description": "No property will transition."
40440                 }
40441             ],
40442             "relevance": 50,
40443             "description": "Shorthand property combines four of the transition properties into a single property.",
40444             "restrictions": [
40445                 "time",
40446                 "property",
40447                 "timing-function",
40448                 "enum"
40449             ]
40450         },
40451         {
40452             "name": "-webkit-transition-delay",
40453             "browsers": [
40454                 "C",
40455                 "O12",
40456                 "S5"
40457             ],
40458             "relevance": 50,
40459             "description": "Defines when the transition will start. It allows a transition to begin execution some period of time from when it is applied.",
40460             "restrictions": [
40461                 "time"
40462             ]
40463         },
40464         {
40465             "name": "-webkit-transition-duration",
40466             "browsers": [
40467                 "C",
40468                 "O12",
40469                 "S5"
40470             ],
40471             "relevance": 50,
40472             "description": "Specifies how long the transition from the old value to the new value should take.",
40473             "restrictions": [
40474                 "time"
40475             ]
40476         },
40477         {
40478             "name": "-webkit-transition-property",
40479             "browsers": [
40480                 "C",
40481                 "O12",
40482                 "S5"
40483             ],
40484             "values": [
40485                 {
40486                     "name": "all",
40487                     "description": "Every property that is able to undergo a transition will do so."
40488                 },
40489                 {
40490                     "name": "none",
40491                     "description": "No property will transition."
40492                 }
40493             ],
40494             "relevance": 50,
40495             "description": "Specifies the name of the CSS property to which the transition is applied.",
40496             "restrictions": [
40497                 "property"
40498             ]
40499         },
40500         {
40501             "name": "-webkit-transition-timing-function",
40502             "browsers": [
40503                 "C",
40504                 "O12",
40505                 "S5"
40506             ],
40507             "relevance": 50,
40508             "description": "Describes how the intermediate values used during a transition will be calculated.",
40509             "restrictions": [
40510                 "timing-function"
40511             ]
40512         },
40513         {
40514             "name": "-webkit-user-drag",
40515             "browsers": [
40516                 "S3"
40517             ],
40518             "values": [
40519                 {
40520                     "name": "auto"
40521                 },
40522                 {
40523                     "name": "element"
40524                 },
40525                 {
40526                     "name": "none"
40527                 }
40528             ],
40529             "relevance": 50,
40530             "restrictions": [
40531                 "enum"
40532             ]
40533         },
40534         {
40535             "name": "-webkit-user-modify",
40536             "browsers": [
40537                 "C",
40538                 "S3"
40539             ],
40540             "values": [
40541                 {
40542                     "name": "read-only"
40543                 },
40544                 {
40545                     "name": "read-write"
40546                 },
40547                 {
40548                     "name": "read-write-plaintext-only"
40549                 }
40550             ],
40551             "status": "nonstandard",
40552             "syntax": "read-only | read-write | read-write-plaintext-only",
40553             "relevance": 0,
40554             "description": "Determines whether a user can edit the content of an element.",
40555             "restrictions": [
40556                 "enum"
40557             ]
40558         },
40559         {
40560             "name": "-webkit-user-select",
40561             "browsers": [
40562                 "C",
40563                 "S3"
40564             ],
40565             "values": [
40566                 {
40567                     "name": "auto"
40568                 },
40569                 {
40570                     "name": "none"
40571                 },
40572                 {
40573                     "name": "text"
40574                 }
40575             ],
40576             "relevance": 50,
40577             "description": "Controls the appearance of selection.",
40578             "restrictions": [
40579                 "enum"
40580             ]
40581         },
40582         {
40583             "name": "white-space",
40584             "values": [
40585                 {
40586                     "name": "normal",
40587                     "description": "Sets 'white-space-collapsing' to 'collapse' and 'text-wrap' to 'normal'."
40588                 },
40589                 {
40590                     "name": "nowrap",
40591                     "description": "Sets 'white-space-collapsing' to 'collapse' and 'text-wrap' to 'none'."
40592                 },
40593                 {
40594                     "name": "pre",
40595                     "description": "Sets 'white-space-collapsing' to 'preserve' and 'text-wrap' to 'none'."
40596                 },
40597                 {
40598                     "name": "pre-line",
40599                     "description": "Sets 'white-space-collapsing' to 'preserve-breaks' and 'text-wrap' to 'normal'."
40600                 },
40601                 {
40602                     "name": "pre-wrap",
40603                     "description": "Sets 'white-space-collapsing' to 'preserve' and 'text-wrap' to 'normal'."
40604                 }
40605             ],
40606             "syntax": "normal | pre | nowrap | pre-wrap | pre-line | break-spaces",
40607             "relevance": 88,
40608             "references": [
40609                 {
40610                     "name": "MDN Reference",
40611                     "url": "https://developer.mozilla.org/docs/Web/CSS/white-space"
40612                 }
40613             ],
40614             "description": "Shorthand property for the 'white-space-collapsing' and 'text-wrap' properties.",
40615             "restrictions": [
40616                 "enum"
40617             ]
40618         },
40619         {
40620             "name": "widows",
40621             "browsers": [
40622                 "E12",
40623                 "S1.3",
40624                 "C25",
40625                 "IE8",
40626                 "O9.2"
40627             ],
40628             "syntax": "<integer>",
40629             "relevance": 51,
40630             "references": [
40631                 {
40632                     "name": "MDN Reference",
40633                     "url": "https://developer.mozilla.org/docs/Web/CSS/widows"
40634                 }
40635             ],
40636             "description": "Specifies the minimum number of line boxes of a block container that must be left in a fragment after a break.",
40637             "restrictions": [
40638                 "integer"
40639             ]
40640         },
40641         {
40642             "name": "width",
40643             "values": [
40644                 {
40645                     "name": "auto",
40646                     "description": "The width depends on the values of other properties."
40647                 },
40648                 {
40649                     "name": "fit-content",
40650                     "description": "Use the fit-content inline size or fit-content block size, as appropriate to the writing mode."
40651                 },
40652                 {
40653                     "name": "max-content",
40654                     "description": "Use the max-content inline size or max-content block size, as appropriate to the writing mode."
40655                 },
40656                 {
40657                     "name": "min-content",
40658                     "description": "Use the min-content inline size or min-content block size, as appropriate to the writing mode."
40659                 }
40660             ],
40661             "syntax": "<viewport-length>{1,2}",
40662             "relevance": 96,
40663             "references": [
40664                 {
40665                     "name": "MDN Reference",
40666                     "url": "https://developer.mozilla.org/docs/Web/CSS/width"
40667                 }
40668             ],
40669             "description": "Specifies the width of the content area, padding area or border area (depending on 'box-sizing') of certain boxes.",
40670             "restrictions": [
40671                 "length",
40672                 "percentage"
40673             ]
40674         },
40675         {
40676             "name": "will-change",
40677             "browsers": [
40678                 "E79",
40679                 "FF36",
40680                 "S9.1",
40681                 "C36",
40682                 "O24"
40683             ],
40684             "values": [
40685                 {
40686                     "name": "auto",
40687                     "description": "Expresses no particular intent."
40688                 },
40689                 {
40690                     "name": "contents",
40691                     "description": "Indicates that the author expects to animate or change something about the element’s contents in the near future."
40692                 },
40693                 {
40694                     "name": "scroll-position",
40695                     "description": "Indicates that the author expects to animate or change the scroll position of the element in the near future."
40696                 }
40697             ],
40698             "syntax": "auto | <animateable-feature>#",
40699             "relevance": 62,
40700             "references": [
40701                 {
40702                     "name": "MDN Reference",
40703                     "url": "https://developer.mozilla.org/docs/Web/CSS/will-change"
40704                 }
40705             ],
40706             "description": "Provides a rendering hint to the user agent, stating what kinds of changes the author expects to perform on the element.",
40707             "restrictions": [
40708                 "enum",
40709                 "identifier"
40710             ]
40711         },
40712         {
40713             "name": "word-break",
40714             "values": [
40715                 {
40716                     "name": "break-all",
40717                     "description": "Lines may break between any two grapheme clusters for non-CJK scripts."
40718                 },
40719                 {
40720                     "name": "keep-all",
40721                     "description": "Block characters can no longer create implied break points."
40722                 },
40723                 {
40724                     "name": "normal",
40725                     "description": "Breaks non-CJK scripts according to their own rules."
40726                 }
40727             ],
40728             "syntax": "normal | break-all | keep-all | break-word",
40729             "relevance": 72,
40730             "references": [
40731                 {
40732                     "name": "MDN Reference",
40733                     "url": "https://developer.mozilla.org/docs/Web/CSS/word-break"
40734                 }
40735             ],
40736             "description": "Specifies line break opportunities for non-CJK scripts.",
40737             "restrictions": [
40738                 "enum"
40739             ]
40740         },
40741         {
40742             "name": "word-spacing",
40743             "values": [
40744                 {
40745                     "name": "normal",
40746                     "description": "No additional spacing is applied. Computes to zero."
40747                 }
40748             ],
40749             "syntax": "normal | <length-percentage>",
40750             "relevance": 57,
40751             "references": [
40752                 {
40753                     "name": "MDN Reference",
40754                     "url": "https://developer.mozilla.org/docs/Web/CSS/word-spacing"
40755                 }
40756             ],
40757             "description": "Specifies additional spacing between “words”.",
40758             "restrictions": [
40759                 "length",
40760                 "percentage"
40761             ]
40762         },
40763         {
40764             "name": "word-wrap",
40765             "values": [
40766                 {
40767                     "name": "break-word",
40768                     "description": "An otherwise unbreakable sequence of characters may be broken at an arbitrary point if there are no otherwise-acceptable break points in the line."
40769                 },
40770                 {
40771                     "name": "normal",
40772                     "description": "Lines may break only at allowed break points."
40773                 }
40774             ],
40775             "syntax": "normal | break-word",
40776             "relevance": 77,
40777             "references": [
40778                 {
40779                     "name": "MDN Reference",
40780                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-wrap"
40781                 }
40782             ],
40783             "description": "Specifies whether the UA may break within a word to prevent overflow when an otherwise-unbreakable string is too long to fit.",
40784             "restrictions": [
40785                 "enum"
40786             ]
40787         },
40788         {
40789             "name": "writing-mode",
40790             "values": [
40791                 {
40792                     "name": "horizontal-tb",
40793                     "description": "Top-to-bottom block flow direction. The writing mode is horizontal."
40794                 },
40795                 {
40796                     "name": "sideways-lr",
40797                     "description": "Left-to-right block flow direction. The writing mode is vertical, while the typographic mode is horizontal."
40798                 },
40799                 {
40800                     "name": "sideways-rl",
40801                     "description": "Right-to-left block flow direction. The writing mode is vertical, while the typographic mode is horizontal."
40802                 },
40803                 {
40804                     "name": "vertical-lr",
40805                     "description": "Left-to-right block flow direction. The writing mode is vertical."
40806                 },
40807                 {
40808                     "name": "vertical-rl",
40809                     "description": "Right-to-left block flow direction. The writing mode is vertical."
40810                 }
40811             ],
40812             "syntax": "horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr",
40813             "relevance": 50,
40814             "references": [
40815                 {
40816                     "name": "MDN Reference",
40817                     "url": "https://developer.mozilla.org/docs/Web/CSS/writing-mode"
40818                 }
40819             ],
40820             "description": "This is a shorthand property for both 'direction' and 'block-progression'.",
40821             "restrictions": [
40822                 "enum"
40823             ]
40824         },
40825         {
40826             "name": "z-index",
40827             "values": [
40828                 {
40829                     "name": "auto",
40830                     "description": "The stack level of the generated box in the current stacking context is 0. The box does not establish a new stacking context unless it is the root element."
40831                 }
40832             ],
40833             "syntax": "auto | <integer>",
40834             "relevance": 91,
40835             "references": [
40836                 {
40837                     "name": "MDN Reference",
40838                     "url": "https://developer.mozilla.org/docs/Web/CSS/z-index"
40839                 }
40840             ],
40841             "description": "For a positioned box, the 'z-index' property specifies the stack level of the box in the current stacking context and whether the box establishes a local stacking context.",
40842             "restrictions": [
40843                 "integer"
40844             ]
40845         },
40846         {
40847             "name": "zoom",
40848             "browsers": [
40849                 "E12",
40850                 "S3.1",
40851                 "C1",
40852                 "IE5.5",
40853                 "O15"
40854             ],
40855             "values": [
40856                 {
40857                     "name": "normal"
40858                 }
40859             ],
40860             "syntax": "auto | <number> | <percentage>",
40861             "relevance": 74,
40862             "references": [
40863                 {
40864                     "name": "MDN Reference",
40865                     "url": "https://developer.mozilla.org/docs/Web/CSS/zoom"
40866                 }
40867             ],
40868             "description": "Non-standard. Specifies the magnification scale of the object. See 'transform: scale()' for a standards-based alternative.",
40869             "restrictions": [
40870                 "enum",
40871                 "integer",
40872                 "number",
40873                 "percentage"
40874             ]
40875         },
40876         {
40877             "name": "-ms-ime-align",
40878             "status": "nonstandard",
40879             "syntax": "auto | after",
40880             "relevance": 0,
40881             "description": "Aligns the Input Method Editor (IME) candidate window box relative to the element on which the IME composition is active."
40882         },
40883         {
40884             "name": "-moz-binding",
40885             "status": "nonstandard",
40886             "syntax": "<url> | none",
40887             "relevance": 0,
40888             "browsers": [
40889                 "FF1"
40890             ],
40891             "references": [
40892                 {
40893                     "name": "MDN Reference",
40894                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-binding"
40895                 }
40896             ],
40897             "description": "The -moz-binding CSS property is used by Mozilla-based applications to attach an XBL binding to a DOM element."
40898         },
40899         {
40900             "name": "-moz-context-properties",
40901             "status": "nonstandard",
40902             "syntax": "none | [ fill | fill-opacity | stroke | stroke-opacity ]#",
40903             "relevance": 0,
40904             "browsers": [
40905                 "FF55"
40906             ],
40907             "references": [
40908                 {
40909                     "name": "MDN Reference",
40910                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-context-properties"
40911                 }
40912             ],
40913             "description": "If you reference an SVG image in a webpage (such as with the <img> element or as a background image), the SVG image can coordinate with the embedding element (its context) to have the image adopt property values set on the embedding element. To do this the embedding element needs to list the properties that are to be made available to the image by listing them as values of the -moz-context-properties property, and the image needs to opt in to using those properties by using values such as the context-fill value.\n\nThis feature is available since Firefox 55, but is only currently supported with SVG images loaded via chrome:// or resource:// URLs. To experiment with the feature in SVG on the Web it is necessary to set the svg.context-properties.content.enabled pref to true."
40914         },
40915         {
40916             "name": "-moz-float-edge",
40917             "status": "nonstandard",
40918             "syntax": "border-box | content-box | margin-box | padding-box",
40919             "relevance": 0,
40920             "browsers": [
40921                 "FF1"
40922             ],
40923             "references": [
40924                 {
40925                     "name": "MDN Reference",
40926                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-float-edge"
40927                 }
40928             ],
40929             "description": "The non-standard -moz-float-edge CSS property specifies whether the height and width properties of the element include the margin, border, or padding thickness."
40930         },
40931         {
40932             "name": "-moz-force-broken-image-icon",
40933             "status": "nonstandard",
40934             "syntax": "<integer>",
40935             "relevance": 0,
40936             "browsers": [
40937                 "FF1"
40938             ],
40939             "references": [
40940                 {
40941                     "name": "MDN Reference",
40942                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-force-broken-image-icon"
40943                 }
40944             ],
40945             "description": "The -moz-force-broken-image-icon extended CSS property can be used to force the broken image icon to be shown even when a broken image has an alt attribute."
40946         },
40947         {
40948             "name": "-moz-image-region",
40949             "status": "nonstandard",
40950             "syntax": "<shape> | auto",
40951             "relevance": 0,
40952             "browsers": [
40953                 "FF1"
40954             ],
40955             "references": [
40956                 {
40957                     "name": "MDN Reference",
40958                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-image-region"
40959                 }
40960             ],
40961             "description": "For certain XUL elements and pseudo-elements that use an image from the list-style-image property, this property specifies a region of the image that is used in place of the whole image. This allows elements to use different pieces of the same image to improve performance."
40962         },
40963         {
40964             "name": "-moz-orient",
40965             "status": "nonstandard",
40966             "syntax": "inline | block | horizontal | vertical",
40967             "relevance": 0,
40968             "browsers": [
40969                 "FF6"
40970             ],
40971             "references": [
40972                 {
40973                     "name": "MDN Reference",
40974                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-orient"
40975                 }
40976             ],
40977             "description": "The -moz-orient CSS property specifies the orientation of the element to which it's applied."
40978         },
40979         {
40980             "name": "-moz-outline-radius",
40981             "status": "nonstandard",
40982             "syntax": "<outline-radius>{1,4} [ / <outline-radius>{1,4} ]?",
40983             "relevance": 0,
40984             "browsers": [
40985                 "FF1"
40986             ],
40987             "references": [
40988                 {
40989                     "name": "MDN Reference",
40990                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius"
40991                 }
40992             ],
40993             "description": "In Mozilla applications like Firefox, the -moz-outline-radius CSS property can be used to give an element's outline rounded corners."
40994         },
40995         {
40996             "name": "-moz-outline-radius-bottomleft",
40997             "status": "nonstandard",
40998             "syntax": "<outline-radius>",
40999             "relevance": 0,
41000             "browsers": [
41001                 "FF1"
41002             ],
41003             "references": [
41004                 {
41005                     "name": "MDN Reference",
41006                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomleft"
41007                 }
41008             ],
41009             "description": "In Mozilla applications, the -moz-outline-radius-bottomleft CSS property can be used to round the bottom-left corner of an element's outline."
41010         },
41011         {
41012             "name": "-moz-outline-radius-bottomright",
41013             "status": "nonstandard",
41014             "syntax": "<outline-radius>",
41015             "relevance": 0,
41016             "browsers": [
41017                 "FF1"
41018             ],
41019             "references": [
41020                 {
41021                     "name": "MDN Reference",
41022                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-bottomright"
41023                 }
41024             ],
41025             "description": "In Mozilla applications, the -moz-outline-radius-bottomright CSS property can be used to round the bottom-right corner of an element's outline."
41026         },
41027         {
41028             "name": "-moz-outline-radius-topleft",
41029             "status": "nonstandard",
41030             "syntax": "<outline-radius>",
41031             "relevance": 0,
41032             "browsers": [
41033                 "FF1"
41034             ],
41035             "references": [
41036                 {
41037                     "name": "MDN Reference",
41038                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topleft"
41039                 }
41040             ],
41041             "description": "In Mozilla applications, the -moz-outline-radius-topleft CSS property can be used to round the top-left corner of an element's outline."
41042         },
41043         {
41044             "name": "-moz-outline-radius-topright",
41045             "status": "nonstandard",
41046             "syntax": "<outline-radius>",
41047             "relevance": 0,
41048             "browsers": [
41049                 "FF1"
41050             ],
41051             "references": [
41052                 {
41053                     "name": "MDN Reference",
41054                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-outline-radius-topright"
41055                 }
41056             ],
41057             "description": "In Mozilla applications, the -moz-outline-radius-topright CSS property can be used to round the top-right corner of an element's outline."
41058         },
41059         {
41060             "name": "-moz-stack-sizing",
41061             "status": "nonstandard",
41062             "syntax": "ignore | stretch-to-fit",
41063             "relevance": 0,
41064             "description": "-moz-stack-sizing is an extended CSS property. Normally, a stack will change its size so that all of its child elements are completely visible. For example, moving a child of the stack far to the right will widen the stack so the child remains visible."
41065         },
41066         {
41067             "name": "-moz-text-blink",
41068             "status": "nonstandard",
41069             "syntax": "none | blink",
41070             "relevance": 0,
41071             "description": "The -moz-text-blink non-standard Mozilla CSS extension specifies the blink mode."
41072         },
41073         {
41074             "name": "-moz-user-input",
41075             "status": "nonstandard",
41076             "syntax": "auto | none | enabled | disabled",
41077             "relevance": 0,
41078             "browsers": [
41079                 "FF1"
41080             ],
41081             "references": [
41082                 {
41083                     "name": "MDN Reference",
41084                     "url": "https://developer.mozilla.org/docs/Web/CSS/-moz-user-input"
41085                 }
41086             ],
41087             "description": "In Mozilla applications, -moz-user-input determines if an element will accept user input."
41088         },
41089         {
41090             "name": "-moz-user-modify",
41091             "status": "nonstandard",
41092             "syntax": "read-only | read-write | write-only",
41093             "relevance": 0,
41094             "description": "The -moz-user-modify property has no effect. It was originally planned to determine whether or not the content of an element can be edited by a user."
41095         },
41096         {
41097             "name": "-moz-window-dragging",
41098             "status": "nonstandard",
41099             "syntax": "drag | no-drag",
41100             "relevance": 0,
41101             "description": "The -moz-window-dragging CSS property specifies whether a window is draggable or not. It only works in Chrome code, and only on Mac OS X."
41102         },
41103         {
41104             "name": "-moz-window-shadow",
41105             "status": "nonstandard",
41106             "syntax": "default | menu | tooltip | sheet | none",
41107             "relevance": 0,
41108             "description": "The -moz-window-shadow CSS property specifies whether a window will have a shadow. It only works on Mac OS X."
41109         },
41110         {
41111             "name": "-webkit-border-before",
41112             "status": "nonstandard",
41113             "syntax": "<'border-width'> || <'border-style'> || <'color'>",
41114             "relevance": 0,
41115             "browsers": [
41116                 "E79",
41117                 "S5.1",
41118                 "C8",
41119                 "O15"
41120             ],
41121             "references": [
41122                 {
41123                     "name": "MDN Reference",
41124                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-border-before"
41125                 }
41126             ],
41127             "description": "The -webkit-border-before CSS property is a shorthand property for setting the individual logical block start border property values in a single place in the style sheet."
41128         },
41129         {
41130             "name": "-webkit-border-before-color",
41131             "status": "nonstandard",
41132             "syntax": "<'color'>",
41133             "relevance": 0,
41134             "description": "The -webkit-border-before-color CSS property sets the color of the individual logical block start border in a single place in the style sheet."
41135         },
41136         {
41137             "name": "-webkit-border-before-style",
41138             "status": "nonstandard",
41139             "syntax": "<'border-style'>",
41140             "relevance": 0,
41141             "description": "The -webkit-border-before-style CSS property sets the style of the individual logical block start border in a single place in the style sheet."
41142         },
41143         {
41144             "name": "-webkit-border-before-width",
41145             "status": "nonstandard",
41146             "syntax": "<'border-width'>",
41147             "relevance": 0,
41148             "description": "The -webkit-border-before-width CSS property sets the width of the individual logical block start border in a single place in the style sheet."
41149         },
41150         {
41151             "name": "-webkit-line-clamp",
41152             "syntax": "none | <integer>",
41153             "relevance": 50,
41154             "browsers": [
41155                 "E17",
41156                 "FF68",
41157                 "S5",
41158                 "C6",
41159                 "O15"
41160             ],
41161             "references": [
41162                 {
41163                     "name": "MDN Reference",
41164                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-line-clamp"
41165                 }
41166             ],
41167             "description": "The -webkit-line-clamp CSS property allows limiting of the contents of a block container to the specified number of lines."
41168         },
41169         {
41170             "name": "-webkit-mask",
41171             "status": "nonstandard",
41172             "syntax": "[ <mask-reference> || <position> [ / <bg-size> ]? || <repeat-style> || [ <box> | border | padding | content | text ] || [ <box> | border | padding | content ] ]#",
41173             "relevance": 0,
41174             "description": "The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points."
41175         },
41176         {
41177             "name": "-webkit-mask-attachment",
41178             "status": "nonstandard",
41179             "syntax": "<attachment>#",
41180             "relevance": 0,
41181             "browsers": [
41182                 "S4",
41183                 "C1"
41184             ],
41185             "references": [
41186                 {
41187                     "name": "MDN Reference",
41188                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-attachment"
41189                 }
41190             ],
41191             "description": "If a -webkit-mask-image is specified, -webkit-mask-attachment determines whether the mask image's position is fixed within the viewport, or scrolls along with its containing block."
41192         },
41193         {
41194             "name": "-webkit-mask-composite",
41195             "status": "nonstandard",
41196             "syntax": "<composite-style>#",
41197             "relevance": 0,
41198             "browsers": [
41199                 "E18",
41200                 "FF53",
41201                 "S3.2",
41202                 "C1",
41203                 "O15"
41204             ],
41205             "references": [
41206                 {
41207                     "name": "MDN Reference",
41208                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-composite"
41209                 }
41210             ],
41211             "description": "The -webkit-mask-composite property specifies the manner in which multiple mask images applied to the same element are composited with one another. Mask images are composited in the opposite order that they are declared with the -webkit-mask-image property."
41212         },
41213         {
41214             "name": "-webkit-mask-position",
41215             "status": "nonstandard",
41216             "syntax": "<position>#",
41217             "relevance": 0,
41218             "description": "The mask-position CSS property sets the initial position, relative to the mask position layer defined by mask-origin, for each defined mask image."
41219         },
41220         {
41221             "name": "-webkit-mask-position-x",
41222             "status": "nonstandard",
41223             "syntax": "[ <length-percentage> | left | center | right ]#",
41224             "relevance": 0,
41225             "browsers": [
41226                 "E18",
41227                 "FF49",
41228                 "S3.2",
41229                 "C1",
41230                 "O15"
41231             ],
41232             "references": [
41233                 {
41234                     "name": "MDN Reference",
41235                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-x"
41236                 }
41237             ],
41238             "description": "The -webkit-mask-position-x CSS property sets the initial horizontal position of a mask image."
41239         },
41240         {
41241             "name": "-webkit-mask-position-y",
41242             "status": "nonstandard",
41243             "syntax": "[ <length-percentage> | top | center | bottom ]#",
41244             "relevance": 0,
41245             "browsers": [
41246                 "E18",
41247                 "FF49",
41248                 "S3.2",
41249                 "C1",
41250                 "O15"
41251             ],
41252             "references": [
41253                 {
41254                     "name": "MDN Reference",
41255                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-position-y"
41256                 }
41257             ],
41258             "description": "The -webkit-mask-position-y CSS property sets the initial vertical position of a mask image."
41259         },
41260         {
41261             "name": "-webkit-mask-repeat-x",
41262             "status": "nonstandard",
41263             "syntax": "repeat | no-repeat | space | round",
41264             "relevance": 0,
41265             "browsers": [
41266                 "E18",
41267                 "S5",
41268                 "C3",
41269                 "O15"
41270             ],
41271             "references": [
41272                 {
41273                     "name": "MDN Reference",
41274                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-x"
41275                 }
41276             ],
41277             "description": "The -webkit-mask-repeat-x property specifies whether and how a mask image is repeated (tiled) horizontally."
41278         },
41279         {
41280             "name": "-webkit-mask-repeat-y",
41281             "status": "nonstandard",
41282             "syntax": "repeat | no-repeat | space | round",
41283             "relevance": 0,
41284             "browsers": [
41285                 "E18",
41286                 "S5",
41287                 "C3",
41288                 "O15"
41289             ],
41290             "references": [
41291                 {
41292                     "name": "MDN Reference",
41293                     "url": "https://developer.mozilla.org/docs/Web/CSS/-webkit-mask-repeat-y"
41294                 }
41295             ],
41296             "description": "The -webkit-mask-repeat-y property specifies whether and how a mask image is repeated (tiled) vertically."
41297         },
41298         {
41299             "name": "appearance",
41300             "status": "experimental",
41301             "syntax": "none | auto | button | textfield | menulist-button | <compat-auto>",
41302             "relevance": 60,
41303             "browsers": [
41304                 "E84",
41305                 "FF1",
41306                 "S3",
41307                 "C84",
41308                 "O70"
41309             ],
41310             "references": [
41311                 {
41312                     "name": "MDN Reference",
41313                     "url": "https://developer.mozilla.org/docs/Web/CSS/appearance"
41314                 }
41315             ],
41316             "description": "Changes the appearance of buttons and other controls to resemble native controls."
41317         },
41318         {
41319             "name": "aspect-ratio",
41320             "status": "experimental",
41321             "syntax": "auto | <ratio>",
41322             "relevance": 50,
41323             "browsers": [
41324                 "E79",
41325                 "FF71",
41326                 "C79"
41327             ],
41328             "references": [
41329                 {
41330                     "name": "MDN Reference",
41331                     "url": "https://developer.mozilla.org/docs/Web/CSS/aspect-ratio"
41332                 }
41333             ],
41334             "description": "The aspect-ratio   CSS property sets a preferred aspect ratio for the box, which will be used in the calculation of auto sizes and some other layout functions."
41335         },
41336         {
41337             "name": "azimuth",
41338             "status": "obsolete",
41339             "syntax": "<angle> | [ [ left-side | far-left | left | center-left | center | center-right | right | far-right | right-side ] || behind ] | leftwards | rightwards",
41340             "relevance": 0,
41341             "references": [
41342                 {
41343                     "name": "MDN Reference",
41344                     "url": "https://developer.mozilla.org/docs/Web/CSS/azimuth"
41345                 }
41346             ],
41347             "description": "In combination with elevation, the azimuth CSS property enables different audio sources to be positioned spatially for aural presentation. This is important in that it provides a natural way to tell several voices apart, as each can be positioned to originate at a different location on the sound stage. Stereo output produce a lateral sound stage, while binaural headphones and multi-speaker setups allow for a fully three-dimensional stage."
41348         },
41349         {
41350             "name": "backdrop-filter",
41351             "syntax": "none | <filter-function-list>",
41352             "relevance": 51,
41353             "browsers": [
41354                 "E17",
41355                 "FF70",
41356                 "S9",
41357                 "C76",
41358                 "O34"
41359             ],
41360             "references": [
41361                 {
41362                     "name": "MDN Reference",
41363                     "url": "https://developer.mozilla.org/docs/Web/CSS/backdrop-filter"
41364                 }
41365             ],
41366             "description": "The backdrop-filter CSS property lets you apply graphical effects such as blurring or color shifting to the area behind an element. Because it applies to everything behind the element, to see the effect you must make the element or its background at least partially transparent."
41367         },
41368         {
41369             "name": "border-block",
41370             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
41371             "relevance": 50,
41372             "browsers": [
41373                 "E79",
41374                 "FF66",
41375                 "C69",
41376                 "O56"
41377             ],
41378             "references": [
41379                 {
41380                     "name": "MDN Reference",
41381                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block"
41382                 }
41383             ],
41384             "description": "The border-block CSS property is a shorthand property for setting the individual logical block border property values in a single place in the style sheet."
41385         },
41386         {
41387             "name": "border-block-color",
41388             "syntax": "<'border-top-color'>{1,2}",
41389             "relevance": 50,
41390             "browsers": [
41391                 "E79",
41392                 "FF66",
41393                 "C69",
41394                 "O56"
41395             ],
41396             "references": [
41397                 {
41398                     "name": "MDN Reference",
41399                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-color"
41400                 }
41401             ],
41402             "description": "The border-block-color CSS property defines the color of the logical block borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation."
41403         },
41404         {
41405             "name": "border-block-style",
41406             "syntax": "<'border-top-style'>",
41407             "relevance": 50,
41408             "browsers": [
41409                 "E79",
41410                 "FF66",
41411                 "C69",
41412                 "O56"
41413             ],
41414             "references": [
41415                 {
41416                     "name": "MDN Reference",
41417                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-style"
41418                 }
41419             ],
41420             "description": "The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation."
41421         },
41422         {
41423             "name": "border-block-width",
41424             "syntax": "<'border-top-width'>",
41425             "relevance": 50,
41426             "browsers": [
41427                 "E79",
41428                 "FF66",
41429                 "C69",
41430                 "O56"
41431             ],
41432             "references": [
41433                 {
41434                     "name": "MDN Reference",
41435                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-block-width"
41436                 }
41437             ],
41438             "description": "The border-block-width CSS property defines the width of the logical block borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation."
41439         },
41440         {
41441             "name": "border-end-end-radius",
41442             "syntax": "<length-percentage>{1,2}",
41443             "relevance": 50,
41444             "browsers": [
41445                 "FF66"
41446             ],
41447             "references": [
41448                 {
41449                     "name": "MDN Reference",
41450                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-end-end-radius"
41451                 }
41452             ],
41453             "description": "The border-end-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on on the element's writing-mode, direction, and text-orientation."
41454         },
41455         {
41456             "name": "border-end-start-radius",
41457             "syntax": "<length-percentage>{1,2}",
41458             "relevance": 50,
41459             "browsers": [
41460                 "FF66"
41461             ],
41462             "references": [
41463                 {
41464                     "name": "MDN Reference",
41465                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-end-start-radius"
41466                 }
41467             ],
41468             "description": "The border-end-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation."
41469         },
41470         {
41471             "name": "border-inline",
41472             "syntax": "<'border-top-width'> || <'border-top-style'> || <'color'>",
41473             "relevance": 50,
41474             "browsers": [
41475                 "E79",
41476                 "FF66",
41477                 "C69",
41478                 "O56"
41479             ],
41480             "references": [
41481                 {
41482                     "name": "MDN Reference",
41483                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline"
41484                 }
41485             ],
41486             "description": "The border-inline CSS property is a shorthand property for setting the individual logical inline border property values in a single place in the style sheet."
41487         },
41488         {
41489             "name": "border-inline-color",
41490             "syntax": "<'border-top-color'>{1,2}",
41491             "relevance": 50,
41492             "browsers": [
41493                 "E79",
41494                 "FF66",
41495                 "C69",
41496                 "O56"
41497             ],
41498             "references": [
41499                 {
41500                     "name": "MDN Reference",
41501                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-color"
41502                 }
41503             ],
41504             "description": "The border-inline-color CSS property defines the color of the logical inline borders of an element, which maps to a physical border color depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-color and border-bottom-color, or border-right-color and border-left-color property depending on the values defined for writing-mode, direction, and text-orientation."
41505         },
41506         {
41507             "name": "border-inline-style",
41508             "syntax": "<'border-top-style'>",
41509             "relevance": 50,
41510             "browsers": [
41511                 "E79",
41512                 "FF66",
41513                 "C69",
41514                 "O56"
41515             ],
41516             "references": [
41517                 {
41518                     "name": "MDN Reference",
41519                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-style"
41520                 }
41521             ],
41522             "description": "The border-inline-style CSS property defines the style of the logical inline borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-style and border-bottom-style, or border-left-style and border-right-style properties depending on the values defined for writing-mode, direction, and text-orientation."
41523         },
41524         {
41525             "name": "border-inline-width",
41526             "syntax": "<'border-top-width'>",
41527             "relevance": 50,
41528             "browsers": [
41529                 "E79",
41530                 "FF66",
41531                 "C69",
41532                 "O56"
41533             ],
41534             "references": [
41535                 {
41536                     "name": "MDN Reference",
41537                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-inline-width"
41538                 }
41539             ],
41540             "description": "The border-inline-width CSS property defines the width of the logical inline borders of an element, which maps to a physical border width depending on the element's writing mode, directionality, and text orientation. It corresponds to the border-top-width and border-bottom-width, or border-left-width, and border-right-width property depending on the values defined for writing-mode, direction, and text-orientation."
41541         },
41542         {
41543             "name": "border-start-end-radius",
41544             "syntax": "<length-percentage>{1,2}",
41545             "relevance": 50,
41546             "browsers": [
41547                 "FF66"
41548             ],
41549             "references": [
41550                 {
41551                     "name": "MDN Reference",
41552                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-start-end-radius"
41553                 }
41554             ],
41555             "description": "The border-start-end-radius CSS property defines a logical border radius on an element, which maps to a physical border radius depending on the element's writing-mode, direction, and text-orientation."
41556         },
41557         {
41558             "name": "border-start-start-radius",
41559             "syntax": "<length-percentage>{1,2}",
41560             "relevance": 50,
41561             "browsers": [
41562                 "FF66"
41563             ],
41564             "references": [
41565                 {
41566                     "name": "MDN Reference",
41567                     "url": "https://developer.mozilla.org/docs/Web/CSS/border-start-start-radius"
41568                 }
41569             ],
41570             "description": "The border-start-start-radius CSS property defines a logical border radius on an element, which maps to a physical border radius that depends on the element's writing-mode, direction, and text-orientation."
41571         },
41572         {
41573             "name": "box-align",
41574             "status": "nonstandard",
41575             "syntax": "start | center | end | baseline | stretch",
41576             "relevance": 0,
41577             "browsers": [
41578                 "E12",
41579                 "FF1",
41580                 "S3",
41581                 "C1",
41582                 "O15"
41583             ],
41584             "references": [
41585                 {
41586                     "name": "MDN Reference",
41587                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-align"
41588                 }
41589             ],
41590             "description": "The box-align CSS property specifies how an element aligns its contents across its layout in a perpendicular direction. The effect of the property is only visible if there is extra space in the box."
41591         },
41592         {
41593             "name": "box-direction",
41594             "status": "nonstandard",
41595             "syntax": "normal | reverse | inherit",
41596             "relevance": 0,
41597             "browsers": [
41598                 "E12",
41599                 "FF1",
41600                 "S3",
41601                 "C1",
41602                 "O15"
41603             ],
41604             "references": [
41605                 {
41606                     "name": "MDN Reference",
41607                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-direction"
41608                 }
41609             ],
41610             "description": "The box-direction CSS property specifies whether a box lays out its contents normally (from the top or left edge), or in reverse (from the bottom or right edge)."
41611         },
41612         {
41613             "name": "box-flex",
41614             "status": "nonstandard",
41615             "syntax": "<number>",
41616             "relevance": 0,
41617             "browsers": [
41618                 "E12",
41619                 "FF1",
41620                 "S3",
41621                 "C1",
41622                 "O15"
41623             ],
41624             "references": [
41625                 {
41626                     "name": "MDN Reference",
41627                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-flex"
41628                 }
41629             ],
41630             "description": "The -moz-box-flex and -webkit-box-flex CSS properties specify how a -moz-box or -webkit-box grows to fill the box that contains it, in the direction of the containing box's layout."
41631         },
41632         {
41633             "name": "box-flex-group",
41634             "status": "nonstandard",
41635             "syntax": "<integer>",
41636             "relevance": 0,
41637             "browsers": [
41638                 "S3",
41639                 "C1",
41640                 "O15"
41641             ],
41642             "references": [
41643                 {
41644                     "name": "MDN Reference",
41645                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-flex-group"
41646                 }
41647             ],
41648             "description": "The box-flex-group CSS property assigns the flexbox's child elements to a flex group."
41649         },
41650         {
41651             "name": "box-lines",
41652             "status": "nonstandard",
41653             "syntax": "single | multiple",
41654             "relevance": 0,
41655             "browsers": [
41656                 "S3",
41657                 "C1",
41658                 "O15"
41659             ],
41660             "references": [
41661                 {
41662                     "name": "MDN Reference",
41663                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-lines"
41664                 }
41665             ],
41666             "description": "The box-lines CSS property determines whether the box may have a single or multiple lines (rows for horizontally oriented boxes, columns for vertically oriented boxes)."
41667         },
41668         {
41669             "name": "box-ordinal-group",
41670             "status": "nonstandard",
41671             "syntax": "<integer>",
41672             "relevance": 0,
41673             "browsers": [
41674                 "E12",
41675                 "FF1",
41676                 "S3",
41677                 "C1",
41678                 "O15"
41679             ],
41680             "references": [
41681                 {
41682                     "name": "MDN Reference",
41683                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-ordinal-group"
41684                 }
41685             ],
41686             "description": "The box-ordinal-group CSS property assigns the flexbox's child elements to an ordinal group."
41687         },
41688         {
41689             "name": "box-orient",
41690             "status": "nonstandard",
41691             "syntax": "horizontal | vertical | inline-axis | block-axis | inherit",
41692             "relevance": 0,
41693             "browsers": [
41694                 "E12",
41695                 "FF1",
41696                 "S3",
41697                 "C1",
41698                 "O15"
41699             ],
41700             "references": [
41701                 {
41702                     "name": "MDN Reference",
41703                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-orient"
41704                 }
41705             ],
41706             "description": "The box-orient CSS property specifies whether an element lays out its contents horizontally or vertically."
41707         },
41708         {
41709             "name": "box-pack",
41710             "status": "nonstandard",
41711             "syntax": "start | center | end | justify",
41712             "relevance": 0,
41713             "browsers": [
41714                 "E12",
41715                 "FF1",
41716                 "S3",
41717                 "C1",
41718                 "O15"
41719             ],
41720             "references": [
41721                 {
41722                     "name": "MDN Reference",
41723                     "url": "https://developer.mozilla.org/docs/Web/CSS/box-pack"
41724                 }
41725             ],
41726             "description": "The -moz-box-pack and -webkit-box-pack CSS properties specify how a -moz-box or -webkit-box packs its contents in the direction of its layout. The effect of this is only visible if there is extra space in the box."
41727         },
41728         {
41729             "name": "color-adjust",
41730             "syntax": "economy | exact",
41731             "relevance": 50,
41732             "browsers": [
41733                 "E79",
41734                 "FF48",
41735                 "S6",
41736                 "C49",
41737                 "O15"
41738             ],
41739             "references": [
41740                 {
41741                     "name": "MDN Reference",
41742                     "url": "https://developer.mozilla.org/docs/Web/CSS/color-adjust"
41743                 }
41744             ],
41745             "description": "The color-adjust property is a non-standard CSS extension that can be used to force printing of background colors and images in browsers based on the WebKit engine."
41746         },
41747         {
41748             "name": "counter-set",
41749             "syntax": "[ <custom-ident> <integer>? ]+ | none",
41750             "relevance": 50,
41751             "browsers": [
41752                 "FF68"
41753             ],
41754             "references": [
41755                 {
41756                     "name": "MDN Reference",
41757                     "url": "https://developer.mozilla.org/docs/Web/CSS/counter-set"
41758                 }
41759             ],
41760             "description": "The counter-set CSS property sets a CSS counter to a given value. It manipulates the value of existing counters, and will only create new counters if there isn't already a counter of the given name on the element."
41761         },
41762         {
41763             "name": "font-optical-sizing",
41764             "syntax": "auto | none",
41765             "relevance": 50,
41766             "browsers": [
41767                 "E17",
41768                 "FF62",
41769                 "S11",
41770                 "C79",
41771                 "O66"
41772             ],
41773             "references": [
41774                 {
41775                     "name": "MDN Reference",
41776                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-optical-sizing"
41777                 }
41778             ],
41779             "description": "The font-optical-sizing CSS property allows developers to control whether browsers render text with slightly differing visual representations to optimize viewing at different sizes, or not. This only works for fonts that have an optical size variation axis."
41780         },
41781         {
41782             "name": "font-variation-settings",
41783             "syntax": "normal | [ <string> <number> ]#",
41784             "relevance": 50,
41785             "browsers": [
41786                 "E17",
41787                 "FF62",
41788                 "S11",
41789                 "C62",
41790                 "O49"
41791             ],
41792             "references": [
41793                 {
41794                     "name": "MDN Reference",
41795                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-variation-settings"
41796                 }
41797             ],
41798             "description": "The font-variation-settings CSS property provides low-level control over OpenType or TrueType font variations, by specifying the four letter axis names of the features you want to vary, along with their variation values."
41799         },
41800         {
41801             "name": "font-smooth",
41802             "status": "nonstandard",
41803             "syntax": "auto | never | always | <absolute-size> | <length>",
41804             "relevance": 0,
41805             "browsers": [
41806                 "E79",
41807                 "FF25",
41808                 "S4",
41809                 "C5",
41810                 "O15"
41811             ],
41812             "references": [
41813                 {
41814                     "name": "MDN Reference",
41815                     "url": "https://developer.mozilla.org/docs/Web/CSS/font-smooth"
41816                 }
41817             ],
41818             "description": ""
41819         },
41820         {
41821             "name": "gap",
41822             "syntax": "<'row-gap'> <'column-gap'>?",
41823             "relevance": 50,
41824             "browsers": [
41825                 "E84",
41826                 "FF63",
41827                 "S10.1",
41828                 "C84",
41829                 "O70"
41830             ],
41831             "description": "The gap CSS property is a shorthand property for row-gap and column-gap specifying the gutters between grid rows and columns."
41832         },
41833         {
41834             "name": "hanging-punctuation",
41835             "syntax": "none | [ first || [ force-end | allow-end ] || last ]",
41836             "relevance": 50,
41837             "browsers": [
41838                 "S10"
41839             ],
41840             "references": [
41841                 {
41842                     "name": "MDN Reference",
41843                     "url": "https://developer.mozilla.org/docs/Web/CSS/hanging-punctuation"
41844                 }
41845             ],
41846             "description": "The hanging-punctuation CSS property specifies whether a punctuation mark should hang at the start or end of a line of text. Hanging punctuation may be placed outside the line box."
41847         },
41848         {
41849             "name": "image-resolution",
41850             "status": "experimental",
41851             "syntax": "[ from-image || <resolution> ] && snap?",
41852             "relevance": 50,
41853             "description": "The image-resolution property specifies the intrinsic resolution of all raster images used in or on the element. It affects both content images (e.g. replaced elements and generated content) and decorative images (such as background-image). The intrinsic resolution of an image is used to determine the image’s intrinsic dimensions."
41854         },
41855         {
41856             "name": "initial-letter",
41857             "status": "experimental",
41858             "syntax": "normal | [ <number> <integer>? ]",
41859             "relevance": 50,
41860             "browsers": [
41861                 "S9"
41862             ],
41863             "references": [
41864                 {
41865                     "name": "MDN Reference",
41866                     "url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter"
41867                 }
41868             ],
41869             "description": "The initial-letter CSS property specifies styling for dropped, raised, and sunken initial letters."
41870         },
41871         {
41872             "name": "initial-letter-align",
41873             "status": "experimental",
41874             "syntax": "[ auto | alphabetic | hanging | ideographic ]",
41875             "relevance": 50,
41876             "references": [
41877                 {
41878                     "name": "MDN Reference",
41879                     "url": "https://developer.mozilla.org/docs/Web/CSS/initial-letter-align"
41880                 }
41881             ],
41882             "description": "The initial-letter-align CSS property specifies the alignment of initial letters within a paragraph."
41883         },
41884         {
41885             "name": "inset",
41886             "syntax": "<'top'>{1,4}",
41887             "relevance": 50,
41888             "browsers": [
41889                 "FF66"
41890             ],
41891             "references": [
41892                 {
41893                     "name": "MDN Reference",
41894                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset"
41895                 }
41896             ],
41897             "description": "The inset CSS property defines the logical block and inline start and end offsets of an element, which map to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."
41898         },
41899         {
41900             "name": "inset-block",
41901             "syntax": "<'top'>{1,2}",
41902             "relevance": 50,
41903             "browsers": [
41904                 "E79",
41905                 "FF63",
41906                 "C69",
41907                 "O56"
41908             ],
41909             "references": [
41910                 {
41911                     "name": "MDN Reference",
41912                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-block"
41913                 }
41914             ],
41915             "description": "The inset-block CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."
41916         },
41917         {
41918             "name": "inset-block-end",
41919             "syntax": "<'top'>",
41920             "relevance": 50,
41921             "browsers": [
41922                 "E79",
41923                 "FF63",
41924                 "C69",
41925                 "O56"
41926             ],
41927             "references": [
41928                 {
41929                     "name": "MDN Reference",
41930                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-end"
41931                 }
41932             ],
41933             "description": "The inset-block-end CSS property defines the logical block end offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."
41934         },
41935         {
41936             "name": "inset-block-start",
41937             "syntax": "<'top'>",
41938             "relevance": 50,
41939             "browsers": [
41940                 "E79",
41941                 "FF63",
41942                 "C69",
41943                 "O56"
41944             ],
41945             "references": [
41946                 {
41947                     "name": "MDN Reference",
41948                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-block-start"
41949                 }
41950             ],
41951             "description": "The inset-block-start CSS property defines the logical block start offset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."
41952         },
41953         {
41954             "name": "inset-inline",
41955             "syntax": "<'top'>{1,2}",
41956             "relevance": 50,
41957             "browsers": [
41958                 "E79",
41959                 "FF63",
41960                 "C69",
41961                 "O56"
41962             ],
41963             "references": [
41964                 {
41965                     "name": "MDN Reference",
41966                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline"
41967                 }
41968             ],
41969             "description": "The inset-inline CSS property defines the logical block start and end offsets of an element, which maps to physical offsets depending on the element's writing mode, directionality, and text orientation. It corresponds to the top and bottom, or right and left properties depending on the values defined for writing-mode, direction, and text-orientation."
41970         },
41971         {
41972             "name": "inset-inline-end",
41973             "syntax": "<'top'>",
41974             "relevance": 50,
41975             "browsers": [
41976                 "E79",
41977                 "FF63",
41978                 "C69",
41979                 "O56"
41980             ],
41981             "references": [
41982                 {
41983                     "name": "MDN Reference",
41984                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-end"
41985                 }
41986             ],
41987             "description": "The inset-inline-end CSS property defines the logical inline end inset of an element, which maps to a physical inset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."
41988         },
41989         {
41990             "name": "inset-inline-start",
41991             "syntax": "<'top'>",
41992             "relevance": 50,
41993             "browsers": [
41994                 "E79",
41995                 "FF63",
41996                 "C69",
41997                 "O56"
41998             ],
41999             "references": [
42000                 {
42001                     "name": "MDN Reference",
42002                     "url": "https://developer.mozilla.org/docs/Web/CSS/inset-inline-start"
42003                 }
42004             ],
42005             "description": "The inset-inline-start CSS property defines the logical inline start inset of an element, which maps to a physical offset depending on the element's writing mode, directionality, and text orientation. It corresponds to the top, right, bottom, or left property depending on the values defined for writing-mode, direction, and text-orientation."
42006         },
42007         {
42008             "name": "line-clamp",
42009             "status": "experimental",
42010             "syntax": "none | <integer>",
42011             "relevance": 50,
42012             "description": "The line-clamp property allows limiting the contents of a block container to the specified number of lines; remaining content is fragmented away and neither rendered nor measured. Optionally, it also allows inserting content into the last line box to indicate the continuity of truncated/interrupted content."
42013         },
42014         {
42015             "name": "line-height-step",
42016             "status": "experimental",
42017             "syntax": "<length>",
42018             "relevance": 50,
42019             "browsers": [
42020                 "E79",
42021                 "C60",
42022                 "O47"
42023             ],
42024             "references": [
42025                 {
42026                     "name": "MDN Reference",
42027                     "url": "https://developer.mozilla.org/docs/Web/CSS/line-height-step"
42028                 }
42029             ],
42030             "description": "The line-height-step CSS property defines the step units for line box heights. When the step unit is positive, line box heights are rounded up to the closest multiple of the unit. Negative values are invalid."
42031         },
42032         {
42033             "name": "margin-block",
42034             "syntax": "<'margin-left'>{1,2}",
42035             "relevance": 50,
42036             "browsers": [
42037                 "E79",
42038                 "FF66",
42039                 "C69",
42040                 "O56"
42041             ],
42042             "references": [
42043                 {
42044                     "name": "MDN Reference",
42045                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-block"
42046                 }
42047             ],
42048             "description": "The margin-block CSS property defines the logical block start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation."
42049         },
42050         {
42051             "name": "margin-inline",
42052             "syntax": "<'margin-left'>{1,2}",
42053             "relevance": 50,
42054             "browsers": [
42055                 "E79",
42056                 "FF66",
42057                 "C69",
42058                 "O56"
42059             ],
42060             "references": [
42061                 {
42062                     "name": "MDN Reference",
42063                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-inline"
42064                 }
42065             ],
42066             "description": "The margin-inline CSS property defines the logical inline start and end margins of an element, which maps to physical margins depending on the element's writing mode, directionality, and text orientation."
42067         },
42068         {
42069             "name": "margin-trim",
42070             "status": "experimental",
42071             "syntax": "none | in-flow | all",
42072             "relevance": 50,
42073             "references": [
42074                 {
42075                     "name": "MDN Reference",
42076                     "url": "https://developer.mozilla.org/docs/Web/CSS/margin-trim"
42077                 }
42078             ],
42079             "description": "The margin-trim property allows the container to trim the margins of its children where they adjoin the container’s edges."
42080         },
42081         {
42082             "name": "mask",
42083             "syntax": "<mask-layer>#",
42084             "relevance": 50,
42085             "browsers": [
42086                 "E12",
42087                 "FF2",
42088                 "S3.2",
42089                 "C1",
42090                 "O15"
42091             ],
42092             "references": [
42093                 {
42094                     "name": "MDN Reference",
42095                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask"
42096                 }
42097             ],
42098             "description": "The mask CSS property alters the visibility of an element by either partially or fully hiding it. This is accomplished by either masking or clipping the image at specific points."
42099         },
42100         {
42101             "name": "mask-border",
42102             "syntax": "<'mask-border-source'> || <'mask-border-slice'> [ / <'mask-border-width'>? [ / <'mask-border-outset'> ]? ]? || <'mask-border-repeat'> || <'mask-border-mode'>",
42103             "relevance": 50,
42104             "description": "The mask-border CSS property lets you create a mask along the edge of an element's border.\n\nThis property is a shorthand for mask-border-source, mask-border-slice, mask-border-width, mask-border-outset, mask-border-repeat, and mask-border-mode. As with all shorthand properties, any omitted sub-values will be set to their initial value."
42105         },
42106         {
42107             "name": "mask-border-mode",
42108             "syntax": "luminance | alpha",
42109             "relevance": 50,
42110             "description": "The mask-border-mode CSS property specifies the blending mode used in a mask border."
42111         },
42112         {
42113             "name": "mask-border-outset",
42114             "syntax": "[ <length> | <number> ]{1,4}",
42115             "relevance": 50,
42116             "description": "The mask-border-outset CSS property specifies the distance by which an element's mask border is set out from its border box."
42117         },
42118         {
42119             "name": "mask-border-repeat",
42120             "syntax": "[ stretch | repeat | round | space ]{1,2}",
42121             "relevance": 50,
42122             "description": "The mask-border-repeat CSS property defines how the edge regions of a source image are adjusted to fit the dimensions of an element's mask border."
42123         },
42124         {
42125             "name": "mask-border-slice",
42126             "syntax": "<number-percentage>{1,4} fill?",
42127             "relevance": 50,
42128             "description": "The mask-border-slice CSS property divides the image specified by mask-border-source into regions. These regions are used to form the components of an element's mask border."
42129         },
42130         {
42131             "name": "mask-border-source",
42132             "syntax": "none | <image>",
42133             "relevance": 50,
42134             "description": "The mask-border-source CSS property specifies the source image used to create an element's mask border.\n\nThe mask-border-slice property is used to divide the source image into regions, which are then dynamically applied to the final mask border."
42135         },
42136         {
42137             "name": "mask-border-width",
42138             "syntax": "[ <length-percentage> | <number> | auto ]{1,4}",
42139             "relevance": 50,
42140             "description": "The mask-border-width CSS property specifies the width of an element's mask border."
42141         },
42142         {
42143             "name": "mask-clip",
42144             "syntax": "[ <geometry-box> | no-clip ]#",
42145             "relevance": 50,
42146             "browsers": [
42147                 "E79",
42148                 "FF53",
42149                 "S4",
42150                 "C1",
42151                 "O15"
42152             ],
42153             "references": [
42154                 {
42155                     "name": "MDN Reference",
42156                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-clip"
42157                 }
42158             ],
42159             "description": "The mask-clip CSS property determines the area, which is affected by a mask. The painted content of an element must be restricted to this area."
42160         },
42161         {
42162             "name": "mask-composite",
42163             "syntax": "<compositing-operator>#",
42164             "relevance": 50,
42165             "browsers": [
42166                 "E18",
42167                 "FF53"
42168             ],
42169             "references": [
42170                 {
42171                     "name": "MDN Reference",
42172                     "url": "https://developer.mozilla.org/docs/Web/CSS/mask-composite"
42173                 }
42174             ],
42175             "description": "The mask-composite CSS property represents a compositing operation used on the current mask layer with the mask layers below it."
42176         },
42177         {
42178             "name": "max-lines",
42179             "status": "experimental",
42180             "syntax": "none | <integer>",
42181             "relevance": 50,
42182             "description": "The max-liens property forces a break after a set number of lines"
42183         },
42184         {
42185             "name": "offset",
42186             "syntax": "[ <'offset-position'>? [ <'offset-path'> [ <'offset-distance'> || <'offset-rotate'> ]? ]? ]! [ / <'offset-anchor'> ]?",
42187             "relevance": 50,
42188             "browsers": [
42189                 "E79",
42190                 "FF72",
42191                 "C55",
42192                 "O42"
42193             ],
42194             "references": [
42195                 {
42196                     "name": "MDN Reference",
42197                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset"
42198                 }
42199             ],
42200             "description": "The offset CSS property is a shorthand property for animating an element along a defined path."
42201         },
42202         {
42203             "name": "offset-anchor",
42204             "syntax": "auto | <position>",
42205             "relevance": 50,
42206             "browsers": [
42207                 "E79",
42208                 "FF72",
42209                 "C79"
42210             ],
42211             "references": [
42212                 {
42213                     "name": "MDN Reference",
42214                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset-anchor"
42215                 }
42216             ],
42217             "description": "Defines an anchor point of the box positioned along the path. The anchor point specifies the point of the box which is to be considered as the point that is moved along the path."
42218         },
42219         {
42220             "name": "offset-distance",
42221             "syntax": "<length-percentage>",
42222             "relevance": 50,
42223             "browsers": [
42224                 "E79",
42225                 "FF72",
42226                 "C55",
42227                 "O42"
42228             ],
42229             "references": [
42230                 {
42231                     "name": "MDN Reference",
42232                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset-distance"
42233                 }
42234             ],
42235             "description": "The offset-distance CSS property specifies a position along an offset-path."
42236         },
42237         {
42238             "name": "offset-path",
42239             "syntax": "none | ray( [ <angle> && <size>? && contain? ] ) | <path()> | <url> | [ <basic-shape> || <geometry-box> ]",
42240             "relevance": 50,
42241             "browsers": [
42242                 "E79",
42243                 "FF72",
42244                 "C55",
42245                 "O45"
42246             ],
42247             "references": [
42248                 {
42249                     "name": "MDN Reference",
42250                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset-path"
42251                 }
42252             ],
42253             "description": "The offset-path CSS property specifies the offset path where the element gets positioned. The exact element’s position on the offset path is determined by the offset-distance property. An offset path is either a specified path with one or multiple sub-paths or the geometry of a not-styled basic shape. Each shape or path must define an initial position for the computed value of \"0\" for offset-distance and an initial direction which specifies the rotation of the object to the initial position.\n\nIn this specification, a direction (or rotation) of 0 degrees is equivalent to the direction of the positive x-axis in the object’s local coordinate system. In other words, a rotation of 0 degree points to the right side of the UA if the object and its ancestors have no transformation applied."
42254         },
42255         {
42256             "name": "offset-position",
42257             "status": "experimental",
42258             "syntax": "auto | <position>",
42259             "relevance": 50,
42260             "references": [
42261                 {
42262                     "name": "MDN Reference",
42263                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset-position"
42264                 }
42265             ],
42266             "description": "Specifies the initial position of the offset path. If position is specified with static, offset-position would be ignored."
42267         },
42268         {
42269             "name": "offset-rotate",
42270             "syntax": "[ auto | reverse ] || <angle>",
42271             "relevance": 50,
42272             "browsers": [
42273                 "E79",
42274                 "FF72",
42275                 "C56",
42276                 "O43"
42277             ],
42278             "references": [
42279                 {
42280                     "name": "MDN Reference",
42281                     "url": "https://developer.mozilla.org/docs/Web/CSS/offset-rotate"
42282                 }
42283             ],
42284             "description": "The offset-rotate CSS property defines the direction of the element while positioning along the offset path."
42285         },
42286         {
42287             "name": "overflow-anchor",
42288             "syntax": "auto | none",
42289             "relevance": 51,
42290             "browsers": [
42291                 "E79",
42292                 "FF66",
42293                 "C56",
42294                 "O43"
42295             ],
42296             "references": [
42297                 {
42298                     "name": "MDN Reference",
42299                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-anchor"
42300                 }
42301             ],
42302             "description": "The overflow-anchor CSS property provides a way to opt out browser scroll anchoring behavior which adjusts scroll position to minimize content shifts."
42303         },
42304         {
42305             "name": "overflow-block",
42306             "syntax": "visible | hidden | clip | scroll | auto",
42307             "relevance": 50,
42308             "browsers": [
42309                 "FF69"
42310             ],
42311             "references": [
42312                 {
42313                     "name": "MDN Reference",
42314                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-block"
42315                 }
42316             ],
42317             "description": "The overflow-block CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the block axis."
42318         },
42319         {
42320             "name": "overflow-clip-box",
42321             "status": "nonstandard",
42322             "syntax": "padding-box | content-box",
42323             "relevance": 0,
42324             "browsers": [
42325                 "FF29"
42326             ],
42327             "references": [
42328                 {
42329                     "name": "MDN Reference",
42330                     "url": "https://developer.mozilla.org/docs/Mozilla/Gecko/Chrome/CSS/overflow-clip-box"
42331                 }
42332             ],
42333             "description": "The overflow-clip-box CSS property specifies relative to which box the clipping happens when there is an overflow. It is short hand for the overflow-clip-box-inline and overflow-clip-box-block properties."
42334         },
42335         {
42336             "name": "overflow-inline",
42337             "syntax": "visible | hidden | clip | scroll | auto",
42338             "relevance": 50,
42339             "browsers": [
42340                 "FF69"
42341             ],
42342             "references": [
42343                 {
42344                     "name": "MDN Reference",
42345                     "url": "https://developer.mozilla.org/docs/Web/CSS/overflow-inline"
42346                 }
42347             ],
42348             "description": "The overflow-inline CSS media feature can be used to test how the output device handles content that overflows the initial containing block along the inline axis."
42349         },
42350         {
42351             "name": "overscroll-behavior",
42352             "syntax": "[ contain | none | auto ]{1,2}",
42353             "relevance": 50,
42354             "browsers": [
42355                 "E18",
42356                 "FF59",
42357                 "C63",
42358                 "O50"
42359             ],
42360             "references": [
42361                 {
42362                     "name": "MDN Reference",
42363                     "url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior"
42364                 }
42365             ],
42366             "description": "The overscroll-behavior CSS property is shorthand for the overscroll-behavior-x and overscroll-behavior-y properties, which allow you to control the browser's scroll overflow behavior — what happens when the boundary of a scrolling area is reached."
42367         },
42368         {
42369             "name": "overscroll-behavior-block",
42370             "syntax": "contain | none | auto",
42371             "relevance": 50,
42372             "browsers": [
42373                 "E79",
42374                 "FF73",
42375                 "C77",
42376                 "O64"
42377             ],
42378             "references": [
42379                 {
42380                     "name": "MDN Reference",
42381                     "url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-block"
42382                 }
42383             ],
42384             "description": "The overscroll-behavior-block CSS property sets the browser's behavior when the block direction boundary of a scrolling area is reached."
42385         },
42386         {
42387             "name": "overscroll-behavior-inline",
42388             "syntax": "contain | none | auto",
42389             "relevance": 50,
42390             "browsers": [
42391                 "E79",
42392                 "FF73",
42393                 "C77",
42394                 "O64"
42395             ],
42396             "references": [
42397                 {
42398                     "name": "MDN Reference",
42399                     "url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-inline"
42400                 }
42401             ],
42402             "description": "The overscroll-behavior-inline CSS property sets the browser's behavior when the inline direction boundary of a scrolling area is reached."
42403         },
42404         {
42405             "name": "overscroll-behavior-x",
42406             "syntax": "contain | none | auto",
42407             "relevance": 50,
42408             "browsers": [
42409                 "E18",
42410                 "FF59",
42411                 "C63",
42412                 "O50"
42413             ],
42414             "references": [
42415                 {
42416                     "name": "MDN Reference",
42417                     "url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-x"
42418                 }
42419             ],
42420             "description": "The overscroll-behavior-x CSS property is allows you to control the browser's scroll overflow behavior — what happens when the boundary of a scrolling area is reached — in the x axis direction."
42421         },
42422         {
42423             "name": "overscroll-behavior-y",
42424             "syntax": "contain | none | auto",
42425             "relevance": 50,
42426             "browsers": [
42427                 "E18",
42428                 "FF59",
42429                 "C63",
42430                 "O50"
42431             ],
42432             "references": [
42433                 {
42434                     "name": "MDN Reference",
42435                     "url": "https://developer.mozilla.org/docs/Web/CSS/overscroll-behavior-y"
42436                 }
42437             ],
42438             "description": "The overscroll-behavior-y CSS property is allows you to control the browser's scroll overflow behavior — what happens when the boundary of a scrolling area is reached — in the y axis direction."
42439         },
42440         {
42441             "name": "padding-block",
42442             "syntax": "<'padding-left'>{1,2}",
42443             "relevance": 50,
42444             "browsers": [
42445                 "E79",
42446                 "FF66",
42447                 "C69",
42448                 "O56"
42449             ],
42450             "references": [
42451                 {
42452                     "name": "MDN Reference",
42453                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-block"
42454                 }
42455             ],
42456             "description": "The padding-block CSS property defines the logical block start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation."
42457         },
42458         {
42459             "name": "padding-inline",
42460             "syntax": "<'padding-left'>{1,2}",
42461             "relevance": 50,
42462             "browsers": [
42463                 "E79",
42464                 "FF66",
42465                 "C69",
42466                 "O56"
42467             ],
42468             "references": [
42469                 {
42470                     "name": "MDN Reference",
42471                     "url": "https://developer.mozilla.org/docs/Web/CSS/padding-inline"
42472                 }
42473             ],
42474             "description": "The padding-inline CSS property defines the logical inline start and end padding of an element, which maps to physical padding properties depending on the element's writing mode, directionality, and text orientation."
42475         },
42476         {
42477             "name": "place-content",
42478             "syntax": "<'align-content'> <'justify-content'>?",
42479             "relevance": 50,
42480             "browsers": [
42481                 "E79",
42482                 "FF53",
42483                 "S9",
42484                 "C59",
42485                 "O46"
42486             ],
42487             "description": "The place-content CSS shorthand property sets both the align-content and justify-content properties."
42488         },
42489         {
42490             "name": "place-items",
42491             "syntax": "<'align-items'> <'justify-items'>?",
42492             "relevance": 50,
42493             "browsers": [
42494                 "E79",
42495                 "FF45",
42496                 "S11",
42497                 "C59",
42498                 "O46"
42499             ],
42500             "description": "The CSS place-items shorthand property sets both the align-items and justify-items properties. The first value is the align-items property value, the second the justify-items one. If the second value is not present, the first value is also used for it."
42501         },
42502         {
42503             "name": "place-self",
42504             "syntax": "<'align-self'> <'justify-self'>?",
42505             "relevance": 50,
42506             "browsers": [
42507                 "E79",
42508                 "FF45",
42509                 "C59",
42510                 "O46"
42511             ],
42512             "description": "The place-self CSS property is a shorthand property sets both the align-self and justify-self properties. The first value is the align-self property value, the second the justify-self one. If the second value is not present, the first value is also used for it."
42513         },
42514         {
42515             "name": "rotate",
42516             "syntax": "none | <angle> | [ x | y | z | <number>{3} ] && <angle>",
42517             "relevance": 50,
42518             "browsers": [
42519                 "FF72"
42520             ],
42521             "references": [
42522                 {
42523                     "name": "MDN Reference",
42524                     "url": "https://developer.mozilla.org/docs/Web/CSS/rotate"
42525                 }
42526             ],
42527             "description": "The rotate CSS property allows you to specify rotation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."
42528         },
42529         {
42530             "name": "row-gap",
42531             "syntax": "normal | <length-percentage>",
42532             "relevance": 50,
42533             "browsers": [
42534                 "E84",
42535                 "FF63",
42536                 "S10.1",
42537                 "C84",
42538                 "O70"
42539             ],
42540             "description": "The row-gap CSS property specifies the gutter between grid rows."
42541         },
42542         {
42543             "name": "ruby-merge",
42544             "status": "experimental",
42545             "syntax": "separate | collapse | auto",
42546             "relevance": 50,
42547             "description": "This property controls how ruby annotation boxes should be rendered when there are more than one in a ruby container box: whether each pair should be kept separate, the annotations should be collapsed and rendered as a group, or the separation should be determined based on the space available."
42548         },
42549         {
42550             "name": "scale",
42551             "syntax": "none | <number>{1,3}",
42552             "relevance": 50,
42553             "browsers": [
42554                 "FF72"
42555             ],
42556             "references": [
42557                 {
42558                     "name": "MDN Reference",
42559                     "url": "https://developer.mozilla.org/docs/Web/CSS/scale"
42560                 }
42561             ],
42562             "description": "The scale CSS property allows you to specify scale transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."
42563         },
42564         {
42565             "name": "scrollbar-color",
42566             "syntax": "auto | dark | light | <color>{2}",
42567             "relevance": 50,
42568             "browsers": [
42569                 "FF64"
42570             ],
42571             "references": [
42572                 {
42573                     "name": "MDN Reference",
42574                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-color"
42575                 }
42576             ],
42577             "description": "The scrollbar-color CSS property sets the color of the scrollbar track and thumb."
42578         },
42579         {
42580             "name": "scrollbar-width",
42581             "syntax": "auto | thin | none",
42582             "relevance": 50,
42583             "browsers": [
42584                 "FF64"
42585             ],
42586             "references": [
42587                 {
42588                     "name": "MDN Reference",
42589                     "url": "https://developer.mozilla.org/docs/Web/CSS/scrollbar-width"
42590                 }
42591             ],
42592             "description": "The scrollbar-width property allows the author to set the maximum thickness of an element’s scrollbars when they are shown. "
42593         },
42594         {
42595             "name": "scroll-margin",
42596             "syntax": "<length>{1,4}",
42597             "relevance": 50,
42598             "browsers": [
42599                 "E79",
42600                 "FF68",
42601                 "S11",
42602                 "C69",
42603                 "O56"
42604             ],
42605             "references": [
42606                 {
42607                     "name": "MDN Reference",
42608                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin"
42609                 }
42610             ],
42611             "description": "The scroll-margin property is a shorthand property which sets all of the scroll-margin longhands, assigning values much like the margin property does for the margin-* longhands."
42612         },
42613         {
42614             "name": "scroll-margin-block",
42615             "syntax": "<length>{1,2}",
42616             "relevance": 50,
42617             "browsers": [
42618                 "E79",
42619                 "FF68",
42620                 "C69",
42621                 "O56"
42622             ],
42623             "references": [
42624                 {
42625                     "name": "MDN Reference",
42626                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block"
42627                 }
42628             ],
42629             "description": "The scroll-margin-block property is a shorthand property which sets the scroll-margin longhands in the block dimension."
42630         },
42631         {
42632             "name": "scroll-margin-block-start",
42633             "syntax": "<length>",
42634             "relevance": 50,
42635             "browsers": [
42636                 "E79",
42637                 "FF68",
42638                 "C69",
42639                 "O56"
42640             ],
42641             "references": [
42642                 {
42643                     "name": "MDN Reference",
42644                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-start"
42645                 }
42646             ],
42647             "description": "The scroll-margin-block-start property defines the margin of the scroll snap area at the start of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42648         },
42649         {
42650             "name": "scroll-margin-block-end",
42651             "syntax": "<length>",
42652             "relevance": 50,
42653             "browsers": [
42654                 "E79",
42655                 "FF68",
42656                 "C69",
42657                 "O56"
42658             ],
42659             "references": [
42660                 {
42661                     "name": "MDN Reference",
42662                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-block-end"
42663                 }
42664             ],
42665             "description": "The scroll-margin-block-end property defines the margin of the scroll snap area at the end of the block dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42666         },
42667         {
42668             "name": "scroll-margin-bottom",
42669             "syntax": "<length>",
42670             "relevance": 50,
42671             "browsers": [
42672                 "E79",
42673                 "FF68",
42674                 "S11",
42675                 "C69",
42676                 "O56"
42677             ],
42678             "references": [
42679                 {
42680                     "name": "MDN Reference",
42681                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-bottom"
42682                 }
42683             ],
42684             "description": "The scroll-margin-bottom property defines the bottom margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42685         },
42686         {
42687             "name": "scroll-margin-inline",
42688             "syntax": "<length>{1,2}",
42689             "relevance": 50,
42690             "browsers": [
42691                 "FF68"
42692             ],
42693             "references": [
42694                 {
42695                     "name": "MDN Reference",
42696                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline"
42697                 }
42698             ],
42699             "description": "The scroll-margin-inline property is a shorthand property which sets the scroll-margin longhands in the inline dimension."
42700         },
42701         {
42702             "name": "scroll-margin-inline-start",
42703             "syntax": "<length>",
42704             "relevance": 50,
42705             "browsers": [
42706                 "E79",
42707                 "FF68",
42708                 "C69",
42709                 "O56"
42710             ],
42711             "references": [
42712                 {
42713                     "name": "MDN Reference",
42714                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-start"
42715                 }
42716             ],
42717             "description": "The scroll-margin-inline-start property defines the margin of the scroll snap area at the start of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42718         },
42719         {
42720             "name": "scroll-margin-inline-end",
42721             "syntax": "<length>",
42722             "relevance": 50,
42723             "browsers": [
42724                 "E79",
42725                 "FF68",
42726                 "C69",
42727                 "O56"
42728             ],
42729             "references": [
42730                 {
42731                     "name": "MDN Reference",
42732                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-inline-end"
42733                 }
42734             ],
42735             "description": "The scroll-margin-inline-end property defines the margin of the scroll snap area at the end of the inline dimension that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42736         },
42737         {
42738             "name": "scroll-margin-left",
42739             "syntax": "<length>",
42740             "relevance": 50,
42741             "browsers": [
42742                 "E79",
42743                 "FF68",
42744                 "S11",
42745                 "C69",
42746                 "O56"
42747             ],
42748             "references": [
42749                 {
42750                     "name": "MDN Reference",
42751                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-left"
42752                 }
42753             ],
42754             "description": "The scroll-margin-left property defines the left margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42755         },
42756         {
42757             "name": "scroll-margin-right",
42758             "syntax": "<length>",
42759             "relevance": 50,
42760             "browsers": [
42761                 "E79",
42762                 "FF68",
42763                 "S11",
42764                 "C69",
42765                 "O56"
42766             ],
42767             "references": [
42768                 {
42769                     "name": "MDN Reference",
42770                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-right"
42771                 }
42772             ],
42773             "description": "The scroll-margin-right property defines the right margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42774         },
42775         {
42776             "name": "scroll-margin-top",
42777             "syntax": "<length>",
42778             "relevance": 50,
42779             "browsers": [
42780                 "E79",
42781                 "FF68",
42782                 "S11",
42783                 "C69",
42784                 "O56"
42785             ],
42786             "references": [
42787                 {
42788                     "name": "MDN Reference",
42789                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-margin-top"
42790                 }
42791             ],
42792             "description": "The scroll-margin-top property defines the top margin of the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets."
42793         },
42794         {
42795             "name": "scroll-padding",
42796             "syntax": "[ auto | <length-percentage> ]{1,4}",
42797             "relevance": 50,
42798             "browsers": [
42799                 "E79",
42800                 "FF68",
42801                 "S11",
42802                 "C69",
42803                 "O56"
42804             ],
42805             "references": [
42806                 {
42807                     "name": "MDN Reference",
42808                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding"
42809                 }
42810             ],
42811             "description": "The scroll-padding property is a shorthand property which sets all of the scroll-padding longhands, assigning values much like the padding property does for the padding-* longhands."
42812         },
42813         {
42814             "name": "scroll-padding-block",
42815             "syntax": "[ auto | <length-percentage> ]{1,2}",
42816             "relevance": 50,
42817             "browsers": [
42818                 "E79",
42819                 "FF68",
42820                 "C69",
42821                 "O56"
42822             ],
42823             "references": [
42824                 {
42825                     "name": "MDN Reference",
42826                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block"
42827                 }
42828             ],
42829             "description": "The scroll-padding-block property is a shorthand property which sets the scroll-padding longhands for the block dimension."
42830         },
42831         {
42832             "name": "scroll-padding-block-start",
42833             "syntax": "auto | <length-percentage>",
42834             "relevance": 50,
42835             "browsers": [
42836                 "E79",
42837                 "FF68",
42838                 "C69",
42839                 "O56"
42840             ],
42841             "references": [
42842                 {
42843                     "name": "MDN Reference",
42844                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-start"
42845                 }
42846             ],
42847             "description": "The scroll-padding-block-start property defines offsets for the start edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42848         },
42849         {
42850             "name": "scroll-padding-block-end",
42851             "syntax": "auto | <length-percentage>",
42852             "relevance": 50,
42853             "browsers": [
42854                 "E79",
42855                 "FF68",
42856                 "C69",
42857                 "O56"
42858             ],
42859             "references": [
42860                 {
42861                     "name": "MDN Reference",
42862                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-block-end"
42863                 }
42864             ],
42865             "description": "The scroll-padding-block-end property defines offsets for the end edge in the block dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42866         },
42867         {
42868             "name": "scroll-padding-bottom",
42869             "syntax": "auto | <length-percentage>",
42870             "relevance": 50,
42871             "browsers": [
42872                 "E79",
42873                 "FF68",
42874                 "S11",
42875                 "C69",
42876                 "O56"
42877             ],
42878             "references": [
42879                 {
42880                     "name": "MDN Reference",
42881                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-bottom"
42882                 }
42883             ],
42884             "description": "The scroll-padding-bottom property defines offsets for the bottom of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42885         },
42886         {
42887             "name": "scroll-padding-inline",
42888             "syntax": "[ auto | <length-percentage> ]{1,2}",
42889             "relevance": 50,
42890             "browsers": [
42891                 "E79",
42892                 "FF68",
42893                 "C69",
42894                 "O56"
42895             ],
42896             "references": [
42897                 {
42898                     "name": "MDN Reference",
42899                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline"
42900                 }
42901             ],
42902             "description": "The scroll-padding-inline property is a shorthand property which sets the scroll-padding longhands for the inline dimension."
42903         },
42904         {
42905             "name": "scroll-padding-inline-start",
42906             "syntax": "auto | <length-percentage>",
42907             "relevance": 50,
42908             "browsers": [
42909                 "E79",
42910                 "FF68",
42911                 "C69",
42912                 "O56"
42913             ],
42914             "references": [
42915                 {
42916                     "name": "MDN Reference",
42917                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-start"
42918                 }
42919             ],
42920             "description": "The scroll-padding-inline-start property defines offsets for the start edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42921         },
42922         {
42923             "name": "scroll-padding-inline-end",
42924             "syntax": "auto | <length-percentage>",
42925             "relevance": 50,
42926             "browsers": [
42927                 "E79",
42928                 "FF68",
42929                 "C69",
42930                 "O56"
42931             ],
42932             "references": [
42933                 {
42934                     "name": "MDN Reference",
42935                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-inline-end"
42936                 }
42937             ],
42938             "description": "The scroll-padding-inline-end property defines offsets for the end edge in the inline dimension of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42939         },
42940         {
42941             "name": "scroll-padding-left",
42942             "syntax": "auto | <length-percentage>",
42943             "relevance": 50,
42944             "browsers": [
42945                 "E79",
42946                 "FF68",
42947                 "S11",
42948                 "C69",
42949                 "O56"
42950             ],
42951             "references": [
42952                 {
42953                     "name": "MDN Reference",
42954                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-left"
42955                 }
42956             ],
42957             "description": "The scroll-padding-left property defines offsets for the left of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42958         },
42959         {
42960             "name": "scroll-padding-right",
42961             "syntax": "auto | <length-percentage>",
42962             "relevance": 50,
42963             "browsers": [
42964                 "E79",
42965                 "FF68",
42966                 "S11",
42967                 "C69",
42968                 "O56"
42969             ],
42970             "references": [
42971                 {
42972                     "name": "MDN Reference",
42973                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-right"
42974                 }
42975             ],
42976             "description": "The scroll-padding-right property defines offsets for the right of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42977         },
42978         {
42979             "name": "scroll-padding-top",
42980             "syntax": "auto | <length-percentage>",
42981             "relevance": 50,
42982             "browsers": [
42983                 "E79",
42984                 "FF68",
42985                 "S11",
42986                 "C69",
42987                 "O56"
42988             ],
42989             "references": [
42990                 {
42991                     "name": "MDN Reference",
42992                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-padding-top"
42993                 }
42994             ],
42995             "description": "The scroll-padding-top property defines offsets for the top of the optimal viewing region of the scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport."
42996         },
42997         {
42998             "name": "scroll-snap-align",
42999             "syntax": "[ none | start | end | center ]{1,2}",
43000             "relevance": 50,
43001             "browsers": [
43002                 "E79",
43003                 "FF68",
43004                 "S11",
43005                 "C69",
43006                 "O56"
43007             ],
43008             "references": [
43009                 {
43010                     "name": "MDN Reference",
43011                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-align"
43012                 }
43013             ],
43014             "description": "The scroll-snap-align property specifies the box’s snap position as an alignment of its snap area (as the alignment subject) within its snap container’s snapport (as the alignment container). The two values specify the snapping alignment in the block axis and inline axis, respectively. If only one value is specified, the second value defaults to the same value."
43015         },
43016         {
43017             "name": "scroll-snap-stop",
43018             "syntax": "normal | always",
43019             "relevance": 50,
43020             "browsers": [
43021                 "E79",
43022                 "C75",
43023                 "O62"
43024             ],
43025             "references": [
43026                 {
43027                     "name": "MDN Reference",
43028                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-stop"
43029                 }
43030             ],
43031             "description": "The scroll-snap-stop CSS property defines whether the scroll container is allowed to \"pass over\" possible snap positions."
43032         },
43033         {
43034             "name": "scroll-snap-type-x",
43035             "status": "obsolete",
43036             "syntax": "none | mandatory | proximity",
43037             "relevance": 0,
43038             "browsers": [
43039                 "FF39",
43040                 "S9"
43041             ],
43042             "references": [
43043                 {
43044                     "name": "MDN Reference",
43045                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-x"
43046                 }
43047             ],
43048             "description": "The scroll-snap-type-x CSS property defines how strictly snap points are enforced on the horizontal axis of the scroll container in case there is one.\n\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent."
43049         },
43050         {
43051             "name": "scroll-snap-type-y",
43052             "status": "obsolete",
43053             "syntax": "none | mandatory | proximity",
43054             "relevance": 0,
43055             "browsers": [
43056                 "FF39"
43057             ],
43058             "references": [
43059                 {
43060                     "name": "MDN Reference",
43061                     "url": "https://developer.mozilla.org/docs/Web/CSS/scroll-snap-type-y"
43062                 }
43063             ],
43064             "description": "The scroll-snap-type-y CSS property defines how strictly snap points are enforced on the vertical axis of the scroll container in case there is one.\n\nSpecifying any precise animations or physics used to enforce those snap points is not covered by this property but instead left up to the user agent."
43065         },
43066         {
43067             "name": "text-combine-upright",
43068             "syntax": "none | all | [ digits <integer>? ]",
43069             "relevance": 50,
43070             "references": [
43071                 {
43072                     "name": "MDN Reference",
43073                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-combine-upright"
43074                 }
43075             ],
43076             "description": "The text-combine-upright CSS property specifies the combination of multiple characters into the space of a single character. If the combined text is wider than 1em, the user agent must fit the contents within 1em. The resulting composition is treated as a single upright glyph for layout and decoration. This property only has an effect in vertical writing modes.\n\nThis is used to produce an effect that is known as tate-chū-yoko (縦中横) in Japanese, or as 直書橫向 in Chinese."
43077         },
43078         {
43079             "name": "text-decoration-skip",
43080             "status": "experimental",
43081             "syntax": "none | [ objects || [ spaces | [ leading-spaces || trailing-spaces ] ] || edges || box-decoration ]",
43082             "relevance": 52,
43083             "browsers": [
43084                 "S12.1",
43085                 "C57",
43086                 "O44"
43087             ],
43088             "references": [
43089                 {
43090                     "name": "MDN Reference",
43091                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip"
43092                 }
43093             ],
43094             "description": "The text-decoration-skip CSS property specifies what parts of the element’s content any text decoration affecting the element must skip over. It controls all text decoration lines drawn by the element and also any text decoration lines drawn by its ancestors."
43095         },
43096         {
43097             "name": "text-decoration-skip-ink",
43098             "syntax": "auto | all | none",
43099             "relevance": 50,
43100             "browsers": [
43101                 "E79",
43102                 "FF70",
43103                 "C64",
43104                 "O50"
43105             ],
43106             "references": [
43107                 {
43108                     "name": "MDN Reference",
43109                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-skip-ink"
43110                 }
43111             ],
43112             "description": "The text-decoration-skip-ink CSS property specifies how overlines and underlines are drawn when they pass over glyph ascenders and descenders."
43113         },
43114         {
43115             "name": "text-decoration-thickness",
43116             "syntax": "auto | from-font | <length> | <percentage> ",
43117             "relevance": 50,
43118             "browsers": [
43119                 "FF70",
43120                 "S12.1"
43121             ],
43122             "references": [
43123                 {
43124                     "name": "MDN Reference",
43125                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-decoration-thickness"
43126                 }
43127             ],
43128             "description": "The text-decoration-thickness CSS property sets the thickness, or width, of the decoration line that is used on text in an element, such as a line-through, underline, or overline."
43129         },
43130         {
43131             "name": "text-emphasis",
43132             "syntax": "<'text-emphasis-style'> || <'text-emphasis-color'>",
43133             "relevance": 50,
43134             "browsers": [
43135                 "E79",
43136                 "FF46",
43137                 "S6.1",
43138                 "C25",
43139                 "O15"
43140             ],
43141             "references": [
43142                 {
43143                     "name": "MDN Reference",
43144                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis"
43145                 }
43146             ],
43147             "description": "The text-emphasis CSS property is a shorthand property for setting text-emphasis-style and text-emphasis-color in one declaration. This property will apply the specified emphasis mark to each character of the element's text, except separator characters, like spaces,  and control characters."
43148         },
43149         {
43150             "name": "text-emphasis-color",
43151             "syntax": "<color>",
43152             "relevance": 50,
43153             "browsers": [
43154                 "E79",
43155                 "FF46",
43156                 "S6.1",
43157                 "C25",
43158                 "O15"
43159             ],
43160             "references": [
43161                 {
43162                     "name": "MDN Reference",
43163                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-color"
43164                 }
43165             ],
43166             "description": "The text-emphasis-color CSS property defines the color used to draw emphasis marks on text being rendered in the HTML document. This value can also be set and reset using the text-emphasis shorthand."
43167         },
43168         {
43169             "name": "text-emphasis-position",
43170             "syntax": "[ over | under ] && [ right | left ]",
43171             "relevance": 50,
43172             "browsers": [
43173                 "E79",
43174                 "FF46",
43175                 "S6.1",
43176                 "C25",
43177                 "O15"
43178             ],
43179             "references": [
43180                 {
43181                     "name": "MDN Reference",
43182                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-position"
43183                 }
43184             ],
43185             "description": "The text-emphasis-position CSS property describes where emphasis marks are drawn at. The effect of emphasis marks on the line height is the same as for ruby text: if there isn't enough place, the line height is increased."
43186         },
43187         {
43188             "name": "text-emphasis-style",
43189             "syntax": "none | [ [ filled | open ] || [ dot | circle | double-circle | triangle | sesame ] ] | <string>",
43190             "relevance": 50,
43191             "browsers": [
43192                 "E79",
43193                 "FF46",
43194                 "S6.1",
43195                 "C25",
43196                 "O15"
43197             ],
43198             "references": [
43199                 {
43200                     "name": "MDN Reference",
43201                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-emphasis-style"
43202                 }
43203             ],
43204             "description": "The text-emphasis-style CSS property defines the type of emphasis used. It can also be set, and reset, using the text-emphasis shorthand."
43205         },
43206         {
43207             "name": "text-size-adjust",
43208             "status": "experimental",
43209             "syntax": "none | auto | <percentage>",
43210             "relevance": 56,
43211             "browsers": [
43212                 "E79",
43213                 "C54",
43214                 "O41"
43215             ],
43216             "references": [
43217                 {
43218                     "name": "MDN Reference",
43219                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-size-adjust"
43220                 }
43221             ],
43222             "description": "The text-size-adjust CSS property controls the text inflation algorithm used on some smartphones and tablets. Other browsers will ignore this property."
43223         },
43224         {
43225             "name": "text-underline-offset",
43226             "syntax": "auto | <length> | <percentage> ",
43227             "relevance": 50,
43228             "browsers": [
43229                 "FF70",
43230                 "S12.1"
43231             ],
43232             "references": [
43233                 {
43234                     "name": "MDN Reference",
43235                     "url": "https://developer.mozilla.org/docs/Web/CSS/text-underline-offset"
43236                 }
43237             ],
43238             "description": "The text-underline-offset CSS property sets the offset distance of an underline text decoration line (applied using text-decoration) from its original position."
43239         },
43240         {
43241             "name": "transform-box",
43242             "syntax": "content-box | border-box | fill-box | stroke-box | view-box",
43243             "relevance": 50,
43244             "browsers": [
43245                 "E79",
43246                 "FF55",
43247                 "S11",
43248                 "C64",
43249                 "O51"
43250             ],
43251             "references": [
43252                 {
43253                     "name": "MDN Reference",
43254                     "url": "https://developer.mozilla.org/docs/Web/CSS/transform-box"
43255                 }
43256             ],
43257             "description": "The transform-box CSS property defines the layout box to which the transform and transform-origin properties relate."
43258         },
43259         {
43260             "name": "translate",
43261             "syntax": "none | <length-percentage> [ <length-percentage> <length>? ]?",
43262             "relevance": 50,
43263             "browsers": [
43264                 "FF72"
43265             ],
43266             "references": [
43267                 {
43268                     "name": "MDN Reference",
43269                     "url": "https://developer.mozilla.org/docs/Web/CSS/translate"
43270                 }
43271             ],
43272             "description": "The translate CSS property allows you to specify translation transforms individually and independently of the transform property. This maps better to typical user interface usage, and saves having to remember the exact order of transform functions to specify in the transform value."
43273         },
43274         {
43275             "name": "speak-as",
43276             "syntax": "auto | bullets | numbers | words | spell-out | <counter-style-name>",
43277             "relevance": 50,
43278             "description": "The speak-as descriptor specifies how a counter symbol constructed with a given @counter-style will be represented in the spoken form. For example, an author can specify a counter symbol to be either spoken as its numerical value or just represented with an audio cue."
43279         },
43280         {
43281             "name": "font-display",
43282             "status": "experimental",
43283             "syntax": "[ auto | block | swap | fallback | optional ]",
43284             "relevance": 54,
43285             "description": "The font-display descriptor determines how a font face is displayed based on whether and when it is downloaded and ready to use."
43286         },
43287         {
43288             "name": "bleed",
43289             "syntax": "auto | <length>",
43290             "relevance": 50,
43291             "description": "The bleed CSS at-rule descriptor, used with the @page at-rule, specifies the extent of the page bleed area outside the page box. This property only has effect if crop marks are enabled using the marks property."
43292         },
43293         {
43294             "name": "marks",
43295             "syntax": "none | [ crop || cross ]",
43296             "relevance": 50,
43297             "description": "The marks CSS at-rule descriptor, used with the @page at-rule, adds crop and/or cross marks to the presentation of the document. Crop marks indicate where the page should be cut. Cross marks are used to align sheets."
43298         },
43299         {
43300             "name": "max-zoom",
43301             "syntax": "auto | <number> | <percentage>",
43302             "relevance": 50,
43303             "description": "The max-zoom CSS descriptor sets the maximum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom in any further than this, whether automatically or at the user's request.\n\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out."
43304         },
43305         {
43306             "name": "min-zoom",
43307             "syntax": "auto | <number> | <percentage>",
43308             "relevance": 50,
43309             "description": "The min-zoom CSS descriptor sets the minimum zoom factor of a document defined by the @viewport at-rule. The browser will not zoom out any further than this, whether automatically or at the user's request.\n\nA zoom factor of 1.0 or 100% corresponds to no zooming. Larger values are zoomed in. Smaller values are zoomed out."
43310         },
43311         {
43312             "name": "orientation",
43313             "syntax": "auto | portrait | landscape",
43314             "relevance": 50,
43315             "description": "The orientation CSS @media media feature can be used to apply styles based on the orientation of the viewport (or the page box, for paged media)."
43316         },
43317         {
43318             "name": "user-zoom",
43319             "syntax": "zoom | fixed",
43320             "relevance": 50,
43321             "description": "The user-zoom CSS descriptor controls whether or not the user can change the zoom factor of a document defined by @viewport."
43322         },
43323         {
43324             "name": "viewport-fit",
43325             "syntax": "auto | contain | cover",
43326             "relevance": 50,
43327             "description": "The border-block-style CSS property defines the style of the logical block borders of an element, which maps to a physical border style depending on the element's writing mode, directionality, and text orientation."
43328         }
43329     ],
43330     "atDirectives": [
43331         {
43332             "name": "@charset",
43333             "references": [
43334                 {
43335                     "name": "MDN Reference",
43336                     "url": "https://developer.mozilla.org/docs/Web/CSS/@charset"
43337                 }
43338             ],
43339             "description": "Defines character set of the document."
43340         },
43341         {
43342             "name": "@counter-style",
43343             "browsers": [
43344                 "FF33"
43345             ],
43346             "references": [
43347                 {
43348                     "name": "MDN Reference",
43349                     "url": "https://developer.mozilla.org/docs/Web/CSS/@counter-style"
43350                 }
43351             ],
43352             "description": "Defines a custom counter style."
43353         },
43354         {
43355             "name": "@font-face",
43356             "references": [
43357                 {
43358                     "name": "MDN Reference",
43359                     "url": "https://developer.mozilla.org/docs/Web/CSS/@font-face"
43360                 }
43361             ],
43362             "description": "Allows for linking to fonts that are automatically activated when needed. This permits authors to work around the limitation of 'web-safe' fonts, allowing for consistent rendering independent of the fonts available in a given user's environment."
43363         },
43364         {
43365             "name": "@font-feature-values",
43366             "browsers": [
43367                 "FF34",
43368                 "S9.1"
43369             ],
43370             "references": [
43371                 {
43372                     "name": "MDN Reference",
43373                     "url": "https://developer.mozilla.org/docs/Web/CSS/@font-feature-values"
43374                 }
43375             ],
43376             "description": "Defines named values for the indices used to select alternate glyphs for a given font family."
43377         },
43378         {
43379             "name": "@import",
43380             "references": [
43381                 {
43382                     "name": "MDN Reference",
43383                     "url": "https://developer.mozilla.org/docs/Web/CSS/@import"
43384                 }
43385             ],
43386             "description": "Includes content of another file."
43387         },
43388         {
43389             "name": "@keyframes",
43390             "references": [
43391                 {
43392                     "name": "MDN Reference",
43393                     "url": "https://developer.mozilla.org/docs/Web/CSS/@keyframes"
43394                 }
43395             ],
43396             "description": "Defines set of animation key frames."
43397         },
43398         {
43399             "name": "@media",
43400             "references": [
43401                 {
43402                     "name": "MDN Reference",
43403                     "url": "https://developer.mozilla.org/docs/Web/CSS/@media"
43404                 }
43405             ],
43406             "description": "Defines a stylesheet for a particular media type."
43407         },
43408         {
43409             "name": "@-moz-document",
43410             "browsers": [
43411                 "FF1.8"
43412             ],
43413             "description": "Gecko-specific at-rule that restricts the style rules contained within it based on the URL of the document."
43414         },
43415         {
43416             "name": "@-moz-keyframes",
43417             "browsers": [
43418                 "FF5"
43419             ],
43420             "description": "Defines set of animation key frames."
43421         },
43422         {
43423             "name": "@-ms-viewport",
43424             "browsers": [
43425                 "E",
43426                 "IE10"
43427             ],
43428             "description": "Specifies the size, zoom factor, and orientation of the viewport."
43429         },
43430         {
43431             "name": "@namespace",
43432             "references": [
43433                 {
43434                     "name": "MDN Reference",
43435                     "url": "https://developer.mozilla.org/docs/Web/CSS/@namespace"
43436                 }
43437             ],
43438             "description": "Declares a prefix and associates it with a namespace name."
43439         },
43440         {
43441             "name": "@-o-keyframes",
43442             "browsers": [
43443                 "O12"
43444             ],
43445             "description": "Defines set of animation key frames."
43446         },
43447         {
43448             "name": "@-o-viewport",
43449             "browsers": [
43450                 "O11"
43451             ],
43452             "description": "Specifies the size, zoom factor, and orientation of the viewport."
43453         },
43454         {
43455             "name": "@page",
43456             "browsers": [
43457                 "E12",
43458                 "FF19",
43459                 "C2",
43460                 "IE8",
43461                 "O6"
43462             ],
43463             "references": [
43464                 {
43465                     "name": "MDN Reference",
43466                     "url": "https://developer.mozilla.org/docs/Web/CSS/@page"
43467                 }
43468             ],
43469             "description": "Directive defines various page parameters."
43470         },
43471         {
43472             "name": "@supports",
43473             "browsers": [
43474                 "E12",
43475                 "FF22",
43476                 "S9",
43477                 "C28",
43478                 "O12.1"
43479             ],
43480             "references": [
43481                 {
43482                     "name": "MDN Reference",
43483                     "url": "https://developer.mozilla.org/docs/Web/CSS/@supports"
43484                 }
43485             ],
43486             "description": "A conditional group rule whose condition tests whether the user agent supports CSS property:value pairs."
43487         },
43488         {
43489             "name": "@-webkit-keyframes",
43490             "browsers": [
43491                 "C",
43492                 "S4"
43493             ],
43494             "description": "Defines set of animation key frames."
43495         }
43496     ],
43497     "pseudoClasses": [
43498         {
43499             "name": ":active",
43500             "references": [
43501                 {
43502                     "name": "MDN Reference",
43503                     "url": "https://developer.mozilla.org/docs/Web/CSS/:active"
43504                 }
43505             ],
43506             "description": "Applies while an element is being activated by the user. For example, between the times the user presses the mouse button and releases it."
43507         },
43508         {
43509             "name": ":any-link",
43510             "browsers": [
43511                 "E79",
43512                 "FF50",
43513                 "S9",
43514                 "C65",
43515                 "O52"
43516             ],
43517             "references": [
43518                 {
43519                     "name": "MDN Reference",
43520                     "url": "https://developer.mozilla.org/docs/Web/CSS/:any-link"
43521                 }
43522             ],
43523             "description": "Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links."
43524         },
43525         {
43526             "name": ":checked",
43527             "references": [
43528                 {
43529                     "name": "MDN Reference",
43530                     "url": "https://developer.mozilla.org/docs/Web/CSS/:checked"
43531                 }
43532             ],
43533             "description": "Radio and checkbox elements can be toggled by the user. Some menu items are 'checked' when the user selects them. When such elements are toggled 'on' the :checked pseudo-class applies."
43534         },
43535         {
43536             "name": ":corner-present",
43537             "browsers": [
43538                 "C",
43539                 "S5"
43540             ],
43541             "description": "Non-standard. Indicates whether or not a scrollbar corner is present."
43542         },
43543         {
43544             "name": ":decrement",
43545             "browsers": [
43546                 "C",
43547                 "S5"
43548             ],
43549             "description": "Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will decrement the view’s position when used."
43550         },
43551         {
43552             "name": ":default",
43553             "browsers": [
43554                 "E79",
43555                 "FF4",
43556                 "S5",
43557                 "C10",
43558                 "O10"
43559             ],
43560             "references": [
43561                 {
43562                     "name": "MDN Reference",
43563                     "url": "https://developer.mozilla.org/docs/Web/CSS/:default"
43564                 }
43565             ],
43566             "description": "Applies to the one or more UI elements that are the default among a set of similar elements. Typically applies to context menu items, buttons, and select lists/menus."
43567         },
43568         {
43569             "name": ":disabled",
43570             "references": [
43571                 {
43572                     "name": "MDN Reference",
43573                     "url": "https://developer.mozilla.org/docs/Web/CSS/:disabled"
43574                 }
43575             ],
43576             "description": "Represents user interface elements that are in a disabled state; such elements have a corresponding enabled state."
43577         },
43578         {
43579             "name": ":double-button",
43580             "browsers": [
43581                 "C",
43582                 "S5"
43583             ],
43584             "description": "Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed together at the same end of the scrollbar."
43585         },
43586         {
43587             "name": ":empty",
43588             "references": [
43589                 {
43590                     "name": "MDN Reference",
43591                     "url": "https://developer.mozilla.org/docs/Web/CSS/:empty"
43592                 }
43593             ],
43594             "description": "Represents an element that has no children at all."
43595         },
43596         {
43597             "name": ":enabled",
43598             "references": [
43599                 {
43600                     "name": "MDN Reference",
43601                     "url": "https://developer.mozilla.org/docs/Web/CSS/:enabled"
43602                 }
43603             ],
43604             "description": "Represents user interface elements that are in an enabled state; such elements have a corresponding disabled state."
43605         },
43606         {
43607             "name": ":end",
43608             "browsers": [
43609                 "C",
43610                 "S5"
43611             ],
43612             "description": "Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed after the thumb."
43613         },
43614         {
43615             "name": ":first",
43616             "browsers": [
43617                 "E12",
43618                 "S6",
43619                 "C18",
43620                 "IE8",
43621                 "O9.2"
43622             ],
43623             "references": [
43624                 {
43625                     "name": "MDN Reference",
43626                     "url": "https://developer.mozilla.org/docs/Web/CSS/:first"
43627                 }
43628             ],
43629             "description": "When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."
43630         },
43631         {
43632             "name": ":first-child",
43633             "references": [
43634                 {
43635                     "name": "MDN Reference",
43636                     "url": "https://developer.mozilla.org/docs/Web/CSS/:first-child"
43637                 }
43638             ],
43639             "description": "Same as :nth-child(1). Represents an element that is the first child of some other element."
43640         },
43641         {
43642             "name": ":first-of-type",
43643             "references": [
43644                 {
43645                     "name": "MDN Reference",
43646                     "url": "https://developer.mozilla.org/docs/Web/CSS/:first-of-type"
43647                 }
43648             ],
43649             "description": "Same as :nth-of-type(1). Represents an element that is the first sibling of its type in the list of children of its parent element."
43650         },
43651         {
43652             "name": ":focus",
43653             "references": [
43654                 {
43655                     "name": "MDN Reference",
43656                     "url": "https://developer.mozilla.org/docs/Web/CSS/:focus"
43657                 }
43658             ],
43659             "description": "Applies while an element has the focus (accepts keyboard or mouse events, or other forms of input)."
43660         },
43661         {
43662             "name": ":fullscreen",
43663             "references": [
43664                 {
43665                     "name": "MDN Reference",
43666                     "url": "https://developer.mozilla.org/docs/Web/CSS/:fullscreen"
43667                 }
43668             ],
43669             "description": "Matches any element that has its fullscreen flag set."
43670         },
43671         {
43672             "name": ":future",
43673             "browsers": [
43674                 "C",
43675                 "O16",
43676                 "S6"
43677             ],
43678             "description": "Represents any element that is defined to occur entirely after a :current element."
43679         },
43680         {
43681             "name": ":horizontal",
43682             "browsers": [
43683                 "C",
43684                 "S5"
43685             ],
43686             "description": "Non-standard. Applies to any scrollbar pieces that have a horizontal orientation."
43687         },
43688         {
43689             "name": ":host",
43690             "browsers": [
43691                 "E79",
43692                 "FF63",
43693                 "S10",
43694                 "C54",
43695                 "O41"
43696             ],
43697             "references": [
43698                 {
43699                     "name": "MDN Reference",
43700                     "url": "https://developer.mozilla.org/docs/Web/CSS/:host"
43701                 }
43702             ],
43703             "description": "When evaluated in the context of a shadow tree, matches the shadow tree’s host element."
43704         },
43705         {
43706             "name": ":host()",
43707             "browsers": [
43708                 "C35",
43709                 "O22"
43710             ],
43711             "description": "When evaluated in the context of a shadow tree, it matches the shadow tree’s host element if the host element, in its normal context, matches the selector argument."
43712         },
43713         {
43714             "name": ":host-context()",
43715             "browsers": [
43716                 "C35",
43717                 "O22"
43718             ],
43719             "description": "Tests whether there is an ancestor, outside the shadow tree, which matches a particular selector."
43720         },
43721         {
43722             "name": ":hover",
43723             "references": [
43724                 {
43725                     "name": "MDN Reference",
43726                     "url": "https://developer.mozilla.org/docs/Web/CSS/:hover"
43727                 }
43728             ],
43729             "description": "Applies while the user designates an element with a pointing device, but does not necessarily activate it. For example, a visual user agent could apply this pseudo-class when the cursor (mouse pointer) hovers over a box generated by the element."
43730         },
43731         {
43732             "name": ":increment",
43733             "browsers": [
43734                 "C",
43735                 "S5"
43736             ],
43737             "description": "Non-standard. Applies to buttons and track pieces. Indicates whether or not the button or track piece will increment the view’s position when used."
43738         },
43739         {
43740             "name": ":indeterminate",
43741             "references": [
43742                 {
43743                     "name": "MDN Reference",
43744                     "url": "https://developer.mozilla.org/docs/Web/CSS/:indeterminate"
43745                 }
43746             ],
43747             "description": "Applies to UI elements whose value is in an indeterminate state."
43748         },
43749         {
43750             "name": ":in-range",
43751             "browsers": [
43752                 "E13",
43753                 "FF29",
43754                 "S5.1",
43755                 "C10",
43756                 "O11"
43757             ],
43758             "references": [
43759                 {
43760                     "name": "MDN Reference",
43761                     "url": "https://developer.mozilla.org/docs/Web/CSS/:in-range"
43762                 }
43763             ],
43764             "description": "Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes."
43765         },
43766         {
43767             "name": ":invalid",
43768             "references": [
43769                 {
43770                     "name": "MDN Reference",
43771                     "url": "https://developer.mozilla.org/docs/Web/CSS/:invalid"
43772                 }
43773             ],
43774             "description": "An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification."
43775         },
43776         {
43777             "name": ":lang()",
43778             "browsers": [
43779                 "E",
43780                 "C",
43781                 "FF1",
43782                 "IE8",
43783                 "O8",
43784                 "S3"
43785             ],
43786             "description": "Represents an element that is in language specified."
43787         },
43788         {
43789             "name": ":last-child",
43790             "references": [
43791                 {
43792                     "name": "MDN Reference",
43793                     "url": "https://developer.mozilla.org/docs/Web/CSS/:last-child"
43794                 }
43795             ],
43796             "description": "Same as :nth-last-child(1). Represents an element that is the last child of some other element."
43797         },
43798         {
43799             "name": ":last-of-type",
43800             "references": [
43801                 {
43802                     "name": "MDN Reference",
43803                     "url": "https://developer.mozilla.org/docs/Web/CSS/:last-of-type"
43804                 }
43805             ],
43806             "description": "Same as :nth-last-of-type(1). Represents an element that is the last sibling of its type in the list of children of its parent element."
43807         },
43808         {
43809             "name": ":left",
43810             "browsers": [
43811                 "E12",
43812                 "S5.1",
43813                 "C6",
43814                 "IE8",
43815                 "O9.2"
43816             ],
43817             "references": [
43818                 {
43819                     "name": "MDN Reference",
43820                     "url": "https://developer.mozilla.org/docs/Web/CSS/:left"
43821                 }
43822             ],
43823             "description": "When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."
43824         },
43825         {
43826             "name": ":link",
43827             "references": [
43828                 {
43829                     "name": "MDN Reference",
43830                     "url": "https://developer.mozilla.org/docs/Web/CSS/:link"
43831                 }
43832             ],
43833             "description": "Applies to links that have not yet been visited."
43834         },
43835         {
43836             "name": ":matches()",
43837             "browsers": [
43838                 "S9"
43839             ],
43840             "description": "Takes a selector list as its argument. It represents an element that is represented by its argument."
43841         },
43842         {
43843             "name": ":-moz-any()",
43844             "browsers": [
43845                 "FF4"
43846             ],
43847             "description": "Represents an element that is represented by the selector list passed as its argument. Standardized as :matches()."
43848         },
43849         {
43850             "name": ":-moz-any-link",
43851             "browsers": [
43852                 "FF1"
43853             ],
43854             "description": "Represents an element that acts as the source anchor of a hyperlink. Applies to both visited and unvisited links."
43855         },
43856         {
43857             "name": ":-moz-broken",
43858             "browsers": [
43859                 "FF3"
43860             ],
43861             "references": [
43862                 {
43863                     "name": "MDN Reference",
43864                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-broken"
43865                 }
43866             ],
43867             "description": "Non-standard. Matches elements representing broken images."
43868         },
43869         {
43870             "name": ":-moz-drag-over",
43871             "browsers": [
43872                 "FF1"
43873             ],
43874             "description": "Non-standard. Matches elements when a drag-over event applies to it."
43875         },
43876         {
43877             "name": ":-moz-first-node",
43878             "browsers": [
43879                 "FF1"
43880             ],
43881             "description": "Non-standard. Represents an element that is the first child node of some other element."
43882         },
43883         {
43884             "name": ":-moz-focusring",
43885             "browsers": [
43886                 "FF4"
43887             ],
43888             "description": "Non-standard. Matches an element that has focus and focus ring drawing is enabled in the browser."
43889         },
43890         {
43891             "name": ":-moz-full-screen",
43892             "browsers": [
43893                 "FF9"
43894             ],
43895             "description": "Matches any element that has its fullscreen flag set. Standardized as :fullscreen."
43896         },
43897         {
43898             "name": ":-moz-last-node",
43899             "browsers": [
43900                 "FF1"
43901             ],
43902             "description": "Non-standard. Represents an element that is the last child node of some other element."
43903         },
43904         {
43905             "name": ":-moz-loading",
43906             "browsers": [
43907                 "FF3"
43908             ],
43909             "description": "Non-standard. Matches elements, such as images, that haven’t started loading yet."
43910         },
43911         {
43912             "name": ":-moz-only-whitespace",
43913             "browsers": [
43914                 "FF1"
43915             ],
43916             "references": [
43917                 {
43918                     "name": "MDN Reference",
43919                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-only-whitespace"
43920                 }
43921             ],
43922             "description": "The same as :empty, except that it additionally matches elements that only contain code points affected by whitespace processing. Standardized as :blank."
43923         },
43924         {
43925             "name": ":-moz-placeholder",
43926             "browsers": [
43927                 "FF4"
43928             ],
43929             "description": "Deprecated. Represents placeholder text in an input field. Use ::-moz-placeholder for Firefox 19+."
43930         },
43931         {
43932             "name": ":-moz-submit-invalid",
43933             "browsers": [
43934                 "FF4"
43935             ],
43936             "references": [
43937                 {
43938                     "name": "MDN Reference",
43939                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-submit-invalid"
43940                 }
43941             ],
43942             "description": "Non-standard. Represents any submit button when the contents of the associated form are not valid."
43943         },
43944         {
43945             "name": ":-moz-suppressed",
43946             "browsers": [
43947                 "FF3"
43948             ],
43949             "description": "Non-standard. Matches elements representing images that have been blocked from loading."
43950         },
43951         {
43952             "name": ":-moz-ui-invalid",
43953             "browsers": [
43954                 "FF4"
43955             ],
43956             "references": [
43957                 {
43958                     "name": "MDN Reference",
43959                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-ui-invalid"
43960                 }
43961             ],
43962             "description": "Non-standard. Represents any validated form element whose value isn't valid "
43963         },
43964         {
43965             "name": ":-moz-ui-valid",
43966             "browsers": [
43967                 "FF4"
43968             ],
43969             "references": [
43970                 {
43971                     "name": "MDN Reference",
43972                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-ui-valid"
43973                 }
43974             ],
43975             "description": "Non-standard. Represents any validated form element whose value is valid "
43976         },
43977         {
43978             "name": ":-moz-user-disabled",
43979             "browsers": [
43980                 "FF3"
43981             ],
43982             "description": "Non-standard. Matches elements representing images that have been disabled due to the user’s preferences."
43983         },
43984         {
43985             "name": ":-moz-window-inactive",
43986             "browsers": [
43987                 "FF4"
43988             ],
43989             "references": [
43990                 {
43991                     "name": "MDN Reference",
43992                     "url": "https://developer.mozilla.org/docs/Web/CSS/:-moz-window-inactive"
43993                 }
43994             ],
43995             "description": "Non-standard. Matches elements in an inactive window."
43996         },
43997         {
43998             "name": ":-ms-fullscreen",
43999             "browsers": [
44000                 "IE11"
44001             ],
44002             "description": "Matches any element that has its fullscreen flag set."
44003         },
44004         {
44005             "name": ":-ms-input-placeholder",
44006             "browsers": [
44007                 "IE10"
44008             ],
44009             "description": "Represents placeholder text in an input field. Note: for Edge use the pseudo-element ::-ms-input-placeholder. Standardized as ::placeholder."
44010         },
44011         {
44012             "name": ":-ms-keyboard-active",
44013             "browsers": [
44014                 "IE10"
44015             ],
44016             "description": "Windows Store apps only. Applies one or more styles to an element when it has focus and the user presses the space bar."
44017         },
44018         {
44019             "name": ":-ms-lang()",
44020             "browsers": [
44021                 "E",
44022                 "IE10"
44023             ],
44024             "description": "Represents an element that is in the language specified. Accepts a comma separated list of language tokens."
44025         },
44026         {
44027             "name": ":no-button",
44028             "browsers": [
44029                 "C",
44030                 "S5"
44031             ],
44032             "description": "Non-standard. Applies to track pieces. Applies when there is no button at that end of the track."
44033         },
44034         {
44035             "name": ":not()",
44036             "browsers": [
44037                 "E",
44038                 "C",
44039                 "FF1",
44040                 "IE9",
44041                 "O9.5",
44042                 "S2"
44043             ],
44044             "description": "The negation pseudo-class, :not(X), is a functional notation taking a simple selector (excluding the negation pseudo-class itself) as an argument. It represents an element that is not represented by its argument."
44045         },
44046         {
44047             "name": ":nth-child()",
44048             "browsers": [
44049                 "E",
44050                 "C",
44051                 "FF3.5",
44052                 "IE9",
44053                 "O9.5",
44054                 "S3.1"
44055             ],
44056             "description": "Represents an element that has an+b-1 siblings before it in the document tree, for any positive integer or zero value of n, and has a parent element."
44057         },
44058         {
44059             "name": ":nth-last-child()",
44060             "browsers": [
44061                 "E",
44062                 "C",
44063                 "FF3.5",
44064                 "IE9",
44065                 "O9.5",
44066                 "S3.1"
44067             ],
44068             "description": "Represents an element that has an+b-1 siblings after it in the document tree, for any positive integer or zero value of n, and has a parent element."
44069         },
44070         {
44071             "name": ":nth-last-of-type()",
44072             "browsers": [
44073                 "E",
44074                 "C",
44075                 "FF3.5",
44076                 "IE9",
44077                 "O9.5",
44078                 "S3.1"
44079             ],
44080             "description": "Represents an element that has an+b-1 siblings with the same expanded element name after it in the document tree, for any zero or positive integer value of n, and has a parent element."
44081         },
44082         {
44083             "name": ":nth-of-type()",
44084             "browsers": [
44085                 "E",
44086                 "C",
44087                 "FF3.5",
44088                 "IE9",
44089                 "O9.5",
44090                 "S3.1"
44091             ],
44092             "description": "Represents an element that has an+b-1 siblings with the same expanded element name before it in the document tree, for any zero or positive integer value of n, and has a parent element."
44093         },
44094         {
44095             "name": ":only-child",
44096             "references": [
44097                 {
44098                     "name": "MDN Reference",
44099                     "url": "https://developer.mozilla.org/docs/Web/CSS/:only-child"
44100                 }
44101             ],
44102             "description": "Represents an element that has a parent element and whose parent element has no other element children. Same as :first-child:last-child or :nth-child(1):nth-last-child(1), but with a lower specificity."
44103         },
44104         {
44105             "name": ":only-of-type",
44106             "references": [
44107                 {
44108                     "name": "MDN Reference",
44109                     "url": "https://developer.mozilla.org/docs/Web/CSS/:only-of-type"
44110                 }
44111             ],
44112             "description": "Matches every element that is the only child of its type, of its parent. Same as :first-of-type:last-of-type or :nth-of-type(1):nth-last-of-type(1), but with a lower specificity."
44113         },
44114         {
44115             "name": ":optional",
44116             "references": [
44117                 {
44118                     "name": "MDN Reference",
44119                     "url": "https://developer.mozilla.org/docs/Web/CSS/:optional"
44120                 }
44121             ],
44122             "description": "A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional."
44123         },
44124         {
44125             "name": ":out-of-range",
44126             "browsers": [
44127                 "E13",
44128                 "FF29",
44129                 "S5.1",
44130                 "C10",
44131                 "O11"
44132             ],
44133             "references": [
44134                 {
44135                     "name": "MDN Reference",
44136                     "url": "https://developer.mozilla.org/docs/Web/CSS/:out-of-range"
44137                 }
44138             ],
44139             "description": "Used in conjunction with the min and max attributes, whether on a range input, a number field, or any other types that accept those attributes."
44140         },
44141         {
44142             "name": ":past",
44143             "browsers": [
44144                 "C",
44145                 "O16",
44146                 "S6"
44147             ],
44148             "description": "Represents any element that is defined to occur entirely prior to a :current element."
44149         },
44150         {
44151             "name": ":read-only",
44152             "browsers": [
44153                 "E13",
44154                 "FF78",
44155                 "S4",
44156                 "C1",
44157                 "O9"
44158             ],
44159             "references": [
44160                 {
44161                     "name": "MDN Reference",
44162                     "url": "https://developer.mozilla.org/docs/Web/CSS/:read-only"
44163                 }
44164             ],
44165             "description": "An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only."
44166         },
44167         {
44168             "name": ":read-write",
44169             "browsers": [
44170                 "E13",
44171                 "FF78",
44172                 "S4",
44173                 "C1",
44174                 "O9"
44175             ],
44176             "references": [
44177                 {
44178                     "name": "MDN Reference",
44179                     "url": "https://developer.mozilla.org/docs/Web/CSS/:read-write"
44180                 }
44181             ],
44182             "description": "An element whose contents are not user-alterable is :read-only. However, elements whose contents are user-alterable (such as text input fields) are considered to be in a :read-write state. In typical documents, most elements are :read-only."
44183         },
44184         {
44185             "name": ":required",
44186             "references": [
44187                 {
44188                     "name": "MDN Reference",
44189                     "url": "https://developer.mozilla.org/docs/Web/CSS/:required"
44190                 }
44191             ],
44192             "description": "A form element is :required or :optional if a value for it is, respectively, required or optional before the form it belongs to is submitted. Elements that are not form elements are neither required nor optional."
44193         },
44194         {
44195             "name": ":right",
44196             "browsers": [
44197                 "E12",
44198                 "S5.1",
44199                 "C6",
44200                 "IE8",
44201                 "O9.2"
44202             ],
44203             "references": [
44204                 {
44205                     "name": "MDN Reference",
44206                     "url": "https://developer.mozilla.org/docs/Web/CSS/:right"
44207                 }
44208             ],
44209             "description": "When printing double-sided documents, the page boxes on left and right pages may be different. This can be expressed through CSS pseudo-classes defined in the  page context."
44210         },
44211         {
44212             "name": ":root",
44213             "references": [
44214                 {
44215                     "name": "MDN Reference",
44216                     "url": "https://developer.mozilla.org/docs/Web/CSS/:root"
44217                 }
44218             ],
44219             "description": "Represents an element that is the root of the document. In HTML 4, this is always the HTML element."
44220         },
44221         {
44222             "name": ":scope",
44223             "browsers": [
44224                 "E79",
44225                 "FF32",
44226                 "S7",
44227                 "C27",
44228                 "O15"
44229             ],
44230             "references": [
44231                 {
44232                     "name": "MDN Reference",
44233                     "url": "https://developer.mozilla.org/docs/Web/CSS/:scope"
44234                 }
44235             ],
44236             "description": "Represents any element that is in the contextual reference element set."
44237         },
44238         {
44239             "name": ":single-button",
44240             "browsers": [
44241                 "C",
44242                 "S5"
44243             ],
44244             "description": "Non-standard. Applies to buttons and track pieces. Applies when both buttons are displayed separately at either end of the scrollbar."
44245         },
44246         {
44247             "name": ":start",
44248             "browsers": [
44249                 "C",
44250                 "S5"
44251             ],
44252             "description": "Non-standard. Applies to buttons and track pieces. Indicates whether the object is placed before the thumb."
44253         },
44254         {
44255             "name": ":target",
44256             "references": [
44257                 {
44258                     "name": "MDN Reference",
44259                     "url": "https://developer.mozilla.org/docs/Web/CSS/:target"
44260                 }
44261             ],
44262             "description": "Some URIs refer to a location within a resource. This kind of URI ends with a 'number sign' (#) followed by an anchor identifier (called the fragment identifier)."
44263         },
44264         {
44265             "name": ":valid",
44266             "references": [
44267                 {
44268                     "name": "MDN Reference",
44269                     "url": "https://developer.mozilla.org/docs/Web/CSS/:valid"
44270                 }
44271             ],
44272             "description": "An element is :valid or :invalid when it is, respectively, valid or invalid with respect to data validity semantics defined by a different specification."
44273         },
44274         {
44275             "name": ":vertical",
44276             "browsers": [
44277                 "C",
44278                 "S5"
44279             ],
44280             "description": "Non-standard. Applies to any scrollbar pieces that have a vertical orientation."
44281         },
44282         {
44283             "name": ":visited",
44284             "references": [
44285                 {
44286                     "name": "MDN Reference",
44287                     "url": "https://developer.mozilla.org/docs/Web/CSS/:visited"
44288                 }
44289             ],
44290             "description": "Applies once the link has been visited by the user."
44291         },
44292         {
44293             "name": ":-webkit-any()",
44294             "browsers": [
44295                 "C",
44296                 "S5"
44297             ],
44298             "description": "Represents an element that is represented by the selector list passed as its argument. Standardized as :matches()."
44299         },
44300         {
44301             "name": ":-webkit-full-screen",
44302             "browsers": [
44303                 "C",
44304                 "S6"
44305             ],
44306             "description": "Matches any element that has its fullscreen flag set. Standardized as :fullscreen."
44307         },
44308         {
44309             "name": ":window-inactive",
44310             "browsers": [
44311                 "C",
44312                 "S3"
44313             ],
44314             "description": "Non-standard. Applies to all scrollbar pieces. Indicates whether or not the window containing the scrollbar is currently active."
44315         },
44316         {
44317             "name": ":blank",
44318             "status": "experimental",
44319             "references": [
44320                 {
44321                     "name": "MDN Reference",
44322                     "url": "https://developer.mozilla.org/docs/Web/CSS/:blank"
44323                 }
44324             ],
44325             "description": "The :blank CSS pseudo-class selects empty user input elements (eg. <input> or <textarea>)."
44326         },
44327         {
44328             "name": ":defined",
44329             "status": "experimental",
44330             "browsers": [
44331                 "E79",
44332                 "FF63",
44333                 "S10",
44334                 "C54",
44335                 "O41"
44336             ],
44337             "references": [
44338                 {
44339                     "name": "MDN Reference",
44340                     "url": "https://developer.mozilla.org/docs/Web/CSS/:defined"
44341                 }
44342             ],
44343             "description": "The :defined CSS pseudo-class represents any element that has been defined. This includes any standard element built in to the browser, and custom elements that have been successfully defined (i.e. with the CustomElementRegistry.define() method)."
44344         },
44345         {
44346             "name": ":dir",
44347             "browsers": [
44348                 "FF49"
44349             ],
44350             "references": [
44351                 {
44352                     "name": "MDN Reference",
44353                     "url": "https://developer.mozilla.org/docs/Web/CSS/:dir"
44354                 }
44355             ],
44356             "description": "The :dir() CSS pseudo-class matches elements based on the directionality of the text contained in them."
44357         },
44358         {
44359             "name": ":focus-visible",
44360             "status": "experimental",
44361             "browsers": [
44362                 "E79",
44363                 "FF4",
44364                 "C67",
44365                 "O54"
44366             ],
44367             "references": [
44368                 {
44369                     "name": "MDN Reference",
44370                     "url": "https://developer.mozilla.org/docs/Web/CSS/:focus-visible"
44371                 }
44372             ],
44373             "description": "The :focus-visible pseudo-class applies while an element matches the :focus pseudo-class and the UA determines via heuristics that the focus should be made evident on the element."
44374         },
44375         {
44376             "name": ":focus-within",
44377             "status": "experimental",
44378             "browsers": [
44379                 "E79",
44380                 "FF52",
44381                 "S10.1",
44382                 "C60",
44383                 "O47"
44384             ],
44385             "references": [
44386                 {
44387                     "name": "MDN Reference",
44388                     "url": "https://developer.mozilla.org/docs/Web/CSS/:focus-within"
44389                 }
44390             ],
44391             "description": "The :focus-within pseudo-class applies to any element for which the :focus pseudo class applies as well as to an element whose descendant in the flat tree (including non-element nodes, such as text nodes) matches the conditions for matching :focus."
44392         },
44393         {
44394             "name": ":has",
44395             "status": "experimental",
44396             "references": [
44397                 {
44398                     "name": "MDN Reference",
44399                     "url": "https://developer.mozilla.org/docs/Web/CSS/:has"
44400                 }
44401             ],
44402             "description": ":The :has() CSS pseudo-class represents an element if any of the selectors passed as parameters (relative to the :scope of the given element), match at least one element."
44403         },
44404         {
44405             "name": ":is",
44406             "status": "experimental",
44407             "browsers": [
44408                 "E79",
44409                 "FF78",
44410                 "S9",
44411                 "C68",
44412                 "O55"
44413             ],
44414             "references": [
44415                 {
44416                     "name": "MDN Reference",
44417                     "url": "https://developer.mozilla.org/docs/Web/CSS/:is"
44418                 }
44419             ],
44420             "description": "The :is() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list. This is useful for writing large selectors in a more compact form."
44421         },
44422         {
44423             "name": ":placeholder-shown",
44424             "status": "experimental",
44425             "references": [
44426                 {
44427                     "name": "MDN Reference",
44428                     "url": "https://developer.mozilla.org/docs/Web/CSS/:placeholder-shown"
44429                 }
44430             ],
44431             "description": "The :placeholder-shown CSS pseudo-class represents any <input> or <textarea> element that is currently displaying placeholder text."
44432         },
44433         {
44434             "name": ":where",
44435             "status": "experimental",
44436             "browsers": [
44437                 "FF78",
44438                 "C72"
44439             ],
44440             "references": [
44441                 {
44442                     "name": "MDN Reference",
44443                     "url": "https://developer.mozilla.org/docs/Web/CSS/:where"
44444                 }
44445             ],
44446             "description": "The :where() CSS pseudo-class function takes a selector list as its argument, and selects any element that can be selected by one of the selectors in that list."
44447         }
44448     ],
44449     "pseudoElements": [
44450         {
44451             "name": "::after",
44452             "references": [
44453                 {
44454                     "name": "MDN Reference",
44455                     "url": "https://developer.mozilla.org/docs/Web/CSS/::after"
44456                 }
44457             ],
44458             "description": "Represents a styleable child pseudo-element immediately after the originating element’s actual content."
44459         },
44460         {
44461             "name": "::backdrop",
44462             "browsers": [
44463                 "E12",
44464                 "FF47",
44465                 "C37",
44466                 "IE11",
44467                 "O24"
44468             ],
44469             "references": [
44470                 {
44471                     "name": "MDN Reference",
44472                     "url": "https://developer.mozilla.org/docs/Web/CSS/::backdrop"
44473                 }
44474             ],
44475             "description": "Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen)."
44476         },
44477         {
44478             "name": "::before",
44479             "references": [
44480                 {
44481                     "name": "MDN Reference",
44482                     "url": "https://developer.mozilla.org/docs/Web/CSS/::before"
44483                 }
44484             ],
44485             "description": "Represents a styleable child pseudo-element immediately before the originating element’s actual content."
44486         },
44487         {
44488             "name": "::content",
44489             "browsers": [
44490                 "C35",
44491                 "O22"
44492             ],
44493             "description": "Deprecated. Matches the distribution list itself, on elements that have one. Use ::slotted for forward compatibility."
44494         },
44495         {
44496             "name": "::cue",
44497             "browsers": [
44498                 "E79",
44499                 "FF55",
44500                 "S6.1",
44501                 "C26",
44502                 "O15"
44503             ],
44504             "references": [
44505                 {
44506                     "name": "MDN Reference",
44507                     "url": "https://developer.mozilla.org/docs/Web/CSS/::cue"
44508                 }
44509             ]
44510         },
44511         {
44512             "name": "::cue()",
44513             "browsers": [
44514                 "C",
44515                 "O16",
44516                 "S6"
44517             ]
44518         },
44519         {
44520             "name": "::cue-region",
44521             "browsers": [
44522                 "C",
44523                 "O16",
44524                 "S6"
44525             ]
44526         },
44527         {
44528             "name": "::cue-region()",
44529             "browsers": [
44530                 "C",
44531                 "O16",
44532                 "S6"
44533             ]
44534         },
44535         {
44536             "name": "::first-letter",
44537             "references": [
44538                 {
44539                     "name": "MDN Reference",
44540                     "url": "https://developer.mozilla.org/docs/Web/CSS/::first-letter"
44541                 }
44542             ],
44543             "description": "Represents the first letter of an element, if it is not preceded by any other content (such as images or inline tables) on its line."
44544         },
44545         {
44546             "name": "::first-line",
44547             "references": [
44548                 {
44549                     "name": "MDN Reference",
44550                     "url": "https://developer.mozilla.org/docs/Web/CSS/::first-line"
44551                 }
44552             ],
44553             "description": "Describes the contents of the first formatted line of its originating element."
44554         },
44555         {
44556             "name": "::-moz-focus-inner",
44557             "browsers": [
44558                 "FF4"
44559             ]
44560         },
44561         {
44562             "name": "::-moz-focus-outer",
44563             "browsers": [
44564                 "FF4"
44565             ]
44566         },
44567         {
44568             "name": "::-moz-list-bullet",
44569             "browsers": [
44570                 "FF1"
44571             ],
44572             "description": "Used to style the bullet of a list element. Similar to the standardized ::marker."
44573         },
44574         {
44575             "name": "::-moz-list-number",
44576             "browsers": [
44577                 "FF1"
44578             ],
44579             "description": "Used to style the numbers of a list element. Similar to the standardized ::marker."
44580         },
44581         {
44582             "name": "::-moz-placeholder",
44583             "browsers": [
44584                 "FF19"
44585             ],
44586             "description": "Represents placeholder text in an input field"
44587         },
44588         {
44589             "name": "::-moz-progress-bar",
44590             "browsers": [
44591                 "FF9"
44592             ],
44593             "description": "Represents the bar portion of a progress bar."
44594         },
44595         {
44596             "name": "::-moz-selection",
44597             "browsers": [
44598                 "FF1"
44599             ],
44600             "description": "Represents the portion of a document that has been highlighted by the user."
44601         },
44602         {
44603             "name": "::-ms-backdrop",
44604             "browsers": [
44605                 "IE11"
44606             ],
44607             "description": "Used to create a backdrop that hides the underlying document for an element in a top layer (such as an element that is displayed fullscreen)."
44608         },
44609         {
44610             "name": "::-ms-browse",
44611             "browsers": [
44612                 "E",
44613                 "IE10"
44614             ],
44615             "description": "Represents the browse button of an input type=file control."
44616         },
44617         {
44618             "name": "::-ms-check",
44619             "browsers": [
44620                 "E",
44621                 "IE10"
44622             ],
44623             "description": "Represents the check of a checkbox or radio button input control."
44624         },
44625         {
44626             "name": "::-ms-clear",
44627             "browsers": [
44628                 "E",
44629                 "IE10"
44630             ],
44631             "description": "Represents the clear button of a text input control"
44632         },
44633         {
44634             "name": "::-ms-expand",
44635             "browsers": [
44636                 "E",
44637                 "IE10"
44638             ],
44639             "description": "Represents the drop-down button of a select control."
44640         },
44641         {
44642             "name": "::-ms-fill",
44643             "browsers": [
44644                 "E",
44645                 "IE10"
44646             ],
44647             "description": "Represents the bar portion of a progress bar."
44648         },
44649         {
44650             "name": "::-ms-fill-lower",
44651             "browsers": [
44652                 "E",
44653                 "IE10"
44654             ],
44655             "description": "Represents the portion of the slider track from its smallest value up to the value currently selected by the thumb. In a left-to-right layout, this is the portion of the slider track to the left of the thumb."
44656         },
44657         {
44658             "name": "::-ms-fill-upper",
44659             "browsers": [
44660                 "E",
44661                 "IE10"
44662             ],
44663             "description": "Represents the portion of the slider track from the value currently selected by the thumb up to the slider's largest value. In a left-to-right layout, this is the portion of the slider track to the right of the thumb."
44664         },
44665         {
44666             "name": "::-ms-reveal",
44667             "browsers": [
44668                 "E",
44669                 "IE10"
44670             ],
44671             "description": "Represents the password reveal button of an input type=password control."
44672         },
44673         {
44674             "name": "::-ms-thumb",
44675             "browsers": [
44676                 "E",
44677                 "IE10"
44678             ],
44679             "description": "Represents the portion of range input control (also known as a slider control) that the user drags."
44680         },
44681         {
44682             "name": "::-ms-ticks-after",
44683             "browsers": [
44684                 "E",
44685                 "IE10"
44686             ],
44687             "description": "Represents the tick marks of a slider that begin just after the thumb and continue up to the slider's largest value. In a left-to-right layout, these are the ticks to the right of the thumb."
44688         },
44689         {
44690             "name": "::-ms-ticks-before",
44691             "browsers": [
44692                 "E",
44693                 "IE10"
44694             ],
44695             "description": "Represents the tick marks of a slider that represent its smallest values up to the value currently selected by the thumb. In a left-to-right layout, these are the ticks to the left of the thumb."
44696         },
44697         {
44698             "name": "::-ms-tooltip",
44699             "browsers": [
44700                 "E",
44701                 "IE10"
44702             ],
44703             "description": "Represents the tooltip of a slider (input type=range)."
44704         },
44705         {
44706             "name": "::-ms-track",
44707             "browsers": [
44708                 "E",
44709                 "IE10"
44710             ],
44711             "description": "Represents the track of a slider."
44712         },
44713         {
44714             "name": "::-ms-value",
44715             "browsers": [
44716                 "E",
44717                 "IE10"
44718             ],
44719             "description": "Represents the content of a text or password input control, or a select control."
44720         },
44721         {
44722             "name": "::selection",
44723             "references": [
44724                 {
44725                     "name": "MDN Reference",
44726                     "url": "https://developer.mozilla.org/docs/Web/CSS/::selection"
44727                 }
44728             ],
44729             "description": "Represents the portion of a document that has been highlighted by the user."
44730         },
44731         {
44732             "name": "::shadow",
44733             "browsers": [
44734                 "C35",
44735                 "O22"
44736             ],
44737             "description": "Matches the shadow root if an element has a shadow tree."
44738         },
44739         {
44740             "name": "::-webkit-file-upload-button",
44741             "browsers": [
44742                 "E79",
44743                 "S3",
44744                 "C1",
44745                 "O15"
44746             ],
44747             "references": [
44748                 {
44749                     "name": "MDN Reference",
44750                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-file-upload-button"
44751                 }
44752             ]
44753         },
44754         {
44755             "name": "::-webkit-inner-spin-button",
44756             "browsers": [
44757                 "E79",
44758                 "S5",
44759                 "C6",
44760                 "O15"
44761             ],
44762             "references": [
44763                 {
44764                     "name": "MDN Reference",
44765                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-inner-spin-button"
44766                 }
44767             ]
44768         },
44769         {
44770             "name": "::-webkit-input-placeholder",
44771             "browsers": [
44772                 "C",
44773                 "S4"
44774             ]
44775         },
44776         {
44777             "name": "::-webkit-keygen-select",
44778             "browsers": [
44779                 "C",
44780                 "O",
44781                 "S6"
44782             ]
44783         },
44784         {
44785             "name": "::-webkit-meter-bar",
44786             "browsers": [
44787                 "E79",
44788                 "S5.1",
44789                 "C12",
44790                 "O15"
44791             ],
44792             "references": [
44793                 {
44794                     "name": "MDN Reference",
44795                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-bar"
44796                 }
44797             ]
44798         },
44799         {
44800             "name": "::-webkit-meter-even-less-good-value",
44801             "browsers": [
44802                 "E79",
44803                 "S5.1",
44804                 "C12",
44805                 "O15"
44806             ],
44807             "references": [
44808                 {
44809                     "name": "MDN Reference",
44810                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-even-less-good-value"
44811                 }
44812             ]
44813         },
44814         {
44815             "name": "::-webkit-meter-optimum-value",
44816             "browsers": [
44817                 "E79",
44818                 "S5.1",
44819                 "C12",
44820                 "O15"
44821             ],
44822             "references": [
44823                 {
44824                     "name": "MDN Reference",
44825                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-optimum-value"
44826                 }
44827             ]
44828         },
44829         {
44830             "name": "::-webkit-meter-suboptimum-value",
44831             "browsers": [
44832                 "E79",
44833                 "S5.1",
44834                 "C12",
44835                 "O15"
44836             ],
44837             "references": [
44838                 {
44839                     "name": "MDN Reference",
44840                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-meter-suboptimum-value"
44841                 }
44842             ]
44843         },
44844         {
44845             "name": "::-webkit-outer-spin-button",
44846             "browsers": [
44847                 "S5",
44848                 "C6"
44849             ],
44850             "references": [
44851                 {
44852                     "name": "MDN Reference",
44853                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-outer-spin-button"
44854                 }
44855             ]
44856         },
44857         {
44858             "name": "::-webkit-progress-bar",
44859             "browsers": [
44860                 "E79",
44861                 "S6.1",
44862                 "C25",
44863                 "O15"
44864             ],
44865             "references": [
44866                 {
44867                     "name": "MDN Reference",
44868                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-bar"
44869                 }
44870             ]
44871         },
44872         {
44873             "name": "::-webkit-progress-inner-element",
44874             "browsers": [
44875                 "E79",
44876                 "S6.1",
44877                 "C23",
44878                 "O15"
44879             ],
44880             "references": [
44881                 {
44882                     "name": "MDN Reference",
44883                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-inner-element"
44884                 }
44885             ]
44886         },
44887         {
44888             "name": "::-webkit-progress-value",
44889             "browsers": [
44890                 "E79",
44891                 "S6.1",
44892                 "C25",
44893                 "O15"
44894             ],
44895             "references": [
44896                 {
44897                     "name": "MDN Reference",
44898                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-progress-value"
44899                 }
44900             ]
44901         },
44902         {
44903             "name": "::-webkit-resizer",
44904             "browsers": [
44905                 "E79",
44906                 "S4",
44907                 "C2",
44908                 "O15"
44909             ],
44910             "references": [
44911                 {
44912                     "name": "MDN Reference",
44913                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44914                 }
44915             ]
44916         },
44917         {
44918             "name": "::-webkit-scrollbar",
44919             "browsers": [
44920                 "E79",
44921                 "S4",
44922                 "C2",
44923                 "O15"
44924             ],
44925             "references": [
44926                 {
44927                     "name": "MDN Reference",
44928                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44929                 }
44930             ]
44931         },
44932         {
44933             "name": "::-webkit-scrollbar-button",
44934             "browsers": [
44935                 "E79",
44936                 "S4",
44937                 "C2",
44938                 "O15"
44939             ],
44940             "references": [
44941                 {
44942                     "name": "MDN Reference",
44943                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44944                 }
44945             ]
44946         },
44947         {
44948             "name": "::-webkit-scrollbar-corner",
44949             "browsers": [
44950                 "E79",
44951                 "S4",
44952                 "C2",
44953                 "O15"
44954             ],
44955             "references": [
44956                 {
44957                     "name": "MDN Reference",
44958                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44959                 }
44960             ]
44961         },
44962         {
44963             "name": "::-webkit-scrollbar-thumb",
44964             "browsers": [
44965                 "E79",
44966                 "S4",
44967                 "C2",
44968                 "O15"
44969             ],
44970             "references": [
44971                 {
44972                     "name": "MDN Reference",
44973                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44974                 }
44975             ]
44976         },
44977         {
44978             "name": "::-webkit-scrollbar-track",
44979             "browsers": [
44980                 "E79",
44981                 "S4",
44982                 "C2",
44983                 "O15"
44984             ],
44985             "references": [
44986                 {
44987                     "name": "MDN Reference",
44988                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
44989                 }
44990             ]
44991         },
44992         {
44993             "name": "::-webkit-scrollbar-track-piece",
44994             "browsers": [
44995                 "E79",
44996                 "S4",
44997                 "C2",
44998                 "O15"
44999             ],
45000             "references": [
45001                 {
45002                     "name": "MDN Reference",
45003                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-scrollbar"
45004                 }
45005             ]
45006         },
45007         {
45008             "name": "::-webkit-search-cancel-button",
45009             "browsers": [
45010                 "E79",
45011                 "S3",
45012                 "C1",
45013                 "O15"
45014             ],
45015             "references": [
45016                 {
45017                     "name": "MDN Reference",
45018                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-cancel-button"
45019                 }
45020             ]
45021         },
45022         {
45023             "name": "::-webkit-search-decoration",
45024             "browsers": [
45025                 "C",
45026                 "S4"
45027             ]
45028         },
45029         {
45030             "name": "::-webkit-search-results-button",
45031             "browsers": [
45032                 "E79",
45033                 "S3",
45034                 "C1",
45035                 "O15"
45036             ],
45037             "references": [
45038                 {
45039                     "name": "MDN Reference",
45040                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-webkit-search-results-button"
45041                 }
45042             ]
45043         },
45044         {
45045             "name": "::-webkit-search-results-decoration",
45046             "browsers": [
45047                 "C",
45048                 "S4"
45049             ]
45050         },
45051         {
45052             "name": "::-webkit-slider-runnable-track",
45053             "browsers": [
45054                 "C",
45055                 "O",
45056                 "S6"
45057             ]
45058         },
45059         {
45060             "name": "::-webkit-slider-thumb",
45061             "browsers": [
45062                 "C",
45063                 "O",
45064                 "S6"
45065             ]
45066         },
45067         {
45068             "name": "::-webkit-textfield-decoration-container",
45069             "browsers": [
45070                 "C",
45071                 "O",
45072                 "S6"
45073             ]
45074         },
45075         {
45076             "name": "::-webkit-validation-bubble",
45077             "browsers": [
45078                 "C",
45079                 "O",
45080                 "S6"
45081             ]
45082         },
45083         {
45084             "name": "::-webkit-validation-bubble-arrow",
45085             "browsers": [
45086                 "C",
45087                 "O",
45088                 "S6"
45089             ]
45090         },
45091         {
45092             "name": "::-webkit-validation-bubble-arrow-clipper",
45093             "browsers": [
45094                 "C",
45095                 "O",
45096                 "S6"
45097             ]
45098         },
45099         {
45100             "name": "::-webkit-validation-bubble-heading",
45101             "browsers": [
45102                 "C",
45103                 "O",
45104                 "S6"
45105             ]
45106         },
45107         {
45108             "name": "::-webkit-validation-bubble-message",
45109             "browsers": [
45110                 "C",
45111                 "O",
45112                 "S6"
45113             ]
45114         },
45115         {
45116             "name": "::-webkit-validation-bubble-text-block",
45117             "browsers": [
45118                 "C",
45119                 "O",
45120                 "S6"
45121             ]
45122         },
45123         {
45124             "name": "::-moz-range-progress",
45125             "status": "nonstandard",
45126             "browsers": [
45127                 "FF22"
45128             ],
45129             "references": [
45130                 {
45131                     "name": "MDN Reference",
45132                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-progress"
45133                 }
45134             ],
45135             "description": "The ::-moz-range-progress CSS pseudo-element is a Mozilla extension that represents the lower portion of the track (i.e., groove) in which the indicator slides in an <input> of type=\"range\". This portion corresponds to values lower than the value currently selected by the thumb (i.e., virtual knob)."
45136         },
45137         {
45138             "name": "::-moz-range-thumb",
45139             "status": "nonstandard",
45140             "browsers": [
45141                 "FF21"
45142             ],
45143             "references": [
45144                 {
45145                     "name": "MDN Reference",
45146                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-thumb"
45147                 }
45148             ],
45149             "description": "The ::-moz-range-thumb CSS pseudo-element is a Mozilla extension that represents the thumb (i.e., virtual knob) of an <input> of type=\"range\". The user can move the thumb along the input's track to alter its numerical value."
45150         },
45151         {
45152             "name": "::-moz-range-track",
45153             "status": "nonstandard",
45154             "browsers": [
45155                 "FF21"
45156             ],
45157             "references": [
45158                 {
45159                     "name": "MDN Reference",
45160                     "url": "https://developer.mozilla.org/docs/Web/CSS/::-moz-range-track"
45161                 }
45162             ],
45163             "description": "The ::-moz-range-track CSS pseudo-element is a Mozilla extension that represents the track (i.e., groove) in which the indicator slides in an <input> of type=\"range\"."
45164         },
45165         {
45166             "name": "::-webkit-progress-inner-value",
45167             "status": "nonstandard",
45168             "description": "The ::-webkit-progress-value CSS pseudo-element represents the filled-in portion of the bar of a <progress> element. It is a child of the ::-webkit-progress-bar pseudo-element.\n\nIn order to let ::-webkit-progress-value take effect, -webkit-appearance needs to be set to none on the <progress> element."
45169         },
45170         {
45171             "name": "::grammar-error",
45172             "status": "experimental",
45173             "references": [
45174                 {
45175                     "name": "MDN Reference",
45176                     "url": "https://developer.mozilla.org/docs/Web/CSS/::grammar-error"
45177                 }
45178             ],
45179             "description": "The ::grammar-error CSS pseudo-element represents a text segment which the user agent has flagged as grammatically incorrect."
45180         },
45181         {
45182             "name": "::marker",
45183             "browsers": [
45184                 "E80",
45185                 "FF68",
45186                 "S11.1",
45187                 "C80"
45188             ],
45189             "references": [
45190                 {
45191                     "name": "MDN Reference",
45192                     "url": "https://developer.mozilla.org/docs/Web/CSS/::marker"
45193                 }
45194             ],
45195             "description": "The ::marker CSS pseudo-element selects the marker box of a list item, which typically contains a bullet or number. It works on any element or pseudo-element set to display: list-item, such as the <li> and <summary> elements."
45196         },
45197         {
45198             "name": "::part",
45199             "status": "experimental",
45200             "browsers": [
45201                 "E79",
45202                 "FF72",
45203                 "S13.1",
45204                 "C73",
45205                 "O60"
45206             ],
45207             "references": [
45208                 {
45209                     "name": "MDN Reference",
45210                     "url": "https://developer.mozilla.org/docs/Web/CSS/::part"
45211                 }
45212             ],
45213             "description": "The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute."
45214         },
45215         {
45216             "name": "::placeholder",
45217             "browsers": [
45218                 "E12",
45219                 "FF51",
45220                 "S10.1",
45221                 "C57",
45222                 "O44"
45223             ],
45224             "references": [
45225                 {
45226                     "name": "MDN Reference",
45227                     "url": "https://developer.mozilla.org/docs/Web/CSS/::placeholder"
45228                 }
45229             ],
45230             "description": "The ::placeholder CSS pseudo-element represents the placeholder text of a form element."
45231         },
45232         {
45233             "name": "::slotted",
45234             "browsers": [
45235                 "E79",
45236                 "FF63",
45237                 "S10",
45238                 "C50",
45239                 "O37"
45240             ],
45241             "references": [
45242                 {
45243                     "name": "MDN Reference",
45244                     "url": "https://developer.mozilla.org/docs/Web/CSS/::slotted"
45245                 }
45246             ],
45247             "description": "The :slotted() CSS pseudo-element represents any element that has been placed into a slot inside an HTML template."
45248         },
45249         {
45250             "name": "::spelling-error",
45251             "status": "experimental",
45252             "references": [
45253                 {
45254                     "name": "MDN Reference",
45255                     "url": "https://developer.mozilla.org/docs/Web/CSS/::spelling-error"
45256                 }
45257             ],
45258             "description": "The ::spelling-error CSS pseudo-element represents a text segment which the user agent has flagged as incorrectly spelled."
45259         }
45260     ]
45261 };
45262
45263
45264 /***/ }),
45265 /* 103 */
45266 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
45267
45268 __webpack_require__.r(__webpack_exports__);
45269 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
45270 /* harmony export */   "CSSDataProvider": () => /* binding */ CSSDataProvider
45271 /* harmony export */ });
45272 /*---------------------------------------------------------------------------------------------
45273  *  Copyright (c) Microsoft Corporation. All rights reserved.
45274  *  Licensed under the MIT License. See License.txt in the project root for license information.
45275  *--------------------------------------------------------------------------------------------*/
45276
45277 var CSSDataProvider = /** @class */ (function () {
45278     /**
45279      * Currently, unversioned data uses the V1 implementation
45280      * In the future when the provider handles multiple versions of HTML custom data,
45281      * use the latest implementation for unversioned data
45282      */
45283     function CSSDataProvider(data) {
45284         this._properties = [];
45285         this._atDirectives = [];
45286         this._pseudoClasses = [];
45287         this._pseudoElements = [];
45288         this.addData(data);
45289     }
45290     CSSDataProvider.prototype.provideProperties = function () {
45291         return this._properties;
45292     };
45293     CSSDataProvider.prototype.provideAtDirectives = function () {
45294         return this._atDirectives;
45295     };
45296     CSSDataProvider.prototype.providePseudoClasses = function () {
45297         return this._pseudoClasses;
45298     };
45299     CSSDataProvider.prototype.providePseudoElements = function () {
45300         return this._pseudoElements;
45301     };
45302     CSSDataProvider.prototype.addData = function (data) {
45303         if (Array.isArray(data.properties)) {
45304             for (var _i = 0, _a = data.properties; _i < _a.length; _i++) {
45305                 var prop = _a[_i];
45306                 if (isPropertyData(prop)) {
45307                     this._properties.push(prop);
45308                 }
45309             }
45310         }
45311         if (Array.isArray(data.atDirectives)) {
45312             for (var _b = 0, _c = data.atDirectives; _b < _c.length; _b++) {
45313                 var prop = _c[_b];
45314                 if (isAtDirective(prop)) {
45315                     this._atDirectives.push(prop);
45316                 }
45317             }
45318         }
45319         if (Array.isArray(data.pseudoClasses)) {
45320             for (var _d = 0, _e = data.pseudoClasses; _d < _e.length; _d++) {
45321                 var prop = _e[_d];
45322                 if (isPseudoClassData(prop)) {
45323                     this._pseudoClasses.push(prop);
45324                 }
45325             }
45326         }
45327         if (Array.isArray(data.pseudoElements)) {
45328             for (var _f = 0, _g = data.pseudoElements; _f < _g.length; _f++) {
45329                 var prop = _g[_f];
45330                 if (isPseudoElementData(prop)) {
45331                     this._pseudoElements.push(prop);
45332                 }
45333             }
45334         }
45335     };
45336     return CSSDataProvider;
45337 }());
45338
45339 function isPropertyData(d) {
45340     return typeof d.name === 'string';
45341 }
45342 function isAtDirective(d) {
45343     return typeof d.name === 'string';
45344 }
45345 function isPseudoClassData(d) {
45346     return typeof d.name === 'string';
45347 }
45348 function isPseudoElementData(d) {
45349     return typeof d.name === 'string';
45350 }
45351
45352
45353 /***/ }),
45354 /* 104 */
45355 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
45356
45357 __webpack_require__.r(__webpack_exports__);
45358 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
45359 /* harmony export */   "getSelectionRanges": () => /* binding */ getSelectionRanges
45360 /* harmony export */ });
45361 /* harmony import */ var _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(79);
45362 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65);
45363 /*---------------------------------------------------------------------------------------------
45364  *  Copyright (c) Microsoft Corporation. All rights reserved.
45365  *  Licensed under the MIT License. See License.txt in the project root for license information.
45366  *--------------------------------------------------------------------------------------------*/
45367
45368
45369
45370 function getSelectionRanges(document, positions, stylesheet) {
45371     function getSelectionRange(position) {
45372         var applicableRanges = getApplicableRanges(position);
45373         var current = undefined;
45374         for (var index = applicableRanges.length - 1; index >= 0; index--) {
45375             current = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SelectionRange.create(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(applicableRanges[index][0]), document.positionAt(applicableRanges[index][1])), current);
45376         }
45377         if (!current) {
45378             current = _cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.SelectionRange.create(_cssLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(position, position));
45379         }
45380         return current;
45381     }
45382     return positions.map(getSelectionRange);
45383     function getApplicableRanges(position) {
45384         var offset = document.offsetAt(position);
45385         var currNode = stylesheet.findChildAtOffset(offset, true);
45386         if (!currNode) {
45387             return [];
45388         }
45389         var result = [];
45390         while (currNode) {
45391             if (currNode.parent &&
45392                 currNode.offset === currNode.parent.offset &&
45393                 currNode.end === currNode.parent.end) {
45394                 currNode = currNode.parent;
45395                 continue;
45396             }
45397             // The `{ }` part of `.a { }`
45398             if (currNode.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Declarations) {
45399                 if (offset > currNode.offset && offset < currNode.end) {
45400                     // Return `{ }` and the range inside `{` and `}`
45401                     result.push([currNode.offset + 1, currNode.end - 1]);
45402                 }
45403             }
45404             result.push([currNode.offset, currNode.end]);
45405             currNode = currNode.parent;
45406         }
45407         return result;
45408     }
45409 }
45410
45411
45412 /***/ }),
45413 /* 105 */
45414 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
45415
45416 __webpack_require__.r(__webpack_exports__);
45417 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
45418 /* harmony export */   "SCSSNavigation": () => /* binding */ SCSSNavigation
45419 /* harmony export */ });
45420 /* harmony import */ var _cssNavigation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(87);
45421 /* harmony import */ var _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65);
45422 /* harmony import */ var vscode_uri__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(84);
45423 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(66);
45424 /* harmony import */ var _utils_resources__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(83);
45425 /*---------------------------------------------------------------------------------------------
45426  *  Copyright (c) Microsoft Corporation. All rights reserved.
45427  *  Licensed under the MIT License. See License.txt in the project root for license information.
45428  *--------------------------------------------------------------------------------------------*/
45429
45430 var __extends = (undefined && undefined.__extends) || (function () {
45431     var extendStatics = function (d, b) {
45432         extendStatics = Object.setPrototypeOf ||
45433             ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
45434             function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
45435         return extendStatics(d, b);
45436     };
45437     return function (d, b) {
45438         extendStatics(d, b);
45439         function __() { this.constructor = d; }
45440         d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
45441     };
45442 })();
45443 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
45444     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
45445     return new (P || (P = Promise))(function (resolve, reject) {
45446         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
45447         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
45448         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
45449         step((generator = generator.apply(thisArg, _arguments || [])).next());
45450     });
45451 };
45452 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
45453     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
45454     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
45455     function verb(n) { return function (v) { return step([n, v]); }; }
45456     function step(op) {
45457         if (f) throw new TypeError("Generator is already executing.");
45458         while (_) try {
45459             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45460             if (y = 0, t) op = [op[0] & 2, t.value];
45461             switch (op[0]) {
45462                 case 0: case 1: t = op; break;
45463                 case 4: _.label++; return { value: op[1], done: false };
45464                 case 5: _.label++; y = op[1]; op = [0]; continue;
45465                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
45466                 default:
45467                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
45468                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
45469                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
45470                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45471                     if (t[2]) _.ops.pop();
45472                     _.trys.pop(); continue;
45473             }
45474             op = body.call(thisArg, _);
45475         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45476         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
45477     }
45478 };
45479
45480
45481
45482
45483
45484 var SCSSNavigation = /** @class */ (function (_super) {
45485     __extends(SCSSNavigation, _super);
45486     function SCSSNavigation(fileSystemProvider) {
45487         return _super.call(this, fileSystemProvider) || this;
45488     }
45489     SCSSNavigation.prototype.isRawStringDocumentLinkNode = function (node) {
45490         return (_super.prototype.isRawStringDocumentLinkNode.call(this, node) ||
45491             node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Use ||
45492             node.type === _parser_cssNodes__WEBPACK_IMPORTED_MODULE_1__.NodeType.Forward);
45493     };
45494     SCSSNavigation.prototype.resolveRelativeReference = function (ref, documentUri, documentContext) {
45495         return __awaiter(this, void 0, void 0, function () {
45496             function toPathVariations(uri) {
45497                 // No valid path
45498                 if (uri.path === '') {
45499                     return undefined;
45500                 }
45501                 // No variation for links that ends with suffix
45502                 if (uri.path.endsWith('.scss') || uri.path.endsWith('.css')) {
45503                     return undefined;
45504                 }
45505                 // If a link is like a/, try resolving a/index.scss and a/_index.scss
45506                 if (uri.path.endsWith('/')) {
45507                     return [
45508                         uri.with({ path: uri.path + 'index.scss' }).toString(),
45509                         uri.with({ path: uri.path + '_index.scss' }).toString()
45510                     ];
45511                 }
45512                 // Use `uri.path` since it's normalized to use `/` in all platforms
45513                 var pathFragments = uri.path.split('/');
45514                 var basename = pathFragments[pathFragments.length - 1];
45515                 var pathWithoutBasename = uri.path.slice(0, -basename.length);
45516                 // No variation for links such as _a
45517                 if (basename.startsWith('_')) {
45518                     if (uri.path.endsWith('.scss')) {
45519                         return undefined;
45520                     }
45521                     else {
45522                         return [uri.with({ path: uri.path + '.scss' }).toString()];
45523                     }
45524                 }
45525                 var normalizedBasename = basename + '.scss';
45526                 var documentUriWithBasename = function (newBasename) {
45527                     return uri.with({ path: pathWithoutBasename + newBasename }).toString();
45528                 };
45529                 var normalizedPath = documentUriWithBasename(normalizedBasename);
45530                 var underScorePath = documentUriWithBasename('_' + normalizedBasename);
45531                 var indexPath = documentUriWithBasename(normalizedBasename.slice(0, -5) + '/index.scss');
45532                 var indexUnderscoreUri = documentUriWithBasename(normalizedBasename.slice(0, -5) + '/_index.scss');
45533                 var cssPath = documentUriWithBasename(normalizedBasename.slice(0, -5) + '.css');
45534                 return [normalizedPath, underScorePath, indexPath, indexUnderscoreUri, cssPath];
45535             }
45536             var target, parsedUri, pathVariations, j, e_1;
45537             return __generator(this, function (_a) {
45538                 switch (_a.label) {
45539                     case 0:
45540                         if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_4__.startsWith)(ref, 'sass:')) {
45541                             return [2 /*return*/, undefined]; // sass library
45542                         }
45543                         return [4 /*yield*/, _super.prototype.resolveRelativeReference.call(this, ref, documentUri, documentContext)];
45544                     case 1:
45545                         target = _a.sent();
45546                         if (!(this.fileSystemProvider && target && (0,_utils_resources__WEBPACK_IMPORTED_MODULE_3__.extname)(target).length === 0)) return [3 /*break*/, 8];
45547                         _a.label = 2;
45548                     case 2:
45549                         _a.trys.push([2, 7, , 8]);
45550                         parsedUri = vscode_uri__WEBPACK_IMPORTED_MODULE_2__.URI.parse(target);
45551                         pathVariations = toPathVariations(parsedUri);
45552                         if (!pathVariations) return [3 /*break*/, 6];
45553                         j = 0;
45554                         _a.label = 3;
45555                     case 3:
45556                         if (!(j < pathVariations.length)) return [3 /*break*/, 6];
45557                         return [4 /*yield*/, this.fileExists(pathVariations[j])];
45558                     case 4:
45559                         if (_a.sent()) {
45560                             return [2 /*return*/, pathVariations[j]];
45561                         }
45562                         _a.label = 5;
45563                     case 5:
45564                         j++;
45565                         return [3 /*break*/, 3];
45566                     case 6: return [2 /*return*/, undefined];
45567                     case 7:
45568                         e_1 = _a.sent();
45569                         return [3 /*break*/, 8];
45570                     case 8: return [2 /*return*/, target];
45571                 }
45572             });
45573         });
45574     };
45575     return SCSSNavigation;
45576 }(_cssNavigation__WEBPACK_IMPORTED_MODULE_0__.CSSNavigation));
45577
45578
45579
45580 /***/ }),
45581 /* 106 */
45582 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
45583
45584 __webpack_require__.r(__webpack_exports__);
45585 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
45586 /* harmony export */   "ClientCapabilities": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.ClientCapabilities,
45587 /* harmony export */   "CodeAction": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CodeAction,
45588 /* harmony export */   "CodeActionContext": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CodeActionContext,
45589 /* harmony export */   "CodeActionKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CodeActionKind,
45590 /* harmony export */   "CodeLens": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CodeLens,
45591 /* harmony export */   "Color": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Color,
45592 /* harmony export */   "ColorInformation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.ColorInformation,
45593 /* harmony export */   "ColorPresentation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.ColorPresentation,
45594 /* harmony export */   "Command": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Command,
45595 /* harmony export */   "CompletionItem": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CompletionItem,
45596 /* harmony export */   "CompletionItemKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CompletionItemKind,
45597 /* harmony export */   "CompletionItemTag": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CompletionItemTag,
45598 /* harmony export */   "CompletionList": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CompletionList,
45599 /* harmony export */   "CreateFile": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.CreateFile,
45600 /* harmony export */   "DeleteFile": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DeleteFile,
45601 /* harmony export */   "Diagnostic": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Diagnostic,
45602 /* harmony export */   "DiagnosticCode": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DiagnosticCode,
45603 /* harmony export */   "DiagnosticRelatedInformation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DiagnosticRelatedInformation,
45604 /* harmony export */   "DiagnosticSeverity": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DiagnosticSeverity,
45605 /* harmony export */   "DiagnosticTag": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DiagnosticTag,
45606 /* harmony export */   "DocumentHighlight": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DocumentHighlight,
45607 /* harmony export */   "DocumentHighlightKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DocumentHighlightKind,
45608 /* harmony export */   "DocumentLink": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DocumentLink,
45609 /* harmony export */   "DocumentSymbol": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.DocumentSymbol,
45610 /* harmony export */   "EOL": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.EOL,
45611 /* harmony export */   "FileType": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.FileType,
45612 /* harmony export */   "FoldingRange": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.FoldingRange,
45613 /* harmony export */   "FoldingRangeKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.FoldingRangeKind,
45614 /* harmony export */   "FormattingOptions": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.FormattingOptions,
45615 /* harmony export */   "Hover": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Hover,
45616 /* harmony export */   "InsertReplaceEdit": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.InsertReplaceEdit,
45617 /* harmony export */   "InsertTextFormat": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.InsertTextFormat,
45618 /* harmony export */   "Location": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Location,
45619 /* harmony export */   "LocationLink": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.LocationLink,
45620 /* harmony export */   "MarkedString": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.MarkedString,
45621 /* harmony export */   "MarkupContent": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.MarkupContent,
45622 /* harmony export */   "MarkupKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.MarkupKind,
45623 /* harmony export */   "ParameterInformation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.ParameterInformation,
45624 /* harmony export */   "Position": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Position,
45625 /* harmony export */   "Range": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.Range,
45626 /* harmony export */   "RenameFile": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.RenameFile,
45627 /* harmony export */   "ScannerState": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.ScannerState,
45628 /* harmony export */   "SelectionRange": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.SelectionRange,
45629 /* harmony export */   "SignatureInformation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.SignatureInformation,
45630 /* harmony export */   "SymbolInformation": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.SymbolInformation,
45631 /* harmony export */   "SymbolKind": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.SymbolKind,
45632 /* harmony export */   "SymbolTag": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.SymbolTag,
45633 /* harmony export */   "TextDocument": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TextDocument,
45634 /* harmony export */   "TextDocumentEdit": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TextDocumentEdit,
45635 /* harmony export */   "TextDocumentIdentifier": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TextDocumentIdentifier,
45636 /* harmony export */   "TextDocumentItem": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TextDocumentItem,
45637 /* harmony export */   "TextEdit": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TextEdit,
45638 /* harmony export */   "TokenType": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.TokenType,
45639 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.VersionedTextDocumentIdentifier,
45640 /* harmony export */   "WorkspaceChange": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.WorkspaceChange,
45641 /* harmony export */   "WorkspaceEdit": () => /* reexport safe */ _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__.WorkspaceEdit,
45642 /* harmony export */   "getLanguageService": () => /* binding */ getLanguageService,
45643 /* harmony export */   "newHTMLDataProvider": () => /* binding */ newHTMLDataProvider,
45644 /* harmony export */   "getDefaultHTMLDataProvider": () => /* binding */ getDefaultHTMLDataProvider
45645 /* harmony export */ });
45646 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);
45647 /* harmony import */ var _parser_htmlParser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(110);
45648 /* harmony import */ var _services_htmlCompletion__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(113);
45649 /* harmony import */ var _services_htmlHover__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(120);
45650 /* harmony import */ var _services_htmlFormatter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(121);
45651 /* harmony import */ var _services_htmlLinks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(125);
45652 /* harmony import */ var _services_htmlHighlighting__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(126);
45653 /* harmony import */ var _services_htmlSymbolsProvider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(127);
45654 /* harmony import */ var _services_htmlRename__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(133);
45655 /* harmony import */ var _services_htmlMatchingTagPosition__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(134);
45656 /* harmony import */ var _services_htmlSyncedRegions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(128);
45657 /* harmony import */ var _services_htmlFolding__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(129);
45658 /* harmony import */ var _services_htmlSelectionRange__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(130);
45659 /* harmony import */ var _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(116);
45660 /* harmony import */ var _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(131);
45661 /* harmony import */ var _languageFacts_data_webCustomData__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(132);
45662 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(108);
45663 /*---------------------------------------------------------------------------------------------
45664  *  Copyright (c) Microsoft Corporation. All rights reserved.
45665  *  Licensed under the MIT License. See License.txt in the project root for license information.
45666  *--------------------------------------------------------------------------------------------*/
45667
45668
45669
45670
45671
45672
45673
45674
45675
45676
45677
45678
45679
45680
45681
45682
45683
45684 var defaultLanguageServiceOptions = {};
45685 function getLanguageService(options) {
45686     if (options === void 0) { options = defaultLanguageServiceOptions; }
45687     var dataManager = new _languageFacts_dataManager__WEBPACK_IMPORTED_MODULE_12__.HTMLDataManager(options);
45688     var htmlHover = new _services_htmlHover__WEBPACK_IMPORTED_MODULE_3__.HTMLHover(options, dataManager);
45689     var htmlCompletion = new _services_htmlCompletion__WEBPACK_IMPORTED_MODULE_2__.HTMLCompletion(options, dataManager);
45690     return {
45691         setDataProviders: dataManager.setDataProviders.bind(dataManager),
45692         createScanner: _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner,
45693         parseHTMLDocument: function (document) { return (0,_parser_htmlParser__WEBPACK_IMPORTED_MODULE_1__.parse)(document.getText()); },
45694         doComplete: htmlCompletion.doComplete.bind(htmlCompletion),
45695         doComplete2: htmlCompletion.doComplete2.bind(htmlCompletion),
45696         setCompletionParticipants: htmlCompletion.setCompletionParticipants.bind(htmlCompletion),
45697         doHover: htmlHover.doHover.bind(htmlHover),
45698         format: _services_htmlFormatter__WEBPACK_IMPORTED_MODULE_4__.format,
45699         findDocumentHighlights: _services_htmlHighlighting__WEBPACK_IMPORTED_MODULE_6__.findDocumentHighlights,
45700         findDocumentLinks: _services_htmlLinks__WEBPACK_IMPORTED_MODULE_5__.findDocumentLinks,
45701         findDocumentSymbols: _services_htmlSymbolsProvider__WEBPACK_IMPORTED_MODULE_7__.findDocumentSymbols,
45702         getFoldingRanges: _services_htmlFolding__WEBPACK_IMPORTED_MODULE_9__.getFoldingRanges,
45703         getSelectionRanges: _services_htmlSelectionRange__WEBPACK_IMPORTED_MODULE_10__.getSelectionRanges,
45704         doTagComplete: htmlCompletion.doTagComplete.bind(htmlCompletion),
45705         doRename: _services_htmlRename__WEBPACK_IMPORTED_MODULE_15__.doRename,
45706         findMatchingTagPosition: _services_htmlMatchingTagPosition__WEBPACK_IMPORTED_MODULE_16__.findMatchingTagPosition,
45707         findOnTypeRenameRanges: _services_htmlSyncedRegions__WEBPACK_IMPORTED_MODULE_8__.findOnTypeRenameRanges
45708     };
45709 }
45710 function newHTMLDataProvider(id, customData) {
45711     return new _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_11__.HTMLDataProvider(id, customData);
45712 }
45713 function getDefaultHTMLDataProvider() {
45714     return newHTMLDataProvider('default', _languageFacts_data_webCustomData__WEBPACK_IMPORTED_MODULE_13__.htmlData);
45715 }
45716
45717
45718 /***/ }),
45719 /* 107 */
45720 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
45721
45722 __webpack_require__.r(__webpack_exports__);
45723 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
45724 /* harmony export */   "createScanner": () => /* binding */ createScanner
45725 /* harmony export */ });
45726 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(68);
45727 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(108);
45728 /*---------------------------------------------------------------------------------------------
45729  *  Copyright (c) Microsoft Corporation. All rights reserved.
45730  *  Licensed under the MIT License. See License.txt in the project root for license information.
45731  *--------------------------------------------------------------------------------------------*/
45732
45733
45734 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_0__.loadMessageBundle();
45735 var MultiLineStream = /** @class */ (function () {
45736     function MultiLineStream(source, position) {
45737         this.source = source;
45738         this.len = source.length;
45739         this.position = position;
45740     }
45741     MultiLineStream.prototype.eos = function () {
45742         return this.len <= this.position;
45743     };
45744     MultiLineStream.prototype.getSource = function () {
45745         return this.source;
45746     };
45747     MultiLineStream.prototype.pos = function () {
45748         return this.position;
45749     };
45750     MultiLineStream.prototype.goBackTo = function (pos) {
45751         this.position = pos;
45752     };
45753     MultiLineStream.prototype.goBack = function (n) {
45754         this.position -= n;
45755     };
45756     MultiLineStream.prototype.advance = function (n) {
45757         this.position += n;
45758     };
45759     MultiLineStream.prototype.goToEnd = function () {
45760         this.position = this.source.length;
45761     };
45762     MultiLineStream.prototype.nextChar = function () {
45763         return this.source.charCodeAt(this.position++) || 0;
45764     };
45765     MultiLineStream.prototype.peekChar = function (n) {
45766         if (n === void 0) { n = 0; }
45767         return this.source.charCodeAt(this.position + n) || 0;
45768     };
45769     MultiLineStream.prototype.advanceIfChar = function (ch) {
45770         if (ch === this.source.charCodeAt(this.position)) {
45771             this.position++;
45772             return true;
45773         }
45774         return false;
45775     };
45776     MultiLineStream.prototype.advanceIfChars = function (ch) {
45777         var i;
45778         if (this.position + ch.length > this.source.length) {
45779             return false;
45780         }
45781         for (i = 0; i < ch.length; i++) {
45782             if (this.source.charCodeAt(this.position + i) !== ch[i]) {
45783                 return false;
45784             }
45785         }
45786         this.advance(i);
45787         return true;
45788     };
45789     MultiLineStream.prototype.advanceIfRegExp = function (regex) {
45790         var str = this.source.substr(this.position);
45791         var match = str.match(regex);
45792         if (match) {
45793             this.position = this.position + match.index + match[0].length;
45794             return match[0];
45795         }
45796         return '';
45797     };
45798     MultiLineStream.prototype.advanceUntilRegExp = function (regex) {
45799         var str = this.source.substr(this.position);
45800         var match = str.match(regex);
45801         if (match) {
45802             this.position = this.position + match.index;
45803             return match[0];
45804         }
45805         else {
45806             this.goToEnd();
45807         }
45808         return '';
45809     };
45810     MultiLineStream.prototype.advanceUntilChar = function (ch) {
45811         while (this.position < this.source.length) {
45812             if (this.source.charCodeAt(this.position) === ch) {
45813                 return true;
45814             }
45815             this.advance(1);
45816         }
45817         return false;
45818     };
45819     MultiLineStream.prototype.advanceUntilChars = function (ch) {
45820         while (this.position + ch.length <= this.source.length) {
45821             var i = 0;
45822             for (; i < ch.length && this.source.charCodeAt(this.position + i) === ch[i]; i++) {
45823             }
45824             if (i === ch.length) {
45825                 return true;
45826             }
45827             this.advance(1);
45828         }
45829         this.goToEnd();
45830         return false;
45831     };
45832     MultiLineStream.prototype.skipWhitespace = function () {
45833         var n = this.advanceWhileChar(function (ch) {
45834             return ch === _WSP || ch === _TAB || ch === _NWL || ch === _LFD || ch === _CAR;
45835         });
45836         return n > 0;
45837     };
45838     MultiLineStream.prototype.advanceWhileChar = function (condition) {
45839         var posNow = this.position;
45840         while (this.position < this.len && condition(this.source.charCodeAt(this.position))) {
45841             this.position++;
45842         }
45843         return this.position - posNow;
45844     };
45845     return MultiLineStream;
45846 }());
45847 var _BNG = '!'.charCodeAt(0);
45848 var _MIN = '-'.charCodeAt(0);
45849 var _LAN = '<'.charCodeAt(0);
45850 var _RAN = '>'.charCodeAt(0);
45851 var _FSL = '/'.charCodeAt(0);
45852 var _EQS = '='.charCodeAt(0);
45853 var _DQO = '"'.charCodeAt(0);
45854 var _SQO = '\''.charCodeAt(0);
45855 var _NWL = '\n'.charCodeAt(0);
45856 var _CAR = '\r'.charCodeAt(0);
45857 var _LFD = '\f'.charCodeAt(0);
45858 var _WSP = ' '.charCodeAt(0);
45859 var _TAB = '\t'.charCodeAt(0);
45860 var htmlScriptContents = {
45861     'text/x-handlebars-template': true
45862 };
45863 function createScanner(input, initialOffset, initialState, emitPseudoCloseTags) {
45864     if (initialOffset === void 0) { initialOffset = 0; }
45865     if (initialState === void 0) { initialState = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent; }
45866     if (emitPseudoCloseTags === void 0) { emitPseudoCloseTags = false; }
45867     var stream = new MultiLineStream(input, initialOffset);
45868     var state = initialState;
45869     var tokenOffset = 0;
45870     var tokenType = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown;
45871     var tokenError;
45872     var hasSpaceAfterTag;
45873     var lastTag;
45874     var lastAttributeName;
45875     var lastTypeValue;
45876     function nextElementName() {
45877         return stream.advanceIfRegExp(/^[_:\w][_:\w-.\d]*/).toLowerCase();
45878     }
45879     function nextAttributeName() {
45880         return stream.advanceIfRegExp(/^[^\s"'></=\x00-\x0F\x7F\x80-\x9F]*/).toLowerCase();
45881     }
45882     function finishToken(offset, type, errorMessage) {
45883         tokenType = type;
45884         tokenOffset = offset;
45885         tokenError = errorMessage;
45886         return type;
45887     }
45888     function scan() {
45889         var offset = stream.pos();
45890         var oldState = state;
45891         var token = internalScan();
45892         if (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOS && offset === stream.pos() && !(emitPseudoCloseTags && (token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagClose || token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagClose))) {
45893             console.log('Scanner.scan has not advanced at offset ' + offset + ', state before: ' + oldState + ' after: ' + state);
45894             stream.advance(1);
45895             return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown);
45896         }
45897         return token;
45898     }
45899     function internalScan() {
45900         var offset = stream.pos();
45901         if (stream.eos()) {
45902             return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOS);
45903         }
45904         var errorMessage;
45905         switch (state) {
45906             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinComment:
45907                 if (stream.advanceIfChars([_MIN, _MIN, _RAN])) { // -->
45908                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
45909                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndCommentTag);
45910                 }
45911                 stream.advanceUntilChars([_MIN, _MIN, _RAN]); // -->
45912                 return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comment);
45913             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinDoctype:
45914                 if (stream.advanceIfChar(_RAN)) {
45915                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
45916                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndDoctypeTag);
45917                 }
45918                 stream.advanceUntilChar(_RAN); // >
45919                 return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Doctype);
45920             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent:
45921                 if (stream.advanceIfChar(_LAN)) { // <
45922                     if (!stream.eos() && stream.peekChar() === _BNG) { // !
45923                         if (stream.advanceIfChars([_BNG, _MIN, _MIN])) { // <!--
45924                             state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinComment;
45925                             return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartCommentTag);
45926                         }
45927                         if (stream.advanceIfRegExp(/^!doctype/i)) {
45928                             state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinDoctype;
45929                             return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartDoctypeTag);
45930                         }
45931                     }
45932                     if (stream.advanceIfChar(_FSL)) { // /
45933                         state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterOpeningEndTag;
45934                         return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagOpen);
45935                     }
45936                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterOpeningStartTag;
45937                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagOpen);
45938                 }
45939                 stream.advanceUntilChar(_LAN);
45940                 return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Content);
45941             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterOpeningEndTag:
45942                 var tagName = nextElementName();
45943                 if (tagName.length > 0) {
45944                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinEndTag;
45945                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTag);
45946                 }
45947                 if (stream.skipWhitespace()) { // white space is not valid here
45948                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace, localize('error.unexpectedWhitespace', 'Tag name must directly follow the open bracket.'));
45949                 }
45950                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinEndTag;
45951                 stream.advanceUntilChar(_RAN);
45952                 if (offset < stream.pos()) {
45953                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown, localize('error.endTagNameExpected', 'End tag name expected.'));
45954                 }
45955                 return internalScan();
45956             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinEndTag:
45957                 if (stream.skipWhitespace()) { // white space is valid here
45958                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace);
45959                 }
45960                 if (stream.advanceIfChar(_RAN)) { // >
45961                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
45962                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagClose);
45963                 }
45964                 if (emitPseudoCloseTags && stream.peekChar() === _LAN) { // <
45965                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
45966                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagClose, localize('error.closingBracketMissing', 'Closing bracket missing.'));
45967                 }
45968                 errorMessage = localize('error.closingBracketExpected', 'Closing bracket expected.');
45969                 break;
45970             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterOpeningStartTag:
45971                 lastTag = nextElementName();
45972                 lastTypeValue = void 0;
45973                 lastAttributeName = void 0;
45974                 if (lastTag.length > 0) {
45975                     hasSpaceAfterTag = false;
45976                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
45977                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTag);
45978                 }
45979                 if (stream.skipWhitespace()) { // white space is not valid here
45980                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace, localize('error.unexpectedWhitespace', 'Tag name must directly follow the open bracket.'));
45981                 }
45982                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
45983                 stream.advanceUntilChar(_RAN);
45984                 if (offset < stream.pos()) {
45985                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown, localize('error.startTagNameExpected', 'Start tag name expected.'));
45986                 }
45987                 return internalScan();
45988             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag:
45989                 if (stream.skipWhitespace()) {
45990                     hasSpaceAfterTag = true; // remember that we have seen a whitespace
45991                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace);
45992                 }
45993                 if (hasSpaceAfterTag) {
45994                     lastAttributeName = nextAttributeName();
45995                     if (lastAttributeName.length > 0) {
45996                         state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterAttributeName;
45997                         hasSpaceAfterTag = false;
45998                         return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.AttributeName);
45999                     }
46000                 }
46001                 if (stream.advanceIfChars([_FSL, _RAN])) { // />
46002                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46003                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagSelfClose);
46004                 }
46005                 if (stream.advanceIfChar(_RAN)) { // >
46006                     if (lastTag === 'script') {
46007                         if (lastTypeValue && htmlScriptContents[lastTypeValue]) {
46008                             // stay in html
46009                             state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46010                         }
46011                         else {
46012                             state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinScriptContent;
46013                         }
46014                     }
46015                     else if (lastTag === 'style') {
46016                         state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinStyleContent;
46017                     }
46018                     else {
46019                         state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46020                     }
46021                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagClose);
46022                 }
46023                 if (emitPseudoCloseTags && stream.peekChar() === _LAN) { // <
46024                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46025                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagClose, localize('error.closingBracketMissing', 'Closing bracket missing.'));
46026                 }
46027                 stream.advance(1);
46028                 return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown, localize('error.unexpectedCharacterInTag', 'Unexpected character in tag.'));
46029             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.AfterAttributeName:
46030                 if (stream.skipWhitespace()) {
46031                     hasSpaceAfterTag = true;
46032                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace);
46033                 }
46034                 if (stream.advanceIfChar(_EQS)) {
46035                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.BeforeAttributeValue;
46036                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.DelimiterAssign);
46037                 }
46038                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
46039                 return internalScan(); // no advance yet - jump to WithinTag
46040             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.BeforeAttributeValue:
46041                 if (stream.skipWhitespace()) {
46042                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Whitespace);
46043                 }
46044                 var attributeValue = stream.advanceIfRegExp(/^[^\s"'`=<>]+/);
46045                 if (attributeValue.length > 0) {
46046                     if (stream.peekChar() === _RAN && stream.peekChar(-1) === _FSL) { // <foo bar=http://foo/>
46047                         stream.goBack(1);
46048                         attributeValue = attributeValue.substr(0, attributeValue.length - 1);
46049                     }
46050                     if (lastAttributeName === 'type') {
46051                         lastTypeValue = attributeValue;
46052                     }
46053                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
46054                     hasSpaceAfterTag = false;
46055                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.AttributeValue);
46056                 }
46057                 var ch = stream.peekChar();
46058                 if (ch === _SQO || ch === _DQO) {
46059                     stream.advance(1); // consume quote
46060                     if (stream.advanceUntilChar(ch)) {
46061                         stream.advance(1); // consume quote
46062                     }
46063                     if (lastAttributeName === 'type') {
46064                         lastTypeValue = stream.getSource().substring(offset + 1, stream.pos() - 1);
46065                     }
46066                     state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
46067                     hasSpaceAfterTag = false;
46068                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.AttributeValue);
46069                 }
46070                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinTag;
46071                 hasSpaceAfterTag = false;
46072                 return internalScan(); // no advance yet - jump to WithinTag
46073             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinScriptContent:
46074                 // see http://stackoverflow.com/questions/14574471/how-do-browsers-parse-a-script-tag-exactly
46075                 var sciptState = 1;
46076                 while (!stream.eos()) {
46077                     var match = stream.advanceIfRegExp(/<!--|-->|<\/?script\s*\/?>?/i);
46078                     if (match.length === 0) {
46079                         stream.goToEnd();
46080                         return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Script);
46081                     }
46082                     else if (match === '<!--') {
46083                         if (sciptState === 1) {
46084                             sciptState = 2;
46085                         }
46086                     }
46087                     else if (match === '-->') {
46088                         sciptState = 1;
46089                     }
46090                     else if (match[1] !== '/') { // <script
46091                         if (sciptState === 2) {
46092                             sciptState = 3;
46093                         }
46094                     }
46095                     else { // </script
46096                         if (sciptState === 3) {
46097                             sciptState = 2;
46098                         }
46099                         else {
46100                             stream.goBack(match.length); // to the beginning of the closing tag
46101                             break;
46102                         }
46103                     }
46104                 }
46105                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46106                 if (offset < stream.pos()) {
46107                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Script);
46108                 }
46109                 return internalScan(); // no advance yet - jump to content
46110             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinStyleContent:
46111                 stream.advanceUntilRegExp(/<\/style/i);
46112                 state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46113                 if (offset < stream.pos()) {
46114                     return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Styles);
46115                 }
46116                 return internalScan(); // no advance yet - jump to content
46117         }
46118         stream.advance(1);
46119         state = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.ScannerState.WithinContent;
46120         return finishToken(offset, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Unknown, errorMessage);
46121     }
46122     return {
46123         scan: scan,
46124         getTokenType: function () { return tokenType; },
46125         getTokenOffset: function () { return tokenOffset; },
46126         getTokenLength: function () { return stream.pos() - tokenOffset; },
46127         getTokenEnd: function () { return stream.pos(); },
46128         getTokenText: function () { return stream.getSource().substring(tokenOffset, stream.pos()); },
46129         getScannerState: function () { return state; },
46130         getTokenError: function () { return tokenError; }
46131     };
46132 }
46133
46134
46135 /***/ }),
46136 /* 108 */
46137 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
46138
46139 __webpack_require__.r(__webpack_exports__);
46140 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
46141 /* harmony export */   "TextDocument": () => /* reexport safe */ vscode_languageserver_textdocument__WEBPACK_IMPORTED_MODULE_1__.TextDocument,
46142 /* harmony export */   "CodeAction": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeAction,
46143 /* harmony export */   "CodeActionContext": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeActionContext,
46144 /* harmony export */   "CodeActionKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeActionKind,
46145 /* harmony export */   "CodeLens": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CodeLens,
46146 /* harmony export */   "Color": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Color,
46147 /* harmony export */   "ColorInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ColorInformation,
46148 /* harmony export */   "ColorPresentation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ColorPresentation,
46149 /* harmony export */   "Command": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Command,
46150 /* harmony export */   "CompletionItem": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItem,
46151 /* harmony export */   "CompletionItemKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind,
46152 /* harmony export */   "CompletionItemTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemTag,
46153 /* harmony export */   "CompletionList": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionList,
46154 /* harmony export */   "CreateFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CreateFile,
46155 /* harmony export */   "DeleteFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DeleteFile,
46156 /* harmony export */   "Diagnostic": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Diagnostic,
46157 /* harmony export */   "DiagnosticCode": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticCode,
46158 /* harmony export */   "DiagnosticRelatedInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticRelatedInformation,
46159 /* harmony export */   "DiagnosticSeverity": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticSeverity,
46160 /* harmony export */   "DiagnosticTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DiagnosticTag,
46161 /* harmony export */   "DocumentHighlight": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlight,
46162 /* harmony export */   "DocumentHighlightKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentHighlightKind,
46163 /* harmony export */   "DocumentLink": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentLink,
46164 /* harmony export */   "DocumentSymbol": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.DocumentSymbol,
46165 /* harmony export */   "EOL": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.EOL,
46166 /* harmony export */   "FoldingRange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRange,
46167 /* harmony export */   "FoldingRangeKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRangeKind,
46168 /* harmony export */   "FormattingOptions": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FormattingOptions,
46169 /* harmony export */   "Hover": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Hover,
46170 /* harmony export */   "InsertReplaceEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertReplaceEdit,
46171 /* harmony export */   "InsertTextFormat": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat,
46172 /* harmony export */   "Location": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Location,
46173 /* harmony export */   "LocationLink": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.LocationLink,
46174 /* harmony export */   "MarkedString": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkedString,
46175 /* harmony export */   "MarkupContent": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupContent,
46176 /* harmony export */   "MarkupKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind,
46177 /* harmony export */   "ParameterInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.ParameterInformation,
46178 /* harmony export */   "Position": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position,
46179 /* harmony export */   "Range": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range,
46180 /* harmony export */   "RenameFile": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.RenameFile,
46181 /* harmony export */   "SelectionRange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SelectionRange,
46182 /* harmony export */   "SignatureInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SignatureInformation,
46183 /* harmony export */   "SymbolInformation": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolInformation,
46184 /* harmony export */   "SymbolKind": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolKind,
46185 /* harmony export */   "SymbolTag": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolTag,
46186 /* harmony export */   "TextDocumentEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentEdit,
46187 /* harmony export */   "TextDocumentIdentifier": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentIdentifier,
46188 /* harmony export */   "TextDocumentItem": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextDocumentItem,
46189 /* harmony export */   "TextEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit,
46190 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.VersionedTextDocumentIdentifier,
46191 /* harmony export */   "WorkspaceChange": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.WorkspaceChange,
46192 /* harmony export */   "WorkspaceEdit": () => /* reexport safe */ vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.WorkspaceEdit,
46193 /* harmony export */   "TokenType": () => /* binding */ TokenType,
46194 /* harmony export */   "ScannerState": () => /* binding */ ScannerState,
46195 /* harmony export */   "ClientCapabilities": () => /* binding */ ClientCapabilities,
46196 /* harmony export */   "FileType": () => /* binding */ FileType
46197 /* harmony export */ });
46198 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
46199 /* harmony import */ var vscode_languageserver_textdocument__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(81);
46200 /*---------------------------------------------------------------------------------------------
46201  *  Copyright (c) Microsoft Corporation. All rights reserved.
46202  *  Licensed under the MIT License. See License.txt in the project root for license information.
46203  *--------------------------------------------------------------------------------------------*/
46204
46205
46206
46207 var TokenType;
46208 (function (TokenType) {
46209     TokenType[TokenType["StartCommentTag"] = 0] = "StartCommentTag";
46210     TokenType[TokenType["Comment"] = 1] = "Comment";
46211     TokenType[TokenType["EndCommentTag"] = 2] = "EndCommentTag";
46212     TokenType[TokenType["StartTagOpen"] = 3] = "StartTagOpen";
46213     TokenType[TokenType["StartTagClose"] = 4] = "StartTagClose";
46214     TokenType[TokenType["StartTagSelfClose"] = 5] = "StartTagSelfClose";
46215     TokenType[TokenType["StartTag"] = 6] = "StartTag";
46216     TokenType[TokenType["EndTagOpen"] = 7] = "EndTagOpen";
46217     TokenType[TokenType["EndTagClose"] = 8] = "EndTagClose";
46218     TokenType[TokenType["EndTag"] = 9] = "EndTag";
46219     TokenType[TokenType["DelimiterAssign"] = 10] = "DelimiterAssign";
46220     TokenType[TokenType["AttributeName"] = 11] = "AttributeName";
46221     TokenType[TokenType["AttributeValue"] = 12] = "AttributeValue";
46222     TokenType[TokenType["StartDoctypeTag"] = 13] = "StartDoctypeTag";
46223     TokenType[TokenType["Doctype"] = 14] = "Doctype";
46224     TokenType[TokenType["EndDoctypeTag"] = 15] = "EndDoctypeTag";
46225     TokenType[TokenType["Content"] = 16] = "Content";
46226     TokenType[TokenType["Whitespace"] = 17] = "Whitespace";
46227     TokenType[TokenType["Unknown"] = 18] = "Unknown";
46228     TokenType[TokenType["Script"] = 19] = "Script";
46229     TokenType[TokenType["Styles"] = 20] = "Styles";
46230     TokenType[TokenType["EOS"] = 21] = "EOS";
46231 })(TokenType || (TokenType = {}));
46232 var ScannerState;
46233 (function (ScannerState) {
46234     ScannerState[ScannerState["WithinContent"] = 0] = "WithinContent";
46235     ScannerState[ScannerState["AfterOpeningStartTag"] = 1] = "AfterOpeningStartTag";
46236     ScannerState[ScannerState["AfterOpeningEndTag"] = 2] = "AfterOpeningEndTag";
46237     ScannerState[ScannerState["WithinDoctype"] = 3] = "WithinDoctype";
46238     ScannerState[ScannerState["WithinTag"] = 4] = "WithinTag";
46239     ScannerState[ScannerState["WithinEndTag"] = 5] = "WithinEndTag";
46240     ScannerState[ScannerState["WithinComment"] = 6] = "WithinComment";
46241     ScannerState[ScannerState["WithinScriptContent"] = 7] = "WithinScriptContent";
46242     ScannerState[ScannerState["WithinStyleContent"] = 8] = "WithinStyleContent";
46243     ScannerState[ScannerState["AfterAttributeName"] = 9] = "AfterAttributeName";
46244     ScannerState[ScannerState["BeforeAttributeValue"] = 10] = "BeforeAttributeValue";
46245 })(ScannerState || (ScannerState = {}));
46246 var ClientCapabilities;
46247 (function (ClientCapabilities) {
46248     ClientCapabilities.LATEST = {
46249         textDocument: {
46250             completion: {
46251                 completionItem: {
46252                     documentationFormat: [vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.Markdown, vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.PlainText]
46253                 }
46254             },
46255             hover: {
46256                 contentFormat: [vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.Markdown, vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.PlainText]
46257             }
46258         }
46259     };
46260 })(ClientCapabilities || (ClientCapabilities = {}));
46261 var FileType;
46262 (function (FileType) {
46263     /**
46264      * The file type is unknown.
46265      */
46266     FileType[FileType["Unknown"] = 0] = "Unknown";
46267     /**
46268      * A regular file.
46269      */
46270     FileType[FileType["File"] = 1] = "File";
46271     /**
46272      * A directory.
46273      */
46274     FileType[FileType["Directory"] = 2] = "Directory";
46275     /**
46276      * A symbolic link to a file.
46277      */
46278     FileType[FileType["SymbolicLink"] = 64] = "SymbolicLink";
46279 })(FileType || (FileType = {}));
46280
46281
46282 /***/ }),
46283 /* 109 */
46284 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
46285
46286 __webpack_require__.r(__webpack_exports__);
46287 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
46288 /* harmony export */   "Position": () => /* binding */ Position,
46289 /* harmony export */   "Range": () => /* binding */ Range,
46290 /* harmony export */   "Location": () => /* binding */ Location,
46291 /* harmony export */   "LocationLink": () => /* binding */ LocationLink,
46292 /* harmony export */   "Color": () => /* binding */ Color,
46293 /* harmony export */   "ColorInformation": () => /* binding */ ColorInformation,
46294 /* harmony export */   "ColorPresentation": () => /* binding */ ColorPresentation,
46295 /* harmony export */   "FoldingRangeKind": () => /* binding */ FoldingRangeKind,
46296 /* harmony export */   "FoldingRange": () => /* binding */ FoldingRange,
46297 /* harmony export */   "DiagnosticRelatedInformation": () => /* binding */ DiagnosticRelatedInformation,
46298 /* harmony export */   "DiagnosticSeverity": () => /* binding */ DiagnosticSeverity,
46299 /* harmony export */   "DiagnosticTag": () => /* binding */ DiagnosticTag,
46300 /* harmony export */   "DiagnosticCode": () => /* binding */ DiagnosticCode,
46301 /* harmony export */   "Diagnostic": () => /* binding */ Diagnostic,
46302 /* harmony export */   "Command": () => /* binding */ Command,
46303 /* harmony export */   "TextEdit": () => /* binding */ TextEdit,
46304 /* harmony export */   "TextDocumentEdit": () => /* binding */ TextDocumentEdit,
46305 /* harmony export */   "CreateFile": () => /* binding */ CreateFile,
46306 /* harmony export */   "RenameFile": () => /* binding */ RenameFile,
46307 /* harmony export */   "DeleteFile": () => /* binding */ DeleteFile,
46308 /* harmony export */   "WorkspaceEdit": () => /* binding */ WorkspaceEdit,
46309 /* harmony export */   "WorkspaceChange": () => /* binding */ WorkspaceChange,
46310 /* harmony export */   "TextDocumentIdentifier": () => /* binding */ TextDocumentIdentifier,
46311 /* harmony export */   "VersionedTextDocumentIdentifier": () => /* binding */ VersionedTextDocumentIdentifier,
46312 /* harmony export */   "TextDocumentItem": () => /* binding */ TextDocumentItem,
46313 /* harmony export */   "MarkupKind": () => /* binding */ MarkupKind,
46314 /* harmony export */   "MarkupContent": () => /* binding */ MarkupContent,
46315 /* harmony export */   "CompletionItemKind": () => /* binding */ CompletionItemKind,
46316 /* harmony export */   "InsertTextFormat": () => /* binding */ InsertTextFormat,
46317 /* harmony export */   "CompletionItemTag": () => /* binding */ CompletionItemTag,
46318 /* harmony export */   "InsertReplaceEdit": () => /* binding */ InsertReplaceEdit,
46319 /* harmony export */   "CompletionItem": () => /* binding */ CompletionItem,
46320 /* harmony export */   "CompletionList": () => /* binding */ CompletionList,
46321 /* harmony export */   "MarkedString": () => /* binding */ MarkedString,
46322 /* harmony export */   "Hover": () => /* binding */ Hover,
46323 /* harmony export */   "ParameterInformation": () => /* binding */ ParameterInformation,
46324 /* harmony export */   "SignatureInformation": () => /* binding */ SignatureInformation,
46325 /* harmony export */   "DocumentHighlightKind": () => /* binding */ DocumentHighlightKind,
46326 /* harmony export */   "DocumentHighlight": () => /* binding */ DocumentHighlight,
46327 /* harmony export */   "SymbolKind": () => /* binding */ SymbolKind,
46328 /* harmony export */   "SymbolTag": () => /* binding */ SymbolTag,
46329 /* harmony export */   "SymbolInformation": () => /* binding */ SymbolInformation,
46330 /* harmony export */   "DocumentSymbol": () => /* binding */ DocumentSymbol,
46331 /* harmony export */   "CodeActionKind": () => /* binding */ CodeActionKind,
46332 /* harmony export */   "CodeActionContext": () => /* binding */ CodeActionContext,
46333 /* harmony export */   "CodeAction": () => /* binding */ CodeAction,
46334 /* harmony export */   "CodeLens": () => /* binding */ CodeLens,
46335 /* harmony export */   "FormattingOptions": () => /* binding */ FormattingOptions,
46336 /* harmony export */   "DocumentLink": () => /* binding */ DocumentLink,
46337 /* harmony export */   "SelectionRange": () => /* binding */ SelectionRange,
46338 /* harmony export */   "EOL": () => /* binding */ EOL,
46339 /* harmony export */   "TextDocument": () => /* binding */ TextDocument
46340 /* harmony export */ });
46341 /* --------------------------------------------------------------------------------------------
46342  * Copyright (c) Microsoft Corporation. All rights reserved.
46343  * Licensed under the MIT License. See License.txt in the project root for license information.
46344  * ------------------------------------------------------------------------------------------ */
46345
46346 /**
46347  * The Position namespace provides helper functions to work with
46348  * [Position](#Position) literals.
46349  */
46350 var Position;
46351 (function (Position) {
46352     /**
46353      * Creates a new Position literal from the given line and character.
46354      * @param line The position's line.
46355      * @param character The position's character.
46356      */
46357     function create(line, character) {
46358         return { line: line, character: character };
46359     }
46360     Position.create = create;
46361     /**
46362      * Checks whether the given liternal conforms to the [Position](#Position) interface.
46363      */
46364     function is(value) {
46365         var candidate = value;
46366         return Is.objectLiteral(candidate) && Is.number(candidate.line) && Is.number(candidate.character);
46367     }
46368     Position.is = is;
46369 })(Position || (Position = {}));
46370 /**
46371  * The Range namespace provides helper functions to work with
46372  * [Range](#Range) literals.
46373  */
46374 var Range;
46375 (function (Range) {
46376     function create(one, two, three, four) {
46377         if (Is.number(one) && Is.number(two) && Is.number(three) && Is.number(four)) {
46378             return { start: Position.create(one, two), end: Position.create(three, four) };
46379         }
46380         else if (Position.is(one) && Position.is(two)) {
46381             return { start: one, end: two };
46382         }
46383         else {
46384             throw new Error("Range#create called with invalid arguments[" + one + ", " + two + ", " + three + ", " + four + "]");
46385         }
46386     }
46387     Range.create = create;
46388     /**
46389      * Checks whether the given literal conforms to the [Range](#Range) interface.
46390      */
46391     function is(value) {
46392         var candidate = value;
46393         return Is.objectLiteral(candidate) && Position.is(candidate.start) && Position.is(candidate.end);
46394     }
46395     Range.is = is;
46396 })(Range || (Range = {}));
46397 /**
46398  * The Location namespace provides helper functions to work with
46399  * [Location](#Location) literals.
46400  */
46401 var Location;
46402 (function (Location) {
46403     /**
46404      * Creates a Location literal.
46405      * @param uri The location's uri.
46406      * @param range The location's range.
46407      */
46408     function create(uri, range) {
46409         return { uri: uri, range: range };
46410     }
46411     Location.create = create;
46412     /**
46413      * Checks whether the given literal conforms to the [Location](#Location) interface.
46414      */
46415     function is(value) {
46416         var candidate = value;
46417         return Is.defined(candidate) && Range.is(candidate.range) && (Is.string(candidate.uri) || Is.undefined(candidate.uri));
46418     }
46419     Location.is = is;
46420 })(Location || (Location = {}));
46421 /**
46422  * The LocationLink namespace provides helper functions to work with
46423  * [LocationLink](#LocationLink) literals.
46424  */
46425 var LocationLink;
46426 (function (LocationLink) {
46427     /**
46428      * Creates a LocationLink literal.
46429      * @param targetUri The definition's uri.
46430      * @param targetRange The full range of the definition.
46431      * @param targetSelectionRange The span of the symbol definition at the target.
46432      * @param originSelectionRange The span of the symbol being defined in the originating source file.
46433      */
46434     function create(targetUri, targetRange, targetSelectionRange, originSelectionRange) {
46435         return { targetUri: targetUri, targetRange: targetRange, targetSelectionRange: targetSelectionRange, originSelectionRange: originSelectionRange };
46436     }
46437     LocationLink.create = create;
46438     /**
46439      * Checks whether the given literal conforms to the [LocationLink](#LocationLink) interface.
46440      */
46441     function is(value) {
46442         var candidate = value;
46443         return Is.defined(candidate) && Range.is(candidate.targetRange) && Is.string(candidate.targetUri)
46444             && (Range.is(candidate.targetSelectionRange) || Is.undefined(candidate.targetSelectionRange))
46445             && (Range.is(candidate.originSelectionRange) || Is.undefined(candidate.originSelectionRange));
46446     }
46447     LocationLink.is = is;
46448 })(LocationLink || (LocationLink = {}));
46449 /**
46450  * The Color namespace provides helper functions to work with
46451  * [Color](#Color) literals.
46452  */
46453 var Color;
46454 (function (Color) {
46455     /**
46456      * Creates a new Color literal.
46457      */
46458     function create(red, green, blue, alpha) {
46459         return {
46460             red: red,
46461             green: green,
46462             blue: blue,
46463             alpha: alpha,
46464         };
46465     }
46466     Color.create = create;
46467     /**
46468      * Checks whether the given literal conforms to the [Color](#Color) interface.
46469      */
46470     function is(value) {
46471         var candidate = value;
46472         return Is.number(candidate.red)
46473             && Is.number(candidate.green)
46474             && Is.number(candidate.blue)
46475             && Is.number(candidate.alpha);
46476     }
46477     Color.is = is;
46478 })(Color || (Color = {}));
46479 /**
46480  * The ColorInformation namespace provides helper functions to work with
46481  * [ColorInformation](#ColorInformation) literals.
46482  */
46483 var ColorInformation;
46484 (function (ColorInformation) {
46485     /**
46486      * Creates a new ColorInformation literal.
46487      */
46488     function create(range, color) {
46489         return {
46490             range: range,
46491             color: color,
46492         };
46493     }
46494     ColorInformation.create = create;
46495     /**
46496      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
46497      */
46498     function is(value) {
46499         var candidate = value;
46500         return Range.is(candidate.range) && Color.is(candidate.color);
46501     }
46502     ColorInformation.is = is;
46503 })(ColorInformation || (ColorInformation = {}));
46504 /**
46505  * The Color namespace provides helper functions to work with
46506  * [ColorPresentation](#ColorPresentation) literals.
46507  */
46508 var ColorPresentation;
46509 (function (ColorPresentation) {
46510     /**
46511      * Creates a new ColorInformation literal.
46512      */
46513     function create(label, textEdit, additionalTextEdits) {
46514         return {
46515             label: label,
46516             textEdit: textEdit,
46517             additionalTextEdits: additionalTextEdits,
46518         };
46519     }
46520     ColorPresentation.create = create;
46521     /**
46522      * Checks whether the given literal conforms to the [ColorInformation](#ColorInformation) interface.
46523      */
46524     function is(value) {
46525         var candidate = value;
46526         return Is.string(candidate.label)
46527             && (Is.undefined(candidate.textEdit) || TextEdit.is(candidate))
46528             && (Is.undefined(candidate.additionalTextEdits) || Is.typedArray(candidate.additionalTextEdits, TextEdit.is));
46529     }
46530     ColorPresentation.is = is;
46531 })(ColorPresentation || (ColorPresentation = {}));
46532 /**
46533  * Enum of known range kinds
46534  */
46535 var FoldingRangeKind;
46536 (function (FoldingRangeKind) {
46537     /**
46538      * Folding range for a comment
46539      */
46540     FoldingRangeKind["Comment"] = "comment";
46541     /**
46542      * Folding range for a imports or includes
46543      */
46544     FoldingRangeKind["Imports"] = "imports";
46545     /**
46546      * Folding range for a region (e.g. `#region`)
46547      */
46548     FoldingRangeKind["Region"] = "region";
46549 })(FoldingRangeKind || (FoldingRangeKind = {}));
46550 /**
46551  * The folding range namespace provides helper functions to work with
46552  * [FoldingRange](#FoldingRange) literals.
46553  */
46554 var FoldingRange;
46555 (function (FoldingRange) {
46556     /**
46557      * Creates a new FoldingRange literal.
46558      */
46559     function create(startLine, endLine, startCharacter, endCharacter, kind) {
46560         var result = {
46561             startLine: startLine,
46562             endLine: endLine
46563         };
46564         if (Is.defined(startCharacter)) {
46565             result.startCharacter = startCharacter;
46566         }
46567         if (Is.defined(endCharacter)) {
46568             result.endCharacter = endCharacter;
46569         }
46570         if (Is.defined(kind)) {
46571             result.kind = kind;
46572         }
46573         return result;
46574     }
46575     FoldingRange.create = create;
46576     /**
46577      * Checks whether the given literal conforms to the [FoldingRange](#FoldingRange) interface.
46578      */
46579     function is(value) {
46580         var candidate = value;
46581         return Is.number(candidate.startLine) && Is.number(candidate.startLine)
46582             && (Is.undefined(candidate.startCharacter) || Is.number(candidate.startCharacter))
46583             && (Is.undefined(candidate.endCharacter) || Is.number(candidate.endCharacter))
46584             && (Is.undefined(candidate.kind) || Is.string(candidate.kind));
46585     }
46586     FoldingRange.is = is;
46587 })(FoldingRange || (FoldingRange = {}));
46588 /**
46589  * The DiagnosticRelatedInformation namespace provides helper functions to work with
46590  * [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) literals.
46591  */
46592 var DiagnosticRelatedInformation;
46593 (function (DiagnosticRelatedInformation) {
46594     /**
46595      * Creates a new DiagnosticRelatedInformation literal.
46596      */
46597     function create(location, message) {
46598         return {
46599             location: location,
46600             message: message
46601         };
46602     }
46603     DiagnosticRelatedInformation.create = create;
46604     /**
46605      * Checks whether the given literal conforms to the [DiagnosticRelatedInformation](#DiagnosticRelatedInformation) interface.
46606      */
46607     function is(value) {
46608         var candidate = value;
46609         return Is.defined(candidate) && Location.is(candidate.location) && Is.string(candidate.message);
46610     }
46611     DiagnosticRelatedInformation.is = is;
46612 })(DiagnosticRelatedInformation || (DiagnosticRelatedInformation = {}));
46613 /**
46614  * The diagnostic's severity.
46615  */
46616 var DiagnosticSeverity;
46617 (function (DiagnosticSeverity) {
46618     /**
46619      * Reports an error.
46620      */
46621     DiagnosticSeverity.Error = 1;
46622     /**
46623      * Reports a warning.
46624      */
46625     DiagnosticSeverity.Warning = 2;
46626     /**
46627      * Reports an information.
46628      */
46629     DiagnosticSeverity.Information = 3;
46630     /**
46631      * Reports a hint.
46632      */
46633     DiagnosticSeverity.Hint = 4;
46634 })(DiagnosticSeverity || (DiagnosticSeverity = {}));
46635 /**
46636  * The diagnostic tags.
46637  *
46638  * @since 3.15.0
46639  */
46640 var DiagnosticTag;
46641 (function (DiagnosticTag) {
46642     /**
46643      * Unused or unnecessary code.
46644      *
46645      * Clients are allowed to render diagnostics with this tag faded out instead of having
46646      * an error squiggle.
46647      */
46648     DiagnosticTag.Unnecessary = 1;
46649     /**
46650      * Deprecated or obsolete code.
46651      *
46652      * Clients are allowed to rendered diagnostics with this tag strike through.
46653      */
46654     DiagnosticTag.Deprecated = 2;
46655 })(DiagnosticTag || (DiagnosticTag = {}));
46656 /**
46657  * The DiagnosticCode namespace provides functions to deal with complex diagnostic codes.
46658  *
46659  * @since 3.16.0 - Proposed state
46660  */
46661 var DiagnosticCode;
46662 (function (DiagnosticCode) {
46663     /**
46664      * Checks whether the given liternal conforms to the [DiagnosticCode](#DiagnosticCode) interface.
46665      */
46666     function is(value) {
46667         var candidate = value;
46668         return candidate !== undefined && candidate !== null && (Is.number(candidate.value) || Is.string(candidate.value)) && Is.string(candidate.target);
46669     }
46670     DiagnosticCode.is = is;
46671 })(DiagnosticCode || (DiagnosticCode = {}));
46672 /**
46673  * The Diagnostic namespace provides helper functions to work with
46674  * [Diagnostic](#Diagnostic) literals.
46675  */
46676 var Diagnostic;
46677 (function (Diagnostic) {
46678     /**
46679      * Creates a new Diagnostic literal.
46680      */
46681     function create(range, message, severity, code, source, relatedInformation) {
46682         var result = { range: range, message: message };
46683         if (Is.defined(severity)) {
46684             result.severity = severity;
46685         }
46686         if (Is.defined(code)) {
46687             result.code = code;
46688         }
46689         if (Is.defined(source)) {
46690             result.source = source;
46691         }
46692         if (Is.defined(relatedInformation)) {
46693             result.relatedInformation = relatedInformation;
46694         }
46695         return result;
46696     }
46697     Diagnostic.create = create;
46698     /**
46699      * Checks whether the given literal conforms to the [Diagnostic](#Diagnostic) interface.
46700      */
46701     function is(value) {
46702         var candidate = value;
46703         return Is.defined(candidate)
46704             && Range.is(candidate.range)
46705             && Is.string(candidate.message)
46706             && (Is.number(candidate.severity) || Is.undefined(candidate.severity))
46707             && (Is.number(candidate.code) || Is.string(candidate.code) || Is.undefined(candidate.code))
46708             && (Is.string(candidate.source) || Is.undefined(candidate.source))
46709             && (Is.undefined(candidate.relatedInformation) || Is.typedArray(candidate.relatedInformation, DiagnosticRelatedInformation.is));
46710     }
46711     Diagnostic.is = is;
46712 })(Diagnostic || (Diagnostic = {}));
46713 /**
46714  * The Command namespace provides helper functions to work with
46715  * [Command](#Command) literals.
46716  */
46717 var Command;
46718 (function (Command) {
46719     /**
46720      * Creates a new Command literal.
46721      */
46722     function create(title, command) {
46723         var args = [];
46724         for (var _i = 2; _i < arguments.length; _i++) {
46725             args[_i - 2] = arguments[_i];
46726         }
46727         var result = { title: title, command: command };
46728         if (Is.defined(args) && args.length > 0) {
46729             result.arguments = args;
46730         }
46731         return result;
46732     }
46733     Command.create = create;
46734     /**
46735      * Checks whether the given literal conforms to the [Command](#Command) interface.
46736      */
46737     function is(value) {
46738         var candidate = value;
46739         return Is.defined(candidate) && Is.string(candidate.title) && Is.string(candidate.command);
46740     }
46741     Command.is = is;
46742 })(Command || (Command = {}));
46743 /**
46744  * The TextEdit namespace provides helper function to create replace,
46745  * insert and delete edits more easily.
46746  */
46747 var TextEdit;
46748 (function (TextEdit) {
46749     /**
46750      * Creates a replace text edit.
46751      * @param range The range of text to be replaced.
46752      * @param newText The new text.
46753      */
46754     function replace(range, newText) {
46755         return { range: range, newText: newText };
46756     }
46757     TextEdit.replace = replace;
46758     /**
46759      * Creates a insert text edit.
46760      * @param position The position to insert the text at.
46761      * @param newText The text to be inserted.
46762      */
46763     function insert(position, newText) {
46764         return { range: { start: position, end: position }, newText: newText };
46765     }
46766     TextEdit.insert = insert;
46767     /**
46768      * Creates a delete text edit.
46769      * @param range The range of text to be deleted.
46770      */
46771     function del(range) {
46772         return { range: range, newText: '' };
46773     }
46774     TextEdit.del = del;
46775     function is(value) {
46776         var candidate = value;
46777         return Is.objectLiteral(candidate)
46778             && Is.string(candidate.newText)
46779             && Range.is(candidate.range);
46780     }
46781     TextEdit.is = is;
46782 })(TextEdit || (TextEdit = {}));
46783 /**
46784  * The TextDocumentEdit namespace provides helper function to create
46785  * an edit that manipulates a text document.
46786  */
46787 var TextDocumentEdit;
46788 (function (TextDocumentEdit) {
46789     /**
46790      * Creates a new `TextDocumentEdit`
46791      */
46792     function create(textDocument, edits) {
46793         return { textDocument: textDocument, edits: edits };
46794     }
46795     TextDocumentEdit.create = create;
46796     function is(value) {
46797         var candidate = value;
46798         return Is.defined(candidate)
46799             && VersionedTextDocumentIdentifier.is(candidate.textDocument)
46800             && Array.isArray(candidate.edits);
46801     }
46802     TextDocumentEdit.is = is;
46803 })(TextDocumentEdit || (TextDocumentEdit = {}));
46804 var CreateFile;
46805 (function (CreateFile) {
46806     function create(uri, options) {
46807         var result = {
46808             kind: 'create',
46809             uri: uri
46810         };
46811         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
46812             result.options = options;
46813         }
46814         return result;
46815     }
46816     CreateFile.create = create;
46817     function is(value) {
46818         var candidate = value;
46819         return candidate && candidate.kind === 'create' && Is.string(candidate.uri) &&
46820             (candidate.options === void 0 ||
46821                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
46822     }
46823     CreateFile.is = is;
46824 })(CreateFile || (CreateFile = {}));
46825 var RenameFile;
46826 (function (RenameFile) {
46827     function create(oldUri, newUri, options) {
46828         var result = {
46829             kind: 'rename',
46830             oldUri: oldUri,
46831             newUri: newUri
46832         };
46833         if (options !== void 0 && (options.overwrite !== void 0 || options.ignoreIfExists !== void 0)) {
46834             result.options = options;
46835         }
46836         return result;
46837     }
46838     RenameFile.create = create;
46839     function is(value) {
46840         var candidate = value;
46841         return candidate && candidate.kind === 'rename' && Is.string(candidate.oldUri) && Is.string(candidate.newUri) &&
46842             (candidate.options === void 0 ||
46843                 ((candidate.options.overwrite === void 0 || Is.boolean(candidate.options.overwrite)) && (candidate.options.ignoreIfExists === void 0 || Is.boolean(candidate.options.ignoreIfExists))));
46844     }
46845     RenameFile.is = is;
46846 })(RenameFile || (RenameFile = {}));
46847 var DeleteFile;
46848 (function (DeleteFile) {
46849     function create(uri, options) {
46850         var result = {
46851             kind: 'delete',
46852             uri: uri
46853         };
46854         if (options !== void 0 && (options.recursive !== void 0 || options.ignoreIfNotExists !== void 0)) {
46855             result.options = options;
46856         }
46857         return result;
46858     }
46859     DeleteFile.create = create;
46860     function is(value) {
46861         var candidate = value;
46862         return candidate && candidate.kind === 'delete' && Is.string(candidate.uri) &&
46863             (candidate.options === void 0 ||
46864                 ((candidate.options.recursive === void 0 || Is.boolean(candidate.options.recursive)) && (candidate.options.ignoreIfNotExists === void 0 || Is.boolean(candidate.options.ignoreIfNotExists))));
46865     }
46866     DeleteFile.is = is;
46867 })(DeleteFile || (DeleteFile = {}));
46868 var WorkspaceEdit;
46869 (function (WorkspaceEdit) {
46870     function is(value) {
46871         var candidate = value;
46872         return candidate &&
46873             (candidate.changes !== void 0 || candidate.documentChanges !== void 0) &&
46874             (candidate.documentChanges === void 0 || candidate.documentChanges.every(function (change) {
46875                 if (Is.string(change.kind)) {
46876                     return CreateFile.is(change) || RenameFile.is(change) || DeleteFile.is(change);
46877                 }
46878                 else {
46879                     return TextDocumentEdit.is(change);
46880                 }
46881             }));
46882     }
46883     WorkspaceEdit.is = is;
46884 })(WorkspaceEdit || (WorkspaceEdit = {}));
46885 var TextEditChangeImpl = /** @class */ (function () {
46886     function TextEditChangeImpl(edits) {
46887         this.edits = edits;
46888     }
46889     TextEditChangeImpl.prototype.insert = function (position, newText) {
46890         this.edits.push(TextEdit.insert(position, newText));
46891     };
46892     TextEditChangeImpl.prototype.replace = function (range, newText) {
46893         this.edits.push(TextEdit.replace(range, newText));
46894     };
46895     TextEditChangeImpl.prototype.delete = function (range) {
46896         this.edits.push(TextEdit.del(range));
46897     };
46898     TextEditChangeImpl.prototype.add = function (edit) {
46899         this.edits.push(edit);
46900     };
46901     TextEditChangeImpl.prototype.all = function () {
46902         return this.edits;
46903     };
46904     TextEditChangeImpl.prototype.clear = function () {
46905         this.edits.splice(0, this.edits.length);
46906     };
46907     return TextEditChangeImpl;
46908 }());
46909 /**
46910  * A workspace change helps constructing changes to a workspace.
46911  */
46912 var WorkspaceChange = /** @class */ (function () {
46913     function WorkspaceChange(workspaceEdit) {
46914         var _this = this;
46915         this._textEditChanges = Object.create(null);
46916         if (workspaceEdit) {
46917             this._workspaceEdit = workspaceEdit;
46918             if (workspaceEdit.documentChanges) {
46919                 workspaceEdit.documentChanges.forEach(function (change) {
46920                     if (TextDocumentEdit.is(change)) {
46921                         var textEditChange = new TextEditChangeImpl(change.edits);
46922                         _this._textEditChanges[change.textDocument.uri] = textEditChange;
46923                     }
46924                 });
46925             }
46926             else if (workspaceEdit.changes) {
46927                 Object.keys(workspaceEdit.changes).forEach(function (key) {
46928                     var textEditChange = new TextEditChangeImpl(workspaceEdit.changes[key]);
46929                     _this._textEditChanges[key] = textEditChange;
46930                 });
46931             }
46932         }
46933     }
46934     Object.defineProperty(WorkspaceChange.prototype, "edit", {
46935         /**
46936          * Returns the underlying [WorkspaceEdit](#WorkspaceEdit) literal
46937          * use to be returned from a workspace edit operation like rename.
46938          */
46939         get: function () {
46940             if (this._workspaceEdit === undefined) {
46941                 return { documentChanges: [] };
46942             }
46943             return this._workspaceEdit;
46944         },
46945         enumerable: true,
46946         configurable: true
46947     });
46948     WorkspaceChange.prototype.getTextEditChange = function (key) {
46949         if (VersionedTextDocumentIdentifier.is(key)) {
46950             if (!this._workspaceEdit) {
46951                 this._workspaceEdit = {
46952                     documentChanges: []
46953                 };
46954             }
46955             if (!this._workspaceEdit.documentChanges) {
46956                 throw new Error('Workspace edit is not configured for document changes.');
46957             }
46958             var textDocument = key;
46959             var result = this._textEditChanges[textDocument.uri];
46960             if (!result) {
46961                 var edits = [];
46962                 var textDocumentEdit = {
46963                     textDocument: textDocument,
46964                     edits: edits
46965                 };
46966                 this._workspaceEdit.documentChanges.push(textDocumentEdit);
46967                 result = new TextEditChangeImpl(edits);
46968                 this._textEditChanges[textDocument.uri] = result;
46969             }
46970             return result;
46971         }
46972         else {
46973             if (!this._workspaceEdit) {
46974                 this._workspaceEdit = {
46975                     changes: Object.create(null)
46976                 };
46977             }
46978             if (!this._workspaceEdit.changes) {
46979                 throw new Error('Workspace edit is not configured for normal text edit changes.');
46980             }
46981             var result = this._textEditChanges[key];
46982             if (!result) {
46983                 var edits = [];
46984                 this._workspaceEdit.changes[key] = edits;
46985                 result = new TextEditChangeImpl(edits);
46986                 this._textEditChanges[key] = result;
46987             }
46988             return result;
46989         }
46990     };
46991     WorkspaceChange.prototype.createFile = function (uri, options) {
46992         this.checkDocumentChanges();
46993         this._workspaceEdit.documentChanges.push(CreateFile.create(uri, options));
46994     };
46995     WorkspaceChange.prototype.renameFile = function (oldUri, newUri, options) {
46996         this.checkDocumentChanges();
46997         this._workspaceEdit.documentChanges.push(RenameFile.create(oldUri, newUri, options));
46998     };
46999     WorkspaceChange.prototype.deleteFile = function (uri, options) {
47000         this.checkDocumentChanges();
47001         this._workspaceEdit.documentChanges.push(DeleteFile.create(uri, options));
47002     };
47003     WorkspaceChange.prototype.checkDocumentChanges = function () {
47004         if (!this._workspaceEdit || !this._workspaceEdit.documentChanges) {
47005             throw new Error('Workspace edit is not configured for document changes.');
47006         }
47007     };
47008     return WorkspaceChange;
47009 }());
47010
47011 /**
47012  * The TextDocumentIdentifier namespace provides helper functions to work with
47013  * [TextDocumentIdentifier](#TextDocumentIdentifier) literals.
47014  */
47015 var TextDocumentIdentifier;
47016 (function (TextDocumentIdentifier) {
47017     /**
47018      * Creates a new TextDocumentIdentifier literal.
47019      * @param uri The document's uri.
47020      */
47021     function create(uri) {
47022         return { uri: uri };
47023     }
47024     TextDocumentIdentifier.create = create;
47025     /**
47026      * Checks whether the given literal conforms to the [TextDocumentIdentifier](#TextDocumentIdentifier) interface.
47027      */
47028     function is(value) {
47029         var candidate = value;
47030         return Is.defined(candidate) && Is.string(candidate.uri);
47031     }
47032     TextDocumentIdentifier.is = is;
47033 })(TextDocumentIdentifier || (TextDocumentIdentifier = {}));
47034 /**
47035  * The VersionedTextDocumentIdentifier namespace provides helper functions to work with
47036  * [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) literals.
47037  */
47038 var VersionedTextDocumentIdentifier;
47039 (function (VersionedTextDocumentIdentifier) {
47040     /**
47041      * Creates a new VersionedTextDocumentIdentifier literal.
47042      * @param uri The document's uri.
47043      * @param uri The document's text.
47044      */
47045     function create(uri, version) {
47046         return { uri: uri, version: version };
47047     }
47048     VersionedTextDocumentIdentifier.create = create;
47049     /**
47050      * Checks whether the given literal conforms to the [VersionedTextDocumentIdentifier](#VersionedTextDocumentIdentifier) interface.
47051      */
47052     function is(value) {
47053         var candidate = value;
47054         return Is.defined(candidate) && Is.string(candidate.uri) && (candidate.version === null || Is.number(candidate.version));
47055     }
47056     VersionedTextDocumentIdentifier.is = is;
47057 })(VersionedTextDocumentIdentifier || (VersionedTextDocumentIdentifier = {}));
47058 /**
47059  * The TextDocumentItem namespace provides helper functions to work with
47060  * [TextDocumentItem](#TextDocumentItem) literals.
47061  */
47062 var TextDocumentItem;
47063 (function (TextDocumentItem) {
47064     /**
47065      * Creates a new TextDocumentItem literal.
47066      * @param uri The document's uri.
47067      * @param languageId The document's language identifier.
47068      * @param version The document's version number.
47069      * @param text The document's text.
47070      */
47071     function create(uri, languageId, version, text) {
47072         return { uri: uri, languageId: languageId, version: version, text: text };
47073     }
47074     TextDocumentItem.create = create;
47075     /**
47076      * Checks whether the given literal conforms to the [TextDocumentItem](#TextDocumentItem) interface.
47077      */
47078     function is(value) {
47079         var candidate = value;
47080         return Is.defined(candidate) && Is.string(candidate.uri) && Is.string(candidate.languageId) && Is.number(candidate.version) && Is.string(candidate.text);
47081     }
47082     TextDocumentItem.is = is;
47083 })(TextDocumentItem || (TextDocumentItem = {}));
47084 /**
47085  * Describes the content type that a client supports in various
47086  * result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
47087  *
47088  * Please note that `MarkupKinds` must not start with a `$`. This kinds
47089  * are reserved for internal usage.
47090  */
47091 var MarkupKind;
47092 (function (MarkupKind) {
47093     /**
47094      * Plain text is supported as a content format
47095      */
47096     MarkupKind.PlainText = 'plaintext';
47097     /**
47098      * Markdown is supported as a content format
47099      */
47100     MarkupKind.Markdown = 'markdown';
47101 })(MarkupKind || (MarkupKind = {}));
47102 (function (MarkupKind) {
47103     /**
47104      * Checks whether the given value is a value of the [MarkupKind](#MarkupKind) type.
47105      */
47106     function is(value) {
47107         var candidate = value;
47108         return candidate === MarkupKind.PlainText || candidate === MarkupKind.Markdown;
47109     }
47110     MarkupKind.is = is;
47111 })(MarkupKind || (MarkupKind = {}));
47112 var MarkupContent;
47113 (function (MarkupContent) {
47114     /**
47115      * Checks whether the given value conforms to the [MarkupContent](#MarkupContent) interface.
47116      */
47117     function is(value) {
47118         var candidate = value;
47119         return Is.objectLiteral(value) && MarkupKind.is(candidate.kind) && Is.string(candidate.value);
47120     }
47121     MarkupContent.is = is;
47122 })(MarkupContent || (MarkupContent = {}));
47123 /**
47124  * The kind of a completion entry.
47125  */
47126 var CompletionItemKind;
47127 (function (CompletionItemKind) {
47128     CompletionItemKind.Text = 1;
47129     CompletionItemKind.Method = 2;
47130     CompletionItemKind.Function = 3;
47131     CompletionItemKind.Constructor = 4;
47132     CompletionItemKind.Field = 5;
47133     CompletionItemKind.Variable = 6;
47134     CompletionItemKind.Class = 7;
47135     CompletionItemKind.Interface = 8;
47136     CompletionItemKind.Module = 9;
47137     CompletionItemKind.Property = 10;
47138     CompletionItemKind.Unit = 11;
47139     CompletionItemKind.Value = 12;
47140     CompletionItemKind.Enum = 13;
47141     CompletionItemKind.Keyword = 14;
47142     CompletionItemKind.Snippet = 15;
47143     CompletionItemKind.Color = 16;
47144     CompletionItemKind.File = 17;
47145     CompletionItemKind.Reference = 18;
47146     CompletionItemKind.Folder = 19;
47147     CompletionItemKind.EnumMember = 20;
47148     CompletionItemKind.Constant = 21;
47149     CompletionItemKind.Struct = 22;
47150     CompletionItemKind.Event = 23;
47151     CompletionItemKind.Operator = 24;
47152     CompletionItemKind.TypeParameter = 25;
47153 })(CompletionItemKind || (CompletionItemKind = {}));
47154 /**
47155  * Defines whether the insert text in a completion item should be interpreted as
47156  * plain text or a snippet.
47157  */
47158 var InsertTextFormat;
47159 (function (InsertTextFormat) {
47160     /**
47161      * The primary text to be inserted is treated as a plain string.
47162      */
47163     InsertTextFormat.PlainText = 1;
47164     /**
47165      * The primary text to be inserted is treated as a snippet.
47166      *
47167      * A snippet can define tab stops and placeholders with `$1`, `$2`
47168      * and `${3:foo}`. `$0` defines the final tab stop, it defaults to
47169      * the end of the snippet. Placeholders with equal identifiers are linked,
47170      * that is typing in one will update others too.
47171      *
47172      * See also: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#snippet_syntax
47173      */
47174     InsertTextFormat.Snippet = 2;
47175 })(InsertTextFormat || (InsertTextFormat = {}));
47176 /**
47177  * Completion item tags are extra annotations that tweak the rendering of a completion
47178  * item.
47179  *
47180  * @since 3.15.0
47181  */
47182 var CompletionItemTag;
47183 (function (CompletionItemTag) {
47184     /**
47185      * Render a completion as obsolete, usually using a strike-out.
47186      */
47187     CompletionItemTag.Deprecated = 1;
47188 })(CompletionItemTag || (CompletionItemTag = {}));
47189 /**
47190  * The InsertReplaceEdit namespace provides functions to deal with insert / replace edits.
47191  *
47192  * @since 3.16.0 - Proposed state
47193  */
47194 var InsertReplaceEdit;
47195 (function (InsertReplaceEdit) {
47196     /**
47197      * Creates a new insert / replace edit
47198      */
47199     function create(newText, insert, replace) {
47200         return { newText: newText, insert: insert, replace: replace };
47201     }
47202     InsertReplaceEdit.create = create;
47203     /**
47204      * Checks whether the given liternal conforms to the [InsertReplaceEdit](#InsertReplaceEdit) interface.
47205      */
47206     function is(value) {
47207         var candidate = value;
47208         return candidate && Is.string(candidate.newText) && Range.is(candidate.insert) && Range.is(candidate.replace);
47209     }
47210     InsertReplaceEdit.is = is;
47211 })(InsertReplaceEdit || (InsertReplaceEdit = {}));
47212 /**
47213  * The CompletionItem namespace provides functions to deal with
47214  * completion items.
47215  */
47216 var CompletionItem;
47217 (function (CompletionItem) {
47218     /**
47219      * Create a completion item and seed it with a label.
47220      * @param label The completion item's label
47221      */
47222     function create(label) {
47223         return { label: label };
47224     }
47225     CompletionItem.create = create;
47226 })(CompletionItem || (CompletionItem = {}));
47227 /**
47228  * The CompletionList namespace provides functions to deal with
47229  * completion lists.
47230  */
47231 var CompletionList;
47232 (function (CompletionList) {
47233     /**
47234      * Creates a new completion list.
47235      *
47236      * @param items The completion items.
47237      * @param isIncomplete The list is not complete.
47238      */
47239     function create(items, isIncomplete) {
47240         return { items: items ? items : [], isIncomplete: !!isIncomplete };
47241     }
47242     CompletionList.create = create;
47243 })(CompletionList || (CompletionList = {}));
47244 var MarkedString;
47245 (function (MarkedString) {
47246     /**
47247      * Creates a marked string from plain text.
47248      *
47249      * @param plainText The plain text.
47250      */
47251     function fromPlainText(plainText) {
47252         return plainText.replace(/[\\`*_{}[\]()#+\-.!]/g, '\\$&'); // escape markdown syntax tokens: http://daringfireball.net/projects/markdown/syntax#backslash
47253     }
47254     MarkedString.fromPlainText = fromPlainText;
47255     /**
47256      * Checks whether the given value conforms to the [MarkedString](#MarkedString) type.
47257      */
47258     function is(value) {
47259         var candidate = value;
47260         return Is.string(candidate) || (Is.objectLiteral(candidate) && Is.string(candidate.language) && Is.string(candidate.value));
47261     }
47262     MarkedString.is = is;
47263 })(MarkedString || (MarkedString = {}));
47264 var Hover;
47265 (function (Hover) {
47266     /**
47267      * Checks whether the given value conforms to the [Hover](#Hover) interface.
47268      */
47269     function is(value) {
47270         var candidate = value;
47271         return !!candidate && Is.objectLiteral(candidate) && (MarkupContent.is(candidate.contents) ||
47272             MarkedString.is(candidate.contents) ||
47273             Is.typedArray(candidate.contents, MarkedString.is)) && (value.range === void 0 || Range.is(value.range));
47274     }
47275     Hover.is = is;
47276 })(Hover || (Hover = {}));
47277 /**
47278  * The ParameterInformation namespace provides helper functions to work with
47279  * [ParameterInformation](#ParameterInformation) literals.
47280  */
47281 var ParameterInformation;
47282 (function (ParameterInformation) {
47283     /**
47284      * Creates a new parameter information literal.
47285      *
47286      * @param label A label string.
47287      * @param documentation A doc string.
47288      */
47289     function create(label, documentation) {
47290         return documentation ? { label: label, documentation: documentation } : { label: label };
47291     }
47292     ParameterInformation.create = create;
47293 })(ParameterInformation || (ParameterInformation = {}));
47294 /**
47295  * The SignatureInformation namespace provides helper functions to work with
47296  * [SignatureInformation](#SignatureInformation) literals.
47297  */
47298 var SignatureInformation;
47299 (function (SignatureInformation) {
47300     function create(label, documentation) {
47301         var parameters = [];
47302         for (var _i = 2; _i < arguments.length; _i++) {
47303             parameters[_i - 2] = arguments[_i];
47304         }
47305         var result = { label: label };
47306         if (Is.defined(documentation)) {
47307             result.documentation = documentation;
47308         }
47309         if (Is.defined(parameters)) {
47310             result.parameters = parameters;
47311         }
47312         else {
47313             result.parameters = [];
47314         }
47315         return result;
47316     }
47317     SignatureInformation.create = create;
47318 })(SignatureInformation || (SignatureInformation = {}));
47319 /**
47320  * A document highlight kind.
47321  */
47322 var DocumentHighlightKind;
47323 (function (DocumentHighlightKind) {
47324     /**
47325      * A textual occurrence.
47326      */
47327     DocumentHighlightKind.Text = 1;
47328     /**
47329      * Read-access of a symbol, like reading a variable.
47330      */
47331     DocumentHighlightKind.Read = 2;
47332     /**
47333      * Write-access of a symbol, like writing to a variable.
47334      */
47335     DocumentHighlightKind.Write = 3;
47336 })(DocumentHighlightKind || (DocumentHighlightKind = {}));
47337 /**
47338  * DocumentHighlight namespace to provide helper functions to work with
47339  * [DocumentHighlight](#DocumentHighlight) literals.
47340  */
47341 var DocumentHighlight;
47342 (function (DocumentHighlight) {
47343     /**
47344      * Create a DocumentHighlight object.
47345      * @param range The range the highlight applies to.
47346      */
47347     function create(range, kind) {
47348         var result = { range: range };
47349         if (Is.number(kind)) {
47350             result.kind = kind;
47351         }
47352         return result;
47353     }
47354     DocumentHighlight.create = create;
47355 })(DocumentHighlight || (DocumentHighlight = {}));
47356 /**
47357  * A symbol kind.
47358  */
47359 var SymbolKind;
47360 (function (SymbolKind) {
47361     SymbolKind.File = 1;
47362     SymbolKind.Module = 2;
47363     SymbolKind.Namespace = 3;
47364     SymbolKind.Package = 4;
47365     SymbolKind.Class = 5;
47366     SymbolKind.Method = 6;
47367     SymbolKind.Property = 7;
47368     SymbolKind.Field = 8;
47369     SymbolKind.Constructor = 9;
47370     SymbolKind.Enum = 10;
47371     SymbolKind.Interface = 11;
47372     SymbolKind.Function = 12;
47373     SymbolKind.Variable = 13;
47374     SymbolKind.Constant = 14;
47375     SymbolKind.String = 15;
47376     SymbolKind.Number = 16;
47377     SymbolKind.Boolean = 17;
47378     SymbolKind.Array = 18;
47379     SymbolKind.Object = 19;
47380     SymbolKind.Key = 20;
47381     SymbolKind.Null = 21;
47382     SymbolKind.EnumMember = 22;
47383     SymbolKind.Struct = 23;
47384     SymbolKind.Event = 24;
47385     SymbolKind.Operator = 25;
47386     SymbolKind.TypeParameter = 26;
47387 })(SymbolKind || (SymbolKind = {}));
47388 /**
47389  * Symbol tags are extra annotations that tweak the rendering of a symbol.
47390  * @since 3.15
47391  */
47392 var SymbolTag;
47393 (function (SymbolTag) {
47394     /**
47395      * Render a symbol as obsolete, usually using a strike-out.
47396      */
47397     SymbolTag.Deprecated = 1;
47398 })(SymbolTag || (SymbolTag = {}));
47399 var SymbolInformation;
47400 (function (SymbolInformation) {
47401     /**
47402      * Creates a new symbol information literal.
47403      *
47404      * @param name The name of the symbol.
47405      * @param kind The kind of the symbol.
47406      * @param range The range of the location of the symbol.
47407      * @param uri The resource of the location of symbol, defaults to the current document.
47408      * @param containerName The name of the symbol containing the symbol.
47409      */
47410     function create(name, kind, range, uri, containerName) {
47411         var result = {
47412             name: name,
47413             kind: kind,
47414             location: { uri: uri, range: range }
47415         };
47416         if (containerName) {
47417             result.containerName = containerName;
47418         }
47419         return result;
47420     }
47421     SymbolInformation.create = create;
47422 })(SymbolInformation || (SymbolInformation = {}));
47423 var DocumentSymbol;
47424 (function (DocumentSymbol) {
47425     /**
47426      * Creates a new symbol information literal.
47427      *
47428      * @param name The name of the symbol.
47429      * @param detail The detail of the symbol.
47430      * @param kind The kind of the symbol.
47431      * @param range The range of the symbol.
47432      * @param selectionRange The selectionRange of the symbol.
47433      * @param children Children of the symbol.
47434      */
47435     function create(name, detail, kind, range, selectionRange, children) {
47436         var result = {
47437             name: name,
47438             detail: detail,
47439             kind: kind,
47440             range: range,
47441             selectionRange: selectionRange
47442         };
47443         if (children !== void 0) {
47444             result.children = children;
47445         }
47446         return result;
47447     }
47448     DocumentSymbol.create = create;
47449     /**
47450      * Checks whether the given literal conforms to the [DocumentSymbol](#DocumentSymbol) interface.
47451      */
47452     function is(value) {
47453         var candidate = value;
47454         return candidate &&
47455             Is.string(candidate.name) && Is.number(candidate.kind) &&
47456             Range.is(candidate.range) && Range.is(candidate.selectionRange) &&
47457             (candidate.detail === void 0 || Is.string(candidate.detail)) &&
47458             (candidate.deprecated === void 0 || Is.boolean(candidate.deprecated)) &&
47459             (candidate.children === void 0 || Array.isArray(candidate.children)) &&
47460             (candidate.tags === void 0 || Array.isArray(candidate.tags));
47461     }
47462     DocumentSymbol.is = is;
47463 })(DocumentSymbol || (DocumentSymbol = {}));
47464 /**
47465  * A set of predefined code action kinds
47466  */
47467 var CodeActionKind;
47468 (function (CodeActionKind) {
47469     /**
47470      * Empty kind.
47471      */
47472     CodeActionKind.Empty = '';
47473     /**
47474      * Base kind for quickfix actions: 'quickfix'
47475      */
47476     CodeActionKind.QuickFix = 'quickfix';
47477     /**
47478      * Base kind for refactoring actions: 'refactor'
47479      */
47480     CodeActionKind.Refactor = 'refactor';
47481     /**
47482      * Base kind for refactoring extraction actions: 'refactor.extract'
47483      *
47484      * Example extract actions:
47485      *
47486      * - Extract method
47487      * - Extract function
47488      * - Extract variable
47489      * - Extract interface from class
47490      * - ...
47491      */
47492     CodeActionKind.RefactorExtract = 'refactor.extract';
47493     /**
47494      * Base kind for refactoring inline actions: 'refactor.inline'
47495      *
47496      * Example inline actions:
47497      *
47498      * - Inline function
47499      * - Inline variable
47500      * - Inline constant
47501      * - ...
47502      */
47503     CodeActionKind.RefactorInline = 'refactor.inline';
47504     /**
47505      * Base kind for refactoring rewrite actions: 'refactor.rewrite'
47506      *
47507      * Example rewrite actions:
47508      *
47509      * - Convert JavaScript function to class
47510      * - Add or remove parameter
47511      * - Encapsulate field
47512      * - Make method static
47513      * - Move method to base class
47514      * - ...
47515      */
47516     CodeActionKind.RefactorRewrite = 'refactor.rewrite';
47517     /**
47518      * Base kind for source actions: `source`
47519      *
47520      * Source code actions apply to the entire file.
47521      */
47522     CodeActionKind.Source = 'source';
47523     /**
47524      * Base kind for an organize imports source action: `source.organizeImports`
47525      */
47526     CodeActionKind.SourceOrganizeImports = 'source.organizeImports';
47527     /**
47528      * Base kind for auto-fix source actions: `source.fixAll`.
47529      *
47530      * Fix all actions automatically fix errors that have a clear fix that do not require user input.
47531      * They should not suppress errors or perform unsafe fixes such as generating new types or classes.
47532      *
47533      * @since 3.15.0
47534      */
47535     CodeActionKind.SourceFixAll = 'source.fixAll';
47536 })(CodeActionKind || (CodeActionKind = {}));
47537 /**
47538  * The CodeActionContext namespace provides helper functions to work with
47539  * [CodeActionContext](#CodeActionContext) literals.
47540  */
47541 var CodeActionContext;
47542 (function (CodeActionContext) {
47543     /**
47544      * Creates a new CodeActionContext literal.
47545      */
47546     function create(diagnostics, only) {
47547         var result = { diagnostics: diagnostics };
47548         if (only !== void 0 && only !== null) {
47549             result.only = only;
47550         }
47551         return result;
47552     }
47553     CodeActionContext.create = create;
47554     /**
47555      * Checks whether the given literal conforms to the [CodeActionContext](#CodeActionContext) interface.
47556      */
47557     function is(value) {
47558         var candidate = value;
47559         return Is.defined(candidate) && Is.typedArray(candidate.diagnostics, Diagnostic.is) && (candidate.only === void 0 || Is.typedArray(candidate.only, Is.string));
47560     }
47561     CodeActionContext.is = is;
47562 })(CodeActionContext || (CodeActionContext = {}));
47563 var CodeAction;
47564 (function (CodeAction) {
47565     function create(title, commandOrEdit, kind) {
47566         var result = { title: title };
47567         if (Command.is(commandOrEdit)) {
47568             result.command = commandOrEdit;
47569         }
47570         else {
47571             result.edit = commandOrEdit;
47572         }
47573         if (kind !== void 0) {
47574             result.kind = kind;
47575         }
47576         return result;
47577     }
47578     CodeAction.create = create;
47579     function is(value) {
47580         var candidate = value;
47581         return candidate && Is.string(candidate.title) &&
47582             (candidate.diagnostics === void 0 || Is.typedArray(candidate.diagnostics, Diagnostic.is)) &&
47583             (candidate.kind === void 0 || Is.string(candidate.kind)) &&
47584             (candidate.edit !== void 0 || candidate.command !== void 0) &&
47585             (candidate.command === void 0 || Command.is(candidate.command)) &&
47586             (candidate.isPreferred === void 0 || Is.boolean(candidate.isPreferred)) &&
47587             (candidate.edit === void 0 || WorkspaceEdit.is(candidate.edit));
47588     }
47589     CodeAction.is = is;
47590 })(CodeAction || (CodeAction = {}));
47591 /**
47592  * The CodeLens namespace provides helper functions to work with
47593  * [CodeLens](#CodeLens) literals.
47594  */
47595 var CodeLens;
47596 (function (CodeLens) {
47597     /**
47598      * Creates a new CodeLens literal.
47599      */
47600     function create(range, data) {
47601         var result = { range: range };
47602         if (Is.defined(data)) {
47603             result.data = data;
47604         }
47605         return result;
47606     }
47607     CodeLens.create = create;
47608     /**
47609      * Checks whether the given literal conforms to the [CodeLens](#CodeLens) interface.
47610      */
47611     function is(value) {
47612         var candidate = value;
47613         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.command) || Command.is(candidate.command));
47614     }
47615     CodeLens.is = is;
47616 })(CodeLens || (CodeLens = {}));
47617 /**
47618  * The FormattingOptions namespace provides helper functions to work with
47619  * [FormattingOptions](#FormattingOptions) literals.
47620  */
47621 var FormattingOptions;
47622 (function (FormattingOptions) {
47623     /**
47624      * Creates a new FormattingOptions literal.
47625      */
47626     function create(tabSize, insertSpaces) {
47627         return { tabSize: tabSize, insertSpaces: insertSpaces };
47628     }
47629     FormattingOptions.create = create;
47630     /**
47631      * Checks whether the given literal conforms to the [FormattingOptions](#FormattingOptions) interface.
47632      */
47633     function is(value) {
47634         var candidate = value;
47635         return Is.defined(candidate) && Is.number(candidate.tabSize) && Is.boolean(candidate.insertSpaces);
47636     }
47637     FormattingOptions.is = is;
47638 })(FormattingOptions || (FormattingOptions = {}));
47639 /**
47640  * The DocumentLink namespace provides helper functions to work with
47641  * [DocumentLink](#DocumentLink) literals.
47642  */
47643 var DocumentLink;
47644 (function (DocumentLink) {
47645     /**
47646      * Creates a new DocumentLink literal.
47647      */
47648     function create(range, target, data) {
47649         return { range: range, target: target, data: data };
47650     }
47651     DocumentLink.create = create;
47652     /**
47653      * Checks whether the given literal conforms to the [DocumentLink](#DocumentLink) interface.
47654      */
47655     function is(value) {
47656         var candidate = value;
47657         return Is.defined(candidate) && Range.is(candidate.range) && (Is.undefined(candidate.target) || Is.string(candidate.target));
47658     }
47659     DocumentLink.is = is;
47660 })(DocumentLink || (DocumentLink = {}));
47661 /**
47662  * The SelectionRange namespace provides helper function to work with
47663  * SelectionRange literals.
47664  */
47665 var SelectionRange;
47666 (function (SelectionRange) {
47667     /**
47668      * Creates a new SelectionRange
47669      * @param range the range.
47670      * @param parent an optional parent.
47671      */
47672     function create(range, parent) {
47673         return { range: range, parent: parent };
47674     }
47675     SelectionRange.create = create;
47676     function is(value) {
47677         var candidate = value;
47678         return candidate !== undefined && Range.is(candidate.range) && (candidate.parent === undefined || SelectionRange.is(candidate.parent));
47679     }
47680     SelectionRange.is = is;
47681 })(SelectionRange || (SelectionRange = {}));
47682 var EOL = ['\n', '\r\n', '\r'];
47683 /**
47684  * @deprecated Use the text document from the new vscode-languageserver-textdocument package.
47685  */
47686 var TextDocument;
47687 (function (TextDocument) {
47688     /**
47689      * Creates a new ITextDocument literal from the given uri and content.
47690      * @param uri The document's uri.
47691      * @param languageId  The document's language Id.
47692      * @param content The document's content.
47693      */
47694     function create(uri, languageId, version, content) {
47695         return new FullTextDocument(uri, languageId, version, content);
47696     }
47697     TextDocument.create = create;
47698     /**
47699      * Checks whether the given literal conforms to the [ITextDocument](#ITextDocument) interface.
47700      */
47701     function is(value) {
47702         var candidate = value;
47703         return Is.defined(candidate) && Is.string(candidate.uri) && (Is.undefined(candidate.languageId) || Is.string(candidate.languageId)) && Is.number(candidate.lineCount)
47704             && Is.func(candidate.getText) && Is.func(candidate.positionAt) && Is.func(candidate.offsetAt) ? true : false;
47705     }
47706     TextDocument.is = is;
47707     function applyEdits(document, edits) {
47708         var text = document.getText();
47709         var sortedEdits = mergeSort(edits, function (a, b) {
47710             var diff = a.range.start.line - b.range.start.line;
47711             if (diff === 0) {
47712                 return a.range.start.character - b.range.start.character;
47713             }
47714             return diff;
47715         });
47716         var lastModifiedOffset = text.length;
47717         for (var i = sortedEdits.length - 1; i >= 0; i--) {
47718             var e = sortedEdits[i];
47719             var startOffset = document.offsetAt(e.range.start);
47720             var endOffset = document.offsetAt(e.range.end);
47721             if (endOffset <= lastModifiedOffset) {
47722                 text = text.substring(0, startOffset) + e.newText + text.substring(endOffset, text.length);
47723             }
47724             else {
47725                 throw new Error('Overlapping edit');
47726             }
47727             lastModifiedOffset = startOffset;
47728         }
47729         return text;
47730     }
47731     TextDocument.applyEdits = applyEdits;
47732     function mergeSort(data, compare) {
47733         if (data.length <= 1) {
47734             // sorted
47735             return data;
47736         }
47737         var p = (data.length / 2) | 0;
47738         var left = data.slice(0, p);
47739         var right = data.slice(p);
47740         mergeSort(left, compare);
47741         mergeSort(right, compare);
47742         var leftIdx = 0;
47743         var rightIdx = 0;
47744         var i = 0;
47745         while (leftIdx < left.length && rightIdx < right.length) {
47746             var ret = compare(left[leftIdx], right[rightIdx]);
47747             if (ret <= 0) {
47748                 // smaller_equal -> take left to preserve order
47749                 data[i++] = left[leftIdx++];
47750             }
47751             else {
47752                 // greater -> take right
47753                 data[i++] = right[rightIdx++];
47754             }
47755         }
47756         while (leftIdx < left.length) {
47757             data[i++] = left[leftIdx++];
47758         }
47759         while (rightIdx < right.length) {
47760             data[i++] = right[rightIdx++];
47761         }
47762         return data;
47763     }
47764 })(TextDocument || (TextDocument = {}));
47765 var FullTextDocument = /** @class */ (function () {
47766     function FullTextDocument(uri, languageId, version, content) {
47767         this._uri = uri;
47768         this._languageId = languageId;
47769         this._version = version;
47770         this._content = content;
47771         this._lineOffsets = undefined;
47772     }
47773     Object.defineProperty(FullTextDocument.prototype, "uri", {
47774         get: function () {
47775             return this._uri;
47776         },
47777         enumerable: true,
47778         configurable: true
47779     });
47780     Object.defineProperty(FullTextDocument.prototype, "languageId", {
47781         get: function () {
47782             return this._languageId;
47783         },
47784         enumerable: true,
47785         configurable: true
47786     });
47787     Object.defineProperty(FullTextDocument.prototype, "version", {
47788         get: function () {
47789             return this._version;
47790         },
47791         enumerable: true,
47792         configurable: true
47793     });
47794     FullTextDocument.prototype.getText = function (range) {
47795         if (range) {
47796             var start = this.offsetAt(range.start);
47797             var end = this.offsetAt(range.end);
47798             return this._content.substring(start, end);
47799         }
47800         return this._content;
47801     };
47802     FullTextDocument.prototype.update = function (event, version) {
47803         this._content = event.text;
47804         this._version = version;
47805         this._lineOffsets = undefined;
47806     };
47807     FullTextDocument.prototype.getLineOffsets = function () {
47808         if (this._lineOffsets === undefined) {
47809             var lineOffsets = [];
47810             var text = this._content;
47811             var isLineStart = true;
47812             for (var i = 0; i < text.length; i++) {
47813                 if (isLineStart) {
47814                     lineOffsets.push(i);
47815                     isLineStart = false;
47816                 }
47817                 var ch = text.charAt(i);
47818                 isLineStart = (ch === '\r' || ch === '\n');
47819                 if (ch === '\r' && i + 1 < text.length && text.charAt(i + 1) === '\n') {
47820                     i++;
47821                 }
47822             }
47823             if (isLineStart && text.length > 0) {
47824                 lineOffsets.push(text.length);
47825             }
47826             this._lineOffsets = lineOffsets;
47827         }
47828         return this._lineOffsets;
47829     };
47830     FullTextDocument.prototype.positionAt = function (offset) {
47831         offset = Math.max(Math.min(offset, this._content.length), 0);
47832         var lineOffsets = this.getLineOffsets();
47833         var low = 0, high = lineOffsets.length;
47834         if (high === 0) {
47835             return Position.create(0, offset);
47836         }
47837         while (low < high) {
47838             var mid = Math.floor((low + high) / 2);
47839             if (lineOffsets[mid] > offset) {
47840                 high = mid;
47841             }
47842             else {
47843                 low = mid + 1;
47844             }
47845         }
47846         // low is the least x for which the line offset is larger than the current offset
47847         // or array.length if no line offset is larger than the current offset
47848         var line = low - 1;
47849         return Position.create(line, offset - lineOffsets[line]);
47850     };
47851     FullTextDocument.prototype.offsetAt = function (position) {
47852         var lineOffsets = this.getLineOffsets();
47853         if (position.line >= lineOffsets.length) {
47854             return this._content.length;
47855         }
47856         else if (position.line < 0) {
47857             return 0;
47858         }
47859         var lineOffset = lineOffsets[position.line];
47860         var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
47861         return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
47862     };
47863     Object.defineProperty(FullTextDocument.prototype, "lineCount", {
47864         get: function () {
47865             return this.getLineOffsets().length;
47866         },
47867         enumerable: true,
47868         configurable: true
47869     });
47870     return FullTextDocument;
47871 }());
47872 var Is;
47873 (function (Is) {
47874     var toString = Object.prototype.toString;
47875     function defined(value) {
47876         return typeof value !== 'undefined';
47877     }
47878     Is.defined = defined;
47879     function undefined(value) {
47880         return typeof value === 'undefined';
47881     }
47882     Is.undefined = undefined;
47883     function boolean(value) {
47884         return value === true || value === false;
47885     }
47886     Is.boolean = boolean;
47887     function string(value) {
47888         return toString.call(value) === '[object String]';
47889     }
47890     Is.string = string;
47891     function number(value) {
47892         return toString.call(value) === '[object Number]';
47893     }
47894     Is.number = number;
47895     function func(value) {
47896         return toString.call(value) === '[object Function]';
47897     }
47898     Is.func = func;
47899     function objectLiteral(value) {
47900         // Strictly speaking class instances pass this check as well. Since the LSP
47901         // doesn't use classes we ignore this for now. If we do we need to add something
47902         // like this: `Object.getPrototypeOf(Object.getPrototypeOf(x)) === null`
47903         return value !== null && typeof value === 'object';
47904     }
47905     Is.objectLiteral = objectLiteral;
47906     function typedArray(value, check) {
47907         return Array.isArray(value) && value.every(check);
47908     }
47909     Is.typedArray = typedArray;
47910 })(Is || (Is = {}));
47911
47912
47913 /***/ }),
47914 /* 110 */
47915 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
47916
47917 __webpack_require__.r(__webpack_exports__);
47918 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
47919 /* harmony export */   "Node": () => /* binding */ Node,
47920 /* harmony export */   "parse": () => /* binding */ parse
47921 /* harmony export */ });
47922 /* harmony import */ var _htmlScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);
47923 /* harmony import */ var _utils_arrays__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(112);
47924 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(108);
47925 /* harmony import */ var _languageFacts_fact__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111);
47926 /*---------------------------------------------------------------------------------------------
47927  *  Copyright (c) Microsoft Corporation. All rights reserved.
47928  *  Licensed under the MIT License. See License.txt in the project root for license information.
47929  *--------------------------------------------------------------------------------------------*/
47930
47931
47932
47933
47934 var Node = /** @class */ (function () {
47935     function Node(start, end, children, parent) {
47936         this.start = start;
47937         this.end = end;
47938         this.children = children;
47939         this.parent = parent;
47940         this.closed = false;
47941     }
47942     Object.defineProperty(Node.prototype, "attributeNames", {
47943         get: function () { return this.attributes ? Object.keys(this.attributes) : []; },
47944         enumerable: false,
47945         configurable: true
47946     });
47947     Node.prototype.isSameTag = function (tagInLowerCase) {
47948         if (this.tag === undefined) {
47949             return tagInLowerCase === undefined;
47950         }
47951         else {
47952             return tagInLowerCase !== undefined && this.tag.length === tagInLowerCase.length && this.tag.toLowerCase() === tagInLowerCase;
47953         }
47954     };
47955     Object.defineProperty(Node.prototype, "firstChild", {
47956         get: function () { return this.children[0]; },
47957         enumerable: false,
47958         configurable: true
47959     });
47960     Object.defineProperty(Node.prototype, "lastChild", {
47961         get: function () { return this.children.length ? this.children[this.children.length - 1] : void 0; },
47962         enumerable: false,
47963         configurable: true
47964     });
47965     Node.prototype.findNodeBefore = function (offset) {
47966         var idx = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_3__.findFirst)(this.children, function (c) { return offset <= c.start; }) - 1;
47967         if (idx >= 0) {
47968             var child = this.children[idx];
47969             if (offset > child.start) {
47970                 if (offset < child.end) {
47971                     return child.findNodeBefore(offset);
47972                 }
47973                 var lastChild = child.lastChild;
47974                 if (lastChild && lastChild.end === child.end) {
47975                     return child.findNodeBefore(offset);
47976                 }
47977                 return child;
47978             }
47979         }
47980         return this;
47981     };
47982     Node.prototype.findNodeAt = function (offset) {
47983         var idx = (0,_utils_arrays__WEBPACK_IMPORTED_MODULE_3__.findFirst)(this.children, function (c) { return offset <= c.start; }) - 1;
47984         if (idx >= 0) {
47985             var child = this.children[idx];
47986             if (offset > child.start && offset <= child.end) {
47987                 return child.findNodeAt(offset);
47988             }
47989         }
47990         return this;
47991     };
47992     return Node;
47993 }());
47994
47995 function parse(text) {
47996     var scanner = (0,_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner)(text, undefined, undefined, true);
47997     var htmlDocument = new Node(0, text.length, [], void 0);
47998     var curr = htmlDocument;
47999     var endTagStart = -1;
48000     var endTagName = undefined;
48001     var pendingAttribute = null;
48002     var token = scanner.scan();
48003     while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOS) {
48004         switch (token) {
48005             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagOpen:
48006                 var child = new Node(scanner.getTokenOffset(), text.length, [], curr);
48007                 curr.children.push(child);
48008                 curr = child;
48009                 break;
48010             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTag:
48011                 curr.tag = scanner.getTokenText();
48012                 break;
48013             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagClose:
48014                 if (curr.parent) {
48015                     curr.end = scanner.getTokenEnd(); // might be later set to end tag position
48016                     if (scanner.getTokenLength()) {
48017                         curr.startTagEnd = scanner.getTokenEnd();
48018                         if (curr.tag && (0,_languageFacts_fact__WEBPACK_IMPORTED_MODULE_2__.isVoidElement)(curr.tag)) {
48019                             curr.closed = true;
48020                             curr = curr.parent;
48021                         }
48022                     }
48023                     else {
48024                         // pseudo close token from an incomplete start tag
48025                         curr = curr.parent;
48026                     }
48027                 }
48028                 break;
48029             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagSelfClose:
48030                 if (curr.parent) {
48031                     curr.closed = true;
48032                     curr.end = scanner.getTokenEnd();
48033                     curr.startTagEnd = scanner.getTokenEnd();
48034                     curr = curr.parent;
48035                 }
48036                 break;
48037             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagOpen:
48038                 endTagStart = scanner.getTokenOffset();
48039                 endTagName = undefined;
48040                 break;
48041             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTag:
48042                 endTagName = scanner.getTokenText().toLowerCase();
48043                 break;
48044             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagClose:
48045                 var node = curr;
48046                 // see if we can find a matching tag
48047                 while (!node.isSameTag(endTagName) && node.parent) {
48048                     node = node.parent;
48049                 }
48050                 if (node.parent) {
48051                     while (curr !== node) {
48052                         curr.end = endTagStart;
48053                         curr.closed = false;
48054                         curr = curr.parent;
48055                     }
48056                     curr.closed = true;
48057                     curr.endTagStart = endTagStart;
48058                     curr.end = scanner.getTokenEnd();
48059                     curr = curr.parent;
48060                 }
48061                 break;
48062             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.AttributeName: {
48063                 pendingAttribute = scanner.getTokenText();
48064                 var attributes = curr.attributes;
48065                 if (!attributes) {
48066                     curr.attributes = attributes = {};
48067                 }
48068                 attributes[pendingAttribute] = null; // Support valueless attributes such as 'checked'
48069                 break;
48070             }
48071             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.AttributeValue: {
48072                 var value = scanner.getTokenText();
48073                 var attributes = curr.attributes;
48074                 if (attributes && pendingAttribute) {
48075                     attributes[pendingAttribute] = value;
48076                     pendingAttribute = null;
48077                 }
48078                 break;
48079             }
48080         }
48081         token = scanner.scan();
48082     }
48083     while (curr.parent) {
48084         curr.end = text.length;
48085         curr.closed = false;
48086         curr = curr.parent;
48087     }
48088     return {
48089         roots: htmlDocument.children,
48090         findNodeBefore: htmlDocument.findNodeBefore.bind(htmlDocument),
48091         findNodeAt: htmlDocument.findNodeAt.bind(htmlDocument)
48092     };
48093 }
48094
48095
48096 /***/ }),
48097 /* 111 */
48098 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48099
48100 __webpack_require__.r(__webpack_exports__);
48101 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48102 /* harmony export */   "VOID_ELEMENTS": () => /* binding */ VOID_ELEMENTS,
48103 /* harmony export */   "isVoidElement": () => /* binding */ isVoidElement
48104 /* harmony export */ });
48105 /* harmony import */ var _utils_arrays__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(112);
48106 /*---------------------------------------------------------------------------------------------
48107  *  Copyright (c) Microsoft Corporation. All rights reserved.
48108  *  Licensed under the MIT License. See License.txt in the project root for license information.
48109  *--------------------------------------------------------------------------------------------*/
48110
48111 // As defined in https://www.w3.org/TR/html5/syntax.html#void-elements
48112 var VOID_ELEMENTS = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr'];
48113 function isVoidElement(e) {
48114     return !!e && _utils_arrays__WEBPACK_IMPORTED_MODULE_0__.binarySearch(VOID_ELEMENTS, e.toLowerCase(), function (s1, s2) { return s1.localeCompare(s2); }) >= 0;
48115 }
48116
48117
48118 /***/ }),
48119 /* 112 */
48120 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48121
48122 __webpack_require__.r(__webpack_exports__);
48123 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48124 /* harmony export */   "findFirst": () => /* binding */ findFirst,
48125 /* harmony export */   "binarySearch": () => /* binding */ binarySearch
48126 /* harmony export */ });
48127 /*---------------------------------------------------------------------------------------------
48128  *  Copyright (c) Microsoft Corporation. All rights reserved.
48129  *  Licensed under the MIT License. See License.txt in the project root for license information.
48130  *--------------------------------------------------------------------------------------------*/
48131 /**
48132  * Takes a sorted array and a function p. The array is sorted in such a way that all elements where p(x) is false
48133  * are located before all elements where p(x) is true.
48134  * @returns the least x for which p(x) is true or array.length if no element fullfills the given function.
48135  */
48136 function findFirst(array, p) {
48137     var low = 0, high = array.length;
48138     if (high === 0) {
48139         return 0; // no children
48140     }
48141     while (low < high) {
48142         var mid = Math.floor((low + high) / 2);
48143         if (p(array[mid])) {
48144             high = mid;
48145         }
48146         else {
48147             low = mid + 1;
48148         }
48149     }
48150     return low;
48151 }
48152 function binarySearch(array, key, comparator) {
48153     var low = 0, high = array.length - 1;
48154     while (low <= high) {
48155         var mid = ((low + high) / 2) | 0;
48156         var comp = comparator(array[mid], key);
48157         if (comp < 0) {
48158             low = mid + 1;
48159         }
48160         else if (comp > 0) {
48161             high = mid - 1;
48162         }
48163         else {
48164             return mid;
48165         }
48166     }
48167     return -(low + 1);
48168 }
48169
48170
48171 /***/ }),
48172 /* 113 */
48173 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48174
48175 __webpack_require__.r(__webpack_exports__);
48176 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48177 /* harmony export */   "HTMLCompletion": () => /* binding */ HTMLCompletion
48178 /* harmony export */ });
48179 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
48180 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(107);
48181 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(108);
48182 /* harmony import */ var _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(114);
48183 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(68);
48184 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(115);
48185 /* harmony import */ var _languageFacts_fact__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(111);
48186 /* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(119);
48187 /* harmony import */ var _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(116);
48188 /* harmony import */ var _pathCompletion__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(118);
48189 /*---------------------------------------------------------------------------------------------
48190  *  Copyright (c) Microsoft Corporation. All rights reserved.
48191  *  Licensed under the MIT License. See License.txt in the project root for license information.
48192  *--------------------------------------------------------------------------------------------*/
48193 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
48194     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
48195     return new (P || (P = Promise))(function (resolve, reject) {
48196         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
48197         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
48198         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
48199         step((generator = generator.apply(thisArg, _arguments || [])).next());
48200     });
48201 };
48202 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
48203     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
48204     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
48205     function verb(n) { return function (v) { return step([n, v]); }; }
48206     function step(op) {
48207         if (f) throw new TypeError("Generator is already executing.");
48208         while (_) try {
48209             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
48210             if (y = 0, t) op = [op[0] & 2, t.value];
48211             switch (op[0]) {
48212                 case 0: case 1: t = op; break;
48213                 case 4: _.label++; return { value: op[1], done: false };
48214                 case 5: _.label++; y = op[1]; op = [0]; continue;
48215                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
48216                 default:
48217                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
48218                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
48219                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
48220                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
48221                     if (t[2]) _.ops.pop();
48222                     _.trys.pop(); continue;
48223             }
48224             op = body.call(thisArg, _);
48225         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
48226         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
48227     }
48228 };
48229
48230
48231
48232
48233
48234
48235
48236
48237
48238
48239 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_4__.loadMessageBundle();
48240 var HTMLCompletion = /** @class */ (function () {
48241     function HTMLCompletion(lsOptions, dataManager) {
48242         this.lsOptions = lsOptions;
48243         this.dataManager = dataManager;
48244         this.completionParticipants = [];
48245     }
48246     HTMLCompletion.prototype.setCompletionParticipants = function (registeredCompletionParticipants) {
48247         this.completionParticipants = registeredCompletionParticipants || [];
48248     };
48249     HTMLCompletion.prototype.doComplete2 = function (document, position, htmlDocument, documentContext, settings) {
48250         return __awaiter(this, void 0, void 0, function () {
48251             var participant, contributedParticipants, result, pathCompletionResult;
48252             return __generator(this, function (_a) {
48253                 switch (_a.label) {
48254                     case 0:
48255                         if (!this.lsOptions.fileSystemProvider || !this.lsOptions.fileSystemProvider.readDirectory) {
48256                             return [2 /*return*/, this.doComplete(document, position, htmlDocument, settings)];
48257                         }
48258                         participant = new _pathCompletion__WEBPACK_IMPORTED_MODULE_8__.PathCompletionParticipant(this.lsOptions.fileSystemProvider.readDirectory);
48259                         contributedParticipants = this.completionParticipants;
48260                         this.completionParticipants = [participant].concat(contributedParticipants);
48261                         result = this.doComplete(document, position, htmlDocument, settings);
48262                         _a.label = 1;
48263                     case 1:
48264                         _a.trys.push([1, , 3, 4]);
48265                         return [4 /*yield*/, participant.computeCompletions(document, documentContext)];
48266                     case 2:
48267                         pathCompletionResult = _a.sent();
48268                         return [2 /*return*/, {
48269                                 isIncomplete: result.isIncomplete || pathCompletionResult.isIncomplete,
48270                                 items: pathCompletionResult.items.concat(result.items)
48271                             }];
48272                     case 3:
48273                         this.completionParticipants = contributedParticipants;
48274                         return [7 /*endfinally*/];
48275                     case 4: return [2 /*return*/];
48276                 }
48277             });
48278         });
48279     };
48280     HTMLCompletion.prototype.doComplete = function (document, position, htmlDocument, settings) {
48281         var result = this._doComplete(document, position, htmlDocument, settings);
48282         return this.convertCompletionList(result);
48283     };
48284     HTMLCompletion.prototype._doComplete = function (document, position, htmlDocument, settings) {
48285         var result = {
48286             isIncomplete: false,
48287             items: []
48288         };
48289         var completionParticipants = this.completionParticipants;
48290         var dataProviders = this.dataManager.getDataProviders().filter(function (p) { return p.isApplicable(document.languageId) && (!settings || settings[p.getId()] !== false); });
48291         var doesSupportMarkdown = this.doesSupportMarkdown();
48292         var text = document.getText();
48293         var offset = document.offsetAt(position);
48294         var node = htmlDocument.findNodeBefore(offset);
48295         if (!node) {
48296             return result;
48297         }
48298         var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__.createScanner)(text, node.start);
48299         var currentTag = '';
48300         var currentAttributeName;
48301         function getReplaceRange(replaceStart, replaceEnd) {
48302             if (replaceEnd === void 0) { replaceEnd = offset; }
48303             if (replaceStart > offset) {
48304                 replaceStart = offset;
48305             }
48306             return { start: document.positionAt(replaceStart), end: document.positionAt(replaceEnd) };
48307         }
48308         function collectOpenTagSuggestions(afterOpenBracket, tagNameEnd) {
48309             var range = getReplaceRange(afterOpenBracket, tagNameEnd);
48310             dataProviders.forEach(function (provider) {
48311                 provider.provideTags().forEach(function (tag) {
48312                     result.items.push({
48313                         label: tag.name,
48314                         kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Property,
48315                         documentation: (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_7__.generateDocumentation)(tag, doesSupportMarkdown),
48316                         textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, tag.name),
48317                         insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48318                     });
48319                 });
48320             });
48321             return result;
48322         }
48323         function getLineIndent(offset) {
48324             var start = offset;
48325             while (start > 0) {
48326                 var ch = text.charAt(start - 1);
48327                 if ("\n\r".indexOf(ch) >= 0) {
48328                     return text.substring(start, offset);
48329                 }
48330                 if (!isWhiteSpace(ch)) {
48331                     return null;
48332                 }
48333                 start--;
48334             }
48335             return text.substring(0, offset);
48336         }
48337         function collectCloseTagSuggestions(afterOpenBracket, inOpenTag, tagNameEnd) {
48338             if (tagNameEnd === void 0) { tagNameEnd = offset; }
48339             var range = getReplaceRange(afterOpenBracket, tagNameEnd);
48340             var closeTag = isFollowedBy(text, tagNameEnd, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.WithinEndTag, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTagClose) ? '' : '>';
48341             var curr = node;
48342             if (inOpenTag) {
48343                 curr = curr.parent; // don't suggest the own tag, it's not yet open
48344             }
48345             while (curr) {
48346                 var tag = curr.tag;
48347                 if (tag && (!curr.closed || curr.endTagStart && (curr.endTagStart > offset))) {
48348                     var item = {
48349                         label: '/' + tag,
48350                         kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Property,
48351                         filterText: '/' + tag,
48352                         textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, '/' + tag + closeTag),
48353                         insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48354                     };
48355                     var startIndent = getLineIndent(curr.start);
48356                     var endIndent = getLineIndent(afterOpenBracket - 1);
48357                     if (startIndent !== null && endIndent !== null && startIndent !== endIndent) {
48358                         var insertText = startIndent + '</' + tag + closeTag;
48359                         item.textEdit = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(getReplaceRange(afterOpenBracket - 1 - endIndent.length), insertText);
48360                         item.filterText = endIndent + '</' + tag;
48361                     }
48362                     result.items.push(item);
48363                     return result;
48364                 }
48365                 curr = curr.parent;
48366             }
48367             if (inOpenTag) {
48368                 return result;
48369             }
48370             dataProviders.forEach(function (provider) {
48371                 provider.provideTags().forEach(function (tag) {
48372                     result.items.push({
48373                         label: '/' + tag.name,
48374                         kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Property,
48375                         documentation: (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_7__.generateDocumentation)(tag, doesSupportMarkdown),
48376                         filterText: '/' + tag + closeTag,
48377                         textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, '/' + tag + closeTag),
48378                         insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48379                     });
48380                 });
48381             });
48382             return result;
48383         }
48384         function collectAutoCloseTagSuggestion(tagCloseEnd, tag) {
48385             if (settings && settings.hideAutoCompleteProposals) {
48386                 return result;
48387             }
48388             if (!(0,_languageFacts_fact__WEBPACK_IMPORTED_MODULE_6__.isVoidElement)(tag)) {
48389                 var pos = document.positionAt(tagCloseEnd);
48390                 result.items.push({
48391                     label: '</' + tag + '>',
48392                     kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Property,
48393                     filterText: '</' + tag + '>',
48394                     textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.insert(pos, '$0</' + tag + '>'),
48395                     insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.Snippet
48396                 });
48397             }
48398             return result;
48399         }
48400         function collectTagSuggestions(tagStart, tagEnd) {
48401             collectOpenTagSuggestions(tagStart, tagEnd);
48402             collectCloseTagSuggestions(tagStart, true, tagEnd);
48403             return result;
48404         }
48405         function collectAttributeNameSuggestions(nameStart, nameEnd) {
48406             if (nameEnd === void 0) { nameEnd = offset; }
48407             var replaceEnd = offset;
48408             while (replaceEnd < nameEnd && text[replaceEnd] !== '<') { // < is a valid attribute name character, but we rather assume the attribute name ends. See #23236.
48409                 replaceEnd++;
48410             }
48411             var range = getReplaceRange(nameStart, replaceEnd);
48412             var value = isFollowedBy(text, nameEnd, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.AfterAttributeName, _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.DelimiterAssign) ? '' : '="$1"';
48413             var seenAttributes = Object.create(null);
48414             dataProviders.forEach(function (provider) {
48415                 provider.provideAttributes(currentTag).forEach(function (attr) {
48416                     if (seenAttributes[attr.name]) {
48417                         return;
48418                     }
48419                     seenAttributes[attr.name] = true;
48420                     var codeSnippet = attr.name;
48421                     var command;
48422                     if (attr.valueSet !== 'v' && value.length) {
48423                         codeSnippet = codeSnippet + value;
48424                         if (attr.valueSet || attr.name === 'style') {
48425                             command = {
48426                                 title: 'Suggest',
48427                                 command: 'editor.action.triggerSuggest'
48428                             };
48429                         }
48430                     }
48431                     result.items.push({
48432                         label: attr.name,
48433                         kind: attr.valueSet === 'handler' ? vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Function : vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Value,
48434                         documentation: (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_7__.generateDocumentation)(attr, doesSupportMarkdown),
48435                         textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, codeSnippet),
48436                         insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.Snippet,
48437                         command: command
48438                     });
48439                 });
48440             });
48441             collectDataAttributesSuggestions(range, seenAttributes);
48442             return result;
48443         }
48444         function collectDataAttributesSuggestions(range, seenAttributes) {
48445             var dataAttr = 'data-';
48446             var dataAttributes = {};
48447             dataAttributes[dataAttr] = dataAttr + "$1=\"$2\"";
48448             function addNodeDataAttributes(node) {
48449                 node.attributeNames.forEach(function (attr) {
48450                     if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.startsWith)(attr, dataAttr) && !dataAttributes[attr] && !seenAttributes[attr]) {
48451                         dataAttributes[attr] = attr + '="$1"';
48452                     }
48453                 });
48454                 node.children.forEach(function (child) { return addNodeDataAttributes(child); });
48455             }
48456             if (htmlDocument) {
48457                 htmlDocument.roots.forEach(function (root) { return addNodeDataAttributes(root); });
48458             }
48459             Object.keys(dataAttributes).forEach(function (attr) { return result.items.push({
48460                 label: attr,
48461                 kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Value,
48462                 textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, dataAttributes[attr]),
48463                 insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.Snippet
48464             }); });
48465         }
48466         function collectAttributeValueSuggestions(valueStart, valueEnd) {
48467             if (valueEnd === void 0) { valueEnd = offset; }
48468             var range;
48469             var addQuotes;
48470             var valuePrefix;
48471             if (offset > valueStart && offset <= valueEnd && isQuote(text[valueStart])) {
48472                 // inside quoted attribute
48473                 var valueContentStart = valueStart + 1;
48474                 var valueContentEnd = valueEnd;
48475                 // valueEnd points to the char after quote, which encloses the replace range
48476                 if (valueEnd > valueStart && text[valueEnd - 1] === text[valueStart]) {
48477                     valueContentEnd--;
48478                 }
48479                 var wsBefore = getWordStart(text, offset, valueContentStart);
48480                 var wsAfter = getWordEnd(text, offset, valueContentEnd);
48481                 range = getReplaceRange(wsBefore, wsAfter);
48482                 valuePrefix = offset >= valueContentStart && offset <= valueContentEnd ? text.substring(valueContentStart, offset) : '';
48483                 addQuotes = false;
48484             }
48485             else {
48486                 range = getReplaceRange(valueStart, valueEnd);
48487                 valuePrefix = text.substring(valueStart, offset);
48488                 addQuotes = true;
48489             }
48490             if (completionParticipants.length > 0) {
48491                 var tag = currentTag.toLowerCase();
48492                 var attribute = currentAttributeName.toLowerCase();
48493                 var fullRange = getReplaceRange(valueStart, valueEnd);
48494                 for (var _i = 0, completionParticipants_1 = completionParticipants; _i < completionParticipants_1.length; _i++) {
48495                     var participant = completionParticipants_1[_i];
48496                     if (participant.onHtmlAttributeValue) {
48497                         participant.onHtmlAttributeValue({ document: document, position: position, tag: tag, attribute: attribute, value: valuePrefix, range: fullRange });
48498                     }
48499                 }
48500             }
48501             dataProviders.forEach(function (provider) {
48502                 provider.provideValues(currentTag, currentAttributeName).forEach(function (value) {
48503                     var insertText = addQuotes ? '"' + value.name + '"' : value.name;
48504                     result.items.push({
48505                         label: value.name,
48506                         filterText: insertText,
48507                         kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Unit,
48508                         documentation: (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_7__.generateDocumentation)(value, doesSupportMarkdown),
48509                         textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, insertText),
48510                         insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48511                     });
48512                 });
48513             });
48514             collectCharacterEntityProposals();
48515             return result;
48516         }
48517         function scanNextForEndPos(nextToken) {
48518             if (offset === scanner.getTokenEnd()) {
48519                 token = scanner.scan();
48520                 if (token === nextToken && scanner.getTokenOffset() === offset) {
48521                     return scanner.getTokenEnd();
48522                 }
48523             }
48524             return offset;
48525         }
48526         function collectInsideContent() {
48527             for (var _i = 0, completionParticipants_2 = completionParticipants; _i < completionParticipants_2.length; _i++) {
48528                 var participant = completionParticipants_2[_i];
48529                 if (participant.onHtmlContent) {
48530                     participant.onHtmlContent({ document: document, position: position });
48531                 }
48532             }
48533             return collectCharacterEntityProposals();
48534         }
48535         function collectCharacterEntityProposals() {
48536             // character entities
48537             var k = offset - 1;
48538             var characterStart = position.character;
48539             while (k >= 0 && (0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.isLetterOrDigit)(text, k)) {
48540                 k--;
48541                 characterStart--;
48542             }
48543             if (k >= 0 && text[k] === '&') {
48544                 var range = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position.create(position.line, characterStart - 1), position);
48545                 for (var entity in _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_3__.entities) {
48546                     if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.endsWith)(entity, ';')) {
48547                         var label = '&' + entity;
48548                         result.items.push({
48549                             label: label,
48550                             kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Keyword,
48551                             documentation: localize('entity.propose', "Character entity representing '" + _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_3__.entities[entity] + "'"),
48552                             textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, label),
48553                             insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48554                         });
48555                     }
48556                 }
48557             }
48558             return result;
48559         }
48560         function suggestDoctype(replaceStart, replaceEnd) {
48561             var range = getReplaceRange(replaceStart, replaceEnd);
48562             result.items.push({
48563                 label: '!DOCTYPE',
48564                 kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Property,
48565                 documentation: 'A preamble for an HTML document.',
48566                 textEdit: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(range, '!DOCTYPE html>'),
48567                 insertTextFormat: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.InsertTextFormat.PlainText
48568             });
48569         }
48570         var token = scanner.scan();
48571         while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && scanner.getTokenOffset() <= offset) {
48572             switch (token) {
48573                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTagOpen:
48574                     if (scanner.getTokenEnd() === offset) {
48575                         var endPos = scanNextForEndPos(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTag);
48576                         if (position.line === 0) {
48577                             suggestDoctype(offset, endPos);
48578                         }
48579                         return collectTagSuggestions(offset, endPos);
48580                     }
48581                     break;
48582                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTag:
48583                     if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {
48584                         return collectOpenTagSuggestions(scanner.getTokenOffset(), scanner.getTokenEnd());
48585                     }
48586                     currentTag = scanner.getTokenText();
48587                     break;
48588                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeName:
48589                     if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {
48590                         return collectAttributeNameSuggestions(scanner.getTokenOffset(), scanner.getTokenEnd());
48591                     }
48592                     currentAttributeName = scanner.getTokenText();
48593                     break;
48594                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.DelimiterAssign:
48595                     if (scanner.getTokenEnd() === offset) {
48596                         var endPos = scanNextForEndPos(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeValue);
48597                         return collectAttributeValueSuggestions(offset, endPos);
48598                     }
48599                     break;
48600                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeValue:
48601                     if (scanner.getTokenOffset() <= offset && offset <= scanner.getTokenEnd()) {
48602                         return collectAttributeValueSuggestions(scanner.getTokenOffset(), scanner.getTokenEnd());
48603                     }
48604                     break;
48605                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.Whitespace:
48606                     if (offset <= scanner.getTokenEnd()) {
48607                         switch (scanner.getScannerState()) {
48608                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.AfterOpeningStartTag:
48609                                 var startPos = scanner.getTokenOffset();
48610                                 var endTagPos = scanNextForEndPos(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTag);
48611                                 return collectTagSuggestions(startPos, endTagPos);
48612                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.WithinTag:
48613                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.AfterAttributeName:
48614                                 return collectAttributeNameSuggestions(scanner.getTokenEnd());
48615                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.BeforeAttributeValue:
48616                                 return collectAttributeValueSuggestions(scanner.getTokenEnd());
48617                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.AfterOpeningEndTag:
48618                                 return collectCloseTagSuggestions(scanner.getTokenOffset() - 1, false);
48619                             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.ScannerState.WithinContent:
48620                                 return collectInsideContent();
48621                         }
48622                     }
48623                     break;
48624                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTagOpen:
48625                     if (offset <= scanner.getTokenEnd()) {
48626                         var afterOpenBracket = scanner.getTokenOffset() + 1;
48627                         var endOffset = scanNextForEndPos(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTag);
48628                         return collectCloseTagSuggestions(afterOpenBracket, false, endOffset);
48629                     }
48630                     break;
48631                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTag:
48632                     if (offset <= scanner.getTokenEnd()) {
48633                         var start = scanner.getTokenOffset() - 1;
48634                         while (start >= 0) {
48635                             var ch = text.charAt(start);
48636                             if (ch === '/') {
48637                                 return collectCloseTagSuggestions(start, false, scanner.getTokenEnd());
48638                             }
48639                             else if (!isWhiteSpace(ch)) {
48640                                 break;
48641                             }
48642                             start--;
48643                         }
48644                     }
48645                     break;
48646                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTagClose:
48647                     if (offset <= scanner.getTokenEnd()) {
48648                         if (currentTag) {
48649                             return collectAutoCloseTagSuggestion(scanner.getTokenEnd(), currentTag);
48650                         }
48651                     }
48652                     break;
48653                 case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.Content:
48654                     if (offset <= scanner.getTokenEnd()) {
48655                         return collectInsideContent();
48656                     }
48657                     break;
48658                 default:
48659                     if (offset <= scanner.getTokenEnd()) {
48660                         return result;
48661                     }
48662                     break;
48663             }
48664             token = scanner.scan();
48665         }
48666         return result;
48667     };
48668     HTMLCompletion.prototype.doTagComplete = function (document, position, htmlDocument) {
48669         var offset = document.offsetAt(position);
48670         if (offset <= 0) {
48671             return null;
48672         }
48673         var char = document.getText().charAt(offset - 1);
48674         if (char === '>') {
48675             var node = htmlDocument.findNodeBefore(offset);
48676             if (node && node.tag && !(0,_languageFacts_fact__WEBPACK_IMPORTED_MODULE_6__.isVoidElement)(node.tag) && node.start < offset && (!node.endTagStart || node.endTagStart > offset)) {
48677                 var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__.createScanner)(document.getText(), node.start);
48678                 var token = scanner.scan();
48679                 while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && scanner.getTokenEnd() <= offset) {
48680                     if (token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTagClose && scanner.getTokenEnd() === offset) {
48681                         return "$0</" + node.tag + ">";
48682                     }
48683                     token = scanner.scan();
48684                 }
48685             }
48686         }
48687         else if (char === '/') {
48688             var node = htmlDocument.findNodeBefore(offset);
48689             while (node && node.closed) {
48690                 node = node.parent;
48691             }
48692             if (node && node.tag) {
48693                 var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__.createScanner)(document.getText(), node.start);
48694                 var token = scanner.scan();
48695                 while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && scanner.getTokenEnd() <= offset) {
48696                     if (token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTagOpen && scanner.getTokenEnd() === offset) {
48697                         return node.tag + ">";
48698                     }
48699                     token = scanner.scan();
48700                 }
48701             }
48702         }
48703         return null;
48704     };
48705     HTMLCompletion.prototype.convertCompletionList = function (list) {
48706         if (!this.doesSupportMarkdown()) {
48707             list.items.forEach(function (item) {
48708                 if (item.documentation && typeof item.documentation !== 'string') {
48709                     item.documentation = {
48710                         kind: 'plaintext',
48711                         value: item.documentation.value
48712                     };
48713                 }
48714             });
48715         }
48716         return list;
48717     };
48718     HTMLCompletion.prototype.doesSupportMarkdown = function () {
48719         var _a, _b, _c;
48720         if (!(0,_utils_object__WEBPACK_IMPORTED_MODULE_9__.isDefined)(this.supportsMarkdown)) {
48721             if (!(0,_utils_object__WEBPACK_IMPORTED_MODULE_9__.isDefined)(this.lsOptions.clientCapabilities)) {
48722                 this.supportsMarkdown = true;
48723                 return this.supportsMarkdown;
48724             }
48725             var documentationFormat = (_c = (_b = (_a = this.lsOptions.clientCapabilities.textDocument) === null || _a === void 0 ? void 0 : _a.completion) === null || _b === void 0 ? void 0 : _b.completionItem) === null || _c === void 0 ? void 0 : _c.documentationFormat;
48726             this.supportsMarkdown = Array.isArray(documentationFormat) && documentationFormat.indexOf(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.MarkupKind.Markdown) !== -1;
48727         }
48728         return this.supportsMarkdown;
48729     };
48730     return HTMLCompletion;
48731 }());
48732
48733 function isQuote(s) {
48734     return /^["']*$/.test(s);
48735 }
48736 function isWhiteSpace(s) {
48737     return /^\s*$/.test(s);
48738 }
48739 function isFollowedBy(s, offset, intialState, expectedToken) {
48740     var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__.createScanner)(s, offset, intialState);
48741     var token = scanner.scan();
48742     while (token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.Whitespace) {
48743         token = scanner.scan();
48744     }
48745     return token === expectedToken;
48746 }
48747 function getWordStart(s, offset, limit) {
48748     while (offset > limit && !isWhiteSpace(s[offset - 1])) {
48749         offset--;
48750     }
48751     return offset;
48752 }
48753 function getWordEnd(s, offset, limit) {
48754     while (offset < limit && !isWhiteSpace(s[offset])) {
48755         offset++;
48756     }
48757     return offset;
48758 }
48759
48760
48761 /***/ }),
48762 /* 114 */
48763 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48764
48765 __webpack_require__.r(__webpack_exports__);
48766 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
48767 /* harmony export */   "entities": () => /* binding */ entities
48768 /* harmony export */ });
48769 /*---------------------------------------------------------------------------------------------
48770  *  Copyright (c) Microsoft Corporation. All rights reserved.
48771  *  Licensed under the MIT License. See License.txt in the project root for license information.
48772  *--------------------------------------------------------------------------------------------*/
48773 /**
48774  * HTML 5 character entities
48775  * https://www.w3.org/TR/html5/syntax.html#named-character-references
48776  */
48777 var entities = {
48778     "Aacute;": "\u00C1",
48779     "Aacute": "\u00C1",
48780     "aacute;": "\u00E1",
48781     "aacute": "\u00E1",
48782     "Abreve;": "\u0102",
48783     "abreve;": "\u0103",
48784     "ac;": "\u223E",
48785     "acd;": "\u223F",
48786     "acE;": "\u223E\u0333",
48787     "Acirc;": "\u00C2",
48788     "Acirc": "\u00C2",
48789     "acirc;": "\u00E2",
48790     "acirc": "\u00E2",
48791     "acute;": "\u00B4",
48792     "acute": "\u00B4",
48793     "Acy;": "\u0410",
48794     "acy;": "\u0430",
48795     "AElig;": "\u00C6",
48796     "AElig": "\u00C6",
48797     "aelig;": "\u00E6",
48798     "aelig": "\u00E6",
48799     "af;": "\u2061",
48800     "Afr;": "\uD835\uDD04",
48801     "afr;": "\uD835\uDD1E",
48802     "Agrave;": "\u00C0",
48803     "Agrave": "\u00C0",
48804     "agrave;": "\u00E0",
48805     "agrave": "\u00E0",
48806     "alefsym;": "\u2135",
48807     "aleph;": "\u2135",
48808     "Alpha;": "\u0391",
48809     "alpha;": "\u03B1",
48810     "Amacr;": "\u0100",
48811     "amacr;": "\u0101",
48812     "amalg;": "\u2A3F",
48813     "AMP;": "\u0026",
48814     "AMP": "\u0026",
48815     "amp;": "\u0026",
48816     "amp": "\u0026",
48817     "And;": "\u2A53",
48818     "and;": "\u2227",
48819     "andand;": "\u2A55",
48820     "andd;": "\u2A5C",
48821     "andslope;": "\u2A58",
48822     "andv;": "\u2A5A",
48823     "ang;": "\u2220",
48824     "ange;": "\u29A4",
48825     "angle;": "\u2220",
48826     "angmsd;": "\u2221",
48827     "angmsdaa;": "\u29A8",
48828     "angmsdab;": "\u29A9",
48829     "angmsdac;": "\u29AA",
48830     "angmsdad;": "\u29AB",
48831     "angmsdae;": "\u29AC",
48832     "angmsdaf;": "\u29AD",
48833     "angmsdag;": "\u29AE",
48834     "angmsdah;": "\u29AF",
48835     "angrt;": "\u221F",
48836     "angrtvb;": "\u22BE",
48837     "angrtvbd;": "\u299D",
48838     "angsph;": "\u2222",
48839     "angst;": "\u00C5",
48840     "angzarr;": "\u237C",
48841     "Aogon;": "\u0104",
48842     "aogon;": "\u0105",
48843     "Aopf;": "\uD835\uDD38",
48844     "aopf;": "\uD835\uDD52",
48845     "ap;": "\u2248",
48846     "apacir;": "\u2A6F",
48847     "apE;": "\u2A70",
48848     "ape;": "\u224A",
48849     "apid;": "\u224B",
48850     "apos;": "\u0027",
48851     "ApplyFunction;": "\u2061",
48852     "approx;": "\u2248",
48853     "approxeq;": "\u224A",
48854     "Aring;": "\u00C5",
48855     "Aring": "\u00C5",
48856     "aring;": "\u00E5",
48857     "aring": "\u00E5",
48858     "Ascr;": "\uD835\uDC9C",
48859     "ascr;": "\uD835\uDCB6",
48860     "Assign;": "\u2254",
48861     "ast;": "\u002A",
48862     "asymp;": "\u2248",
48863     "asympeq;": "\u224D",
48864     "Atilde;": "\u00C3",
48865     "Atilde": "\u00C3",
48866     "atilde;": "\u00E3",
48867     "atilde": "\u00E3",
48868     "Auml;": "\u00C4",
48869     "Auml": "\u00C4",
48870     "auml;": "\u00E4",
48871     "auml": "\u00E4",
48872     "awconint;": "\u2233",
48873     "awint;": "\u2A11",
48874     "backcong;": "\u224C",
48875     "backepsilon;": "\u03F6",
48876     "backprime;": "\u2035",
48877     "backsim;": "\u223D",
48878     "backsimeq;": "\u22CD",
48879     "Backslash;": "\u2216",
48880     "Barv;": "\u2AE7",
48881     "barvee;": "\u22BD",
48882     "Barwed;": "\u2306",
48883     "barwed;": "\u2305",
48884     "barwedge;": "\u2305",
48885     "bbrk;": "\u23B5",
48886     "bbrktbrk;": "\u23B6",
48887     "bcong;": "\u224C",
48888     "Bcy;": "\u0411",
48889     "bcy;": "\u0431",
48890     "bdquo;": "\u201E",
48891     "becaus;": "\u2235",
48892     "Because;": "\u2235",
48893     "because;": "\u2235",
48894     "bemptyv;": "\u29B0",
48895     "bepsi;": "\u03F6",
48896     "bernou;": "\u212C",
48897     "Bernoullis;": "\u212C",
48898     "Beta;": "\u0392",
48899     "beta;": "\u03B2",
48900     "beth;": "\u2136",
48901     "between;": "\u226C",
48902     "Bfr;": "\uD835\uDD05",
48903     "bfr;": "\uD835\uDD1F",
48904     "bigcap;": "\u22C2",
48905     "bigcirc;": "\u25EF",
48906     "bigcup;": "\u22C3",
48907     "bigodot;": "\u2A00",
48908     "bigoplus;": "\u2A01",
48909     "bigotimes;": "\u2A02",
48910     "bigsqcup;": "\u2A06",
48911     "bigstar;": "\u2605",
48912     "bigtriangledown;": "\u25BD",
48913     "bigtriangleup;": "\u25B3",
48914     "biguplus;": "\u2A04",
48915     "bigvee;": "\u22C1",
48916     "bigwedge;": "\u22C0",
48917     "bkarow;": "\u290D",
48918     "blacklozenge;": "\u29EB",
48919     "blacksquare;": "\u25AA",
48920     "blacktriangle;": "\u25B4",
48921     "blacktriangledown;": "\u25BE",
48922     "blacktriangleleft;": "\u25C2",
48923     "blacktriangleright;": "\u25B8",
48924     "blank;": "\u2423",
48925     "blk12;": "\u2592",
48926     "blk14;": "\u2591",
48927     "blk34;": "\u2593",
48928     "block;": "\u2588",
48929     "bne;": "\u003D\u20E5",
48930     "bnequiv;": "\u2261\u20E5",
48931     "bNot;": "\u2AED",
48932     "bnot;": "\u2310",
48933     "Bopf;": "\uD835\uDD39",
48934     "bopf;": "\uD835\uDD53",
48935     "bot;": "\u22A5",
48936     "bottom;": "\u22A5",
48937     "bowtie;": "\u22C8",
48938     "boxbox;": "\u29C9",
48939     "boxDL;": "\u2557",
48940     "boxDl;": "\u2556",
48941     "boxdL;": "\u2555",
48942     "boxdl;": "\u2510",
48943     "boxDR;": "\u2554",
48944     "boxDr;": "\u2553",
48945     "boxdR;": "\u2552",
48946     "boxdr;": "\u250C",
48947     "boxH;": "\u2550",
48948     "boxh;": "\u2500",
48949     "boxHD;": "\u2566",
48950     "boxHd;": "\u2564",
48951     "boxhD;": "\u2565",
48952     "boxhd;": "\u252C",
48953     "boxHU;": "\u2569",
48954     "boxHu;": "\u2567",
48955     "boxhU;": "\u2568",
48956     "boxhu;": "\u2534",
48957     "boxminus;": "\u229F",
48958     "boxplus;": "\u229E",
48959     "boxtimes;": "\u22A0",
48960     "boxUL;": "\u255D",
48961     "boxUl;": "\u255C",
48962     "boxuL;": "\u255B",
48963     "boxul;": "\u2518",
48964     "boxUR;": "\u255A",
48965     "boxUr;": "\u2559",
48966     "boxuR;": "\u2558",
48967     "boxur;": "\u2514",
48968     "boxV;": "\u2551",
48969     "boxv;": "\u2502",
48970     "boxVH;": "\u256C",
48971     "boxVh;": "\u256B",
48972     "boxvH;": "\u256A",
48973     "boxvh;": "\u253C",
48974     "boxVL;": "\u2563",
48975     "boxVl;": "\u2562",
48976     "boxvL;": "\u2561",
48977     "boxvl;": "\u2524",
48978     "boxVR;": "\u2560",
48979     "boxVr;": "\u255F",
48980     "boxvR;": "\u255E",
48981     "boxvr;": "\u251C",
48982     "bprime;": "\u2035",
48983     "Breve;": "\u02D8",
48984     "breve;": "\u02D8",
48985     "brvbar;": "\u00A6",
48986     "brvbar": "\u00A6",
48987     "Bscr;": "\u212C",
48988     "bscr;": "\uD835\uDCB7",
48989     "bsemi;": "\u204F",
48990     "bsim;": "\u223D",
48991     "bsime;": "\u22CD",
48992     "bsol;": "\u005C",
48993     "bsolb;": "\u29C5",
48994     "bsolhsub;": "\u27C8",
48995     "bull;": "\u2022",
48996     "bullet;": "\u2022",
48997     "bump;": "\u224E",
48998     "bumpE;": "\u2AAE",
48999     "bumpe;": "\u224F",
49000     "Bumpeq;": "\u224E",
49001     "bumpeq;": "\u224F",
49002     "Cacute;": "\u0106",
49003     "cacute;": "\u0107",
49004     "Cap;": "\u22D2",
49005     "cap;": "\u2229",
49006     "capand;": "\u2A44",
49007     "capbrcup;": "\u2A49",
49008     "capcap;": "\u2A4B",
49009     "capcup;": "\u2A47",
49010     "capdot;": "\u2A40",
49011     "CapitalDifferentialD;": "\u2145",
49012     "caps;": "\u2229\uFE00",
49013     "caret;": "\u2041",
49014     "caron;": "\u02C7",
49015     "Cayleys;": "\u212D",
49016     "ccaps;": "\u2A4D",
49017     "Ccaron;": "\u010C",
49018     "ccaron;": "\u010D",
49019     "Ccedil;": "\u00C7",
49020     "Ccedil": "\u00C7",
49021     "ccedil;": "\u00E7",
49022     "ccedil": "\u00E7",
49023     "Ccirc;": "\u0108",
49024     "ccirc;": "\u0109",
49025     "Cconint;": "\u2230",
49026     "ccups;": "\u2A4C",
49027     "ccupssm;": "\u2A50",
49028     "Cdot;": "\u010A",
49029     "cdot;": "\u010B",
49030     "cedil;": "\u00B8",
49031     "cedil": "\u00B8",
49032     "Cedilla;": "\u00B8",
49033     "cemptyv;": "\u29B2",
49034     "cent;": "\u00A2",
49035     "cent": "\u00A2",
49036     "CenterDot;": "\u00B7",
49037     "centerdot;": "\u00B7",
49038     "Cfr;": "\u212D",
49039     "cfr;": "\uD835\uDD20",
49040     "CHcy;": "\u0427",
49041     "chcy;": "\u0447",
49042     "check;": "\u2713",
49043     "checkmark;": "\u2713",
49044     "Chi;": "\u03A7",
49045     "chi;": "\u03C7",
49046     "cir;": "\u25CB",
49047     "circ;": "\u02C6",
49048     "circeq;": "\u2257",
49049     "circlearrowleft;": "\u21BA",
49050     "circlearrowright;": "\u21BB",
49051     "circledast;": "\u229B",
49052     "circledcirc;": "\u229A",
49053     "circleddash;": "\u229D",
49054     "CircleDot;": "\u2299",
49055     "circledR;": "\u00AE",
49056     "circledS;": "\u24C8",
49057     "CircleMinus;": "\u2296",
49058     "CirclePlus;": "\u2295",
49059     "CircleTimes;": "\u2297",
49060     "cirE;": "\u29C3",
49061     "cire;": "\u2257",
49062     "cirfnint;": "\u2A10",
49063     "cirmid;": "\u2AEF",
49064     "cirscir;": "\u29C2",
49065     "ClockwiseContourIntegral;": "\u2232",
49066     "CloseCurlyDoubleQuote;": "\u201D",
49067     "CloseCurlyQuote;": "\u2019",
49068     "clubs;": "\u2663",
49069     "clubsuit;": "\u2663",
49070     "Colon;": "\u2237",
49071     "colon;": "\u003A",
49072     "Colone;": "\u2A74",
49073     "colone;": "\u2254",
49074     "coloneq;": "\u2254",
49075     "comma;": "\u002C",
49076     "commat;": "\u0040",
49077     "comp;": "\u2201",
49078     "compfn;": "\u2218",
49079     "complement;": "\u2201",
49080     "complexes;": "\u2102",
49081     "cong;": "\u2245",
49082     "congdot;": "\u2A6D",
49083     "Congruent;": "\u2261",
49084     "Conint;": "\u222F",
49085     "conint;": "\u222E",
49086     "ContourIntegral;": "\u222E",
49087     "Copf;": "\u2102",
49088     "copf;": "\uD835\uDD54",
49089     "coprod;": "\u2210",
49090     "Coproduct;": "\u2210",
49091     "COPY;": "\u00A9",
49092     "COPY": "\u00A9",
49093     "copy;": "\u00A9",
49094     "copy": "\u00A9",
49095     "copysr;": "\u2117",
49096     "CounterClockwiseContourIntegral;": "\u2233",
49097     "crarr;": "\u21B5",
49098     "Cross;": "\u2A2F",
49099     "cross;": "\u2717",
49100     "Cscr;": "\uD835\uDC9E",
49101     "cscr;": "\uD835\uDCB8",
49102     "csub;": "\u2ACF",
49103     "csube;": "\u2AD1",
49104     "csup;": "\u2AD0",
49105     "csupe;": "\u2AD2",
49106     "ctdot;": "\u22EF",
49107     "cudarrl;": "\u2938",
49108     "cudarrr;": "\u2935",
49109     "cuepr;": "\u22DE",
49110     "cuesc;": "\u22DF",
49111     "cularr;": "\u21B6",
49112     "cularrp;": "\u293D",
49113     "Cup;": "\u22D3",
49114     "cup;": "\u222A",
49115     "cupbrcap;": "\u2A48",
49116     "CupCap;": "\u224D",
49117     "cupcap;": "\u2A46",
49118     "cupcup;": "\u2A4A",
49119     "cupdot;": "\u228D",
49120     "cupor;": "\u2A45",
49121     "cups;": "\u222A\uFE00",
49122     "curarr;": "\u21B7",
49123     "curarrm;": "\u293C",
49124     "curlyeqprec;": "\u22DE",
49125     "curlyeqsucc;": "\u22DF",
49126     "curlyvee;": "\u22CE",
49127     "curlywedge;": "\u22CF",
49128     "curren;": "\u00A4",
49129     "curren": "\u00A4",
49130     "curvearrowleft;": "\u21B6",
49131     "curvearrowright;": "\u21B7",
49132     "cuvee;": "\u22CE",
49133     "cuwed;": "\u22CF",
49134     "cwconint;": "\u2232",
49135     "cwint;": "\u2231",
49136     "cylcty;": "\u232D",
49137     "Dagger;": "\u2021",
49138     "dagger;": "\u2020",
49139     "daleth;": "\u2138",
49140     "Darr;": "\u21A1",
49141     "dArr;": "\u21D3",
49142     "darr;": "\u2193",
49143     "dash;": "\u2010",
49144     "Dashv;": "\u2AE4",
49145     "dashv;": "\u22A3",
49146     "dbkarow;": "\u290F",
49147     "dblac;": "\u02DD",
49148     "Dcaron;": "\u010E",
49149     "dcaron;": "\u010F",
49150     "Dcy;": "\u0414",
49151     "dcy;": "\u0434",
49152     "DD;": "\u2145",
49153     "dd;": "\u2146",
49154     "ddagger;": "\u2021",
49155     "ddarr;": "\u21CA",
49156     "DDotrahd;": "\u2911",
49157     "ddotseq;": "\u2A77",
49158     "deg;": "\u00B0",
49159     "deg": "\u00B0",
49160     "Del;": "\u2207",
49161     "Delta;": "\u0394",
49162     "delta;": "\u03B4",
49163     "demptyv;": "\u29B1",
49164     "dfisht;": "\u297F",
49165     "Dfr;": "\uD835\uDD07",
49166     "dfr;": "\uD835\uDD21",
49167     "dHar;": "\u2965",
49168     "dharl;": "\u21C3",
49169     "dharr;": "\u21C2",
49170     "DiacriticalAcute;": "\u00B4",
49171     "DiacriticalDot;": "\u02D9",
49172     "DiacriticalDoubleAcute;": "\u02DD",
49173     "DiacriticalGrave;": "\u0060",
49174     "DiacriticalTilde;": "\u02DC",
49175     "diam;": "\u22C4",
49176     "Diamond;": "\u22C4",
49177     "diamond;": "\u22C4",
49178     "diamondsuit;": "\u2666",
49179     "diams;": "\u2666",
49180     "die;": "\u00A8",
49181     "DifferentialD;": "\u2146",
49182     "digamma;": "\u03DD",
49183     "disin;": "\u22F2",
49184     "div;": "\u00F7",
49185     "divide;": "\u00F7",
49186     "divide": "\u00F7",
49187     "divideontimes;": "\u22C7",
49188     "divonx;": "\u22C7",
49189     "DJcy;": "\u0402",
49190     "djcy;": "\u0452",
49191     "dlcorn;": "\u231E",
49192     "dlcrop;": "\u230D",
49193     "dollar;": "\u0024",
49194     "Dopf;": "\uD835\uDD3B",
49195     "dopf;": "\uD835\uDD55",
49196     "Dot;": "\u00A8",
49197     "dot;": "\u02D9",
49198     "DotDot;": "\u20DC",
49199     "doteq;": "\u2250",
49200     "doteqdot;": "\u2251",
49201     "DotEqual;": "\u2250",
49202     "dotminus;": "\u2238",
49203     "dotplus;": "\u2214",
49204     "dotsquare;": "\u22A1",
49205     "doublebarwedge;": "\u2306",
49206     "DoubleContourIntegral;": "\u222F",
49207     "DoubleDot;": "\u00A8",
49208     "DoubleDownArrow;": "\u21D3",
49209     "DoubleLeftArrow;": "\u21D0",
49210     "DoubleLeftRightArrow;": "\u21D4",
49211     "DoubleLeftTee;": "\u2AE4",
49212     "DoubleLongLeftArrow;": "\u27F8",
49213     "DoubleLongLeftRightArrow;": "\u27FA",
49214     "DoubleLongRightArrow;": "\u27F9",
49215     "DoubleRightArrow;": "\u21D2",
49216     "DoubleRightTee;": "\u22A8",
49217     "DoubleUpArrow;": "\u21D1",
49218     "DoubleUpDownArrow;": "\u21D5",
49219     "DoubleVerticalBar;": "\u2225",
49220     "DownArrow;": "\u2193",
49221     "Downarrow;": "\u21D3",
49222     "downarrow;": "\u2193",
49223     "DownArrowBar;": "\u2913",
49224     "DownArrowUpArrow;": "\u21F5",
49225     "DownBreve;": "\u0311",
49226     "downdownarrows;": "\u21CA",
49227     "downharpoonleft;": "\u21C3",
49228     "downharpoonright;": "\u21C2",
49229     "DownLeftRightVector;": "\u2950",
49230     "DownLeftTeeVector;": "\u295E",
49231     "DownLeftVector;": "\u21BD",
49232     "DownLeftVectorBar;": "\u2956",
49233     "DownRightTeeVector;": "\u295F",
49234     "DownRightVector;": "\u21C1",
49235     "DownRightVectorBar;": "\u2957",
49236     "DownTee;": "\u22A4",
49237     "DownTeeArrow;": "\u21A7",
49238     "drbkarow;": "\u2910",
49239     "drcorn;": "\u231F",
49240     "drcrop;": "\u230C",
49241     "Dscr;": "\uD835\uDC9F",
49242     "dscr;": "\uD835\uDCB9",
49243     "DScy;": "\u0405",
49244     "dscy;": "\u0455",
49245     "dsol;": "\u29F6",
49246     "Dstrok;": "\u0110",
49247     "dstrok;": "\u0111",
49248     "dtdot;": "\u22F1",
49249     "dtri;": "\u25BF",
49250     "dtrif;": "\u25BE",
49251     "duarr;": "\u21F5",
49252     "duhar;": "\u296F",
49253     "dwangle;": "\u29A6",
49254     "DZcy;": "\u040F",
49255     "dzcy;": "\u045F",
49256     "dzigrarr;": "\u27FF",
49257     "Eacute;": "\u00C9",
49258     "Eacute": "\u00C9",
49259     "eacute;": "\u00E9",
49260     "eacute": "\u00E9",
49261     "easter;": "\u2A6E",
49262     "Ecaron;": "\u011A",
49263     "ecaron;": "\u011B",
49264     "ecir;": "\u2256",
49265     "Ecirc;": "\u00CA",
49266     "Ecirc": "\u00CA",
49267     "ecirc;": "\u00EA",
49268     "ecirc": "\u00EA",
49269     "ecolon;": "\u2255",
49270     "Ecy;": "\u042D",
49271     "ecy;": "\u044D",
49272     "eDDot;": "\u2A77",
49273     "Edot;": "\u0116",
49274     "eDot;": "\u2251",
49275     "edot;": "\u0117",
49276     "ee;": "\u2147",
49277     "efDot;": "\u2252",
49278     "Efr;": "\uD835\uDD08",
49279     "efr;": "\uD835\uDD22",
49280     "eg;": "\u2A9A",
49281     "Egrave;": "\u00C8",
49282     "Egrave": "\u00C8",
49283     "egrave;": "\u00E8",
49284     "egrave": "\u00E8",
49285     "egs;": "\u2A96",
49286     "egsdot;": "\u2A98",
49287     "el;": "\u2A99",
49288     "Element;": "\u2208",
49289     "elinters;": "\u23E7",
49290     "ell;": "\u2113",
49291     "els;": "\u2A95",
49292     "elsdot;": "\u2A97",
49293     "Emacr;": "\u0112",
49294     "emacr;": "\u0113",
49295     "empty;": "\u2205",
49296     "emptyset;": "\u2205",
49297     "EmptySmallSquare;": "\u25FB",
49298     "emptyv;": "\u2205",
49299     "EmptyVerySmallSquare;": "\u25AB",
49300     "emsp;": "\u2003",
49301     "emsp13;": "\u2004",
49302     "emsp14;": "\u2005",
49303     "ENG;": "\u014A",
49304     "eng;": "\u014B",
49305     "ensp;": "\u2002",
49306     "Eogon;": "\u0118",
49307     "eogon;": "\u0119",
49308     "Eopf;": "\uD835\uDD3C",
49309     "eopf;": "\uD835\uDD56",
49310     "epar;": "\u22D5",
49311     "eparsl;": "\u29E3",
49312     "eplus;": "\u2A71",
49313     "epsi;": "\u03B5",
49314     "Epsilon;": "\u0395",
49315     "epsilon;": "\u03B5",
49316     "epsiv;": "\u03F5",
49317     "eqcirc;": "\u2256",
49318     "eqcolon;": "\u2255",
49319     "eqsim;": "\u2242",
49320     "eqslantgtr;": "\u2A96",
49321     "eqslantless;": "\u2A95",
49322     "Equal;": "\u2A75",
49323     "equals;": "\u003D",
49324     "EqualTilde;": "\u2242",
49325     "equest;": "\u225F",
49326     "Equilibrium;": "\u21CC",
49327     "equiv;": "\u2261",
49328     "equivDD;": "\u2A78",
49329     "eqvparsl;": "\u29E5",
49330     "erarr;": "\u2971",
49331     "erDot;": "\u2253",
49332     "Escr;": "\u2130",
49333     "escr;": "\u212F",
49334     "esdot;": "\u2250",
49335     "Esim;": "\u2A73",
49336     "esim;": "\u2242",
49337     "Eta;": "\u0397",
49338     "eta;": "\u03B7",
49339     "ETH;": "\u00D0",
49340     "ETH": "\u00D0",
49341     "eth;": "\u00F0",
49342     "eth": "\u00F0",
49343     "Euml;": "\u00CB",
49344     "Euml": "\u00CB",
49345     "euml;": "\u00EB",
49346     "euml": "\u00EB",
49347     "euro;": "\u20AC",
49348     "excl;": "\u0021",
49349     "exist;": "\u2203",
49350     "Exists;": "\u2203",
49351     "expectation;": "\u2130",
49352     "ExponentialE;": "\u2147",
49353     "exponentiale;": "\u2147",
49354     "fallingdotseq;": "\u2252",
49355     "Fcy;": "\u0424",
49356     "fcy;": "\u0444",
49357     "female;": "\u2640",
49358     "ffilig;": "\uFB03",
49359     "fflig;": "\uFB00",
49360     "ffllig;": "\uFB04",
49361     "Ffr;": "\uD835\uDD09",
49362     "ffr;": "\uD835\uDD23",
49363     "filig;": "\uFB01",
49364     "FilledSmallSquare;": "\u25FC",
49365     "FilledVerySmallSquare;": "\u25AA",
49366     "fjlig;": "\u0066\u006A",
49367     "flat;": "\u266D",
49368     "fllig;": "\uFB02",
49369     "fltns;": "\u25B1",
49370     "fnof;": "\u0192",
49371     "Fopf;": "\uD835\uDD3D",
49372     "fopf;": "\uD835\uDD57",
49373     "ForAll;": "\u2200",
49374     "forall;": "\u2200",
49375     "fork;": "\u22D4",
49376     "forkv;": "\u2AD9",
49377     "Fouriertrf;": "\u2131",
49378     "fpartint;": "\u2A0D",
49379     "frac12;": "\u00BD",
49380     "frac12": "\u00BD",
49381     "frac13;": "\u2153",
49382     "frac14;": "\u00BC",
49383     "frac14": "\u00BC",
49384     "frac15;": "\u2155",
49385     "frac16;": "\u2159",
49386     "frac18;": "\u215B",
49387     "frac23;": "\u2154",
49388     "frac25;": "\u2156",
49389     "frac34;": "\u00BE",
49390     "frac34": "\u00BE",
49391     "frac35;": "\u2157",
49392     "frac38;": "\u215C",
49393     "frac45;": "\u2158",
49394     "frac56;": "\u215A",
49395     "frac58;": "\u215D",
49396     "frac78;": "\u215E",
49397     "frasl;": "\u2044",
49398     "frown;": "\u2322",
49399     "Fscr;": "\u2131",
49400     "fscr;": "\uD835\uDCBB",
49401     "gacute;": "\u01F5",
49402     "Gamma;": "\u0393",
49403     "gamma;": "\u03B3",
49404     "Gammad;": "\u03DC",
49405     "gammad;": "\u03DD",
49406     "gap;": "\u2A86",
49407     "Gbreve;": "\u011E",
49408     "gbreve;": "\u011F",
49409     "Gcedil;": "\u0122",
49410     "Gcirc;": "\u011C",
49411     "gcirc;": "\u011D",
49412     "Gcy;": "\u0413",
49413     "gcy;": "\u0433",
49414     "Gdot;": "\u0120",
49415     "gdot;": "\u0121",
49416     "gE;": "\u2267",
49417     "ge;": "\u2265",
49418     "gEl;": "\u2A8C",
49419     "gel;": "\u22DB",
49420     "geq;": "\u2265",
49421     "geqq;": "\u2267",
49422     "geqslant;": "\u2A7E",
49423     "ges;": "\u2A7E",
49424     "gescc;": "\u2AA9",
49425     "gesdot;": "\u2A80",
49426     "gesdoto;": "\u2A82",
49427     "gesdotol;": "\u2A84",
49428     "gesl;": "\u22DB\uFE00",
49429     "gesles;": "\u2A94",
49430     "Gfr;": "\uD835\uDD0A",
49431     "gfr;": "\uD835\uDD24",
49432     "Gg;": "\u22D9",
49433     "gg;": "\u226B",
49434     "ggg;": "\u22D9",
49435     "gimel;": "\u2137",
49436     "GJcy;": "\u0403",
49437     "gjcy;": "\u0453",
49438     "gl;": "\u2277",
49439     "gla;": "\u2AA5",
49440     "glE;": "\u2A92",
49441     "glj;": "\u2AA4",
49442     "gnap;": "\u2A8A",
49443     "gnapprox;": "\u2A8A",
49444     "gnE;": "\u2269",
49445     "gne;": "\u2A88",
49446     "gneq;": "\u2A88",
49447     "gneqq;": "\u2269",
49448     "gnsim;": "\u22E7",
49449     "Gopf;": "\uD835\uDD3E",
49450     "gopf;": "\uD835\uDD58",
49451     "grave;": "\u0060",
49452     "GreaterEqual;": "\u2265",
49453     "GreaterEqualLess;": "\u22DB",
49454     "GreaterFullEqual;": "\u2267",
49455     "GreaterGreater;": "\u2AA2",
49456     "GreaterLess;": "\u2277",
49457     "GreaterSlantEqual;": "\u2A7E",
49458     "GreaterTilde;": "\u2273",
49459     "Gscr;": "\uD835\uDCA2",
49460     "gscr;": "\u210A",
49461     "gsim;": "\u2273",
49462     "gsime;": "\u2A8E",
49463     "gsiml;": "\u2A90",
49464     "GT;": "\u003E",
49465     "GT": "\u003E",
49466     "Gt;": "\u226B",
49467     "gt;": "\u003E",
49468     "gt": "\u003E",
49469     "gtcc;": "\u2AA7",
49470     "gtcir;": "\u2A7A",
49471     "gtdot;": "\u22D7",
49472     "gtlPar;": "\u2995",
49473     "gtquest;": "\u2A7C",
49474     "gtrapprox;": "\u2A86",
49475     "gtrarr;": "\u2978",
49476     "gtrdot;": "\u22D7",
49477     "gtreqless;": "\u22DB",
49478     "gtreqqless;": "\u2A8C",
49479     "gtrless;": "\u2277",
49480     "gtrsim;": "\u2273",
49481     "gvertneqq;": "\u2269\uFE00",
49482     "gvnE;": "\u2269\uFE00",
49483     "Hacek;": "\u02C7",
49484     "hairsp;": "\u200A",
49485     "half;": "\u00BD",
49486     "hamilt;": "\u210B",
49487     "HARDcy;": "\u042A",
49488     "hardcy;": "\u044A",
49489     "hArr;": "\u21D4",
49490     "harr;": "\u2194",
49491     "harrcir;": "\u2948",
49492     "harrw;": "\u21AD",
49493     "Hat;": "\u005E",
49494     "hbar;": "\u210F",
49495     "Hcirc;": "\u0124",
49496     "hcirc;": "\u0125",
49497     "hearts;": "\u2665",
49498     "heartsuit;": "\u2665",
49499     "hellip;": "\u2026",
49500     "hercon;": "\u22B9",
49501     "Hfr;": "\u210C",
49502     "hfr;": "\uD835\uDD25",
49503     "HilbertSpace;": "\u210B",
49504     "hksearow;": "\u2925",
49505     "hkswarow;": "\u2926",
49506     "hoarr;": "\u21FF",
49507     "homtht;": "\u223B",
49508     "hookleftarrow;": "\u21A9",
49509     "hookrightarrow;": "\u21AA",
49510     "Hopf;": "\u210D",
49511     "hopf;": "\uD835\uDD59",
49512     "horbar;": "\u2015",
49513     "HorizontalLine;": "\u2500",
49514     "Hscr;": "\u210B",
49515     "hscr;": "\uD835\uDCBD",
49516     "hslash;": "\u210F",
49517     "Hstrok;": "\u0126",
49518     "hstrok;": "\u0127",
49519     "HumpDownHump;": "\u224E",
49520     "HumpEqual;": "\u224F",
49521     "hybull;": "\u2043",
49522     "hyphen;": "\u2010",
49523     "Iacute;": "\u00CD",
49524     "Iacute": "\u00CD",
49525     "iacute;": "\u00ED",
49526     "iacute": "\u00ED",
49527     "ic;": "\u2063",
49528     "Icirc;": "\u00CE",
49529     "Icirc": "\u00CE",
49530     "icirc;": "\u00EE",
49531     "icirc": "\u00EE",
49532     "Icy;": "\u0418",
49533     "icy;": "\u0438",
49534     "Idot;": "\u0130",
49535     "IEcy;": "\u0415",
49536     "iecy;": "\u0435",
49537     "iexcl;": "\u00A1",
49538     "iexcl": "\u00A1",
49539     "iff;": "\u21D4",
49540     "Ifr;": "\u2111",
49541     "ifr;": "\uD835\uDD26",
49542     "Igrave;": "\u00CC",
49543     "Igrave": "\u00CC",
49544     "igrave;": "\u00EC",
49545     "igrave": "\u00EC",
49546     "ii;": "\u2148",
49547     "iiiint;": "\u2A0C",
49548     "iiint;": "\u222D",
49549     "iinfin;": "\u29DC",
49550     "iiota;": "\u2129",
49551     "IJlig;": "\u0132",
49552     "ijlig;": "\u0133",
49553     "Im;": "\u2111",
49554     "Imacr;": "\u012A",
49555     "imacr;": "\u012B",
49556     "image;": "\u2111",
49557     "ImaginaryI;": "\u2148",
49558     "imagline;": "\u2110",
49559     "imagpart;": "\u2111",
49560     "imath;": "\u0131",
49561     "imof;": "\u22B7",
49562     "imped;": "\u01B5",
49563     "Implies;": "\u21D2",
49564     "in;": "\u2208",
49565     "incare;": "\u2105",
49566     "infin;": "\u221E",
49567     "infintie;": "\u29DD",
49568     "inodot;": "\u0131",
49569     "Int;": "\u222C",
49570     "int;": "\u222B",
49571     "intcal;": "\u22BA",
49572     "integers;": "\u2124",
49573     "Integral;": "\u222B",
49574     "intercal;": "\u22BA",
49575     "Intersection;": "\u22C2",
49576     "intlarhk;": "\u2A17",
49577     "intprod;": "\u2A3C",
49578     "InvisibleComma;": "\u2063",
49579     "InvisibleTimes;": "\u2062",
49580     "IOcy;": "\u0401",
49581     "iocy;": "\u0451",
49582     "Iogon;": "\u012E",
49583     "iogon;": "\u012F",
49584     "Iopf;": "\uD835\uDD40",
49585     "iopf;": "\uD835\uDD5A",
49586     "Iota;": "\u0399",
49587     "iota;": "\u03B9",
49588     "iprod;": "\u2A3C",
49589     "iquest;": "\u00BF",
49590     "iquest": "\u00BF",
49591     "Iscr;": "\u2110",
49592     "iscr;": "\uD835\uDCBE",
49593     "isin;": "\u2208",
49594     "isindot;": "\u22F5",
49595     "isinE;": "\u22F9",
49596     "isins;": "\u22F4",
49597     "isinsv;": "\u22F3",
49598     "isinv;": "\u2208",
49599     "it;": "\u2062",
49600     "Itilde;": "\u0128",
49601     "itilde;": "\u0129",
49602     "Iukcy;": "\u0406",
49603     "iukcy;": "\u0456",
49604     "Iuml;": "\u00CF",
49605     "Iuml": "\u00CF",
49606     "iuml;": "\u00EF",
49607     "iuml": "\u00EF",
49608     "Jcirc;": "\u0134",
49609     "jcirc;": "\u0135",
49610     "Jcy;": "\u0419",
49611     "jcy;": "\u0439",
49612     "Jfr;": "\uD835\uDD0D",
49613     "jfr;": "\uD835\uDD27",
49614     "jmath;": "\u0237",
49615     "Jopf;": "\uD835\uDD41",
49616     "jopf;": "\uD835\uDD5B",
49617     "Jscr;": "\uD835\uDCA5",
49618     "jscr;": "\uD835\uDCBF",
49619     "Jsercy;": "\u0408",
49620     "jsercy;": "\u0458",
49621     "Jukcy;": "\u0404",
49622     "jukcy;": "\u0454",
49623     "Kappa;": "\u039A",
49624     "kappa;": "\u03BA",
49625     "kappav;": "\u03F0",
49626     "Kcedil;": "\u0136",
49627     "kcedil;": "\u0137",
49628     "Kcy;": "\u041A",
49629     "kcy;": "\u043A",
49630     "Kfr;": "\uD835\uDD0E",
49631     "kfr;": "\uD835\uDD28",
49632     "kgreen;": "\u0138",
49633     "KHcy;": "\u0425",
49634     "khcy;": "\u0445",
49635     "KJcy;": "\u040C",
49636     "kjcy;": "\u045C",
49637     "Kopf;": "\uD835\uDD42",
49638     "kopf;": "\uD835\uDD5C",
49639     "Kscr;": "\uD835\uDCA6",
49640     "kscr;": "\uD835\uDCC0",
49641     "lAarr;": "\u21DA",
49642     "Lacute;": "\u0139",
49643     "lacute;": "\u013A",
49644     "laemptyv;": "\u29B4",
49645     "lagran;": "\u2112",
49646     "Lambda;": "\u039B",
49647     "lambda;": "\u03BB",
49648     "Lang;": "\u27EA",
49649     "lang;": "\u27E8",
49650     "langd;": "\u2991",
49651     "langle;": "\u27E8",
49652     "lap;": "\u2A85",
49653     "Laplacetrf;": "\u2112",
49654     "laquo;": "\u00AB",
49655     "laquo": "\u00AB",
49656     "Larr;": "\u219E",
49657     "lArr;": "\u21D0",
49658     "larr;": "\u2190",
49659     "larrb;": "\u21E4",
49660     "larrbfs;": "\u291F",
49661     "larrfs;": "\u291D",
49662     "larrhk;": "\u21A9",
49663     "larrlp;": "\u21AB",
49664     "larrpl;": "\u2939",
49665     "larrsim;": "\u2973",
49666     "larrtl;": "\u21A2",
49667     "lat;": "\u2AAB",
49668     "lAtail;": "\u291B",
49669     "latail;": "\u2919",
49670     "late;": "\u2AAD",
49671     "lates;": "\u2AAD\uFE00",
49672     "lBarr;": "\u290E",
49673     "lbarr;": "\u290C",
49674     "lbbrk;": "\u2772",
49675     "lbrace;": "\u007B",
49676     "lbrack;": "\u005B",
49677     "lbrke;": "\u298B",
49678     "lbrksld;": "\u298F",
49679     "lbrkslu;": "\u298D",
49680     "Lcaron;": "\u013D",
49681     "lcaron;": "\u013E",
49682     "Lcedil;": "\u013B",
49683     "lcedil;": "\u013C",
49684     "lceil;": "\u2308",
49685     "lcub;": "\u007B",
49686     "Lcy;": "\u041B",
49687     "lcy;": "\u043B",
49688     "ldca;": "\u2936",
49689     "ldquo;": "\u201C",
49690     "ldquor;": "\u201E",
49691     "ldrdhar;": "\u2967",
49692     "ldrushar;": "\u294B",
49693     "ldsh;": "\u21B2",
49694     "lE;": "\u2266",
49695     "le;": "\u2264",
49696     "LeftAngleBracket;": "\u27E8",
49697     "LeftArrow;": "\u2190",
49698     "Leftarrow;": "\u21D0",
49699     "leftarrow;": "\u2190",
49700     "LeftArrowBar;": "\u21E4",
49701     "LeftArrowRightArrow;": "\u21C6",
49702     "leftarrowtail;": "\u21A2",
49703     "LeftCeiling;": "\u2308",
49704     "LeftDoubleBracket;": "\u27E6",
49705     "LeftDownTeeVector;": "\u2961",
49706     "LeftDownVector;": "\u21C3",
49707     "LeftDownVectorBar;": "\u2959",
49708     "LeftFloor;": "\u230A",
49709     "leftharpoondown;": "\u21BD",
49710     "leftharpoonup;": "\u21BC",
49711     "leftleftarrows;": "\u21C7",
49712     "LeftRightArrow;": "\u2194",
49713     "Leftrightarrow;": "\u21D4",
49714     "leftrightarrow;": "\u2194",
49715     "leftrightarrows;": "\u21C6",
49716     "leftrightharpoons;": "\u21CB",
49717     "leftrightsquigarrow;": "\u21AD",
49718     "LeftRightVector;": "\u294E",
49719     "LeftTee;": "\u22A3",
49720     "LeftTeeArrow;": "\u21A4",
49721     "LeftTeeVector;": "\u295A",
49722     "leftthreetimes;": "\u22CB",
49723     "LeftTriangle;": "\u22B2",
49724     "LeftTriangleBar;": "\u29CF",
49725     "LeftTriangleEqual;": "\u22B4",
49726     "LeftUpDownVector;": "\u2951",
49727     "LeftUpTeeVector;": "\u2960",
49728     "LeftUpVector;": "\u21BF",
49729     "LeftUpVectorBar;": "\u2958",
49730     "LeftVector;": "\u21BC",
49731     "LeftVectorBar;": "\u2952",
49732     "lEg;": "\u2A8B",
49733     "leg;": "\u22DA",
49734     "leq;": "\u2264",
49735     "leqq;": "\u2266",
49736     "leqslant;": "\u2A7D",
49737     "les;": "\u2A7D",
49738     "lescc;": "\u2AA8",
49739     "lesdot;": "\u2A7F",
49740     "lesdoto;": "\u2A81",
49741     "lesdotor;": "\u2A83",
49742     "lesg;": "\u22DA\uFE00",
49743     "lesges;": "\u2A93",
49744     "lessapprox;": "\u2A85",
49745     "lessdot;": "\u22D6",
49746     "lesseqgtr;": "\u22DA",
49747     "lesseqqgtr;": "\u2A8B",
49748     "LessEqualGreater;": "\u22DA",
49749     "LessFullEqual;": "\u2266",
49750     "LessGreater;": "\u2276",
49751     "lessgtr;": "\u2276",
49752     "LessLess;": "\u2AA1",
49753     "lesssim;": "\u2272",
49754     "LessSlantEqual;": "\u2A7D",
49755     "LessTilde;": "\u2272",
49756     "lfisht;": "\u297C",
49757     "lfloor;": "\u230A",
49758     "Lfr;": "\uD835\uDD0F",
49759     "lfr;": "\uD835\uDD29",
49760     "lg;": "\u2276",
49761     "lgE;": "\u2A91",
49762     "lHar;": "\u2962",
49763     "lhard;": "\u21BD",
49764     "lharu;": "\u21BC",
49765     "lharul;": "\u296A",
49766     "lhblk;": "\u2584",
49767     "LJcy;": "\u0409",
49768     "ljcy;": "\u0459",
49769     "Ll;": "\u22D8",
49770     "ll;": "\u226A",
49771     "llarr;": "\u21C7",
49772     "llcorner;": "\u231E",
49773     "Lleftarrow;": "\u21DA",
49774     "llhard;": "\u296B",
49775     "lltri;": "\u25FA",
49776     "Lmidot;": "\u013F",
49777     "lmidot;": "\u0140",
49778     "lmoust;": "\u23B0",
49779     "lmoustache;": "\u23B0",
49780     "lnap;": "\u2A89",
49781     "lnapprox;": "\u2A89",
49782     "lnE;": "\u2268",
49783     "lne;": "\u2A87",
49784     "lneq;": "\u2A87",
49785     "lneqq;": "\u2268",
49786     "lnsim;": "\u22E6",
49787     "loang;": "\u27EC",
49788     "loarr;": "\u21FD",
49789     "lobrk;": "\u27E6",
49790     "LongLeftArrow;": "\u27F5",
49791     "Longleftarrow;": "\u27F8",
49792     "longleftarrow;": "\u27F5",
49793     "LongLeftRightArrow;": "\u27F7",
49794     "Longleftrightarrow;": "\u27FA",
49795     "longleftrightarrow;": "\u27F7",
49796     "longmapsto;": "\u27FC",
49797     "LongRightArrow;": "\u27F6",
49798     "Longrightarrow;": "\u27F9",
49799     "longrightarrow;": "\u27F6",
49800     "looparrowleft;": "\u21AB",
49801     "looparrowright;": "\u21AC",
49802     "lopar;": "\u2985",
49803     "Lopf;": "\uD835\uDD43",
49804     "lopf;": "\uD835\uDD5D",
49805     "loplus;": "\u2A2D",
49806     "lotimes;": "\u2A34",
49807     "lowast;": "\u2217",
49808     "lowbar;": "\u005F",
49809     "LowerLeftArrow;": "\u2199",
49810     "LowerRightArrow;": "\u2198",
49811     "loz;": "\u25CA",
49812     "lozenge;": "\u25CA",
49813     "lozf;": "\u29EB",
49814     "lpar;": "\u0028",
49815     "lparlt;": "\u2993",
49816     "lrarr;": "\u21C6",
49817     "lrcorner;": "\u231F",
49818     "lrhar;": "\u21CB",
49819     "lrhard;": "\u296D",
49820     "lrm;": "\u200E",
49821     "lrtri;": "\u22BF",
49822     "lsaquo;": "\u2039",
49823     "Lscr;": "\u2112",
49824     "lscr;": "\uD835\uDCC1",
49825     "Lsh;": "\u21B0",
49826     "lsh;": "\u21B0",
49827     "lsim;": "\u2272",
49828     "lsime;": "\u2A8D",
49829     "lsimg;": "\u2A8F",
49830     "lsqb;": "\u005B",
49831     "lsquo;": "\u2018",
49832     "lsquor;": "\u201A",
49833     "Lstrok;": "\u0141",
49834     "lstrok;": "\u0142",
49835     "LT;": "\u003C",
49836     "LT": "\u003C",
49837     "Lt;": "\u226A",
49838     "lt;": "\u003C",
49839     "lt": "\u003C",
49840     "ltcc;": "\u2AA6",
49841     "ltcir;": "\u2A79",
49842     "ltdot;": "\u22D6",
49843     "lthree;": "\u22CB",
49844     "ltimes;": "\u22C9",
49845     "ltlarr;": "\u2976",
49846     "ltquest;": "\u2A7B",
49847     "ltri;": "\u25C3",
49848     "ltrie;": "\u22B4",
49849     "ltrif;": "\u25C2",
49850     "ltrPar;": "\u2996",
49851     "lurdshar;": "\u294A",
49852     "luruhar;": "\u2966",
49853     "lvertneqq;": "\u2268\uFE00",
49854     "lvnE;": "\u2268\uFE00",
49855     "macr;": "\u00AF",
49856     "macr": "\u00AF",
49857     "male;": "\u2642",
49858     "malt;": "\u2720",
49859     "maltese;": "\u2720",
49860     "Map;": "\u2905",
49861     "map;": "\u21A6",
49862     "mapsto;": "\u21A6",
49863     "mapstodown;": "\u21A7",
49864     "mapstoleft;": "\u21A4",
49865     "mapstoup;": "\u21A5",
49866     "marker;": "\u25AE",
49867     "mcomma;": "\u2A29",
49868     "Mcy;": "\u041C",
49869     "mcy;": "\u043C",
49870     "mdash;": "\u2014",
49871     "mDDot;": "\u223A",
49872     "measuredangle;": "\u2221",
49873     "MediumSpace;": "\u205F",
49874     "Mellintrf;": "\u2133",
49875     "Mfr;": "\uD835\uDD10",
49876     "mfr;": "\uD835\uDD2A",
49877     "mho;": "\u2127",
49878     "micro;": "\u00B5",
49879     "micro": "\u00B5",
49880     "mid;": "\u2223",
49881     "midast;": "\u002A",
49882     "midcir;": "\u2AF0",
49883     "middot;": "\u00B7",
49884     "middot": "\u00B7",
49885     "minus;": "\u2212",
49886     "minusb;": "\u229F",
49887     "minusd;": "\u2238",
49888     "minusdu;": "\u2A2A",
49889     "MinusPlus;": "\u2213",
49890     "mlcp;": "\u2ADB",
49891     "mldr;": "\u2026",
49892     "mnplus;": "\u2213",
49893     "models;": "\u22A7",
49894     "Mopf;": "\uD835\uDD44",
49895     "mopf;": "\uD835\uDD5E",
49896     "mp;": "\u2213",
49897     "Mscr;": "\u2133",
49898     "mscr;": "\uD835\uDCC2",
49899     "mstpos;": "\u223E",
49900     "Mu;": "\u039C",
49901     "mu;": "\u03BC",
49902     "multimap;": "\u22B8",
49903     "mumap;": "\u22B8",
49904     "nabla;": "\u2207",
49905     "Nacute;": "\u0143",
49906     "nacute;": "\u0144",
49907     "nang;": "\u2220\u20D2",
49908     "nap;": "\u2249",
49909     "napE;": "\u2A70\u0338",
49910     "napid;": "\u224B\u0338",
49911     "napos;": "\u0149",
49912     "napprox;": "\u2249",
49913     "natur;": "\u266E",
49914     "natural;": "\u266E",
49915     "naturals;": "\u2115",
49916     "nbsp;": "\u00A0",
49917     "nbsp": "\u00A0",
49918     "nbump;": "\u224E\u0338",
49919     "nbumpe;": "\u224F\u0338",
49920     "ncap;": "\u2A43",
49921     "Ncaron;": "\u0147",
49922     "ncaron;": "\u0148",
49923     "Ncedil;": "\u0145",
49924     "ncedil;": "\u0146",
49925     "ncong;": "\u2247",
49926     "ncongdot;": "\u2A6D\u0338",
49927     "ncup;": "\u2A42",
49928     "Ncy;": "\u041D",
49929     "ncy;": "\u043D",
49930     "ndash;": "\u2013",
49931     "ne;": "\u2260",
49932     "nearhk;": "\u2924",
49933     "neArr;": "\u21D7",
49934     "nearr;": "\u2197",
49935     "nearrow;": "\u2197",
49936     "nedot;": "\u2250\u0338",
49937     "NegativeMediumSpace;": "\u200B",
49938     "NegativeThickSpace;": "\u200B",
49939     "NegativeThinSpace;": "\u200B",
49940     "NegativeVeryThinSpace;": "\u200B",
49941     "nequiv;": "\u2262",
49942     "nesear;": "\u2928",
49943     "nesim;": "\u2242\u0338",
49944     "NestedGreaterGreater;": "\u226B",
49945     "NestedLessLess;": "\u226A",
49946     "NewLine;": "\u000A",
49947     "nexist;": "\u2204",
49948     "nexists;": "\u2204",
49949     "Nfr;": "\uD835\uDD11",
49950     "nfr;": "\uD835\uDD2B",
49951     "ngE;": "\u2267\u0338",
49952     "nge;": "\u2271",
49953     "ngeq;": "\u2271",
49954     "ngeqq;": "\u2267\u0338",
49955     "ngeqslant;": "\u2A7E\u0338",
49956     "nges;": "\u2A7E\u0338",
49957     "nGg;": "\u22D9\u0338",
49958     "ngsim;": "\u2275",
49959     "nGt;": "\u226B\u20D2",
49960     "ngt;": "\u226F",
49961     "ngtr;": "\u226F",
49962     "nGtv;": "\u226B\u0338",
49963     "nhArr;": "\u21CE",
49964     "nharr;": "\u21AE",
49965     "nhpar;": "\u2AF2",
49966     "ni;": "\u220B",
49967     "nis;": "\u22FC",
49968     "nisd;": "\u22FA",
49969     "niv;": "\u220B",
49970     "NJcy;": "\u040A",
49971     "njcy;": "\u045A",
49972     "nlArr;": "\u21CD",
49973     "nlarr;": "\u219A",
49974     "nldr;": "\u2025",
49975     "nlE;": "\u2266\u0338",
49976     "nle;": "\u2270",
49977     "nLeftarrow;": "\u21CD",
49978     "nleftarrow;": "\u219A",
49979     "nLeftrightarrow;": "\u21CE",
49980     "nleftrightarrow;": "\u21AE",
49981     "nleq;": "\u2270",
49982     "nleqq;": "\u2266\u0338",
49983     "nleqslant;": "\u2A7D\u0338",
49984     "nles;": "\u2A7D\u0338",
49985     "nless;": "\u226E",
49986     "nLl;": "\u22D8\u0338",
49987     "nlsim;": "\u2274",
49988     "nLt;": "\u226A\u20D2",
49989     "nlt;": "\u226E",
49990     "nltri;": "\u22EA",
49991     "nltrie;": "\u22EC",
49992     "nLtv;": "\u226A\u0338",
49993     "nmid;": "\u2224",
49994     "NoBreak;": "\u2060",
49995     "NonBreakingSpace;": "\u00A0",
49996     "Nopf;": "\u2115",
49997     "nopf;": "\uD835\uDD5F",
49998     "Not;": "\u2AEC",
49999     "not;": "\u00AC",
50000     "not": "\u00AC",
50001     "NotCongruent;": "\u2262",
50002     "NotCupCap;": "\u226D",
50003     "NotDoubleVerticalBar;": "\u2226",
50004     "NotElement;": "\u2209",
50005     "NotEqual;": "\u2260",
50006     "NotEqualTilde;": "\u2242\u0338",
50007     "NotExists;": "\u2204",
50008     "NotGreater;": "\u226F",
50009     "NotGreaterEqual;": "\u2271",
50010     "NotGreaterFullEqual;": "\u2267\u0338",
50011     "NotGreaterGreater;": "\u226B\u0338",
50012     "NotGreaterLess;": "\u2279",
50013     "NotGreaterSlantEqual;": "\u2A7E\u0338",
50014     "NotGreaterTilde;": "\u2275",
50015     "NotHumpDownHump;": "\u224E\u0338",
50016     "NotHumpEqual;": "\u224F\u0338",
50017     "notin;": "\u2209",
50018     "notindot;": "\u22F5\u0338",
50019     "notinE;": "\u22F9\u0338",
50020     "notinva;": "\u2209",
50021     "notinvb;": "\u22F7",
50022     "notinvc;": "\u22F6",
50023     "NotLeftTriangle;": "\u22EA",
50024     "NotLeftTriangleBar;": "\u29CF\u0338",
50025     "NotLeftTriangleEqual;": "\u22EC",
50026     "NotLess;": "\u226E",
50027     "NotLessEqual;": "\u2270",
50028     "NotLessGreater;": "\u2278",
50029     "NotLessLess;": "\u226A\u0338",
50030     "NotLessSlantEqual;": "\u2A7D\u0338",
50031     "NotLessTilde;": "\u2274",
50032     "NotNestedGreaterGreater;": "\u2AA2\u0338",
50033     "NotNestedLessLess;": "\u2AA1\u0338",
50034     "notni;": "\u220C",
50035     "notniva;": "\u220C",
50036     "notnivb;": "\u22FE",
50037     "notnivc;": "\u22FD",
50038     "NotPrecedes;": "\u2280",
50039     "NotPrecedesEqual;": "\u2AAF\u0338",
50040     "NotPrecedesSlantEqual;": "\u22E0",
50041     "NotReverseElement;": "\u220C",
50042     "NotRightTriangle;": "\u22EB",
50043     "NotRightTriangleBar;": "\u29D0\u0338",
50044     "NotRightTriangleEqual;": "\u22ED",
50045     "NotSquareSubset;": "\u228F\u0338",
50046     "NotSquareSubsetEqual;": "\u22E2",
50047     "NotSquareSuperset;": "\u2290\u0338",
50048     "NotSquareSupersetEqual;": "\u22E3",
50049     "NotSubset;": "\u2282\u20D2",
50050     "NotSubsetEqual;": "\u2288",
50051     "NotSucceeds;": "\u2281",
50052     "NotSucceedsEqual;": "\u2AB0\u0338",
50053     "NotSucceedsSlantEqual;": "\u22E1",
50054     "NotSucceedsTilde;": "\u227F\u0338",
50055     "NotSuperset;": "\u2283\u20D2",
50056     "NotSupersetEqual;": "\u2289",
50057     "NotTilde;": "\u2241",
50058     "NotTildeEqual;": "\u2244",
50059     "NotTildeFullEqual;": "\u2247",
50060     "NotTildeTilde;": "\u2249",
50061     "NotVerticalBar;": "\u2224",
50062     "npar;": "\u2226",
50063     "nparallel;": "\u2226",
50064     "nparsl;": "\u2AFD\u20E5",
50065     "npart;": "\u2202\u0338",
50066     "npolint;": "\u2A14",
50067     "npr;": "\u2280",
50068     "nprcue;": "\u22E0",
50069     "npre;": "\u2AAF\u0338",
50070     "nprec;": "\u2280",
50071     "npreceq;": "\u2AAF\u0338",
50072     "nrArr;": "\u21CF",
50073     "nrarr;": "\u219B",
50074     "nrarrc;": "\u2933\u0338",
50075     "nrarrw;": "\u219D\u0338",
50076     "nRightarrow;": "\u21CF",
50077     "nrightarrow;": "\u219B",
50078     "nrtri;": "\u22EB",
50079     "nrtrie;": "\u22ED",
50080     "nsc;": "\u2281",
50081     "nsccue;": "\u22E1",
50082     "nsce;": "\u2AB0\u0338",
50083     "Nscr;": "\uD835\uDCA9",
50084     "nscr;": "\uD835\uDCC3",
50085     "nshortmid;": "\u2224",
50086     "nshortparallel;": "\u2226",
50087     "nsim;": "\u2241",
50088     "nsime;": "\u2244",
50089     "nsimeq;": "\u2244",
50090     "nsmid;": "\u2224",
50091     "nspar;": "\u2226",
50092     "nsqsube;": "\u22E2",
50093     "nsqsupe;": "\u22E3",
50094     "nsub;": "\u2284",
50095     "nsubE;": "\u2AC5\u0338",
50096     "nsube;": "\u2288",
50097     "nsubset;": "\u2282\u20D2",
50098     "nsubseteq;": "\u2288",
50099     "nsubseteqq;": "\u2AC5\u0338",
50100     "nsucc;": "\u2281",
50101     "nsucceq;": "\u2AB0\u0338",
50102     "nsup;": "\u2285",
50103     "nsupE;": "\u2AC6\u0338",
50104     "nsupe;": "\u2289",
50105     "nsupset;": "\u2283\u20D2",
50106     "nsupseteq;": "\u2289",
50107     "nsupseteqq;": "\u2AC6\u0338",
50108     "ntgl;": "\u2279",
50109     "Ntilde;": "\u00D1",
50110     "Ntilde": "\u00D1",
50111     "ntilde;": "\u00F1",
50112     "ntilde": "\u00F1",
50113     "ntlg;": "\u2278",
50114     "ntriangleleft;": "\u22EA",
50115     "ntrianglelefteq;": "\u22EC",
50116     "ntriangleright;": "\u22EB",
50117     "ntrianglerighteq;": "\u22ED",
50118     "Nu;": "\u039D",
50119     "nu;": "\u03BD",
50120     "num;": "\u0023",
50121     "numero;": "\u2116",
50122     "numsp;": "\u2007",
50123     "nvap;": "\u224D\u20D2",
50124     "nVDash;": "\u22AF",
50125     "nVdash;": "\u22AE",
50126     "nvDash;": "\u22AD",
50127     "nvdash;": "\u22AC",
50128     "nvge;": "\u2265\u20D2",
50129     "nvgt;": "\u003E\u20D2",
50130     "nvHarr;": "\u2904",
50131     "nvinfin;": "\u29DE",
50132     "nvlArr;": "\u2902",
50133     "nvle;": "\u2264\u20D2",
50134     "nvlt;": "\u003C\u20D2",
50135     "nvltrie;": "\u22B4\u20D2",
50136     "nvrArr;": "\u2903",
50137     "nvrtrie;": "\u22B5\u20D2",
50138     "nvsim;": "\u223C\u20D2",
50139     "nwarhk;": "\u2923",
50140     "nwArr;": "\u21D6",
50141     "nwarr;": "\u2196",
50142     "nwarrow;": "\u2196",
50143     "nwnear;": "\u2927",
50144     "Oacute;": "\u00D3",
50145     "Oacute": "\u00D3",
50146     "oacute;": "\u00F3",
50147     "oacute": "\u00F3",
50148     "oast;": "\u229B",
50149     "ocir;": "\u229A",
50150     "Ocirc;": "\u00D4",
50151     "Ocirc": "\u00D4",
50152     "ocirc;": "\u00F4",
50153     "ocirc": "\u00F4",
50154     "Ocy;": "\u041E",
50155     "ocy;": "\u043E",
50156     "odash;": "\u229D",
50157     "Odblac;": "\u0150",
50158     "odblac;": "\u0151",
50159     "odiv;": "\u2A38",
50160     "odot;": "\u2299",
50161     "odsold;": "\u29BC",
50162     "OElig;": "\u0152",
50163     "oelig;": "\u0153",
50164     "ofcir;": "\u29BF",
50165     "Ofr;": "\uD835\uDD12",
50166     "ofr;": "\uD835\uDD2C",
50167     "ogon;": "\u02DB",
50168     "Ograve;": "\u00D2",
50169     "Ograve": "\u00D2",
50170     "ograve;": "\u00F2",
50171     "ograve": "\u00F2",
50172     "ogt;": "\u29C1",
50173     "ohbar;": "\u29B5",
50174     "ohm;": "\u03A9",
50175     "oint;": "\u222E",
50176     "olarr;": "\u21BA",
50177     "olcir;": "\u29BE",
50178     "olcross;": "\u29BB",
50179     "oline;": "\u203E",
50180     "olt;": "\u29C0",
50181     "Omacr;": "\u014C",
50182     "omacr;": "\u014D",
50183     "Omega;": "\u03A9",
50184     "omega;": "\u03C9",
50185     "Omicron;": "\u039F",
50186     "omicron;": "\u03BF",
50187     "omid;": "\u29B6",
50188     "ominus;": "\u2296",
50189     "Oopf;": "\uD835\uDD46",
50190     "oopf;": "\uD835\uDD60",
50191     "opar;": "\u29B7",
50192     "OpenCurlyDoubleQuote;": "\u201C",
50193     "OpenCurlyQuote;": "\u2018",
50194     "operp;": "\u29B9",
50195     "oplus;": "\u2295",
50196     "Or;": "\u2A54",
50197     "or;": "\u2228",
50198     "orarr;": "\u21BB",
50199     "ord;": "\u2A5D",
50200     "order;": "\u2134",
50201     "orderof;": "\u2134",
50202     "ordf;": "\u00AA",
50203     "ordf": "\u00AA",
50204     "ordm;": "\u00BA",
50205     "ordm": "\u00BA",
50206     "origof;": "\u22B6",
50207     "oror;": "\u2A56",
50208     "orslope;": "\u2A57",
50209     "orv;": "\u2A5B",
50210     "oS;": "\u24C8",
50211     "Oscr;": "\uD835\uDCAA",
50212     "oscr;": "\u2134",
50213     "Oslash;": "\u00D8",
50214     "Oslash": "\u00D8",
50215     "oslash;": "\u00F8",
50216     "oslash": "\u00F8",
50217     "osol;": "\u2298",
50218     "Otilde;": "\u00D5",
50219     "Otilde": "\u00D5",
50220     "otilde;": "\u00F5",
50221     "otilde": "\u00F5",
50222     "Otimes;": "\u2A37",
50223     "otimes;": "\u2297",
50224     "otimesas;": "\u2A36",
50225     "Ouml;": "\u00D6",
50226     "Ouml": "\u00D6",
50227     "ouml;": "\u00F6",
50228     "ouml": "\u00F6",
50229     "ovbar;": "\u233D",
50230     "OverBar;": "\u203E",
50231     "OverBrace;": "\u23DE",
50232     "OverBracket;": "\u23B4",
50233     "OverParenthesis;": "\u23DC",
50234     "par;": "\u2225",
50235     "para;": "\u00B6",
50236     "para": "\u00B6",
50237     "parallel;": "\u2225",
50238     "parsim;": "\u2AF3",
50239     "parsl;": "\u2AFD",
50240     "part;": "\u2202",
50241     "PartialD;": "\u2202",
50242     "Pcy;": "\u041F",
50243     "pcy;": "\u043F",
50244     "percnt;": "\u0025",
50245     "period;": "\u002E",
50246     "permil;": "\u2030",
50247     "perp;": "\u22A5",
50248     "pertenk;": "\u2031",
50249     "Pfr;": "\uD835\uDD13",
50250     "pfr;": "\uD835\uDD2D",
50251     "Phi;": "\u03A6",
50252     "phi;": "\u03C6",
50253     "phiv;": "\u03D5",
50254     "phmmat;": "\u2133",
50255     "phone;": "\u260E",
50256     "Pi;": "\u03A0",
50257     "pi;": "\u03C0",
50258     "pitchfork;": "\u22D4",
50259     "piv;": "\u03D6",
50260     "planck;": "\u210F",
50261     "planckh;": "\u210E",
50262     "plankv;": "\u210F",
50263     "plus;": "\u002B",
50264     "plusacir;": "\u2A23",
50265     "plusb;": "\u229E",
50266     "pluscir;": "\u2A22",
50267     "plusdo;": "\u2214",
50268     "plusdu;": "\u2A25",
50269     "pluse;": "\u2A72",
50270     "PlusMinus;": "\u00B1",
50271     "plusmn;": "\u00B1",
50272     "plusmn": "\u00B1",
50273     "plussim;": "\u2A26",
50274     "plustwo;": "\u2A27",
50275     "pm;": "\u00B1",
50276     "Poincareplane;": "\u210C",
50277     "pointint;": "\u2A15",
50278     "Popf;": "\u2119",
50279     "popf;": "\uD835\uDD61",
50280     "pound;": "\u00A3",
50281     "pound": "\u00A3",
50282     "Pr;": "\u2ABB",
50283     "pr;": "\u227A",
50284     "prap;": "\u2AB7",
50285     "prcue;": "\u227C",
50286     "prE;": "\u2AB3",
50287     "pre;": "\u2AAF",
50288     "prec;": "\u227A",
50289     "precapprox;": "\u2AB7",
50290     "preccurlyeq;": "\u227C",
50291     "Precedes;": "\u227A",
50292     "PrecedesEqual;": "\u2AAF",
50293     "PrecedesSlantEqual;": "\u227C",
50294     "PrecedesTilde;": "\u227E",
50295     "preceq;": "\u2AAF",
50296     "precnapprox;": "\u2AB9",
50297     "precneqq;": "\u2AB5",
50298     "precnsim;": "\u22E8",
50299     "precsim;": "\u227E",
50300     "Prime;": "\u2033",
50301     "prime;": "\u2032",
50302     "primes;": "\u2119",
50303     "prnap;": "\u2AB9",
50304     "prnE;": "\u2AB5",
50305     "prnsim;": "\u22E8",
50306     "prod;": "\u220F",
50307     "Product;": "\u220F",
50308     "profalar;": "\u232E",
50309     "profline;": "\u2312",
50310     "profsurf;": "\u2313",
50311     "prop;": "\u221D",
50312     "Proportion;": "\u2237",
50313     "Proportional;": "\u221D",
50314     "propto;": "\u221D",
50315     "prsim;": "\u227E",
50316     "prurel;": "\u22B0",
50317     "Pscr;": "\uD835\uDCAB",
50318     "pscr;": "\uD835\uDCC5",
50319     "Psi;": "\u03A8",
50320     "psi;": "\u03C8",
50321     "puncsp;": "\u2008",
50322     "Qfr;": "\uD835\uDD14",
50323     "qfr;": "\uD835\uDD2E",
50324     "qint;": "\u2A0C",
50325     "Qopf;": "\u211A",
50326     "qopf;": "\uD835\uDD62",
50327     "qprime;": "\u2057",
50328     "Qscr;": "\uD835\uDCAC",
50329     "qscr;": "\uD835\uDCC6",
50330     "quaternions;": "\u210D",
50331     "quatint;": "\u2A16",
50332     "quest;": "\u003F",
50333     "questeq;": "\u225F",
50334     "QUOT;": "\u0022",
50335     "QUOT": "\u0022",
50336     "quot;": "\u0022",
50337     "quot": "\u0022",
50338     "rAarr;": "\u21DB",
50339     "race;": "\u223D\u0331",
50340     "Racute;": "\u0154",
50341     "racute;": "\u0155",
50342     "radic;": "\u221A",
50343     "raemptyv;": "\u29B3",
50344     "Rang;": "\u27EB",
50345     "rang;": "\u27E9",
50346     "rangd;": "\u2992",
50347     "range;": "\u29A5",
50348     "rangle;": "\u27E9",
50349     "raquo;": "\u00BB",
50350     "raquo": "\u00BB",
50351     "Rarr;": "\u21A0",
50352     "rArr;": "\u21D2",
50353     "rarr;": "\u2192",
50354     "rarrap;": "\u2975",
50355     "rarrb;": "\u21E5",
50356     "rarrbfs;": "\u2920",
50357     "rarrc;": "\u2933",
50358     "rarrfs;": "\u291E",
50359     "rarrhk;": "\u21AA",
50360     "rarrlp;": "\u21AC",
50361     "rarrpl;": "\u2945",
50362     "rarrsim;": "\u2974",
50363     "Rarrtl;": "\u2916",
50364     "rarrtl;": "\u21A3",
50365     "rarrw;": "\u219D",
50366     "rAtail;": "\u291C",
50367     "ratail;": "\u291A",
50368     "ratio;": "\u2236",
50369     "rationals;": "\u211A",
50370     "RBarr;": "\u2910",
50371     "rBarr;": "\u290F",
50372     "rbarr;": "\u290D",
50373     "rbbrk;": "\u2773",
50374     "rbrace;": "\u007D",
50375     "rbrack;": "\u005D",
50376     "rbrke;": "\u298C",
50377     "rbrksld;": "\u298E",
50378     "rbrkslu;": "\u2990",
50379     "Rcaron;": "\u0158",
50380     "rcaron;": "\u0159",
50381     "Rcedil;": "\u0156",
50382     "rcedil;": "\u0157",
50383     "rceil;": "\u2309",
50384     "rcub;": "\u007D",
50385     "Rcy;": "\u0420",
50386     "rcy;": "\u0440",
50387     "rdca;": "\u2937",
50388     "rdldhar;": "\u2969",
50389     "rdquo;": "\u201D",
50390     "rdquor;": "\u201D",
50391     "rdsh;": "\u21B3",
50392     "Re;": "\u211C",
50393     "real;": "\u211C",
50394     "realine;": "\u211B",
50395     "realpart;": "\u211C",
50396     "reals;": "\u211D",
50397     "rect;": "\u25AD",
50398     "REG;": "\u00AE",
50399     "REG": "\u00AE",
50400     "reg;": "\u00AE",
50401     "reg": "\u00AE",
50402     "ReverseElement;": "\u220B",
50403     "ReverseEquilibrium;": "\u21CB",
50404     "ReverseUpEquilibrium;": "\u296F",
50405     "rfisht;": "\u297D",
50406     "rfloor;": "\u230B",
50407     "Rfr;": "\u211C",
50408     "rfr;": "\uD835\uDD2F",
50409     "rHar;": "\u2964",
50410     "rhard;": "\u21C1",
50411     "rharu;": "\u21C0",
50412     "rharul;": "\u296C",
50413     "Rho;": "\u03A1",
50414     "rho;": "\u03C1",
50415     "rhov;": "\u03F1",
50416     "RightAngleBracket;": "\u27E9",
50417     "RightArrow;": "\u2192",
50418     "Rightarrow;": "\u21D2",
50419     "rightarrow;": "\u2192",
50420     "RightArrowBar;": "\u21E5",
50421     "RightArrowLeftArrow;": "\u21C4",
50422     "rightarrowtail;": "\u21A3",
50423     "RightCeiling;": "\u2309",
50424     "RightDoubleBracket;": "\u27E7",
50425     "RightDownTeeVector;": "\u295D",
50426     "RightDownVector;": "\u21C2",
50427     "RightDownVectorBar;": "\u2955",
50428     "RightFloor;": "\u230B",
50429     "rightharpoondown;": "\u21C1",
50430     "rightharpoonup;": "\u21C0",
50431     "rightleftarrows;": "\u21C4",
50432     "rightleftharpoons;": "\u21CC",
50433     "rightrightarrows;": "\u21C9",
50434     "rightsquigarrow;": "\u219D",
50435     "RightTee;": "\u22A2",
50436     "RightTeeArrow;": "\u21A6",
50437     "RightTeeVector;": "\u295B",
50438     "rightthreetimes;": "\u22CC",
50439     "RightTriangle;": "\u22B3",
50440     "RightTriangleBar;": "\u29D0",
50441     "RightTriangleEqual;": "\u22B5",
50442     "RightUpDownVector;": "\u294F",
50443     "RightUpTeeVector;": "\u295C",
50444     "RightUpVector;": "\u21BE",
50445     "RightUpVectorBar;": "\u2954",
50446     "RightVector;": "\u21C0",
50447     "RightVectorBar;": "\u2953",
50448     "ring;": "\u02DA",
50449     "risingdotseq;": "\u2253",
50450     "rlarr;": "\u21C4",
50451     "rlhar;": "\u21CC",
50452     "rlm;": "\u200F",
50453     "rmoust;": "\u23B1",
50454     "rmoustache;": "\u23B1",
50455     "rnmid;": "\u2AEE",
50456     "roang;": "\u27ED",
50457     "roarr;": "\u21FE",
50458     "robrk;": "\u27E7",
50459     "ropar;": "\u2986",
50460     "Ropf;": "\u211D",
50461     "ropf;": "\uD835\uDD63",
50462     "roplus;": "\u2A2E",
50463     "rotimes;": "\u2A35",
50464     "RoundImplies;": "\u2970",
50465     "rpar;": "\u0029",
50466     "rpargt;": "\u2994",
50467     "rppolint;": "\u2A12",
50468     "rrarr;": "\u21C9",
50469     "Rrightarrow;": "\u21DB",
50470     "rsaquo;": "\u203A",
50471     "Rscr;": "\u211B",
50472     "rscr;": "\uD835\uDCC7",
50473     "Rsh;": "\u21B1",
50474     "rsh;": "\u21B1",
50475     "rsqb;": "\u005D",
50476     "rsquo;": "\u2019",
50477     "rsquor;": "\u2019",
50478     "rthree;": "\u22CC",
50479     "rtimes;": "\u22CA",
50480     "rtri;": "\u25B9",
50481     "rtrie;": "\u22B5",
50482     "rtrif;": "\u25B8",
50483     "rtriltri;": "\u29CE",
50484     "RuleDelayed;": "\u29F4",
50485     "ruluhar;": "\u2968",
50486     "rx;": "\u211E",
50487     "Sacute;": "\u015A",
50488     "sacute;": "\u015B",
50489     "sbquo;": "\u201A",
50490     "Sc;": "\u2ABC",
50491     "sc;": "\u227B",
50492     "scap;": "\u2AB8",
50493     "Scaron;": "\u0160",
50494     "scaron;": "\u0161",
50495     "sccue;": "\u227D",
50496     "scE;": "\u2AB4",
50497     "sce;": "\u2AB0",
50498     "Scedil;": "\u015E",
50499     "scedil;": "\u015F",
50500     "Scirc;": "\u015C",
50501     "scirc;": "\u015D",
50502     "scnap;": "\u2ABA",
50503     "scnE;": "\u2AB6",
50504     "scnsim;": "\u22E9",
50505     "scpolint;": "\u2A13",
50506     "scsim;": "\u227F",
50507     "Scy;": "\u0421",
50508     "scy;": "\u0441",
50509     "sdot;": "\u22C5",
50510     "sdotb;": "\u22A1",
50511     "sdote;": "\u2A66",
50512     "searhk;": "\u2925",
50513     "seArr;": "\u21D8",
50514     "searr;": "\u2198",
50515     "searrow;": "\u2198",
50516     "sect;": "\u00A7",
50517     "sect": "\u00A7",
50518     "semi;": "\u003B",
50519     "seswar;": "\u2929",
50520     "setminus;": "\u2216",
50521     "setmn;": "\u2216",
50522     "sext;": "\u2736",
50523     "Sfr;": "\uD835\uDD16",
50524     "sfr;": "\uD835\uDD30",
50525     "sfrown;": "\u2322",
50526     "sharp;": "\u266F",
50527     "SHCHcy;": "\u0429",
50528     "shchcy;": "\u0449",
50529     "SHcy;": "\u0428",
50530     "shcy;": "\u0448",
50531     "ShortDownArrow;": "\u2193",
50532     "ShortLeftArrow;": "\u2190",
50533     "shortmid;": "\u2223",
50534     "shortparallel;": "\u2225",
50535     "ShortRightArrow;": "\u2192",
50536     "ShortUpArrow;": "\u2191",
50537     "shy;": "\u00AD",
50538     "shy": "\u00AD",
50539     "Sigma;": "\u03A3",
50540     "sigma;": "\u03C3",
50541     "sigmaf;": "\u03C2",
50542     "sigmav;": "\u03C2",
50543     "sim;": "\u223C",
50544     "simdot;": "\u2A6A",
50545     "sime;": "\u2243",
50546     "simeq;": "\u2243",
50547     "simg;": "\u2A9E",
50548     "simgE;": "\u2AA0",
50549     "siml;": "\u2A9D",
50550     "simlE;": "\u2A9F",
50551     "simne;": "\u2246",
50552     "simplus;": "\u2A24",
50553     "simrarr;": "\u2972",
50554     "slarr;": "\u2190",
50555     "SmallCircle;": "\u2218",
50556     "smallsetminus;": "\u2216",
50557     "smashp;": "\u2A33",
50558     "smeparsl;": "\u29E4",
50559     "smid;": "\u2223",
50560     "smile;": "\u2323",
50561     "smt;": "\u2AAA",
50562     "smte;": "\u2AAC",
50563     "smtes;": "\u2AAC\uFE00",
50564     "SOFTcy;": "\u042C",
50565     "softcy;": "\u044C",
50566     "sol;": "\u002F",
50567     "solb;": "\u29C4",
50568     "solbar;": "\u233F",
50569     "Sopf;": "\uD835\uDD4A",
50570     "sopf;": "\uD835\uDD64",
50571     "spades;": "\u2660",
50572     "spadesuit;": "\u2660",
50573     "spar;": "\u2225",
50574     "sqcap;": "\u2293",
50575     "sqcaps;": "\u2293\uFE00",
50576     "sqcup;": "\u2294",
50577     "sqcups;": "\u2294\uFE00",
50578     "Sqrt;": "\u221A",
50579     "sqsub;": "\u228F",
50580     "sqsube;": "\u2291",
50581     "sqsubset;": "\u228F",
50582     "sqsubseteq;": "\u2291",
50583     "sqsup;": "\u2290",
50584     "sqsupe;": "\u2292",
50585     "sqsupset;": "\u2290",
50586     "sqsupseteq;": "\u2292",
50587     "squ;": "\u25A1",
50588     "Square;": "\u25A1",
50589     "square;": "\u25A1",
50590     "SquareIntersection;": "\u2293",
50591     "SquareSubset;": "\u228F",
50592     "SquareSubsetEqual;": "\u2291",
50593     "SquareSuperset;": "\u2290",
50594     "SquareSupersetEqual;": "\u2292",
50595     "SquareUnion;": "\u2294",
50596     "squarf;": "\u25AA",
50597     "squf;": "\u25AA",
50598     "srarr;": "\u2192",
50599     "Sscr;": "\uD835\uDCAE",
50600     "sscr;": "\uD835\uDCC8",
50601     "ssetmn;": "\u2216",
50602     "ssmile;": "\u2323",
50603     "sstarf;": "\u22C6",
50604     "Star;": "\u22C6",
50605     "star;": "\u2606",
50606     "starf;": "\u2605",
50607     "straightepsilon;": "\u03F5",
50608     "straightphi;": "\u03D5",
50609     "strns;": "\u00AF",
50610     "Sub;": "\u22D0",
50611     "sub;": "\u2282",
50612     "subdot;": "\u2ABD",
50613     "subE;": "\u2AC5",
50614     "sube;": "\u2286",
50615     "subedot;": "\u2AC3",
50616     "submult;": "\u2AC1",
50617     "subnE;": "\u2ACB",
50618     "subne;": "\u228A",
50619     "subplus;": "\u2ABF",
50620     "subrarr;": "\u2979",
50621     "Subset;": "\u22D0",
50622     "subset;": "\u2282",
50623     "subseteq;": "\u2286",
50624     "subseteqq;": "\u2AC5",
50625     "SubsetEqual;": "\u2286",
50626     "subsetneq;": "\u228A",
50627     "subsetneqq;": "\u2ACB",
50628     "subsim;": "\u2AC7",
50629     "subsub;": "\u2AD5",
50630     "subsup;": "\u2AD3",
50631     "succ;": "\u227B",
50632     "succapprox;": "\u2AB8",
50633     "succcurlyeq;": "\u227D",
50634     "Succeeds;": "\u227B",
50635     "SucceedsEqual;": "\u2AB0",
50636     "SucceedsSlantEqual;": "\u227D",
50637     "SucceedsTilde;": "\u227F",
50638     "succeq;": "\u2AB0",
50639     "succnapprox;": "\u2ABA",
50640     "succneqq;": "\u2AB6",
50641     "succnsim;": "\u22E9",
50642     "succsim;": "\u227F",
50643     "SuchThat;": "\u220B",
50644     "Sum;": "\u2211",
50645     "sum;": "\u2211",
50646     "sung;": "\u266A",
50647     "Sup;": "\u22D1",
50648     "sup;": "\u2283",
50649     "sup1;": "\u00B9",
50650     "sup1": "\u00B9",
50651     "sup2;": "\u00B2",
50652     "sup2": "\u00B2",
50653     "sup3;": "\u00B3",
50654     "sup3": "\u00B3",
50655     "supdot;": "\u2ABE",
50656     "supdsub;": "\u2AD8",
50657     "supE;": "\u2AC6",
50658     "supe;": "\u2287",
50659     "supedot;": "\u2AC4",
50660     "Superset;": "\u2283",
50661     "SupersetEqual;": "\u2287",
50662     "suphsol;": "\u27C9",
50663     "suphsub;": "\u2AD7",
50664     "suplarr;": "\u297B",
50665     "supmult;": "\u2AC2",
50666     "supnE;": "\u2ACC",
50667     "supne;": "\u228B",
50668     "supplus;": "\u2AC0",
50669     "Supset;": "\u22D1",
50670     "supset;": "\u2283",
50671     "supseteq;": "\u2287",
50672     "supseteqq;": "\u2AC6",
50673     "supsetneq;": "\u228B",
50674     "supsetneqq;": "\u2ACC",
50675     "supsim;": "\u2AC8",
50676     "supsub;": "\u2AD4",
50677     "supsup;": "\u2AD6",
50678     "swarhk;": "\u2926",
50679     "swArr;": "\u21D9",
50680     "swarr;": "\u2199",
50681     "swarrow;": "\u2199",
50682     "swnwar;": "\u292A",
50683     "szlig;": "\u00DF",
50684     "szlig": "\u00DF",
50685     "Tab;": "\u0009",
50686     "target;": "\u2316",
50687     "Tau;": "\u03A4",
50688     "tau;": "\u03C4",
50689     "tbrk;": "\u23B4",
50690     "Tcaron;": "\u0164",
50691     "tcaron;": "\u0165",
50692     "Tcedil;": "\u0162",
50693     "tcedil;": "\u0163",
50694     "Tcy;": "\u0422",
50695     "tcy;": "\u0442",
50696     "tdot;": "\u20DB",
50697     "telrec;": "\u2315",
50698     "Tfr;": "\uD835\uDD17",
50699     "tfr;": "\uD835\uDD31",
50700     "there4;": "\u2234",
50701     "Therefore;": "\u2234",
50702     "therefore;": "\u2234",
50703     "Theta;": "\u0398",
50704     "theta;": "\u03B8",
50705     "thetasym;": "\u03D1",
50706     "thetav;": "\u03D1",
50707     "thickapprox;": "\u2248",
50708     "thicksim;": "\u223C",
50709     "ThickSpace;": "\u205F\u200A",
50710     "thinsp;": "\u2009",
50711     "ThinSpace;": "\u2009",
50712     "thkap;": "\u2248",
50713     "thksim;": "\u223C",
50714     "THORN;": "\u00DE",
50715     "THORN": "\u00DE",
50716     "thorn;": "\u00FE",
50717     "thorn": "\u00FE",
50718     "Tilde;": "\u223C",
50719     "tilde;": "\u02DC",
50720     "TildeEqual;": "\u2243",
50721     "TildeFullEqual;": "\u2245",
50722     "TildeTilde;": "\u2248",
50723     "times;": "\u00D7",
50724     "times": "\u00D7",
50725     "timesb;": "\u22A0",
50726     "timesbar;": "\u2A31",
50727     "timesd;": "\u2A30",
50728     "tint;": "\u222D",
50729     "toea;": "\u2928",
50730     "top;": "\u22A4",
50731     "topbot;": "\u2336",
50732     "topcir;": "\u2AF1",
50733     "Topf;": "\uD835\uDD4B",
50734     "topf;": "\uD835\uDD65",
50735     "topfork;": "\u2ADA",
50736     "tosa;": "\u2929",
50737     "tprime;": "\u2034",
50738     "TRADE;": "\u2122",
50739     "trade;": "\u2122",
50740     "triangle;": "\u25B5",
50741     "triangledown;": "\u25BF",
50742     "triangleleft;": "\u25C3",
50743     "trianglelefteq;": "\u22B4",
50744     "triangleq;": "\u225C",
50745     "triangleright;": "\u25B9",
50746     "trianglerighteq;": "\u22B5",
50747     "tridot;": "\u25EC",
50748     "trie;": "\u225C",
50749     "triminus;": "\u2A3A",
50750     "TripleDot;": "\u20DB",
50751     "triplus;": "\u2A39",
50752     "trisb;": "\u29CD",
50753     "tritime;": "\u2A3B",
50754     "trpezium;": "\u23E2",
50755     "Tscr;": "\uD835\uDCAF",
50756     "tscr;": "\uD835\uDCC9",
50757     "TScy;": "\u0426",
50758     "tscy;": "\u0446",
50759     "TSHcy;": "\u040B",
50760     "tshcy;": "\u045B",
50761     "Tstrok;": "\u0166",
50762     "tstrok;": "\u0167",
50763     "twixt;": "\u226C",
50764     "twoheadleftarrow;": "\u219E",
50765     "twoheadrightarrow;": "\u21A0",
50766     "Uacute;": "\u00DA",
50767     "Uacute": "\u00DA",
50768     "uacute;": "\u00FA",
50769     "uacute": "\u00FA",
50770     "Uarr;": "\u219F",
50771     "uArr;": "\u21D1",
50772     "uarr;": "\u2191",
50773     "Uarrocir;": "\u2949",
50774     "Ubrcy;": "\u040E",
50775     "ubrcy;": "\u045E",
50776     "Ubreve;": "\u016C",
50777     "ubreve;": "\u016D",
50778     "Ucirc;": "\u00DB",
50779     "Ucirc": "\u00DB",
50780     "ucirc;": "\u00FB",
50781     "ucirc": "\u00FB",
50782     "Ucy;": "\u0423",
50783     "ucy;": "\u0443",
50784     "udarr;": "\u21C5",
50785     "Udblac;": "\u0170",
50786     "udblac;": "\u0171",
50787     "udhar;": "\u296E",
50788     "ufisht;": "\u297E",
50789     "Ufr;": "\uD835\uDD18",
50790     "ufr;": "\uD835\uDD32",
50791     "Ugrave;": "\u00D9",
50792     "Ugrave": "\u00D9",
50793     "ugrave;": "\u00F9",
50794     "ugrave": "\u00F9",
50795     "uHar;": "\u2963",
50796     "uharl;": "\u21BF",
50797     "uharr;": "\u21BE",
50798     "uhblk;": "\u2580",
50799     "ulcorn;": "\u231C",
50800     "ulcorner;": "\u231C",
50801     "ulcrop;": "\u230F",
50802     "ultri;": "\u25F8",
50803     "Umacr;": "\u016A",
50804     "umacr;": "\u016B",
50805     "uml;": "\u00A8",
50806     "uml": "\u00A8",
50807     "UnderBar;": "\u005F",
50808     "UnderBrace;": "\u23DF",
50809     "UnderBracket;": "\u23B5",
50810     "UnderParenthesis;": "\u23DD",
50811     "Union;": "\u22C3",
50812     "UnionPlus;": "\u228E",
50813     "Uogon;": "\u0172",
50814     "uogon;": "\u0173",
50815     "Uopf;": "\uD835\uDD4C",
50816     "uopf;": "\uD835\uDD66",
50817     "UpArrow;": "\u2191",
50818     "Uparrow;": "\u21D1",
50819     "uparrow;": "\u2191",
50820     "UpArrowBar;": "\u2912",
50821     "UpArrowDownArrow;": "\u21C5",
50822     "UpDownArrow;": "\u2195",
50823     "Updownarrow;": "\u21D5",
50824     "updownarrow;": "\u2195",
50825     "UpEquilibrium;": "\u296E",
50826     "upharpoonleft;": "\u21BF",
50827     "upharpoonright;": "\u21BE",
50828     "uplus;": "\u228E",
50829     "UpperLeftArrow;": "\u2196",
50830     "UpperRightArrow;": "\u2197",
50831     "Upsi;": "\u03D2",
50832     "upsi;": "\u03C5",
50833     "upsih;": "\u03D2",
50834     "Upsilon;": "\u03A5",
50835     "upsilon;": "\u03C5",
50836     "UpTee;": "\u22A5",
50837     "UpTeeArrow;": "\u21A5",
50838     "upuparrows;": "\u21C8",
50839     "urcorn;": "\u231D",
50840     "urcorner;": "\u231D",
50841     "urcrop;": "\u230E",
50842     "Uring;": "\u016E",
50843     "uring;": "\u016F",
50844     "urtri;": "\u25F9",
50845     "Uscr;": "\uD835\uDCB0",
50846     "uscr;": "\uD835\uDCCA",
50847     "utdot;": "\u22F0",
50848     "Utilde;": "\u0168",
50849     "utilde;": "\u0169",
50850     "utri;": "\u25B5",
50851     "utrif;": "\u25B4",
50852     "uuarr;": "\u21C8",
50853     "Uuml;": "\u00DC",
50854     "Uuml": "\u00DC",
50855     "uuml;": "\u00FC",
50856     "uuml": "\u00FC",
50857     "uwangle;": "\u29A7",
50858     "vangrt;": "\u299C",
50859     "varepsilon;": "\u03F5",
50860     "varkappa;": "\u03F0",
50861     "varnothing;": "\u2205",
50862     "varphi;": "\u03D5",
50863     "varpi;": "\u03D6",
50864     "varpropto;": "\u221D",
50865     "vArr;": "\u21D5",
50866     "varr;": "\u2195",
50867     "varrho;": "\u03F1",
50868     "varsigma;": "\u03C2",
50869     "varsubsetneq;": "\u228A\uFE00",
50870     "varsubsetneqq;": "\u2ACB\uFE00",
50871     "varsupsetneq;": "\u228B\uFE00",
50872     "varsupsetneqq;": "\u2ACC\uFE00",
50873     "vartheta;": "\u03D1",
50874     "vartriangleleft;": "\u22B2",
50875     "vartriangleright;": "\u22B3",
50876     "Vbar;": "\u2AEB",
50877     "vBar;": "\u2AE8",
50878     "vBarv;": "\u2AE9",
50879     "Vcy;": "\u0412",
50880     "vcy;": "\u0432",
50881     "VDash;": "\u22AB",
50882     "Vdash;": "\u22A9",
50883     "vDash;": "\u22A8",
50884     "vdash;": "\u22A2",
50885     "Vdashl;": "\u2AE6",
50886     "Vee;": "\u22C1",
50887     "vee;": "\u2228",
50888     "veebar;": "\u22BB",
50889     "veeeq;": "\u225A",
50890     "vellip;": "\u22EE",
50891     "Verbar;": "\u2016",
50892     "verbar;": "\u007C",
50893     "Vert;": "\u2016",
50894     "vert;": "\u007C",
50895     "VerticalBar;": "\u2223",
50896     "VerticalLine;": "\u007C",
50897     "VerticalSeparator;": "\u2758",
50898     "VerticalTilde;": "\u2240",
50899     "VeryThinSpace;": "\u200A",
50900     "Vfr;": "\uD835\uDD19",
50901     "vfr;": "\uD835\uDD33",
50902     "vltri;": "\u22B2",
50903     "vnsub;": "\u2282\u20D2",
50904     "vnsup;": "\u2283\u20D2",
50905     "Vopf;": "\uD835\uDD4D",
50906     "vopf;": "\uD835\uDD67",
50907     "vprop;": "\u221D",
50908     "vrtri;": "\u22B3",
50909     "Vscr;": "\uD835\uDCB1",
50910     "vscr;": "\uD835\uDCCB",
50911     "vsubnE;": "\u2ACB\uFE00",
50912     "vsubne;": "\u228A\uFE00",
50913     "vsupnE;": "\u2ACC\uFE00",
50914     "vsupne;": "\u228B\uFE00",
50915     "Vvdash;": "\u22AA",
50916     "vzigzag;": "\u299A",
50917     "Wcirc;": "\u0174",
50918     "wcirc;": "\u0175",
50919     "wedbar;": "\u2A5F",
50920     "Wedge;": "\u22C0",
50921     "wedge;": "\u2227",
50922     "wedgeq;": "\u2259",
50923     "weierp;": "\u2118",
50924     "Wfr;": "\uD835\uDD1A",
50925     "wfr;": "\uD835\uDD34",
50926     "Wopf;": "\uD835\uDD4E",
50927     "wopf;": "\uD835\uDD68",
50928     "wp;": "\u2118",
50929     "wr;": "\u2240",
50930     "wreath;": "\u2240",
50931     "Wscr;": "\uD835\uDCB2",
50932     "wscr;": "\uD835\uDCCC",
50933     "xcap;": "\u22C2",
50934     "xcirc;": "\u25EF",
50935     "xcup;": "\u22C3",
50936     "xdtri;": "\u25BD",
50937     "Xfr;": "\uD835\uDD1B",
50938     "xfr;": "\uD835\uDD35",
50939     "xhArr;": "\u27FA",
50940     "xharr;": "\u27F7",
50941     "Xi;": "\u039E",
50942     "xi;": "\u03BE",
50943     "xlArr;": "\u27F8",
50944     "xlarr;": "\u27F5",
50945     "xmap;": "\u27FC",
50946     "xnis;": "\u22FB",
50947     "xodot;": "\u2A00",
50948     "Xopf;": "\uD835\uDD4F",
50949     "xopf;": "\uD835\uDD69",
50950     "xoplus;": "\u2A01",
50951     "xotime;": "\u2A02",
50952     "xrArr;": "\u27F9",
50953     "xrarr;": "\u27F6",
50954     "Xscr;": "\uD835\uDCB3",
50955     "xscr;": "\uD835\uDCCD",
50956     "xsqcup;": "\u2A06",
50957     "xuplus;": "\u2A04",
50958     "xutri;": "\u25B3",
50959     "xvee;": "\u22C1",
50960     "xwedge;": "\u22C0",
50961     "Yacute;": "\u00DD",
50962     "Yacute": "\u00DD",
50963     "yacute;": "\u00FD",
50964     "yacute": "\u00FD",
50965     "YAcy;": "\u042F",
50966     "yacy;": "\u044F",
50967     "Ycirc;": "\u0176",
50968     "ycirc;": "\u0177",
50969     "Ycy;": "\u042B",
50970     "ycy;": "\u044B",
50971     "yen;": "\u00A5",
50972     "yen": "\u00A5",
50973     "Yfr;": "\uD835\uDD1C",
50974     "yfr;": "\uD835\uDD36",
50975     "YIcy;": "\u0407",
50976     "yicy;": "\u0457",
50977     "Yopf;": "\uD835\uDD50",
50978     "yopf;": "\uD835\uDD6A",
50979     "Yscr;": "\uD835\uDCB4",
50980     "yscr;": "\uD835\uDCCE",
50981     "YUcy;": "\u042E",
50982     "yucy;": "\u044E",
50983     "Yuml;": "\u0178",
50984     "yuml;": "\u00FF",
50985     "yuml": "\u00FF",
50986     "Zacute;": "\u0179",
50987     "zacute;": "\u017A",
50988     "Zcaron;": "\u017D",
50989     "zcaron;": "\u017E",
50990     "Zcy;": "\u0417",
50991     "zcy;": "\u0437",
50992     "Zdot;": "\u017B",
50993     "zdot;": "\u017C",
50994     "zeetrf;": "\u2128",
50995     "ZeroWidthSpace;": "\u200B",
50996     "Zeta;": "\u0396",
50997     "zeta;": "\u03B6",
50998     "Zfr;": "\u2128",
50999     "zfr;": "\uD835\uDD37",
51000     "ZHcy;": "\u0416",
51001     "zhcy;": "\u0436",
51002     "zigrarr;": "\u21DD",
51003     "Zopf;": "\u2124",
51004     "zopf;": "\uD835\uDD6B",
51005     "Zscr;": "\uD835\uDCB5",
51006     "zscr;": "\uD835\uDCCF",
51007     "zwj;": "\u200D",
51008     "zwnj;": "\u200C"
51009 };
51010
51011
51012 /***/ }),
51013 /* 115 */
51014 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51015
51016 __webpack_require__.r(__webpack_exports__);
51017 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51018 /* harmony export */   "startsWith": () => /* binding */ startsWith,
51019 /* harmony export */   "endsWith": () => /* binding */ endsWith,
51020 /* harmony export */   "commonPrefixLength": () => /* binding */ commonPrefixLength,
51021 /* harmony export */   "repeat": () => /* binding */ repeat,
51022 /* harmony export */   "isLetterOrDigit": () => /* binding */ isLetterOrDigit
51023 /* harmony export */ });
51024 /*---------------------------------------------------------------------------------------------
51025  *  Copyright (c) Microsoft Corporation. All rights reserved.
51026  *  Licensed under the MIT License. See License.txt in the project root for license information.
51027  *--------------------------------------------------------------------------------------------*/
51028 function startsWith(haystack, needle) {
51029     if (haystack.length < needle.length) {
51030         return false;
51031     }
51032     for (var i = 0; i < needle.length; i++) {
51033         if (haystack[i] !== needle[i]) {
51034             return false;
51035         }
51036     }
51037     return true;
51038 }
51039 /**
51040  * Determines if haystack ends with needle.
51041  */
51042 function endsWith(haystack, needle) {
51043     var diff = haystack.length - needle.length;
51044     if (diff > 0) {
51045         return haystack.lastIndexOf(needle) === diff;
51046     }
51047     else if (diff === 0) {
51048         return haystack === needle;
51049     }
51050     else {
51051         return false;
51052     }
51053 }
51054 /**
51055  * @returns the length of the common prefix of the two strings.
51056  */
51057 function commonPrefixLength(a, b) {
51058     var i;
51059     var len = Math.min(a.length, b.length);
51060     for (i = 0; i < len; i++) {
51061         if (a.charCodeAt(i) !== b.charCodeAt(i)) {
51062             return i;
51063         }
51064     }
51065     return len;
51066 }
51067 function repeat(value, count) {
51068     var s = '';
51069     while (count > 0) {
51070         if ((count & 1) === 1) {
51071             s += value;
51072         }
51073         value += value;
51074         count = count >>> 1;
51075     }
51076     return s;
51077 }
51078 var _a = 'a'.charCodeAt(0);
51079 var _z = 'z'.charCodeAt(0);
51080 var _A = 'A'.charCodeAt(0);
51081 var _Z = 'Z'.charCodeAt(0);
51082 var _0 = '0'.charCodeAt(0);
51083 var _9 = '9'.charCodeAt(0);
51084 function isLetterOrDigit(text, index) {
51085     var c = text.charCodeAt(index);
51086     return (_a <= c && c <= _z) || (_A <= c && c <= _Z) || (_0 <= c && c <= _9);
51087 }
51088
51089
51090 /***/ }),
51091 /* 116 */
51092 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51093
51094 __webpack_require__.r(__webpack_exports__);
51095 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51096 /* harmony export */   "HTMLDataProvider": () => /* binding */ HTMLDataProvider,
51097 /* harmony export */   "generateDocumentation": () => /* binding */ generateDocumentation
51098 /* harmony export */ });
51099 /* harmony import */ var _utils_markup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(117);
51100 /*---------------------------------------------------------------------------------------------
51101  *  Copyright (c) Microsoft Corporation. All rights reserved.
51102  *  Licensed under the MIT License. See License.txt in the project root for license information.
51103  *--------------------------------------------------------------------------------------------*/
51104
51105 var HTMLDataProvider = /** @class */ (function () {
51106     /**
51107      * Currently, unversioned data uses the V1 implementation
51108      * In the future when the provider handles multiple versions of HTML custom data,
51109      * use the latest implementation for unversioned data
51110      */
51111     function HTMLDataProvider(id, customData) {
51112         var _this = this;
51113         this.id = id;
51114         this._tags = [];
51115         this._tagMap = {};
51116         this._valueSetMap = {};
51117         this._tags = customData.tags || [];
51118         this._globalAttributes = customData.globalAttributes || [];
51119         this._tags.forEach(function (t) {
51120             _this._tagMap[t.name.toLowerCase()] = t;
51121         });
51122         if (customData.valueSets) {
51123             customData.valueSets.forEach(function (vs) {
51124                 _this._valueSetMap[vs.name] = vs.values;
51125             });
51126         }
51127     }
51128     HTMLDataProvider.prototype.isApplicable = function () {
51129         return true;
51130     };
51131     HTMLDataProvider.prototype.getId = function () {
51132         return this.id;
51133     };
51134     HTMLDataProvider.prototype.provideTags = function () {
51135         return this._tags;
51136     };
51137     HTMLDataProvider.prototype.provideAttributes = function (tag) {
51138         var attributes = [];
51139         var processAttribute = function (a) {
51140             attributes.push(a);
51141         };
51142         var tagEntry = this._tagMap[tag.toLowerCase()];
51143         if (tagEntry) {
51144             tagEntry.attributes.forEach(processAttribute);
51145         }
51146         this._globalAttributes.forEach(processAttribute);
51147         return attributes;
51148     };
51149     HTMLDataProvider.prototype.provideValues = function (tag, attribute) {
51150         var _this = this;
51151         var values = [];
51152         attribute = attribute.toLowerCase();
51153         var processAttributes = function (attributes) {
51154             attributes.forEach(function (a) {
51155                 if (a.name.toLowerCase() === attribute) {
51156                     if (a.values) {
51157                         a.values.forEach(function (v) {
51158                             values.push(v);
51159                         });
51160                     }
51161                     if (a.valueSet) {
51162                         if (_this._valueSetMap[a.valueSet]) {
51163                             _this._valueSetMap[a.valueSet].forEach(function (v) {
51164                                 values.push(v);
51165                             });
51166                         }
51167                     }
51168                 }
51169             });
51170         };
51171         var tagEntry = this._tagMap[tag.toLowerCase()];
51172         if (!tagEntry) {
51173             return [];
51174         }
51175         processAttributes(tagEntry.attributes);
51176         processAttributes(this._globalAttributes);
51177         return values;
51178     };
51179     return HTMLDataProvider;
51180 }());
51181
51182 /**
51183  * Generate Documentation used in hover/complete
51184  * From `documentation` and `references`
51185  */
51186 function generateDocumentation(item, doesSupportMarkdown) {
51187     var result = {
51188         kind: doesSupportMarkdown ? 'markdown' : 'plaintext',
51189         value: ''
51190     };
51191     if (item.description) {
51192         var normalizedDescription = (0,_utils_markup__WEBPACK_IMPORTED_MODULE_0__.normalizeMarkupContent)(item.description);
51193         if (normalizedDescription) {
51194             result.value += normalizedDescription.value;
51195         }
51196     }
51197     if (item.references && item.references.length > 0) {
51198         result.value += "\n\n";
51199         if (doesSupportMarkdown) {
51200             result.value += item.references.map(function (r) {
51201                 return "[" + r.name + "](" + r.url + ")";
51202             }).join(' | ');
51203         }
51204         else {
51205             result.value += item.references.map(function (r) {
51206                 return r.name + ": " + r.url;
51207             }).join('\n');
51208         }
51209     }
51210     if (result.value === '') {
51211         return undefined;
51212     }
51213     return result;
51214 }
51215
51216
51217 /***/ }),
51218 /* 117 */
51219 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51220
51221 __webpack_require__.r(__webpack_exports__);
51222 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51223 /* harmony export */   "normalizeMarkupContent": () => /* binding */ normalizeMarkupContent
51224 /* harmony export */ });
51225 /*---------------------------------------------------------------------------------------------
51226  *  Copyright (c) Microsoft Corporation. All rights reserved.
51227  *  Licensed under the MIT License. See License.txt in the project root for license information.
51228  *--------------------------------------------------------------------------------------------*/
51229 function normalizeMarkupContent(input) {
51230     if (!input) {
51231         return undefined;
51232     }
51233     if (typeof input === 'string') {
51234         return {
51235             kind: 'markdown',
51236             value: input
51237         };
51238     }
51239     return {
51240         kind: 'markdown',
51241         value: input.value
51242     };
51243 }
51244
51245
51246 /***/ }),
51247 /* 118 */
51248 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51249
51250 __webpack_require__.r(__webpack_exports__);
51251 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51252 /* harmony export */   "PathCompletionParticipant": () => /* binding */ PathCompletionParticipant
51253 /* harmony export */ });
51254 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(108);
51255 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(115);
51256 /*---------------------------------------------------------------------------------------------
51257  *  Copyright (c) Microsoft Corporation. All rights reserved.
51258  *  Licensed under the MIT License. See License.txt in the project root for license information.
51259  *--------------------------------------------------------------------------------------------*/
51260 var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
51261     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
51262     return new (P || (P = Promise))(function (resolve, reject) {
51263         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
51264         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
51265         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
51266         step((generator = generator.apply(thisArg, _arguments || [])).next());
51267     });
51268 };
51269 var __generator = (undefined && undefined.__generator) || function (thisArg, body) {
51270     var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
51271     return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
51272     function verb(n) { return function (v) { return step([n, v]); }; }
51273     function step(op) {
51274         if (f) throw new TypeError("Generator is already executing.");
51275         while (_) try {
51276             if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
51277             if (y = 0, t) op = [op[0] & 2, t.value];
51278             switch (op[0]) {
51279                 case 0: case 1: t = op; break;
51280                 case 4: _.label++; return { value: op[1], done: false };
51281                 case 5: _.label++; y = op[1]; op = [0]; continue;
51282                 case 7: op = _.ops.pop(); _.trys.pop(); continue;
51283                 default:
51284                     if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
51285                     if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51286                     if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
51287                     if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
51288                     if (t[2]) _.ops.pop();
51289                     _.trys.pop(); continue;
51290             }
51291             op = body.call(thisArg, _);
51292         } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
51293         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51294     }
51295 };
51296
51297
51298 var PathCompletionParticipant = /** @class */ (function () {
51299     function PathCompletionParticipant(readDirectory) {
51300         this.readDirectory = readDirectory;
51301         this.atributeCompletions = [];
51302     }
51303     PathCompletionParticipant.prototype.onHtmlAttributeValue = function (context) {
51304         if (isPathAttribute(context.tag, context.attribute)) {
51305             this.atributeCompletions.push(context);
51306         }
51307     };
51308     PathCompletionParticipant.prototype.computeCompletions = function (document, documentContext) {
51309         return __awaiter(this, void 0, void 0, function () {
51310             var result, _i, _a, attributeCompletion, fullValue, replaceRange, suggestions, _b, suggestions_1, item;
51311             return __generator(this, function (_c) {
51312                 switch (_c.label) {
51313                     case 0:
51314                         result = { items: [], isIncomplete: false };
51315                         _i = 0, _a = this.atributeCompletions;
51316                         _c.label = 1;
51317                     case 1:
51318                         if (!(_i < _a.length)) return [3 /*break*/, 5];
51319                         attributeCompletion = _a[_i];
51320                         fullValue = stripQuotes(document.getText(attributeCompletion.range));
51321                         if (!isCompletablePath(fullValue)) return [3 /*break*/, 4];
51322                         if (!(fullValue === '.' || fullValue === '..')) return [3 /*break*/, 2];
51323                         result.isIncomplete = true;
51324                         return [3 /*break*/, 4];
51325                     case 2:
51326                         replaceRange = pathToReplaceRange(attributeCompletion.value, fullValue, attributeCompletion.range);
51327                         return [4 /*yield*/, this.providePathSuggestions(attributeCompletion.value, replaceRange, document, documentContext)];
51328                     case 3:
51329                         suggestions = _c.sent();
51330                         for (_b = 0, suggestions_1 = suggestions; _b < suggestions_1.length; _b++) {
51331                             item = suggestions_1[_b];
51332                             result.items.push(item);
51333                         }
51334                         _c.label = 4;
51335                     case 4:
51336                         _i++;
51337                         return [3 /*break*/, 1];
51338                     case 5: return [2 /*return*/, result];
51339                 }
51340             });
51341         });
51342     };
51343     PathCompletionParticipant.prototype.providePathSuggestions = function (valueBeforeCursor, replaceRange, document, documentContext) {
51344         return __awaiter(this, void 0, void 0, function () {
51345             var valueBeforeLastSlash, parentDir, result, infos, _i, infos_1, _a, name, type, e_1;
51346             return __generator(this, function (_b) {
51347                 switch (_b.label) {
51348                     case 0:
51349                         valueBeforeLastSlash = valueBeforeCursor.substring(0, valueBeforeCursor.lastIndexOf('/') + 1);
51350                         parentDir = documentContext.resolveReference(valueBeforeLastSlash || '.', document.uri);
51351                         if (!parentDir) return [3 /*break*/, 4];
51352                         _b.label = 1;
51353                     case 1:
51354                         _b.trys.push([1, 3, , 4]);
51355                         result = [];
51356                         return [4 /*yield*/, this.readDirectory(parentDir)];
51357                     case 2:
51358                         infos = _b.sent();
51359                         for (_i = 0, infos_1 = infos; _i < infos_1.length; _i++) {
51360                             _a = infos_1[_i], name = _a[0], type = _a[1];
51361                             // Exclude paths that start with `.`
51362                             if (name.charCodeAt(0) !== CharCode_dot) {
51363                                 result.push(createCompletionItem(name, type === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.FileType.Directory, replaceRange));
51364                             }
51365                         }
51366                         return [2 /*return*/, result];
51367                     case 3:
51368                         e_1 = _b.sent();
51369                         return [3 /*break*/, 4];
51370                     case 4: return [2 /*return*/, []];
51371                 }
51372             });
51373         });
51374     };
51375     return PathCompletionParticipant;
51376 }());
51377
51378 var CharCode_dot = '.'.charCodeAt(0);
51379 function stripQuotes(fullValue) {
51380     if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_1__.startsWith)(fullValue, "'") || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_1__.startsWith)(fullValue, "\"")) {
51381         return fullValue.slice(1, -1);
51382     }
51383     else {
51384         return fullValue;
51385     }
51386 }
51387 function isCompletablePath(value) {
51388     if ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_1__.startsWith)(value, 'http') || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_1__.startsWith)(value, 'https') || (0,_utils_strings__WEBPACK_IMPORTED_MODULE_1__.startsWith)(value, '//')) {
51389         return false;
51390     }
51391     return true;
51392 }
51393 function isPathAttribute(tag, attr) {
51394     var a = PATH_TAG_AND_ATTR[tag];
51395     if (a) {
51396         if (typeof a === 'string') {
51397             return a === attr;
51398         }
51399         else {
51400             return a.indexOf(attr) !== -1;
51401         }
51402     }
51403     return false;
51404 }
51405 function pathToReplaceRange(valueBeforeCursor, fullValue, range) {
51406     var replaceRange;
51407     var lastIndexOfSlash = valueBeforeCursor.lastIndexOf('/');
51408     if (lastIndexOfSlash === -1) {
51409         replaceRange = shiftRange(range, 1, -1);
51410     }
51411     else {
51412         // For cases where cursor is in the middle of attribute value, like <script src="./s|rc/test.js">
51413         // Find the last slash before cursor, and calculate the start of replace range from there
51414         var valueAfterLastSlash = fullValue.slice(lastIndexOfSlash + 1);
51415         var startPos = shiftPosition(range.end, -1 - valueAfterLastSlash.length);
51416         // If whitespace exists, replace until there is no more
51417         var whitespaceIndex = valueAfterLastSlash.indexOf(' ');
51418         var endPos = void 0;
51419         if (whitespaceIndex !== -1) {
51420             endPos = shiftPosition(startPos, whitespaceIndex);
51421         }
51422         else {
51423             endPos = shiftPosition(range.end, -1);
51424         }
51425         replaceRange = _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(startPos, endPos);
51426     }
51427     return replaceRange;
51428 }
51429 function createCompletionItem(p, isDir, replaceRange) {
51430     if (isDir) {
51431         p = p + '/';
51432         return {
51433             label: p,
51434             kind: _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.Folder,
51435             textEdit: _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(replaceRange, p),
51436             command: {
51437                 title: 'Suggest',
51438                 command: 'editor.action.triggerSuggest'
51439             }
51440         };
51441     }
51442     else {
51443         return {
51444             label: p,
51445             kind: _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.CompletionItemKind.File,
51446             textEdit: _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.TextEdit.replace(replaceRange, p)
51447         };
51448     }
51449 }
51450 function shiftPosition(pos, offset) {
51451     return _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Position.create(pos.line, pos.character + offset);
51452 }
51453 function shiftRange(range, startOffset, endOffset) {
51454     var start = shiftPosition(range.start, startOffset);
51455     var end = shiftPosition(range.end, endOffset);
51456     return _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_0__.Range.create(start, end);
51457 }
51458 // Selected from https://stackoverflow.com/a/2725168/1780148
51459 var PATH_TAG_AND_ATTR = {
51460     // HTML 4
51461     a: 'href',
51462     area: 'href',
51463     body: 'background',
51464     del: 'cite',
51465     form: 'action',
51466     frame: ['src', 'longdesc'],
51467     img: ['src', 'longdesc'],
51468     ins: 'cite',
51469     link: 'href',
51470     object: 'data',
51471     q: 'cite',
51472     script: 'src',
51473     // HTML 5
51474     audio: 'src',
51475     button: 'formaction',
51476     command: 'icon',
51477     embed: 'src',
51478     html: 'manifest',
51479     input: ['src', 'formaction'],
51480     source: 'src',
51481     track: 'src',
51482     video: ['src', 'poster']
51483 };
51484
51485
51486 /***/ }),
51487 /* 119 */
51488 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51489
51490 __webpack_require__.r(__webpack_exports__);
51491 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51492 /* harmony export */   "isDefined": () => /* binding */ isDefined
51493 /* harmony export */ });
51494 /*---------------------------------------------------------------------------------------------
51495  *  Copyright (c) Microsoft Corporation. All rights reserved.
51496  *  Licensed under the MIT License. See License.txt in the project root for license information.
51497  *--------------------------------------------------------------------------------------------*/
51498
51499 function isDefined(obj) {
51500     return typeof obj !== 'undefined';
51501 }
51502
51503
51504 /***/ }),
51505 /* 120 */
51506 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51507
51508 __webpack_require__.r(__webpack_exports__);
51509 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51510 /* harmony export */   "HTMLHover": () => /* binding */ HTMLHover
51511 /* harmony export */ });
51512 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);
51513 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(109);
51514 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(108);
51515 /* harmony import */ var _utils_object__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(119);
51516 /* harmony import */ var _languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(116);
51517 /* harmony import */ var _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(114);
51518 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(115);
51519 /* harmony import */ var vscode_nls__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(68);
51520 /*---------------------------------------------------------------------------------------------
51521  *  Copyright (c) Microsoft Corporation. All rights reserved.
51522  *  Licensed under the MIT License. See License.txt in the project root for license information.
51523  *--------------------------------------------------------------------------------------------*/
51524
51525
51526
51527
51528
51529
51530
51531
51532 var localize = vscode_nls__WEBPACK_IMPORTED_MODULE_6__.loadMessageBundle();
51533 var HTMLHover = /** @class */ (function () {
51534     function HTMLHover(lsOptions, dataManager) {
51535         this.lsOptions = lsOptions;
51536         this.dataManager = dataManager;
51537     }
51538     HTMLHover.prototype.doHover = function (document, position, htmlDocument) {
51539         var convertContents = this.convertContents.bind(this);
51540         var doesSupportMarkdown = this.doesSupportMarkdown();
51541         var offset = document.offsetAt(position);
51542         var node = htmlDocument.findNodeAt(offset);
51543         var text = document.getText();
51544         if (!node || !node.tag) {
51545             return null;
51546         }
51547         var dataProviders = this.dataManager.getDataProviders().filter(function (p) { return p.isApplicable(document.languageId); });
51548         function getTagHover(currTag, range, open) {
51549             var _loop_1 = function (provider) {
51550                 var hover = null;
51551                 provider.provideTags().forEach(function (tag) {
51552                     if (tag.name.toLowerCase() === currTag.toLowerCase()) {
51553                         var markupContent = (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_3__.generateDocumentation)(tag, doesSupportMarkdown);
51554                         if (!markupContent) {
51555                             markupContent = {
51556                                 kind: doesSupportMarkdown ? 'markdown' : 'plaintext',
51557                                 value: ''
51558                             };
51559                         }
51560                         hover = { contents: markupContent, range: range };
51561                     }
51562                 });
51563                 if (hover) {
51564                     hover.contents = convertContents(hover.contents);
51565                     return { value: hover };
51566                 }
51567             };
51568             for (var _i = 0, dataProviders_1 = dataProviders; _i < dataProviders_1.length; _i++) {
51569                 var provider = dataProviders_1[_i];
51570                 var state_1 = _loop_1(provider);
51571                 if (typeof state_1 === "object")
51572                     return state_1.value;
51573             }
51574             return null;
51575         }
51576         function getAttrHover(currTag, currAttr, range) {
51577             var _loop_2 = function (provider) {
51578                 var hover = null;
51579                 provider.provideAttributes(currTag).forEach(function (attr) {
51580                     if (currAttr === attr.name && attr.description) {
51581                         var contentsDoc = (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_3__.generateDocumentation)(attr, doesSupportMarkdown);
51582                         if (contentsDoc) {
51583                             hover = { contents: contentsDoc, range: range };
51584                         }
51585                         else {
51586                             hover = null;
51587                         }
51588                     }
51589                 });
51590                 if (hover) {
51591                     hover.contents = convertContents(hover.contents);
51592                     return { value: hover };
51593                 }
51594             };
51595             for (var _i = 0, dataProviders_2 = dataProviders; _i < dataProviders_2.length; _i++) {
51596                 var provider = dataProviders_2[_i];
51597                 var state_2 = _loop_2(provider);
51598                 if (typeof state_2 === "object")
51599                     return state_2.value;
51600             }
51601             return null;
51602         }
51603         function getAttrValueHover(currTag, currAttr, currAttrValue, range) {
51604             var _loop_3 = function (provider) {
51605                 var hover = null;
51606                 provider.provideValues(currTag, currAttr).forEach(function (attrValue) {
51607                     if (currAttrValue === attrValue.name && attrValue.description) {
51608                         var contentsDoc = (0,_languageFacts_dataProvider__WEBPACK_IMPORTED_MODULE_3__.generateDocumentation)(attrValue, doesSupportMarkdown);
51609                         if (contentsDoc) {
51610                             hover = { contents: contentsDoc, range: range };
51611                         }
51612                         else {
51613                             hover = null;
51614                         }
51615                     }
51616                 });
51617                 if (hover) {
51618                     hover.contents = convertContents(hover.contents);
51619                     return { value: hover };
51620                 }
51621             };
51622             for (var _i = 0, dataProviders_3 = dataProviders; _i < dataProviders_3.length; _i++) {
51623                 var provider = dataProviders_3[_i];
51624                 var state_3 = _loop_3(provider);
51625                 if (typeof state_3 === "object")
51626                     return state_3.value;
51627             }
51628             return null;
51629         }
51630         function getEntityHover(text, range) {
51631             var currEntity = filterEntity(text);
51632             for (var entity in _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_4__.entities) {
51633                 var hover = null;
51634                 var label = '&' + entity;
51635                 if (currEntity === label) {
51636                     var code = _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_4__.entities[entity].charCodeAt(0).toString(16).toUpperCase();
51637                     var hex = 'U+';
51638                     if (code.length < 4) {
51639                         var zeroes = 4 - code.length;
51640                         var k = 0;
51641                         while (k < zeroes) {
51642                             hex += '0';
51643                             k += 1;
51644                         }
51645                     }
51646                     hex += code;
51647                     var contentsDoc = localize('entity.propose', "Character entity representing '" + _parser_htmlEntities__WEBPACK_IMPORTED_MODULE_4__.entities[entity] + "', unicode equivalent '" + hex + "'");
51648                     if (contentsDoc) {
51649                         hover = { contents: contentsDoc, range: range };
51650                     }
51651                     else {
51652                         hover = null;
51653                     }
51654                 }
51655                 if (hover) {
51656                     hover.contents = convertContents(hover.contents);
51657                     return hover;
51658                 }
51659             }
51660             return null;
51661         }
51662         function getTagNameRange(tokenType, startOffset) {
51663             var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner)(document.getText(), startOffset);
51664             var token = scanner.scan();
51665             while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && (scanner.getTokenEnd() < offset || scanner.getTokenEnd() === offset && token !== tokenType)) {
51666                 token = scanner.scan();
51667             }
51668             if (token === tokenType && offset <= scanner.getTokenEnd()) {
51669                 return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) };
51670             }
51671             return null;
51672         }
51673         function getEntityRange() {
51674             var k = offset - 1;
51675             var characterStart = position.character;
51676             while (k >= 0 && (0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.isLetterOrDigit)(text, k)) {
51677                 k--;
51678                 characterStart--;
51679             }
51680             var n = k + 1;
51681             var characterEnd = characterStart;
51682             while ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.isLetterOrDigit)(text, n)) {
51683                 n++;
51684                 characterEnd++;
51685             }
51686             if (k >= 0 && text[k] === '&') {
51687                 var range = null;
51688                 if (text[n] === ';') {
51689                     range = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Range.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Position.create(position.line, characterStart), vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Position.create(position.line, characterEnd + 1));
51690                 }
51691                 else {
51692                     range = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Range.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Position.create(position.line, characterStart), vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Position.create(position.line, characterEnd));
51693                 }
51694                 return range;
51695             }
51696             return null;
51697         }
51698         function filterEntity(text) {
51699             var k = offset - 1;
51700             var newText = '&';
51701             while (k >= 0 && (0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.isLetterOrDigit)(text, k)) {
51702                 k--;
51703             }
51704             k = k + 1;
51705             while ((0,_utils_strings__WEBPACK_IMPORTED_MODULE_5__.isLetterOrDigit)(text, k)) {
51706                 newText += text[k];
51707                 k += 1;
51708             }
51709             newText += ';';
51710             return newText;
51711         }
51712         if (node.endTagStart && offset >= node.endTagStart) {
51713             var tagRange_1 = getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTag, node.endTagStart);
51714             if (tagRange_1) {
51715                 return getTagHover(node.tag, tagRange_1, false);
51716             }
51717             return null;
51718         }
51719         var tagRange = getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTag, node.start);
51720         if (tagRange) {
51721             return getTagHover(node.tag, tagRange, true);
51722         }
51723         var attrRange = getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeName, node.start);
51724         if (attrRange) {
51725             var tag = node.tag;
51726             var attr = document.getText(attrRange);
51727             return getAttrHover(tag, attr, attrRange);
51728         }
51729         var entityRange = getEntityRange();
51730         if (entityRange) {
51731             return getEntityHover(text, entityRange);
51732         }
51733         function scanAttrAndAttrValue(nodeStart, attrValueStart) {
51734             var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner)(document.getText(), nodeStart);
51735             var token = scanner.scan();
51736             var prevAttr = undefined;
51737             while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && (scanner.getTokenEnd() <= attrValueStart)) {
51738                 token = scanner.scan();
51739                 if (token === _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeName) {
51740                     prevAttr = scanner.getTokenText();
51741                 }
51742             }
51743             return prevAttr;
51744         }
51745         var attrValueRange = getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.AttributeValue, node.start);
51746         if (attrValueRange) {
51747             var tag = node.tag;
51748             var attrValue = trimQuotes(document.getText(attrValueRange));
51749             var matchAttr = scanAttrAndAttrValue(node.start, document.offsetAt(attrValueRange.start));
51750             if (matchAttr) {
51751                 return getAttrValueHover(tag, matchAttr, attrValue, attrValueRange);
51752             }
51753         }
51754         return null;
51755     };
51756     HTMLHover.prototype.convertContents = function (contents) {
51757         if (!this.doesSupportMarkdown()) {
51758             if (typeof contents === 'string') {
51759                 return contents;
51760             }
51761             // MarkupContent
51762             else if ('kind' in contents) {
51763                 return {
51764                     kind: 'plaintext',
51765                     value: contents.value
51766                 };
51767             }
51768             // MarkedString[]
51769             else if (Array.isArray(contents)) {
51770                 contents.map(function (c) {
51771                     return typeof c === 'string' ? c : c.value;
51772                 });
51773             }
51774             // MarkedString
51775             else {
51776                 return contents.value;
51777             }
51778         }
51779         return contents;
51780     };
51781     HTMLHover.prototype.doesSupportMarkdown = function () {
51782         var _a, _b, _c;
51783         if (!(0,_utils_object__WEBPACK_IMPORTED_MODULE_7__.isDefined)(this.supportsMarkdown)) {
51784             if (!(0,_utils_object__WEBPACK_IMPORTED_MODULE_7__.isDefined)(this.lsOptions.clientCapabilities)) {
51785                 this.supportsMarkdown = true;
51786                 return this.supportsMarkdown;
51787             }
51788             var contentFormat = (_c = (_b = (_a = this.lsOptions.clientCapabilities) === null || _a === void 0 ? void 0 : _a.textDocument) === null || _b === void 0 ? void 0 : _b.hover) === null || _c === void 0 ? void 0 : _c.contentFormat;
51789             this.supportsMarkdown = Array.isArray(contentFormat) && contentFormat.indexOf(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.MarkupKind.Markdown) !== -1;
51790         }
51791         return this.supportsMarkdown;
51792     };
51793     return HTMLHover;
51794 }());
51795
51796 function trimQuotes(s) {
51797     if (s.length <= 1) {
51798         return s.replace(/['"]/, '');
51799     }
51800     if (s[0] === "'" || s[0] === "\"") {
51801         s = s.slice(1);
51802     }
51803     if (s[s.length - 1] === "'" || s[s.length - 1] === "\"") {
51804         s = s.slice(0, -1);
51805     }
51806     return s;
51807 }
51808
51809
51810 /***/ }),
51811 /* 121 */
51812 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51813
51814 __webpack_require__.r(__webpack_exports__);
51815 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51816 /* harmony export */   "format": () => /* binding */ format
51817 /* harmony export */ });
51818 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
51819 /* harmony import */ var _beautify_beautify_html__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(122);
51820 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(115);
51821 /*---------------------------------------------------------------------------------------------
51822  *  Copyright (c) Microsoft Corporation. All rights reserved.
51823  *  Licensed under the MIT License. See License.txt in the project root for license information.
51824  *--------------------------------------------------------------------------------------------*/
51825
51826
51827
51828 function format(document, range, options) {
51829     var value = document.getText();
51830     var includesEnd = true;
51831     var initialIndentLevel = 0;
51832     var tabSize = options.tabSize || 4;
51833     if (range) {
51834         var startOffset = document.offsetAt(range.start);
51835         // include all leading whitespace iff at the beginning of the line
51836         var extendedStart = startOffset;
51837         while (extendedStart > 0 && isWhitespace(value, extendedStart - 1)) {
51838             extendedStart--;
51839         }
51840         if (extendedStart === 0 || isEOL(value, extendedStart - 1)) {
51841             startOffset = extendedStart;
51842         }
51843         else {
51844             // else keep at least one whitespace
51845             if (extendedStart < startOffset) {
51846                 startOffset = extendedStart + 1;
51847             }
51848         }
51849         // include all following whitespace until the end of the line
51850         var endOffset = document.offsetAt(range.end);
51851         var extendedEnd = endOffset;
51852         while (extendedEnd < value.length && isWhitespace(value, extendedEnd)) {
51853             extendedEnd++;
51854         }
51855         if (extendedEnd === value.length || isEOL(value, extendedEnd)) {
51856             endOffset = extendedEnd;
51857         }
51858         range = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(startOffset), document.positionAt(endOffset));
51859         // Do not modify if substring starts in inside an element
51860         // Ending inside an element is fine as it doesn't cause formatting errors
51861         var firstHalf = value.substring(0, startOffset);
51862         if (new RegExp(/.*[<][^>]*$/).test(firstHalf)) {
51863             //return without modification
51864             value = value.substring(startOffset, endOffset);
51865             return [{
51866                     range: range,
51867                     newText: value
51868                 }];
51869         }
51870         includesEnd = endOffset === value.length;
51871         value = value.substring(startOffset, endOffset);
51872         if (startOffset !== 0) {
51873             var startOfLineOffset = document.offsetAt(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position.create(range.start.line, 0));
51874             initialIndentLevel = computeIndentLevel(document.getText(), startOfLineOffset, options);
51875         }
51876     }
51877     else {
51878         range = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position.create(0, 0), document.positionAt(value.length));
51879     }
51880     var htmlOptions = {
51881         indent_size: tabSize,
51882         indent_char: options.insertSpaces ? ' ' : '\t',
51883         indent_empty_lines: getFormatOption(options, 'indentEmptyLines', false),
51884         wrap_line_length: getFormatOption(options, 'wrapLineLength', 120),
51885         unformatted: getTagsFormatOption(options, 'unformatted', void 0),
51886         content_unformatted: getTagsFormatOption(options, 'contentUnformatted', void 0),
51887         indent_inner_html: getFormatOption(options, 'indentInnerHtml', false),
51888         preserve_newlines: getFormatOption(options, 'preserveNewLines', true),
51889         max_preserve_newlines: getFormatOption(options, 'maxPreserveNewLines', 32786),
51890         indent_handlebars: getFormatOption(options, 'indentHandlebars', false),
51891         end_with_newline: includesEnd && getFormatOption(options, 'endWithNewline', false),
51892         extra_liners: getTagsFormatOption(options, 'extraLiners', void 0),
51893         wrap_attributes: getFormatOption(options, 'wrapAttributes', 'auto'),
51894         wrap_attributes_indent_size: getFormatOption(options, 'wrapAttributesIndentSize', void 0),
51895         eol: '\n'
51896     };
51897     var result = (0,_beautify_beautify_html__WEBPACK_IMPORTED_MODULE_1__.html_beautify)(trimLeft(value), htmlOptions);
51898     if (initialIndentLevel > 0) {
51899         var indent = options.insertSpaces ? (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.repeat)(' ', tabSize * initialIndentLevel) : (0,_utils_strings__WEBPACK_IMPORTED_MODULE_2__.repeat)('\t', initialIndentLevel);
51900         result = result.split('\n').join('\n' + indent);
51901         if (range.start.character === 0) {
51902             result = indent + result; // keep the indent
51903         }
51904     }
51905     return [{
51906             range: range,
51907             newText: result
51908         }];
51909 }
51910 function trimLeft(str) {
51911     return str.replace(/^\s+/, '');
51912 }
51913 function getFormatOption(options, key, dflt) {
51914     if (options && options.hasOwnProperty(key)) {
51915         var value = options[key];
51916         if (value !== null) {
51917             return value;
51918         }
51919     }
51920     return dflt;
51921 }
51922 function getTagsFormatOption(options, key, dflt) {
51923     var list = getFormatOption(options, key, null);
51924     if (typeof list === 'string') {
51925         if (list.length > 0) {
51926             return list.split(',').map(function (t) { return t.trim().toLowerCase(); });
51927         }
51928         return [];
51929     }
51930     return dflt;
51931 }
51932 function computeIndentLevel(content, offset, options) {
51933     var i = offset;
51934     var nChars = 0;
51935     var tabSize = options.tabSize || 4;
51936     while (i < content.length) {
51937         var ch = content.charAt(i);
51938         if (ch === ' ') {
51939             nChars++;
51940         }
51941         else if (ch === '\t') {
51942             nChars += tabSize;
51943         }
51944         else {
51945             break;
51946         }
51947         i++;
51948     }
51949     return Math.floor(nChars / tabSize);
51950 }
51951 function getEOL(document) {
51952     var text = document.getText();
51953     if (document.lineCount > 1) {
51954         var to = document.offsetAt(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Position.create(1, 0));
51955         var from = to;
51956         while (from > 0 && isEOL(text, from - 1)) {
51957             from--;
51958         }
51959         return text.substr(from, to - from);
51960     }
51961     return '\n';
51962 }
51963 function isEOL(text, offset) {
51964     return '\r\n'.indexOf(text.charAt(offset)) !== -1;
51965 }
51966 function isWhitespace(text, offset) {
51967     return ' \t'.indexOf(text.charAt(offset)) !== -1;
51968 }
51969
51970
51971 /***/ }),
51972 /* 122 */
51973 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
51974
51975 __webpack_require__.r(__webpack_exports__);
51976 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
51977 /* harmony export */   "html_beautify": () => /* binding */ html_beautify
51978 /* harmony export */ });
51979 /* harmony import */ var _beautify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(124);
51980 /* harmony import */ var _beautify_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(123);
51981 // copied from js-beautify/js/lib/beautify-html.js
51982 // version: 1.11.0
51983 /* AUTO-GENERATED. DO NOT MODIFY. */
51984 /*
51985
51986   The MIT License (MIT)
51987
51988   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
51989
51990   Permission is hereby granted, free of charge, to any person
51991   obtaining a copy of this software and associated documentation files
51992   (the "Software"), to deal in the Software without restriction,
51993   including without limitation the rights to use, copy, modify, merge,
51994   publish, distribute, sublicense, and/or sell copies of the Software,
51995   and to permit persons to whom the Software is furnished to do so,
51996   subject to the following conditions:
51997
51998   The above copyright notice and this permission notice shall be
51999   included in all copies or substantial portions of the Software.
52000
52001   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52002   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
52003   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52004   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52005   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52006   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52007   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52008   SOFTWARE.
52009
52010
52011  Style HTML
52012 ---------------
52013
52014   Written by Nochum Sossonko, (nsossonko@hotmail.com)
52015
52016   Based on code initially developed by: Einar Lielmanis, <einar@beautifier.io>
52017     https://beautifier.io/
52018
52019   Usage:
52020     style_html(html_source);
52021
52022     style_html(html_source, options);
52023
52024   The options are:
52025     indent_inner_html (default false)  — indent <head> and <body> sections,
52026     indent_size (default 4)          — indentation size,
52027     indent_char (default space)      — character to indent with,
52028     wrap_line_length (default 250)            -  maximum amount of characters per line (0 = disable)
52029     brace_style (default "collapse") - "collapse" | "expand" | "end-expand" | "none"
52030             put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line, or attempt to keep them where they are.
52031     inline (defaults to inline tags) - list of tags to be considered inline tags
52032     unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted
52033     content_unformatted (defaults to ["pre", "textarea"] tags) - list of tags, whose content shouldn't be reformatted
52034     indent_scripts (default normal)  - "keep"|"separate"|"normal"
52035     preserve_newlines (default true) - whether existing line breaks before elements should be preserved
52036                                         Only works before elements, not inside tags or for text.
52037     max_preserve_newlines (default unlimited) - maximum number of line breaks to be preserved in one chunk
52038     indent_handlebars (default false) - format and indent {{#foo}} and {{/foo}}
52039     end_with_newline (false)          - end with a newline
52040     extra_liners (default [head,body,/html]) -List of tags that should have an extra newline before them.
52041
52042     e.g.
52043
52044     style_html(html_source, {
52045       'indent_inner_html': false,
52046       'indent_size': 2,
52047       'indent_char': ' ',
52048       'wrap_line_length': 78,
52049       'brace_style': 'expand',
52050       'preserve_newlines': true,
52051       'max_preserve_newlines': 5,
52052       'indent_handlebars': false,
52053       'extra_liners': ['/html']
52054     });
52055 */
52056
52057
52058
52059
52060 var legacy_beautify_html =
52061 /******/ (function(modules) { // webpackBootstrap
52062 /******/        // The module cache
52063 /******/        var installedModules = {};
52064 /******/
52065 /******/        // The require function
52066 /******/        function __nested_webpack_require_3664__(moduleId) {
52067 /******/
52068 /******/                // Check if module is in cache
52069 /******/                if(installedModules[moduleId]) {
52070 /******/                        return installedModules[moduleId].exports;
52071 /******/                }
52072 /******/                // Create a new module (and put it into the cache)
52073 /******/                var module = installedModules[moduleId] = {
52074 /******/                        i: moduleId,
52075 /******/                        l: false,
52076 /******/                        exports: {}
52077 /******/                };
52078 /******/
52079 /******/                // Execute the module function
52080 /******/                modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_3664__);
52081 /******/
52082 /******/                // Flag the module as loaded
52083 /******/                module.l = true;
52084 /******/
52085 /******/                // Return the exports of the module
52086 /******/                return module.exports;
52087 /******/        }
52088 /******/
52089 /******/
52090 /******/        // expose the modules object (__webpack_modules__)
52091 /******/        __nested_webpack_require_3664__.m = modules;
52092 /******/
52093 /******/        // expose the module cache
52094 /******/        __nested_webpack_require_3664__.c = installedModules;
52095 /******/
52096 /******/        // define getter function for harmony exports
52097 /******/        __nested_webpack_require_3664__.d = function(exports, name, getter) {
52098 /******/                if(!__nested_webpack_require_3664__.o(exports, name)) {
52099 /******/                        Object.defineProperty(exports, name, { enumerable: true, get: getter });
52100 /******/                }
52101 /******/        };
52102 /******/
52103 /******/        // define __esModule on exports
52104 /******/        __nested_webpack_require_3664__.r = function(exports) {
52105 /******/                if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
52106 /******/                        Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
52107 /******/                }
52108 /******/                Object.defineProperty(exports, '__esModule', { value: true });
52109 /******/        };
52110 /******/
52111 /******/        // create a fake namespace object
52112 /******/        // mode & 1: value is a module id, require it
52113 /******/        // mode & 2: merge all properties of value into the ns
52114 /******/        // mode & 4: return value when already ns object
52115 /******/        // mode & 8|1: behave like require
52116 /******/        __nested_webpack_require_3664__.t = function(value, mode) {
52117 /******/                if(mode & 1) value = __nested_webpack_require_3664__(value);
52118 /******/                if(mode & 8) return value;
52119 /******/                if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
52120 /******/                var ns = Object.create(null);
52121 /******/                __nested_webpack_require_3664__.r(ns);
52122 /******/                Object.defineProperty(ns, 'default', { enumerable: true, value: value });
52123 /******/                if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_3664__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
52124 /******/                return ns;
52125 /******/        };
52126 /******/
52127 /******/        // getDefaultExport function for compatibility with non-harmony modules
52128 /******/        __nested_webpack_require_3664__.n = function(module) {
52129 /******/                var getter = module && module.__esModule ?
52130 /******/                        function getDefault() { return module['default']; } :
52131 /******/                        function getModuleExports() { return module; };
52132 /******/                __nested_webpack_require_3664__.d(getter, 'a', getter);
52133 /******/                return getter;
52134 /******/        };
52135 /******/
52136 /******/        // Object.prototype.hasOwnProperty.call
52137 /******/        __nested_webpack_require_3664__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
52138 /******/
52139 /******/        // __webpack_public_path__
52140 /******/        __nested_webpack_require_3664__.p = "";
52141 /******/
52142 /******/
52143 /******/        // Load entry module and return exports
52144 /******/        return __nested_webpack_require_3664__(__nested_webpack_require_3664__.s = 18);
52145 /******/ })
52146 /************************************************************************/
52147 /******/ ([
52148 /* 0 */,
52149 /* 1 */,
52150 /* 2 */
52151 /***/ (function(module, exports, __nested_webpack_require_7147__) {
52152
52153 "use strict";
52154 /*jshint node:true */
52155 /*
52156   The MIT License (MIT)
52157
52158   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
52159
52160   Permission is hereby granted, free of charge, to any person
52161   obtaining a copy of this software and associated documentation files
52162   (the "Software"), to deal in the Software without restriction,
52163   including without limitation the rights to use, copy, modify, merge,
52164   publish, distribute, sublicense, and/or sell copies of the Software,
52165   and to permit persons to whom the Software is furnished to do so,
52166   subject to the following conditions:
52167
52168   The above copyright notice and this permission notice shall be
52169   included in all copies or substantial portions of the Software.
52170
52171   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52172   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
52173   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52174   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52175   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52176   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52177   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52178   SOFTWARE.
52179 */
52180
52181
52182
52183 function OutputLine(parent) {
52184   this.__parent = parent;
52185   this.__character_count = 0;
52186   // use indent_count as a marker for this.__lines that have preserved indentation
52187   this.__indent_count = -1;
52188   this.__alignment_count = 0;
52189   this.__wrap_point_index = 0;
52190   this.__wrap_point_character_count = 0;
52191   this.__wrap_point_indent_count = -1;
52192   this.__wrap_point_alignment_count = 0;
52193
52194   this.__items = [];
52195 }
52196
52197 OutputLine.prototype.clone_empty = function() {
52198   var line = new OutputLine(this.__parent);
52199   line.set_indent(this.__indent_count, this.__alignment_count);
52200   return line;
52201 };
52202
52203 OutputLine.prototype.item = function(index) {
52204   if (index < 0) {
52205     return this.__items[this.__items.length + index];
52206   } else {
52207     return this.__items[index];
52208   }
52209 };
52210
52211 OutputLine.prototype.has_match = function(pattern) {
52212   for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {
52213     if (this.__items[lastCheckedOutput].match(pattern)) {
52214       return true;
52215     }
52216   }
52217   return false;
52218 };
52219
52220 OutputLine.prototype.set_indent = function(indent, alignment) {
52221   if (this.is_empty()) {
52222     this.__indent_count = indent || 0;
52223     this.__alignment_count = alignment || 0;
52224     this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count);
52225   }
52226 };
52227
52228 OutputLine.prototype._set_wrap_point = function() {
52229   if (this.__parent.wrap_line_length) {
52230     this.__wrap_point_index = this.__items.length;
52231     this.__wrap_point_character_count = this.__character_count;
52232     this.__wrap_point_indent_count = this.__parent.next_line.__indent_count;
52233     this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count;
52234   }
52235 };
52236
52237 OutputLine.prototype._should_wrap = function() {
52238   return this.__wrap_point_index &&
52239     this.__character_count > this.__parent.wrap_line_length &&
52240     this.__wrap_point_character_count > this.__parent.next_line.__character_count;
52241 };
52242
52243 OutputLine.prototype._allow_wrap = function() {
52244   if (this._should_wrap()) {
52245     this.__parent.add_new_line();
52246     var next = this.__parent.current_line;
52247     next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count);
52248     next.__items = this.__items.slice(this.__wrap_point_index);
52249     this.__items = this.__items.slice(0, this.__wrap_point_index);
52250
52251     next.__character_count += this.__character_count - this.__wrap_point_character_count;
52252     this.__character_count = this.__wrap_point_character_count;
52253
52254     if (next.__items[0] === " ") {
52255       next.__items.splice(0, 1);
52256       next.__character_count -= 1;
52257     }
52258     return true;
52259   }
52260   return false;
52261 };
52262
52263 OutputLine.prototype.is_empty = function() {
52264   return this.__items.length === 0;
52265 };
52266
52267 OutputLine.prototype.last = function() {
52268   if (!this.is_empty()) {
52269     return this.__items[this.__items.length - 1];
52270   } else {
52271     return null;
52272   }
52273 };
52274
52275 OutputLine.prototype.push = function(item) {
52276   this.__items.push(item);
52277   var last_newline_index = item.lastIndexOf('\n');
52278   if (last_newline_index !== -1) {
52279     this.__character_count = item.length - last_newline_index;
52280   } else {
52281     this.__character_count += item.length;
52282   }
52283 };
52284
52285 OutputLine.prototype.pop = function() {
52286   var item = null;
52287   if (!this.is_empty()) {
52288     item = this.__items.pop();
52289     this.__character_count -= item.length;
52290   }
52291   return item;
52292 };
52293
52294
52295 OutputLine.prototype._remove_indent = function() {
52296   if (this.__indent_count > 0) {
52297     this.__indent_count -= 1;
52298     this.__character_count -= this.__parent.indent_size;
52299   }
52300 };
52301
52302 OutputLine.prototype._remove_wrap_indent = function() {
52303   if (this.__wrap_point_indent_count > 0) {
52304     this.__wrap_point_indent_count -= 1;
52305   }
52306 };
52307 OutputLine.prototype.trim = function() {
52308   while (this.last() === ' ') {
52309     this.__items.pop();
52310     this.__character_count -= 1;
52311   }
52312 };
52313
52314 OutputLine.prototype.toString = function() {
52315   var result = '';
52316   if (this.is_empty()) {
52317     if (this.__parent.indent_empty_lines) {
52318       result = this.__parent.get_indent_string(this.__indent_count);
52319     }
52320   } else {
52321     result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count);
52322     result += this.__items.join('');
52323   }
52324   return result;
52325 };
52326
52327 function IndentStringCache(options, baseIndentString) {
52328   this.__cache = [''];
52329   this.__indent_size = options.indent_size;
52330   this.__indent_string = options.indent_char;
52331   if (!options.indent_with_tabs) {
52332     this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char);
52333   }
52334
52335   // Set to null to continue support for auto detection of base indent
52336   baseIndentString = baseIndentString || '';
52337   if (options.indent_level > 0) {
52338     baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string);
52339   }
52340
52341   this.__base_string = baseIndentString;
52342   this.__base_string_length = baseIndentString.length;
52343 }
52344
52345 IndentStringCache.prototype.get_indent_size = function(indent, column) {
52346   var result = this.__base_string_length;
52347   column = column || 0;
52348   if (indent < 0) {
52349     result = 0;
52350   }
52351   result += indent * this.__indent_size;
52352   result += column;
52353   return result;
52354 };
52355
52356 IndentStringCache.prototype.get_indent_string = function(indent_level, column) {
52357   var result = this.__base_string;
52358   column = column || 0;
52359   if (indent_level < 0) {
52360     indent_level = 0;
52361     result = '';
52362   }
52363   column += indent_level * this.__indent_size;
52364   this.__ensure_cache(column);
52365   result += this.__cache[column];
52366   return result;
52367 };
52368
52369 IndentStringCache.prototype.__ensure_cache = function(column) {
52370   while (column >= this.__cache.length) {
52371     this.__add_column();
52372   }
52373 };
52374
52375 IndentStringCache.prototype.__add_column = function() {
52376   var column = this.__cache.length;
52377   var indent = 0;
52378   var result = '';
52379   if (this.__indent_size && column >= this.__indent_size) {
52380     indent = Math.floor(column / this.__indent_size);
52381     column -= indent * this.__indent_size;
52382     result = new Array(indent + 1).join(this.__indent_string);
52383   }
52384   if (column) {
52385     result += new Array(column + 1).join(' ');
52386   }
52387
52388   this.__cache.push(result);
52389 };
52390
52391 function Output(options, baseIndentString) {
52392   this.__indent_cache = new IndentStringCache(options, baseIndentString);
52393   this.raw = false;
52394   this._end_with_newline = options.end_with_newline;
52395   this.indent_size = options.indent_size;
52396   this.wrap_line_length = options.wrap_line_length;
52397   this.indent_empty_lines = options.indent_empty_lines;
52398   this.__lines = [];
52399   this.previous_line = null;
52400   this.current_line = null;
52401   this.next_line = new OutputLine(this);
52402   this.space_before_token = false;
52403   this.non_breaking_space = false;
52404   this.previous_token_wrapped = false;
52405   // initialize
52406   this.__add_outputline();
52407 }
52408
52409 Output.prototype.__add_outputline = function() {
52410   this.previous_line = this.current_line;
52411   this.current_line = this.next_line.clone_empty();
52412   this.__lines.push(this.current_line);
52413 };
52414
52415 Output.prototype.get_line_number = function() {
52416   return this.__lines.length;
52417 };
52418
52419 Output.prototype.get_indent_string = function(indent, column) {
52420   return this.__indent_cache.get_indent_string(indent, column);
52421 };
52422
52423 Output.prototype.get_indent_size = function(indent, column) {
52424   return this.__indent_cache.get_indent_size(indent, column);
52425 };
52426
52427 Output.prototype.is_empty = function() {
52428   return !this.previous_line && this.current_line.is_empty();
52429 };
52430
52431 Output.prototype.add_new_line = function(force_newline) {
52432   // never newline at the start of file
52433   // otherwise, newline only if we didn't just add one or we're forced
52434   if (this.is_empty() ||
52435     (!force_newline && this.just_added_newline())) {
52436     return false;
52437   }
52438
52439   // if raw output is enabled, don't print additional newlines,
52440   // but still return True as though you had
52441   if (!this.raw) {
52442     this.__add_outputline();
52443   }
52444   return true;
52445 };
52446
52447 Output.prototype.get_code = function(eol) {
52448   this.trim(true);
52449
52450   // handle some edge cases where the last tokens
52451   // has text that ends with newline(s)
52452   var last_item = this.current_line.pop();
52453   if (last_item) {
52454     if (last_item[last_item.length - 1] === '\n') {
52455       last_item = last_item.replace(/\n+$/g, '');
52456     }
52457     this.current_line.push(last_item);
52458   }
52459
52460   if (this._end_with_newline) {
52461     this.__add_outputline();
52462   }
52463
52464   var sweet_code = this.__lines.join('\n');
52465
52466   if (eol !== '\n') {
52467     sweet_code = sweet_code.replace(/[\n]/g, eol);
52468   }
52469   return sweet_code;
52470 };
52471
52472 Output.prototype.set_wrap_point = function() {
52473   this.current_line._set_wrap_point();
52474 };
52475
52476 Output.prototype.set_indent = function(indent, alignment) {
52477   indent = indent || 0;
52478   alignment = alignment || 0;
52479
52480   // Next line stores alignment values
52481   this.next_line.set_indent(indent, alignment);
52482
52483   // Never indent your first output indent at the start of the file
52484   if (this.__lines.length > 1) {
52485     this.current_line.set_indent(indent, alignment);
52486     return true;
52487   }
52488
52489   this.current_line.set_indent();
52490   return false;
52491 };
52492
52493 Output.prototype.add_raw_token = function(token) {
52494   for (var x = 0; x < token.newlines; x++) {
52495     this.__add_outputline();
52496   }
52497   this.current_line.set_indent(-1);
52498   this.current_line.push(token.whitespace_before);
52499   this.current_line.push(token.text);
52500   this.space_before_token = false;
52501   this.non_breaking_space = false;
52502   this.previous_token_wrapped = false;
52503 };
52504
52505 Output.prototype.add_token = function(printable_token) {
52506   this.__add_space_before_token();
52507   this.current_line.push(printable_token);
52508   this.space_before_token = false;
52509   this.non_breaking_space = false;
52510   this.previous_token_wrapped = this.current_line._allow_wrap();
52511 };
52512
52513 Output.prototype.__add_space_before_token = function() {
52514   if (this.space_before_token && !this.just_added_newline()) {
52515     if (!this.non_breaking_space) {
52516       this.set_wrap_point();
52517     }
52518     this.current_line.push(' ');
52519   }
52520 };
52521
52522 Output.prototype.remove_indent = function(index) {
52523   var output_length = this.__lines.length;
52524   while (index < output_length) {
52525     this.__lines[index]._remove_indent();
52526     index++;
52527   }
52528   this.current_line._remove_wrap_indent();
52529 };
52530
52531 Output.prototype.trim = function(eat_newlines) {
52532   eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;
52533
52534   this.current_line.trim();
52535
52536   while (eat_newlines && this.__lines.length > 1 &&
52537     this.current_line.is_empty()) {
52538     this.__lines.pop();
52539     this.current_line = this.__lines[this.__lines.length - 1];
52540     this.current_line.trim();
52541   }
52542
52543   this.previous_line = this.__lines.length > 1 ?
52544     this.__lines[this.__lines.length - 2] : null;
52545 };
52546
52547 Output.prototype.just_added_newline = function() {
52548   return this.current_line.is_empty();
52549 };
52550
52551 Output.prototype.just_added_blankline = function() {
52552   return this.is_empty() ||
52553     (this.current_line.is_empty() && this.previous_line.is_empty());
52554 };
52555
52556 Output.prototype.ensure_empty_line_above = function(starts_with, ends_with) {
52557   var index = this.__lines.length - 2;
52558   while (index >= 0) {
52559     var potentialEmptyLine = this.__lines[index];
52560     if (potentialEmptyLine.is_empty()) {
52561       break;
52562     } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 &&
52563       potentialEmptyLine.item(-1) !== ends_with) {
52564       this.__lines.splice(index + 1, 0, new OutputLine(this));
52565       this.previous_line = this.__lines[this.__lines.length - 2];
52566       break;
52567     }
52568     index--;
52569   }
52570 };
52571
52572 module.exports.Output = Output;
52573
52574
52575 /***/ }),
52576 /* 3 */
52577 /***/ (function(module, exports, __nested_webpack_require_19580__) {
52578
52579 "use strict";
52580 /*jshint node:true */
52581 /*
52582
52583   The MIT License (MIT)
52584
52585   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
52586
52587   Permission is hereby granted, free of charge, to any person
52588   obtaining a copy of this software and associated documentation files
52589   (the "Software"), to deal in the Software without restriction,
52590   including without limitation the rights to use, copy, modify, merge,
52591   publish, distribute, sublicense, and/or sell copies of the Software,
52592   and to permit persons to whom the Software is furnished to do so,
52593   subject to the following conditions:
52594
52595   The above copyright notice and this permission notice shall be
52596   included in all copies or substantial portions of the Software.
52597
52598   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52599   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
52600   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52601   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52602   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52603   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52604   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52605   SOFTWARE.
52606 */
52607
52608
52609
52610 function Token(type, text, newlines, whitespace_before) {
52611   this.type = type;
52612   this.text = text;
52613
52614   // comments_before are
52615   // comments that have a new line before them
52616   // and may or may not have a newline after
52617   // this is a set of comments before
52618   this.comments_before = null; /* inline comment*/
52619
52620
52621   // this.comments_after =  new TokenStream(); // no new line before and newline after
52622   this.newlines = newlines || 0;
52623   this.whitespace_before = whitespace_before || '';
52624   this.parent = null;
52625   this.next = null;
52626   this.previous = null;
52627   this.opened = null;
52628   this.closed = null;
52629   this.directives = null;
52630 }
52631
52632
52633 module.exports.Token = Token;
52634
52635
52636 /***/ }),
52637 /* 4 */,
52638 /* 5 */,
52639 /* 6 */
52640 /***/ (function(module, exports, __nested_webpack_require_21527__) {
52641
52642 "use strict";
52643 /*jshint node:true */
52644 /*
52645
52646   The MIT License (MIT)
52647
52648   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
52649
52650   Permission is hereby granted, free of charge, to any person
52651   obtaining a copy of this software and associated documentation files
52652   (the "Software"), to deal in the Software without restriction,
52653   including without limitation the rights to use, copy, modify, merge,
52654   publish, distribute, sublicense, and/or sell copies of the Software,
52655   and to permit persons to whom the Software is furnished to do so,
52656   subject to the following conditions:
52657
52658   The above copyright notice and this permission notice shall be
52659   included in all copies or substantial portions of the Software.
52660
52661   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52662   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
52663   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52664   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52665   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52666   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52667   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52668   SOFTWARE.
52669 */
52670
52671
52672
52673 function Options(options, merge_child_field) {
52674   this.raw_options = _mergeOpts(options, merge_child_field);
52675
52676   // Support passing the source text back with no change
52677   this.disabled = this._get_boolean('disabled');
52678
52679   this.eol = this._get_characters('eol', 'auto');
52680   this.end_with_newline = this._get_boolean('end_with_newline');
52681   this.indent_size = this._get_number('indent_size', 4);
52682   this.indent_char = this._get_characters('indent_char', ' ');
52683   this.indent_level = this._get_number('indent_level');
52684
52685   this.preserve_newlines = this._get_boolean('preserve_newlines', true);
52686   this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786);
52687   if (!this.preserve_newlines) {
52688     this.max_preserve_newlines = 0;
52689   }
52690
52691   this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\t');
52692   if (this.indent_with_tabs) {
52693     this.indent_char = '\t';
52694
52695     // indent_size behavior changed after 1.8.6
52696     // It used to be that indent_size would be
52697     // set to 1 for indent_with_tabs. That is no longer needed and
52698     // actually doesn't make sense - why not use spaces? Further,
52699     // that might produce unexpected behavior - tabs being used
52700     // for single-column alignment. So, when indent_with_tabs is true
52701     // and indent_size is 1, reset indent_size to 4.
52702     if (this.indent_size === 1) {
52703       this.indent_size = 4;
52704     }
52705   }
52706
52707   // Backwards compat with 1.3.x
52708   this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char'));
52709
52710   this.indent_empty_lines = this._get_boolean('indent_empty_lines');
52711
52712   // valid templating languages ['django', 'erb', 'handlebars', 'php']
52713   // For now, 'auto' = all off for javascript, all on for html (and inline javascript).
52714   // other values ignored
52715   this.templating = this._get_selection_list('templating', ['auto', 'none', 'django', 'erb', 'handlebars', 'php'], ['auto']);
52716 }
52717
52718 Options.prototype._get_array = function(name, default_value) {
52719   var option_value = this.raw_options[name];
52720   var result = default_value || [];
52721   if (typeof option_value === 'object') {
52722     if (option_value !== null && typeof option_value.concat === 'function') {
52723       result = option_value.concat();
52724     }
52725   } else if (typeof option_value === 'string') {
52726     result = option_value.split(/[^a-zA-Z0-9_\/\-]+/);
52727   }
52728   return result;
52729 };
52730
52731 Options.prototype._get_boolean = function(name, default_value) {
52732   var option_value = this.raw_options[name];
52733   var result = option_value === undefined ? !!default_value : !!option_value;
52734   return result;
52735 };
52736
52737 Options.prototype._get_characters = function(name, default_value) {
52738   var option_value = this.raw_options[name];
52739   var result = default_value || '';
52740   if (typeof option_value === 'string') {
52741     result = option_value.replace(/\\r/, '\r').replace(/\\n/, '\n').replace(/\\t/, '\t');
52742   }
52743   return result;
52744 };
52745
52746 Options.prototype._get_number = function(name, default_value) {
52747   var option_value = this.raw_options[name];
52748   default_value = parseInt(default_value, 10);
52749   if (isNaN(default_value)) {
52750     default_value = 0;
52751   }
52752   var result = parseInt(option_value, 10);
52753   if (isNaN(result)) {
52754     result = default_value;
52755   }
52756   return result;
52757 };
52758
52759 Options.prototype._get_selection = function(name, selection_list, default_value) {
52760   var result = this._get_selection_list(name, selection_list, default_value);
52761   if (result.length !== 1) {
52762     throw new Error(
52763       "Invalid Option Value: The option '" + name + "' can only be one of the following values:\n" +
52764       selection_list + "\nYou passed in: '" + this.raw_options[name] + "'");
52765   }
52766
52767   return result[0];
52768 };
52769
52770
52771 Options.prototype._get_selection_list = function(name, selection_list, default_value) {
52772   if (!selection_list || selection_list.length === 0) {
52773     throw new Error("Selection list cannot be empty.");
52774   }
52775
52776   default_value = default_value || [selection_list[0]];
52777   if (!this._is_valid_selection(default_value, selection_list)) {
52778     throw new Error("Invalid Default Value!");
52779   }
52780
52781   var result = this._get_array(name, default_value);
52782   if (!this._is_valid_selection(result, selection_list)) {
52783     throw new Error(
52784       "Invalid Option Value: The option '" + name + "' can contain only the following values:\n" +
52785       selection_list + "\nYou passed in: '" + this.raw_options[name] + "'");
52786   }
52787
52788   return result;
52789 };
52790
52791 Options.prototype._is_valid_selection = function(result, selection_list) {
52792   return result.length && selection_list.length &&
52793     !result.some(function(item) { return selection_list.indexOf(item) === -1; });
52794 };
52795
52796
52797 // merges child options up with the parent options object
52798 // Example: obj = {a: 1, b: {a: 2}}
52799 //          mergeOpts(obj, 'b')
52800 //
52801 //          Returns: {a: 2}
52802 function _mergeOpts(allOptions, childFieldName) {
52803   var finalOpts = {};
52804   allOptions = _normalizeOpts(allOptions);
52805   var name;
52806
52807   for (name in allOptions) {
52808     if (name !== childFieldName) {
52809       finalOpts[name] = allOptions[name];
52810     }
52811   }
52812
52813   //merge in the per type settings for the childFieldName
52814   if (childFieldName && allOptions[childFieldName]) {
52815     for (name in allOptions[childFieldName]) {
52816       finalOpts[name] = allOptions[childFieldName][name];
52817     }
52818   }
52819   return finalOpts;
52820 }
52821
52822 function _normalizeOpts(options) {
52823   var convertedOpts = {};
52824   var key;
52825
52826   for (key in options) {
52827     var newKey = key.replace(/-/g, "_");
52828     convertedOpts[newKey] = options[key];
52829   }
52830   return convertedOpts;
52831 }
52832
52833 module.exports.Options = Options;
52834 module.exports.normalizeOpts = _normalizeOpts;
52835 module.exports.mergeOpts = _mergeOpts;
52836
52837
52838 /***/ }),
52839 /* 7 */,
52840 /* 8 */
52841 /***/ (function(module, exports, __nested_webpack_require_28319__) {
52842
52843 "use strict";
52844 /*jshint node:true */
52845 /*
52846
52847   The MIT License (MIT)
52848
52849   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
52850
52851   Permission is hereby granted, free of charge, to any person
52852   obtaining a copy of this software and associated documentation files
52853   (the "Software"), to deal in the Software without restriction,
52854   including without limitation the rights to use, copy, modify, merge,
52855   publish, distribute, sublicense, and/or sell copies of the Software,
52856   and to permit persons to whom the Software is furnished to do so,
52857   subject to the following conditions:
52858
52859   The above copyright notice and this permission notice shall be
52860   included in all copies or substantial portions of the Software.
52861
52862   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
52863   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
52864   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52865   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
52866   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
52867   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
52868   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
52869   SOFTWARE.
52870 */
52871
52872
52873
52874 var regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky');
52875
52876 function InputScanner(input_string) {
52877   this.__input = input_string || '';
52878   this.__input_length = this.__input.length;
52879   this.__position = 0;
52880 }
52881
52882 InputScanner.prototype.restart = function() {
52883   this.__position = 0;
52884 };
52885
52886 InputScanner.prototype.back = function() {
52887   if (this.__position > 0) {
52888     this.__position -= 1;
52889   }
52890 };
52891
52892 InputScanner.prototype.hasNext = function() {
52893   return this.__position < this.__input_length;
52894 };
52895
52896 InputScanner.prototype.next = function() {
52897   var val = null;
52898   if (this.hasNext()) {
52899     val = this.__input.charAt(this.__position);
52900     this.__position += 1;
52901   }
52902   return val;
52903 };
52904
52905 InputScanner.prototype.peek = function(index) {
52906   var val = null;
52907   index = index || 0;
52908   index += this.__position;
52909   if (index >= 0 && index < this.__input_length) {
52910     val = this.__input.charAt(index);
52911   }
52912   return val;
52913 };
52914
52915 // This is a JavaScript only helper function (not in python)
52916 // Javascript doesn't have a match method
52917 // and not all implementation support "sticky" flag.
52918 // If they do not support sticky then both this.match() and this.test() method
52919 // must get the match and check the index of the match.
52920 // If sticky is supported and set, this method will use it.
52921 // Otherwise it will check that global is set, and fall back to the slower method.
52922 InputScanner.prototype.__match = function(pattern, index) {
52923   pattern.lastIndex = index;
52924   var pattern_match = pattern.exec(this.__input);
52925
52926   if (pattern_match && !(regexp_has_sticky && pattern.sticky)) {
52927     if (pattern_match.index !== index) {
52928       pattern_match = null;
52929     }
52930   }
52931
52932   return pattern_match;
52933 };
52934
52935 InputScanner.prototype.test = function(pattern, index) {
52936   index = index || 0;
52937   index += this.__position;
52938
52939   if (index >= 0 && index < this.__input_length) {
52940     return !!this.__match(pattern, index);
52941   } else {
52942     return false;
52943   }
52944 };
52945
52946 InputScanner.prototype.testChar = function(pattern, index) {
52947   // test one character regex match
52948   var val = this.peek(index);
52949   pattern.lastIndex = 0;
52950   return val !== null && pattern.test(val);
52951 };
52952
52953 InputScanner.prototype.match = function(pattern) {
52954   var pattern_match = this.__match(pattern, this.__position);
52955   if (pattern_match) {
52956     this.__position += pattern_match[0].length;
52957   } else {
52958     pattern_match = null;
52959   }
52960   return pattern_match;
52961 };
52962
52963 InputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) {
52964   var val = '';
52965   var match;
52966   if (starting_pattern) {
52967     match = this.match(starting_pattern);
52968     if (match) {
52969       val += match[0];
52970     }
52971   }
52972   if (until_pattern && (match || !starting_pattern)) {
52973     val += this.readUntil(until_pattern, until_after);
52974   }
52975   return val;
52976 };
52977
52978 InputScanner.prototype.readUntil = function(pattern, until_after) {
52979   var val = '';
52980   var match_index = this.__position;
52981   pattern.lastIndex = this.__position;
52982   var pattern_match = pattern.exec(this.__input);
52983   if (pattern_match) {
52984     match_index = pattern_match.index;
52985     if (until_after) {
52986       match_index += pattern_match[0].length;
52987     }
52988   } else {
52989     match_index = this.__input_length;
52990   }
52991
52992   val = this.__input.substring(this.__position, match_index);
52993   this.__position = match_index;
52994   return val;
52995 };
52996
52997 InputScanner.prototype.readUntilAfter = function(pattern) {
52998   return this.readUntil(pattern, true);
52999 };
53000
53001 InputScanner.prototype.get_regexp = function(pattern, match_from) {
53002   var result = null;
53003   var flags = 'g';
53004   if (match_from && regexp_has_sticky) {
53005     flags = 'y';
53006   }
53007   // strings are converted to regexp
53008   if (typeof pattern === "string" && pattern !== '') {
53009     // result = new RegExp(pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), flags);
53010     result = new RegExp(pattern, flags);
53011   } else if (pattern) {
53012     result = new RegExp(pattern.source, flags);
53013   }
53014   return result;
53015 };
53016
53017 InputScanner.prototype.get_literal_regexp = function(literal_string) {
53018   return RegExp(literal_string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
53019 };
53020
53021 /* css beautifier legacy helpers */
53022 InputScanner.prototype.peekUntilAfter = function(pattern) {
53023   var start = this.__position;
53024   var val = this.readUntilAfter(pattern);
53025   this.__position = start;
53026   return val;
53027 };
53028
53029 InputScanner.prototype.lookBack = function(testVal) {
53030   var start = this.__position - 1;
53031   return start >= testVal.length && this.__input.substring(start - testVal.length, start)
53032     .toLowerCase() === testVal;
53033 };
53034
53035 module.exports.InputScanner = InputScanner;
53036
53037
53038 /***/ }),
53039 /* 9 */
53040 /***/ (function(module, exports, __nested_webpack_require_34031__) {
53041
53042 "use strict";
53043 /*jshint node:true */
53044 /*
53045
53046   The MIT License (MIT)
53047
53048   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53049
53050   Permission is hereby granted, free of charge, to any person
53051   obtaining a copy of this software and associated documentation files
53052   (the "Software"), to deal in the Software without restriction,
53053   including without limitation the rights to use, copy, modify, merge,
53054   publish, distribute, sublicense, and/or sell copies of the Software,
53055   and to permit persons to whom the Software is furnished to do so,
53056   subject to the following conditions:
53057
53058   The above copyright notice and this permission notice shall be
53059   included in all copies or substantial portions of the Software.
53060
53061   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53062   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53063   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53064   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53065   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53066   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53067   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53068   SOFTWARE.
53069 */
53070
53071
53072
53073 var InputScanner = __nested_webpack_require_34031__(8).InputScanner;
53074 var Token = __nested_webpack_require_34031__(3).Token;
53075 var TokenStream = __nested_webpack_require_34031__(10).TokenStream;
53076 var WhitespacePattern = __nested_webpack_require_34031__(11).WhitespacePattern;
53077
53078 var TOKEN = {
53079   START: 'TK_START',
53080   RAW: 'TK_RAW',
53081   EOF: 'TK_EOF'
53082 };
53083
53084 var Tokenizer = function(input_string, options) {
53085   this._input = new InputScanner(input_string);
53086   this._options = options || {};
53087   this.__tokens = null;
53088
53089   this._patterns = {};
53090   this._patterns.whitespace = new WhitespacePattern(this._input);
53091 };
53092
53093 Tokenizer.prototype.tokenize = function() {
53094   this._input.restart();
53095   this.__tokens = new TokenStream();
53096
53097   this._reset();
53098
53099   var current;
53100   var previous = new Token(TOKEN.START, '');
53101   var open_token = null;
53102   var open_stack = [];
53103   var comments = new TokenStream();
53104
53105   while (previous.type !== TOKEN.EOF) {
53106     current = this._get_next_token(previous, open_token);
53107     while (this._is_comment(current)) {
53108       comments.add(current);
53109       current = this._get_next_token(previous, open_token);
53110     }
53111
53112     if (!comments.isEmpty()) {
53113       current.comments_before = comments;
53114       comments = new TokenStream();
53115     }
53116
53117     current.parent = open_token;
53118
53119     if (this._is_opening(current)) {
53120       open_stack.push(open_token);
53121       open_token = current;
53122     } else if (open_token && this._is_closing(current, open_token)) {
53123       current.opened = open_token;
53124       open_token.closed = current;
53125       open_token = open_stack.pop();
53126       current.parent = open_token;
53127     }
53128
53129     current.previous = previous;
53130     previous.next = current;
53131
53132     this.__tokens.add(current);
53133     previous = current;
53134   }
53135
53136   return this.__tokens;
53137 };
53138
53139
53140 Tokenizer.prototype._is_first_token = function() {
53141   return this.__tokens.isEmpty();
53142 };
53143
53144 Tokenizer.prototype._reset = function() {};
53145
53146 Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false
53147   this._readWhitespace();
53148   var resulting_string = this._input.read(/.+/g);
53149   if (resulting_string) {
53150     return this._create_token(TOKEN.RAW, resulting_string);
53151   } else {
53152     return this._create_token(TOKEN.EOF, '');
53153   }
53154 };
53155
53156 Tokenizer.prototype._is_comment = function(current_token) { // jshint unused:false
53157   return false;
53158 };
53159
53160 Tokenizer.prototype._is_opening = function(current_token) { // jshint unused:false
53161   return false;
53162 };
53163
53164 Tokenizer.prototype._is_closing = function(current_token, open_token) { // jshint unused:false
53165   return false;
53166 };
53167
53168 Tokenizer.prototype._create_token = function(type, text) {
53169   var token = new Token(type, text,
53170     this._patterns.whitespace.newline_count,
53171     this._patterns.whitespace.whitespace_before_token);
53172   return token;
53173 };
53174
53175 Tokenizer.prototype._readWhitespace = function() {
53176   return this._patterns.whitespace.read();
53177 };
53178
53179
53180
53181 module.exports.Tokenizer = Tokenizer;
53182 module.exports.TOKEN = TOKEN;
53183
53184
53185 /***/ }),
53186 /* 10 */
53187 /***/ (function(module, exports, __nested_webpack_require_38146__) {
53188
53189 "use strict";
53190 /*jshint node:true */
53191 /*
53192
53193   The MIT License (MIT)
53194
53195   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53196
53197   Permission is hereby granted, free of charge, to any person
53198   obtaining a copy of this software and associated documentation files
53199   (the "Software"), to deal in the Software without restriction,
53200   including without limitation the rights to use, copy, modify, merge,
53201   publish, distribute, sublicense, and/or sell copies of the Software,
53202   and to permit persons to whom the Software is furnished to do so,
53203   subject to the following conditions:
53204
53205   The above copyright notice and this permission notice shall be
53206   included in all copies or substantial portions of the Software.
53207
53208   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53209   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53210   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53211   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53212   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53213   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53214   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53215   SOFTWARE.
53216 */
53217
53218
53219
53220 function TokenStream(parent_token) {
53221   // private
53222   this.__tokens = [];
53223   this.__tokens_length = this.__tokens.length;
53224   this.__position = 0;
53225   this.__parent_token = parent_token;
53226 }
53227
53228 TokenStream.prototype.restart = function() {
53229   this.__position = 0;
53230 };
53231
53232 TokenStream.prototype.isEmpty = function() {
53233   return this.__tokens_length === 0;
53234 };
53235
53236 TokenStream.prototype.hasNext = function() {
53237   return this.__position < this.__tokens_length;
53238 };
53239
53240 TokenStream.prototype.next = function() {
53241   var val = null;
53242   if (this.hasNext()) {
53243     val = this.__tokens[this.__position];
53244     this.__position += 1;
53245   }
53246   return val;
53247 };
53248
53249 TokenStream.prototype.peek = function(index) {
53250   var val = null;
53251   index = index || 0;
53252   index += this.__position;
53253   if (index >= 0 && index < this.__tokens_length) {
53254     val = this.__tokens[index];
53255   }
53256   return val;
53257 };
53258
53259 TokenStream.prototype.add = function(token) {
53260   if (this.__parent_token) {
53261     token.parent = this.__parent_token;
53262   }
53263   this.__tokens.push(token);
53264   this.__tokens_length += 1;
53265 };
53266
53267 module.exports.TokenStream = TokenStream;
53268
53269
53270 /***/ }),
53271 /* 11 */
53272 /***/ (function(module, exports, __nested_webpack_require_40484__) {
53273
53274 "use strict";
53275 /*jshint node:true */
53276 /*
53277
53278   The MIT License (MIT)
53279
53280   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53281
53282   Permission is hereby granted, free of charge, to any person
53283   obtaining a copy of this software and associated documentation files
53284   (the "Software"), to deal in the Software without restriction,
53285   including without limitation the rights to use, copy, modify, merge,
53286   publish, distribute, sublicense, and/or sell copies of the Software,
53287   and to permit persons to whom the Software is furnished to do so,
53288   subject to the following conditions:
53289
53290   The above copyright notice and this permission notice shall be
53291   included in all copies or substantial portions of the Software.
53292
53293   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53294   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53295   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53296   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53297   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53298   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53299   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53300   SOFTWARE.
53301 */
53302
53303
53304
53305 var Pattern = __nested_webpack_require_40484__(12).Pattern;
53306
53307 function WhitespacePattern(input_scanner, parent) {
53308   Pattern.call(this, input_scanner, parent);
53309   if (parent) {
53310     this._line_regexp = this._input.get_regexp(parent._line_regexp);
53311   } else {
53312     this.__set_whitespace_patterns('', '');
53313   }
53314
53315   this.newline_count = 0;
53316   this.whitespace_before_token = '';
53317 }
53318 WhitespacePattern.prototype = new Pattern();
53319
53320 WhitespacePattern.prototype.__set_whitespace_patterns = function(whitespace_chars, newline_chars) {
53321   whitespace_chars += '\\t ';
53322   newline_chars += '\\n\\r';
53323
53324   this._match_pattern = this._input.get_regexp(
53325     '[' + whitespace_chars + newline_chars + ']+', true);
53326   this._newline_regexp = this._input.get_regexp(
53327     '\\r\\n|[' + newline_chars + ']');
53328 };
53329
53330 WhitespacePattern.prototype.read = function() {
53331   this.newline_count = 0;
53332   this.whitespace_before_token = '';
53333
53334   var resulting_string = this._input.read(this._match_pattern);
53335   if (resulting_string === ' ') {
53336     this.whitespace_before_token = ' ';
53337   } else if (resulting_string) {
53338     var matches = this.__split(this._newline_regexp, resulting_string);
53339     this.newline_count = matches.length - 1;
53340     this.whitespace_before_token = matches[this.newline_count];
53341   }
53342
53343   return resulting_string;
53344 };
53345
53346 WhitespacePattern.prototype.matching = function(whitespace_chars, newline_chars) {
53347   var result = this._create();
53348   result.__set_whitespace_patterns(whitespace_chars, newline_chars);
53349   result._update();
53350   return result;
53351 };
53352
53353 WhitespacePattern.prototype._create = function() {
53354   return new WhitespacePattern(this._input, this);
53355 };
53356
53357 WhitespacePattern.prototype.__split = function(regexp, input_string) {
53358   regexp.lastIndex = 0;
53359   var start_index = 0;
53360   var result = [];
53361   var next_match = regexp.exec(input_string);
53362   while (next_match) {
53363     result.push(input_string.substring(start_index, next_match.index));
53364     start_index = next_match.index + next_match[0].length;
53365     next_match = regexp.exec(input_string);
53366   }
53367
53368   if (start_index < input_string.length) {
53369     result.push(input_string.substring(start_index, input_string.length));
53370   } else {
53371     result.push('');
53372   }
53373
53374   return result;
53375 };
53376
53377
53378
53379 module.exports.WhitespacePattern = WhitespacePattern;
53380
53381
53382 /***/ }),
53383 /* 12 */
53384 /***/ (function(module, exports, __nested_webpack_require_43972__) {
53385
53386 "use strict";
53387 /*jshint node:true */
53388 /*
53389
53390   The MIT License (MIT)
53391
53392   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53393
53394   Permission is hereby granted, free of charge, to any person
53395   obtaining a copy of this software and associated documentation files
53396   (the "Software"), to deal in the Software without restriction,
53397   including without limitation the rights to use, copy, modify, merge,
53398   publish, distribute, sublicense, and/or sell copies of the Software,
53399   and to permit persons to whom the Software is furnished to do so,
53400   subject to the following conditions:
53401
53402   The above copyright notice and this permission notice shall be
53403   included in all copies or substantial portions of the Software.
53404
53405   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53406   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53407   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53408   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53409   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53410   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53411   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53412   SOFTWARE.
53413 */
53414
53415
53416
53417 function Pattern(input_scanner, parent) {
53418   this._input = input_scanner;
53419   this._starting_pattern = null;
53420   this._match_pattern = null;
53421   this._until_pattern = null;
53422   this._until_after = false;
53423
53424   if (parent) {
53425     this._starting_pattern = this._input.get_regexp(parent._starting_pattern, true);
53426     this._match_pattern = this._input.get_regexp(parent._match_pattern, true);
53427     this._until_pattern = this._input.get_regexp(parent._until_pattern);
53428     this._until_after = parent._until_after;
53429   }
53430 }
53431
53432 Pattern.prototype.read = function() {
53433   var result = this._input.read(this._starting_pattern);
53434   if (!this._starting_pattern || result) {
53435     result += this._input.read(this._match_pattern, this._until_pattern, this._until_after);
53436   }
53437   return result;
53438 };
53439
53440 Pattern.prototype.read_match = function() {
53441   return this._input.match(this._match_pattern);
53442 };
53443
53444 Pattern.prototype.until_after = function(pattern) {
53445   var result = this._create();
53446   result._until_after = true;
53447   result._until_pattern = this._input.get_regexp(pattern);
53448   result._update();
53449   return result;
53450 };
53451
53452 Pattern.prototype.until = function(pattern) {
53453   var result = this._create();
53454   result._until_after = false;
53455   result._until_pattern = this._input.get_regexp(pattern);
53456   result._update();
53457   return result;
53458 };
53459
53460 Pattern.prototype.starting_with = function(pattern) {
53461   var result = this._create();
53462   result._starting_pattern = this._input.get_regexp(pattern, true);
53463   result._update();
53464   return result;
53465 };
53466
53467 Pattern.prototype.matching = function(pattern) {
53468   var result = this._create();
53469   result._match_pattern = this._input.get_regexp(pattern, true);
53470   result._update();
53471   return result;
53472 };
53473
53474 Pattern.prototype._create = function() {
53475   return new Pattern(this._input, this);
53476 };
53477
53478 Pattern.prototype._update = function() {};
53479
53480 module.exports.Pattern = Pattern;
53481
53482
53483 /***/ }),
53484 /* 13 */
53485 /***/ (function(module, exports, __nested_webpack_require_47072__) {
53486
53487 "use strict";
53488 /*jshint node:true */
53489 /*
53490
53491   The MIT License (MIT)
53492
53493   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53494
53495   Permission is hereby granted, free of charge, to any person
53496   obtaining a copy of this software and associated documentation files
53497   (the "Software"), to deal in the Software without restriction,
53498   including without limitation the rights to use, copy, modify, merge,
53499   publish, distribute, sublicense, and/or sell copies of the Software,
53500   and to permit persons to whom the Software is furnished to do so,
53501   subject to the following conditions:
53502
53503   The above copyright notice and this permission notice shall be
53504   included in all copies or substantial portions of the Software.
53505
53506   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53507   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53508   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53509   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53510   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53511   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53512   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53513   SOFTWARE.
53514 */
53515
53516
53517
53518 function Directives(start_block_pattern, end_block_pattern) {
53519   start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source;
53520   end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source;
53521   this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \w+[:]\w+)+ /.source + end_block_pattern, 'g');
53522   this.__directive_pattern = / (\w+)[:](\w+)/g;
53523
53524   this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\sbeautify\signore:end\s/.source + end_block_pattern, 'g');
53525 }
53526
53527 Directives.prototype.get_directives = function(text) {
53528   if (!text.match(this.__directives_block_pattern)) {
53529     return null;
53530   }
53531
53532   var directives = {};
53533   this.__directive_pattern.lastIndex = 0;
53534   var directive_match = this.__directive_pattern.exec(text);
53535
53536   while (directive_match) {
53537     directives[directive_match[1]] = directive_match[2];
53538     directive_match = this.__directive_pattern.exec(text);
53539   }
53540
53541   return directives;
53542 };
53543
53544 Directives.prototype.readIgnored = function(input) {
53545   return input.readUntilAfter(this.__directives_end_ignore_pattern);
53546 };
53547
53548
53549 module.exports.Directives = Directives;
53550
53551
53552 /***/ }),
53553 /* 14 */
53554 /***/ (function(module, exports, __nested_webpack_require_49554__) {
53555
53556 "use strict";
53557 /*jshint node:true */
53558 /*
53559
53560   The MIT License (MIT)
53561
53562   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53563
53564   Permission is hereby granted, free of charge, to any person
53565   obtaining a copy of this software and associated documentation files
53566   (the "Software"), to deal in the Software without restriction,
53567   including without limitation the rights to use, copy, modify, merge,
53568   publish, distribute, sublicense, and/or sell copies of the Software,
53569   and to permit persons to whom the Software is furnished to do so,
53570   subject to the following conditions:
53571
53572   The above copyright notice and this permission notice shall be
53573   included in all copies or substantial portions of the Software.
53574
53575   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53576   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53577   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53578   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53579   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53580   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53581   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53582   SOFTWARE.
53583 */
53584
53585
53586
53587 var Pattern = __nested_webpack_require_49554__(12).Pattern;
53588
53589
53590 var template_names = {
53591   django: false,
53592   erb: false,
53593   handlebars: false,
53594   php: false
53595 };
53596
53597 // This lets templates appear anywhere we would do a readUntil
53598 // The cost is higher but it is pay to play.
53599 function TemplatablePattern(input_scanner, parent) {
53600   Pattern.call(this, input_scanner, parent);
53601   this.__template_pattern = null;
53602   this._disabled = Object.assign({}, template_names);
53603   this._excluded = Object.assign({}, template_names);
53604
53605   if (parent) {
53606     this.__template_pattern = this._input.get_regexp(parent.__template_pattern);
53607     this._excluded = Object.assign(this._excluded, parent._excluded);
53608     this._disabled = Object.assign(this._disabled, parent._disabled);
53609   }
53610   var pattern = new Pattern(input_scanner);
53611   this.__patterns = {
53612     handlebars_comment: pattern.starting_with(/{{!--/).until_after(/--}}/),
53613     handlebars_unescaped: pattern.starting_with(/{{{/).until_after(/}}}/),
53614     handlebars: pattern.starting_with(/{{/).until_after(/}}/),
53615     php: pattern.starting_with(/<\?(?:[=]|php)/).until_after(/\?>/),
53616     erb: pattern.starting_with(/<%[^%]/).until_after(/[^%]%>/),
53617     // django coflicts with handlebars a bit.
53618     django: pattern.starting_with(/{%/).until_after(/%}/),
53619     django_value: pattern.starting_with(/{{/).until_after(/}}/),
53620     django_comment: pattern.starting_with(/{#/).until_after(/#}/)
53621   };
53622 }
53623 TemplatablePattern.prototype = new Pattern();
53624
53625 TemplatablePattern.prototype._create = function() {
53626   return new TemplatablePattern(this._input, this);
53627 };
53628
53629 TemplatablePattern.prototype._update = function() {
53630   this.__set_templated_pattern();
53631 };
53632
53633 TemplatablePattern.prototype.disable = function(language) {
53634   var result = this._create();
53635   result._disabled[language] = true;
53636   result._update();
53637   return result;
53638 };
53639
53640 TemplatablePattern.prototype.read_options = function(options) {
53641   var result = this._create();
53642   for (var language in template_names) {
53643     result._disabled[language] = options.templating.indexOf(language) === -1;
53644   }
53645   result._update();
53646   return result;
53647 };
53648
53649 TemplatablePattern.prototype.exclude = function(language) {
53650   var result = this._create();
53651   result._excluded[language] = true;
53652   result._update();
53653   return result;
53654 };
53655
53656 TemplatablePattern.prototype.read = function() {
53657   var result = '';
53658   if (this._match_pattern) {
53659     result = this._input.read(this._starting_pattern);
53660   } else {
53661     result = this._input.read(this._starting_pattern, this.__template_pattern);
53662   }
53663   var next = this._read_template();
53664   while (next) {
53665     if (this._match_pattern) {
53666       next += this._input.read(this._match_pattern);
53667     } else {
53668       next += this._input.readUntil(this.__template_pattern);
53669     }
53670     result += next;
53671     next = this._read_template();
53672   }
53673
53674   if (this._until_after) {
53675     result += this._input.readUntilAfter(this._until_pattern);
53676   }
53677   return result;
53678 };
53679
53680 TemplatablePattern.prototype.__set_templated_pattern = function() {
53681   var items = [];
53682
53683   if (!this._disabled.php) {
53684     items.push(this.__patterns.php._starting_pattern.source);
53685   }
53686   if (!this._disabled.handlebars) {
53687     items.push(this.__patterns.handlebars._starting_pattern.source);
53688   }
53689   if (!this._disabled.erb) {
53690     items.push(this.__patterns.erb._starting_pattern.source);
53691   }
53692   if (!this._disabled.django) {
53693     items.push(this.__patterns.django._starting_pattern.source);
53694     items.push(this.__patterns.django_value._starting_pattern.source);
53695     items.push(this.__patterns.django_comment._starting_pattern.source);
53696   }
53697
53698   if (this._until_pattern) {
53699     items.push(this._until_pattern.source);
53700   }
53701   this.__template_pattern = this._input.get_regexp('(?:' + items.join('|') + ')');
53702 };
53703
53704 TemplatablePattern.prototype._read_template = function() {
53705   var resulting_string = '';
53706   var c = this._input.peek();
53707   if (c === '<') {
53708     var peek1 = this._input.peek(1);
53709     //if we're in a comment, do something special
53710     // We treat all comments as literals, even more than preformatted tags
53711     // we just look for the appropriate close tag
53712     if (!this._disabled.php && !this._excluded.php && peek1 === '?') {
53713       resulting_string = resulting_string ||
53714         this.__patterns.php.read();
53715     }
53716     if (!this._disabled.erb && !this._excluded.erb && peek1 === '%') {
53717       resulting_string = resulting_string ||
53718         this.__patterns.erb.read();
53719     }
53720   } else if (c === '{') {
53721     if (!this._disabled.handlebars && !this._excluded.handlebars) {
53722       resulting_string = resulting_string ||
53723         this.__patterns.handlebars_comment.read();
53724       resulting_string = resulting_string ||
53725         this.__patterns.handlebars_unescaped.read();
53726       resulting_string = resulting_string ||
53727         this.__patterns.handlebars.read();
53728     }
53729     if (!this._disabled.django) {
53730       // django coflicts with handlebars a bit.
53731       if (!this._excluded.django && !this._excluded.handlebars) {
53732         resulting_string = resulting_string ||
53733           this.__patterns.django_value.read();
53734       }
53735       if (!this._excluded.django) {
53736         resulting_string = resulting_string ||
53737           this.__patterns.django_comment.read();
53738         resulting_string = resulting_string ||
53739           this.__patterns.django.read();
53740       }
53741     }
53742   }
53743   return resulting_string;
53744 };
53745
53746
53747 module.exports.TemplatablePattern = TemplatablePattern;
53748
53749
53750 /***/ }),
53751 /* 15 */,
53752 /* 16 */,
53753 /* 17 */,
53754 /* 18 */
53755 /***/ (function(module, exports, __nested_webpack_require_56152__) {
53756
53757 "use strict";
53758 /*jshint node:true */
53759 /*
53760
53761   The MIT License (MIT)
53762
53763   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53764
53765   Permission is hereby granted, free of charge, to any person
53766   obtaining a copy of this software and associated documentation files
53767   (the "Software"), to deal in the Software without restriction,
53768   including without limitation the rights to use, copy, modify, merge,
53769   publish, distribute, sublicense, and/or sell copies of the Software,
53770   and to permit persons to whom the Software is furnished to do so,
53771   subject to the following conditions:
53772
53773   The above copyright notice and this permission notice shall be
53774   included in all copies or substantial portions of the Software.
53775
53776   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53777   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53778   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53779   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53780   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53781   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53782   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53783   SOFTWARE.
53784 */
53785
53786
53787
53788 var Beautifier = __nested_webpack_require_56152__(19).Beautifier,
53789   Options = __nested_webpack_require_56152__(20).Options;
53790
53791 function style_html(html_source, options, js_beautify, css_beautify) {
53792   var beautifier = new Beautifier(html_source, options, js_beautify, css_beautify);
53793   return beautifier.beautify();
53794 }
53795
53796 module.exports = style_html;
53797 module.exports.defaultOptions = function() {
53798   return new Options();
53799 };
53800
53801
53802 /***/ }),
53803 /* 19 */
53804 /***/ (function(module, exports, __nested_webpack_require_57823__) {
53805
53806 "use strict";
53807 /*jshint node:true */
53808 /*
53809
53810   The MIT License (MIT)
53811
53812   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
53813
53814   Permission is hereby granted, free of charge, to any person
53815   obtaining a copy of this software and associated documentation files
53816   (the "Software"), to deal in the Software without restriction,
53817   including without limitation the rights to use, copy, modify, merge,
53818   publish, distribute, sublicense, and/or sell copies of the Software,
53819   and to permit persons to whom the Software is furnished to do so,
53820   subject to the following conditions:
53821
53822   The above copyright notice and this permission notice shall be
53823   included in all copies or substantial portions of the Software.
53824
53825   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53826   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53827   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
53828   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
53829   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
53830   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
53831   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
53832   SOFTWARE.
53833 */
53834
53835
53836
53837 var Options = __nested_webpack_require_57823__(20).Options;
53838 var Output = __nested_webpack_require_57823__(2).Output;
53839 var Tokenizer = __nested_webpack_require_57823__(21).Tokenizer;
53840 var TOKEN = __nested_webpack_require_57823__(21).TOKEN;
53841
53842 var lineBreak = /\r\n|[\r\n]/;
53843 var allLineBreaks = /\r\n|[\r\n]/g;
53844
53845 var Printer = function(options, base_indent_string) { //handles input/output and some other printing functions
53846
53847   this.indent_level = 0;
53848   this.alignment_size = 0;
53849   this.max_preserve_newlines = options.max_preserve_newlines;
53850   this.preserve_newlines = options.preserve_newlines;
53851
53852   this._output = new Output(options, base_indent_string);
53853
53854 };
53855
53856 Printer.prototype.current_line_has_match = function(pattern) {
53857   return this._output.current_line.has_match(pattern);
53858 };
53859
53860 Printer.prototype.set_space_before_token = function(value, non_breaking) {
53861   this._output.space_before_token = value;
53862   this._output.non_breaking_space = non_breaking;
53863 };
53864
53865 Printer.prototype.set_wrap_point = function() {
53866   this._output.set_indent(this.indent_level, this.alignment_size);
53867   this._output.set_wrap_point();
53868 };
53869
53870
53871 Printer.prototype.add_raw_token = function(token) {
53872   this._output.add_raw_token(token);
53873 };
53874
53875 Printer.prototype.print_preserved_newlines = function(raw_token) {
53876   var newlines = 0;
53877   if (raw_token.type !== TOKEN.TEXT && raw_token.previous.type !== TOKEN.TEXT) {
53878     newlines = raw_token.newlines ? 1 : 0;
53879   }
53880
53881   if (this.preserve_newlines) {
53882     newlines = raw_token.newlines < this.max_preserve_newlines + 1 ? raw_token.newlines : this.max_preserve_newlines + 1;
53883   }
53884   for (var n = 0; n < newlines; n++) {
53885     this.print_newline(n > 0);
53886   }
53887
53888   return newlines !== 0;
53889 };
53890
53891 Printer.prototype.traverse_whitespace = function(raw_token) {
53892   if (raw_token.whitespace_before || raw_token.newlines) {
53893     if (!this.print_preserved_newlines(raw_token)) {
53894       this._output.space_before_token = true;
53895     }
53896     return true;
53897   }
53898   return false;
53899 };
53900
53901 Printer.prototype.previous_token_wrapped = function() {
53902   return this._output.previous_token_wrapped;
53903 };
53904
53905 Printer.prototype.print_newline = function(force) {
53906   this._output.add_new_line(force);
53907 };
53908
53909 Printer.prototype.print_token = function(token) {
53910   if (token.text) {
53911     this._output.set_indent(this.indent_level, this.alignment_size);
53912     this._output.add_token(token.text);
53913   }
53914 };
53915
53916 Printer.prototype.indent = function() {
53917   this.indent_level++;
53918 };
53919
53920 Printer.prototype.get_full_indent = function(level) {
53921   level = this.indent_level + (level || 0);
53922   if (level < 1) {
53923     return '';
53924   }
53925
53926   return this._output.get_indent_string(level);
53927 };
53928
53929 var get_type_attribute = function(start_token) {
53930   var result = null;
53931   var raw_token = start_token.next;
53932
53933   // Search attributes for a type attribute
53934   while (raw_token.type !== TOKEN.EOF && start_token.closed !== raw_token) {
53935     if (raw_token.type === TOKEN.ATTRIBUTE && raw_token.text === 'type') {
53936       if (raw_token.next && raw_token.next.type === TOKEN.EQUALS &&
53937         raw_token.next.next && raw_token.next.next.type === TOKEN.VALUE) {
53938         result = raw_token.next.next.text;
53939       }
53940       break;
53941     }
53942     raw_token = raw_token.next;
53943   }
53944
53945   return result;
53946 };
53947
53948 var get_custom_beautifier_name = function(tag_check, raw_token) {
53949   var typeAttribute = null;
53950   var result = null;
53951
53952   if (!raw_token.closed) {
53953     return null;
53954   }
53955
53956   if (tag_check === 'script') {
53957     typeAttribute = 'text/javascript';
53958   } else if (tag_check === 'style') {
53959     typeAttribute = 'text/css';
53960   }
53961
53962   typeAttribute = get_type_attribute(raw_token) || typeAttribute;
53963
53964   // For script and style tags that have a type attribute, only enable custom beautifiers for matching values
53965   // For those without a type attribute use default;
53966   if (typeAttribute.search('text/css') > -1) {
53967     result = 'css';
53968   } else if (typeAttribute.search(/module|((text|application|dojo)\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\+)?json|method|aspect))/) > -1) {
53969     result = 'javascript';
53970   } else if (typeAttribute.search(/(text|application|dojo)\/(x-)?(html)/) > -1) {
53971     result = 'html';
53972   } else if (typeAttribute.search(/test\/null/) > -1) {
53973     // Test only mime-type for testing the beautifier when null is passed as beautifing function
53974     result = 'null';
53975   }
53976
53977   return result;
53978 };
53979
53980 function in_array(what, arr) {
53981   return arr.indexOf(what) !== -1;
53982 }
53983
53984 function TagFrame(parent, parser_token, indent_level) {
53985   this.parent = parent || null;
53986   this.tag = parser_token ? parser_token.tag_name : '';
53987   this.indent_level = indent_level || 0;
53988   this.parser_token = parser_token || null;
53989 }
53990
53991 function TagStack(printer) {
53992   this._printer = printer;
53993   this._current_frame = null;
53994 }
53995
53996 TagStack.prototype.get_parser_token = function() {
53997   return this._current_frame ? this._current_frame.parser_token : null;
53998 };
53999
54000 TagStack.prototype.record_tag = function(parser_token) { //function to record a tag and its parent in this.tags Object
54001   var new_frame = new TagFrame(this._current_frame, parser_token, this._printer.indent_level);
54002   this._current_frame = new_frame;
54003 };
54004
54005 TagStack.prototype._try_pop_frame = function(frame) { //function to retrieve the opening tag to the corresponding closer
54006   var parser_token = null;
54007
54008   if (frame) {
54009     parser_token = frame.parser_token;
54010     this._printer.indent_level = frame.indent_level;
54011     this._current_frame = frame.parent;
54012   }
54013
54014   return parser_token;
54015 };
54016
54017 TagStack.prototype._get_frame = function(tag_list, stop_list) { //function to retrieve the opening tag to the corresponding closer
54018   var frame = this._current_frame;
54019
54020   while (frame) { //till we reach '' (the initial value);
54021     if (tag_list.indexOf(frame.tag) !== -1) { //if this is it use it
54022       break;
54023     } else if (stop_list && stop_list.indexOf(frame.tag) !== -1) {
54024       frame = null;
54025       break;
54026     }
54027     frame = frame.parent;
54028   }
54029
54030   return frame;
54031 };
54032
54033 TagStack.prototype.try_pop = function(tag, stop_list) { //function to retrieve the opening tag to the corresponding closer
54034   var frame = this._get_frame([tag], stop_list);
54035   return this._try_pop_frame(frame);
54036 };
54037
54038 TagStack.prototype.indent_to_tag = function(tag_list) {
54039   var frame = this._get_frame(tag_list);
54040   if (frame) {
54041     this._printer.indent_level = frame.indent_level;
54042   }
54043 };
54044
54045 function Beautifier(source_text, options, js_beautify, css_beautify) {
54046   //Wrapper function to invoke all the necessary constructors and deal with the output.
54047   this._source_text = source_text || '';
54048   options = options || {};
54049   this._js_beautify = js_beautify;
54050   this._css_beautify = css_beautify;
54051   this._tag_stack = null;
54052
54053   // Allow the setting of language/file-type specific options
54054   // with inheritance of overall settings
54055   var optionHtml = new Options(options, 'html');
54056
54057   this._options = optionHtml;
54058
54059   this._is_wrap_attributes_force = this._options.wrap_attributes.substr(0, 'force'.length) === 'force';
54060   this._is_wrap_attributes_force_expand_multiline = (this._options.wrap_attributes === 'force-expand-multiline');
54061   this._is_wrap_attributes_force_aligned = (this._options.wrap_attributes === 'force-aligned');
54062   this._is_wrap_attributes_aligned_multiple = (this._options.wrap_attributes === 'aligned-multiple');
54063   this._is_wrap_attributes_preserve = this._options.wrap_attributes.substr(0, 'preserve'.length) === 'preserve';
54064   this._is_wrap_attributes_preserve_aligned = (this._options.wrap_attributes === 'preserve-aligned');
54065 }
54066
54067 Beautifier.prototype.beautify = function() {
54068
54069   // if disabled, return the input unchanged.
54070   if (this._options.disabled) {
54071     return this._source_text;
54072   }
54073
54074   var source_text = this._source_text;
54075   var eol = this._options.eol;
54076   if (this._options.eol === 'auto') {
54077     eol = '\n';
54078     if (source_text && lineBreak.test(source_text)) {
54079       eol = source_text.match(lineBreak)[0];
54080     }
54081   }
54082
54083   // HACK: newline parsing inconsistent. This brute force normalizes the input.
54084   source_text = source_text.replace(allLineBreaks, '\n');
54085
54086   var baseIndentString = source_text.match(/^[\t ]*/)[0];
54087
54088   var last_token = {
54089     text: '',
54090     type: ''
54091   };
54092
54093   var last_tag_token = new TagOpenParserToken();
54094
54095   var printer = new Printer(this._options, baseIndentString);
54096   var tokens = new Tokenizer(source_text, this._options).tokenize();
54097
54098   this._tag_stack = new TagStack(printer);
54099
54100   var parser_token = null;
54101   var raw_token = tokens.next();
54102   while (raw_token.type !== TOKEN.EOF) {
54103
54104     if (raw_token.type === TOKEN.TAG_OPEN || raw_token.type === TOKEN.COMMENT) {
54105       parser_token = this._handle_tag_open(printer, raw_token, last_tag_token, last_token);
54106       last_tag_token = parser_token;
54107     } else if ((raw_token.type === TOKEN.ATTRIBUTE || raw_token.type === TOKEN.EQUALS || raw_token.type === TOKEN.VALUE) ||
54108       (raw_token.type === TOKEN.TEXT && !last_tag_token.tag_complete)) {
54109       parser_token = this._handle_inside_tag(printer, raw_token, last_tag_token, tokens);
54110     } else if (raw_token.type === TOKEN.TAG_CLOSE) {
54111       parser_token = this._handle_tag_close(printer, raw_token, last_tag_token);
54112     } else if (raw_token.type === TOKEN.TEXT) {
54113       parser_token = this._handle_text(printer, raw_token, last_tag_token);
54114     } else {
54115       // This should never happen, but if it does. Print the raw token
54116       printer.add_raw_token(raw_token);
54117     }
54118
54119     last_token = parser_token;
54120
54121     raw_token = tokens.next();
54122   }
54123   var sweet_code = printer._output.get_code(eol);
54124
54125   return sweet_code;
54126 };
54127
54128 Beautifier.prototype._handle_tag_close = function(printer, raw_token, last_tag_token) {
54129   var parser_token = {
54130     text: raw_token.text,
54131     type: raw_token.type
54132   };
54133   printer.alignment_size = 0;
54134   last_tag_token.tag_complete = true;
54135
54136   printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);
54137   if (last_tag_token.is_unformatted) {
54138     printer.add_raw_token(raw_token);
54139   } else {
54140     if (last_tag_token.tag_start_char === '<') {
54141       printer.set_space_before_token(raw_token.text[0] === '/', true); // space before />, no space before >
54142       if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.has_wrapped_attrs) {
54143         printer.print_newline(false);
54144       }
54145     }
54146     printer.print_token(raw_token);
54147
54148   }
54149
54150   if (last_tag_token.indent_content &&
54151     !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {
54152     printer.indent();
54153
54154     // only indent once per opened tag
54155     last_tag_token.indent_content = false;
54156   }
54157
54158   if (!last_tag_token.is_inline_element &&
54159     !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) {
54160     printer.set_wrap_point();
54161   }
54162
54163   return parser_token;
54164 };
54165
54166 Beautifier.prototype._handle_inside_tag = function(printer, raw_token, last_tag_token, tokens) {
54167   var wrapped = last_tag_token.has_wrapped_attrs;
54168   var parser_token = {
54169     text: raw_token.text,
54170     type: raw_token.type
54171   };
54172
54173   printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true);
54174   if (last_tag_token.is_unformatted) {
54175     printer.add_raw_token(raw_token);
54176   } else if (last_tag_token.tag_start_char === '{' && raw_token.type === TOKEN.TEXT) {
54177     // For the insides of handlebars allow newlines or a single space between open and contents
54178     if (printer.print_preserved_newlines(raw_token)) {
54179       raw_token.newlines = 0;
54180       printer.add_raw_token(raw_token);
54181     } else {
54182       printer.print_token(raw_token);
54183     }
54184   } else {
54185     if (raw_token.type === TOKEN.ATTRIBUTE) {
54186       printer.set_space_before_token(true);
54187       last_tag_token.attr_count += 1;
54188     } else if (raw_token.type === TOKEN.EQUALS) { //no space before =
54189       printer.set_space_before_token(false);
54190     } else if (raw_token.type === TOKEN.VALUE && raw_token.previous.type === TOKEN.EQUALS) { //no space before value
54191       printer.set_space_before_token(false);
54192     }
54193
54194     if (raw_token.type === TOKEN.ATTRIBUTE && last_tag_token.tag_start_char === '<') {
54195       if (this._is_wrap_attributes_preserve || this._is_wrap_attributes_preserve_aligned) {
54196         printer.traverse_whitespace(raw_token);
54197         wrapped = wrapped || raw_token.newlines !== 0;
54198       }
54199
54200
54201       if (this._is_wrap_attributes_force) {
54202         var force_attr_wrap = last_tag_token.attr_count > 1;
54203         if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.attr_count === 1) {
54204           var is_only_attribute = true;
54205           var peek_index = 0;
54206           var peek_token;
54207           do {
54208             peek_token = tokens.peek(peek_index);
54209             if (peek_token.type === TOKEN.ATTRIBUTE) {
54210               is_only_attribute = false;
54211               break;
54212             }
54213             peek_index += 1;
54214           } while (peek_index < 4 && peek_token.type !== TOKEN.EOF && peek_token.type !== TOKEN.TAG_CLOSE);
54215
54216           force_attr_wrap = !is_only_attribute;
54217         }
54218
54219         if (force_attr_wrap) {
54220           printer.print_newline(false);
54221           wrapped = true;
54222         }
54223       }
54224     }
54225     printer.print_token(raw_token);
54226     wrapped = wrapped || printer.previous_token_wrapped();
54227     last_tag_token.has_wrapped_attrs = wrapped;
54228   }
54229   return parser_token;
54230 };
54231
54232 Beautifier.prototype._handle_text = function(printer, raw_token, last_tag_token) {
54233   var parser_token = {
54234     text: raw_token.text,
54235     type: 'TK_CONTENT'
54236   };
54237   if (last_tag_token.custom_beautifier_name) { //check if we need to format javascript
54238     this._print_custom_beatifier_text(printer, raw_token, last_tag_token);
54239   } else if (last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) {
54240     printer.add_raw_token(raw_token);
54241   } else {
54242     printer.traverse_whitespace(raw_token);
54243     printer.print_token(raw_token);
54244   }
54245   return parser_token;
54246 };
54247
54248 Beautifier.prototype._print_custom_beatifier_text = function(printer, raw_token, last_tag_token) {
54249   var local = this;
54250   if (raw_token.text !== '') {
54251
54252     var text = raw_token.text,
54253       _beautifier,
54254       script_indent_level = 1,
54255       pre = '',
54256       post = '';
54257     if (last_tag_token.custom_beautifier_name === 'javascript' && typeof this._js_beautify === 'function') {
54258       _beautifier = this._js_beautify;
54259     } else if (last_tag_token.custom_beautifier_name === 'css' && typeof this._css_beautify === 'function') {
54260       _beautifier = this._css_beautify;
54261     } else if (last_tag_token.custom_beautifier_name === 'html') {
54262       _beautifier = function(html_source, options) {
54263         var beautifier = new Beautifier(html_source, options, local._js_beautify, local._css_beautify);
54264         return beautifier.beautify();
54265       };
54266     }
54267
54268     if (this._options.indent_scripts === "keep") {
54269       script_indent_level = 0;
54270     } else if (this._options.indent_scripts === "separate") {
54271       script_indent_level = -printer.indent_level;
54272     }
54273
54274     var indentation = printer.get_full_indent(script_indent_level);
54275
54276     // if there is at least one empty line at the end of this text, strip it
54277     // we'll be adding one back after the text but before the containing tag.
54278     text = text.replace(/\n[ \t]*$/, '');
54279
54280     // Handle the case where content is wrapped in a comment or cdata.
54281     if (last_tag_token.custom_beautifier_name !== 'html' &&
54282       text[0] === '<' && text.match(/^(<!--|<!\[CDATA\[)/)) {
54283       var matched = /^(<!--[^\n]*|<!\[CDATA\[)(\n?)([ \t\n]*)([\s\S]*)(-->|]]>)$/.exec(text);
54284
54285       // if we start to wrap but don't finish, print raw
54286       if (!matched) {
54287         printer.add_raw_token(raw_token);
54288         return;
54289       }
54290
54291       pre = indentation + matched[1] + '\n';
54292       text = matched[4];
54293       if (matched[5]) {
54294         post = indentation + matched[5];
54295       }
54296
54297       // if there is at least one empty line at the end of this text, strip it
54298       // we'll be adding one back after the text but before the containing tag.
54299       text = text.replace(/\n[ \t]*$/, '');
54300
54301       if (matched[2] || matched[3].indexOf('\n') !== -1) {
54302         // if the first line of the non-comment text has spaces
54303         // use that as the basis for indenting in null case.
54304         matched = matched[3].match(/[ \t]+$/);
54305         if (matched) {
54306           raw_token.whitespace_before = matched[0];
54307         }
54308       }
54309     }
54310
54311     if (text) {
54312       if (_beautifier) {
54313
54314         // call the Beautifier if avaliable
54315         var Child_options = function() {
54316           this.eol = '\n';
54317         };
54318         Child_options.prototype = this._options.raw_options;
54319         var child_options = new Child_options();
54320         text = _beautifier(indentation + text, child_options);
54321       } else {
54322         // simply indent the string otherwise
54323         var white = raw_token.whitespace_before;
54324         if (white) {
54325           text = text.replace(new RegExp('\n(' + white + ')?', 'g'), '\n');
54326         }
54327
54328         text = indentation + text.replace(/\n/g, '\n' + indentation);
54329       }
54330     }
54331
54332     if (pre) {
54333       if (!text) {
54334         text = pre + post;
54335       } else {
54336         text = pre + text + '\n' + post;
54337       }
54338     }
54339
54340     printer.print_newline(false);
54341     if (text) {
54342       raw_token.text = text;
54343       raw_token.whitespace_before = '';
54344       raw_token.newlines = 0;
54345       printer.add_raw_token(raw_token);
54346       printer.print_newline(true);
54347     }
54348   }
54349 };
54350
54351 Beautifier.prototype._handle_tag_open = function(printer, raw_token, last_tag_token, last_token) {
54352   var parser_token = this._get_tag_open_token(raw_token);
54353
54354   if ((last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) &&
54355     raw_token.type === TOKEN.TAG_OPEN && raw_token.text.indexOf('</') === 0) {
54356     // End element tags for unformatted or content_unformatted elements
54357     // are printed raw to keep any newlines inside them exactly the same.
54358     printer.add_raw_token(raw_token);
54359     parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name);
54360   } else {
54361     printer.traverse_whitespace(raw_token);
54362     this._set_tag_position(printer, raw_token, parser_token, last_tag_token, last_token);
54363     if (!parser_token.is_inline_element) {
54364       printer.set_wrap_point();
54365     }
54366     printer.print_token(raw_token);
54367   }
54368
54369   //indent attributes an auto, forced, aligned or forced-align line-wrap
54370   if (this._is_wrap_attributes_force_aligned || this._is_wrap_attributes_aligned_multiple || this._is_wrap_attributes_preserve_aligned) {
54371     parser_token.alignment_size = raw_token.text.length + 1;
54372   }
54373
54374   if (!parser_token.tag_complete && !parser_token.is_unformatted) {
54375     printer.alignment_size = parser_token.alignment_size;
54376   }
54377
54378   return parser_token;
54379 };
54380
54381 var TagOpenParserToken = function(parent, raw_token) {
54382   this.parent = parent || null;
54383   this.text = '';
54384   this.type = 'TK_TAG_OPEN';
54385   this.tag_name = '';
54386   this.is_inline_element = false;
54387   this.is_unformatted = false;
54388   this.is_content_unformatted = false;
54389   this.is_empty_element = false;
54390   this.is_start_tag = false;
54391   this.is_end_tag = false;
54392   this.indent_content = false;
54393   this.multiline_content = false;
54394   this.custom_beautifier_name = null;
54395   this.start_tag_token = null;
54396   this.attr_count = 0;
54397   this.has_wrapped_attrs = false;
54398   this.alignment_size = 0;
54399   this.tag_complete = false;
54400   this.tag_start_char = '';
54401   this.tag_check = '';
54402
54403   if (!raw_token) {
54404     this.tag_complete = true;
54405   } else {
54406     var tag_check_match;
54407
54408     this.tag_start_char = raw_token.text[0];
54409     this.text = raw_token.text;
54410
54411     if (this.tag_start_char === '<') {
54412       tag_check_match = raw_token.text.match(/^<([^\s>]*)/);
54413       this.tag_check = tag_check_match ? tag_check_match[1] : '';
54414     } else {
54415       tag_check_match = raw_token.text.match(/^{{(?:[\^]|#\*?)?([^\s}]+)/);
54416       this.tag_check = tag_check_match ? tag_check_match[1] : '';
54417
54418       // handle "{{#> myPartial}}
54419       if (raw_token.text === '{{#>' && this.tag_check === '>' && raw_token.next !== null) {
54420         this.tag_check = raw_token.next.text;
54421       }
54422     }
54423     this.tag_check = this.tag_check.toLowerCase();
54424
54425     if (raw_token.type === TOKEN.COMMENT) {
54426       this.tag_complete = true;
54427     }
54428
54429     this.is_start_tag = this.tag_check.charAt(0) !== '/';
54430     this.tag_name = !this.is_start_tag ? this.tag_check.substr(1) : this.tag_check;
54431     this.is_end_tag = !this.is_start_tag ||
54432       (raw_token.closed && raw_token.closed.text === '/>');
54433
54434     // handlebars tags that don't start with # or ^ are single_tags, and so also start and end.
54435     this.is_end_tag = this.is_end_tag ||
54436       (this.tag_start_char === '{' && (this.text.length < 3 || (/[^#\^]/.test(this.text.charAt(2)))));
54437   }
54438 };
54439
54440 Beautifier.prototype._get_tag_open_token = function(raw_token) { //function to get a full tag and parse its type
54441   var parser_token = new TagOpenParserToken(this._tag_stack.get_parser_token(), raw_token);
54442
54443   parser_token.alignment_size = this._options.wrap_attributes_indent_size;
54444
54445   parser_token.is_end_tag = parser_token.is_end_tag ||
54446     in_array(parser_token.tag_check, this._options.void_elements);
54447
54448   parser_token.is_empty_element = parser_token.tag_complete ||
54449     (parser_token.is_start_tag && parser_token.is_end_tag);
54450
54451   parser_token.is_unformatted = !parser_token.tag_complete && in_array(parser_token.tag_check, this._options.unformatted);
54452   parser_token.is_content_unformatted = !parser_token.is_empty_element && in_array(parser_token.tag_check, this._options.content_unformatted);
54453   parser_token.is_inline_element = in_array(parser_token.tag_name, this._options.inline) || parser_token.tag_start_char === '{';
54454
54455   return parser_token;
54456 };
54457
54458 Beautifier.prototype._set_tag_position = function(printer, raw_token, parser_token, last_tag_token, last_token) {
54459
54460   if (!parser_token.is_empty_element) {
54461     if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending
54462       parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name); //remove it and all ancestors
54463     } else { // it's a start-tag
54464       // check if this tag is starting an element that has optional end element
54465       // and do an ending needed
54466       if (this._do_optional_end_element(parser_token)) {
54467         if (!parser_token.is_inline_element) {
54468           if (parser_token.parent) {
54469             parser_token.parent.multiline_content = true;
54470           }
54471           printer.print_newline(false);
54472         }
54473
54474       }
54475
54476       this._tag_stack.record_tag(parser_token); //push it on the tag stack
54477
54478       if ((parser_token.tag_name === 'script' || parser_token.tag_name === 'style') &&
54479         !(parser_token.is_unformatted || parser_token.is_content_unformatted)) {
54480         parser_token.custom_beautifier_name = get_custom_beautifier_name(parser_token.tag_check, raw_token);
54481       }
54482     }
54483   }
54484
54485   if (in_array(parser_token.tag_check, this._options.extra_liners)) { //check if this double needs an extra line
54486     printer.print_newline(false);
54487     if (!printer._output.just_added_blankline()) {
54488       printer.print_newline(true);
54489     }
54490   }
54491
54492   if (parser_token.is_empty_element) { //if this tag name is a single tag type (either in the list or has a closing /)
54493
54494     // if you hit an else case, reset the indent level if you are inside an:
54495     // 'if', 'unless', or 'each' block.
54496     if (parser_token.tag_start_char === '{' && parser_token.tag_check === 'else') {
54497       this._tag_stack.indent_to_tag(['if', 'unless', 'each']);
54498       parser_token.indent_content = true;
54499       // Don't add a newline if opening {{#if}} tag is on the current line
54500       var foundIfOnCurrentLine = printer.current_line_has_match(/{{#if/);
54501       if (!foundIfOnCurrentLine) {
54502         printer.print_newline(false);
54503       }
54504     }
54505
54506     // Don't add a newline before elements that should remain where they are.
54507     if (parser_token.tag_name === '!--' && last_token.type === TOKEN.TAG_CLOSE &&
54508       last_tag_token.is_end_tag && parser_token.text.indexOf('\n') === -1) {
54509       //Do nothing. Leave comments on same line.
54510     } else if (!parser_token.is_inline_element && !parser_token.is_unformatted) {
54511       printer.print_newline(false);
54512     }
54513   } else if (parser_token.is_unformatted || parser_token.is_content_unformatted) {
54514     if (!parser_token.is_inline_element && !parser_token.is_unformatted) {
54515       printer.print_newline(false);
54516     }
54517   } else if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending
54518     if ((parser_token.start_tag_token && parser_token.start_tag_token.multiline_content) ||
54519       !(parser_token.is_inline_element ||
54520         (last_tag_token.is_inline_element) ||
54521         (last_token.type === TOKEN.TAG_CLOSE &&
54522           parser_token.start_tag_token === last_tag_token) ||
54523         (last_token.type === 'TK_CONTENT')
54524       )) {
54525       printer.print_newline(false);
54526     }
54527   } else { // it's a start-tag
54528     parser_token.indent_content = !parser_token.custom_beautifier_name;
54529
54530     if (parser_token.tag_start_char === '<') {
54531       if (parser_token.tag_name === 'html') {
54532         parser_token.indent_content = this._options.indent_inner_html;
54533       } else if (parser_token.tag_name === 'head') {
54534         parser_token.indent_content = this._options.indent_head_inner_html;
54535       } else if (parser_token.tag_name === 'body') {
54536         parser_token.indent_content = this._options.indent_body_inner_html;
54537       }
54538     }
54539
54540     if (!parser_token.is_inline_element && last_token.type !== 'TK_CONTENT') {
54541       if (parser_token.parent) {
54542         parser_token.parent.multiline_content = true;
54543       }
54544       printer.print_newline(false);
54545     }
54546   }
54547 };
54548
54549 //To be used for <p> tag special case:
54550 var p_closers = ['address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'main', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul'];
54551 var p_parent_excludes = ['a', 'audio', 'del', 'ins', 'map', 'noscript', 'video'];
54552
54553 Beautifier.prototype._do_optional_end_element = function(parser_token) {
54554   var result = null;
54555   // NOTE: cases of "if there is no more content in the parent element"
54556   // are handled automatically by the beautifier.
54557   // It assumes parent or ancestor close tag closes all children.
54558   // https://www.w3.org/TR/html5/syntax.html#optional-tags
54559   if (parser_token.is_empty_element || !parser_token.is_start_tag || !parser_token.parent) {
54560     return;
54561
54562   }
54563
54564   if (parser_token.tag_name === 'body') {
54565     // A head element’s end tag may be omitted if the head element is not immediately followed by a space character or a comment.
54566     result = result || this._tag_stack.try_pop('head');
54567
54568     //} else if (parser_token.tag_name === 'body') {
54569     // DONE: A body element’s end tag may be omitted if the body element is not immediately followed by a comment.
54570
54571   } else if (parser_token.tag_name === 'li') {
54572     // An li element’s end tag may be omitted if the li element is immediately followed by another li element or if there is no more content in the parent element.
54573     result = result || this._tag_stack.try_pop('li', ['ol', 'ul']);
54574
54575   } else if (parser_token.tag_name === 'dd' || parser_token.tag_name === 'dt') {
54576     // A dd element’s end tag may be omitted if the dd element is immediately followed by another dd element or a dt element, or if there is no more content in the parent element.
54577     // A dt element’s end tag may be omitted if the dt element is immediately followed by another dt element or a dd element.
54578     result = result || this._tag_stack.try_pop('dt', ['dl']);
54579     result = result || this._tag_stack.try_pop('dd', ['dl']);
54580
54581
54582   } else if (parser_token.parent.tag_name === 'p' && p_closers.indexOf(parser_token.tag_name) !== -1) {
54583     // IMPORTANT: this else-if works because p_closers has no overlap with any other element we look for in this method
54584     // check for the parent element is an HTML element that is not an <a>, <audio>, <del>, <ins>, <map>, <noscript>, or <video> element,  or an autonomous custom element.
54585     // To do this right, this needs to be coded as an inclusion of the inverse of the exclusion above.
54586     // But to start with (if we ignore "autonomous custom elements") the exclusion would be fine.
54587     var p_parent = parser_token.parent.parent;
54588     if (!p_parent || p_parent_excludes.indexOf(p_parent.tag_name) === -1) {
54589       result = result || this._tag_stack.try_pop('p');
54590     }
54591   } else if (parser_token.tag_name === 'rp' || parser_token.tag_name === 'rt') {
54592     // An rt element’s end tag may be omitted if the rt element is immediately followed by an rt or rp element, or if there is no more content in the parent element.
54593     // An rp element’s end tag may be omitted if the rp element is immediately followed by an rt or rp element, or if there is no more content in the parent element.
54594     result = result || this._tag_stack.try_pop('rt', ['ruby', 'rtc']);
54595     result = result || this._tag_stack.try_pop('rp', ['ruby', 'rtc']);
54596
54597   } else if (parser_token.tag_name === 'optgroup') {
54598     // An optgroup element’s end tag may be omitted if the optgroup element is immediately followed by another optgroup element, or if there is no more content in the parent element.
54599     // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.
54600     result = result || this._tag_stack.try_pop('optgroup', ['select']);
54601     //result = result || this._tag_stack.try_pop('option', ['select']);
54602
54603   } else if (parser_token.tag_name === 'option') {
54604     // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element.
54605     result = result || this._tag_stack.try_pop('option', ['select', 'datalist', 'optgroup']);
54606
54607   } else if (parser_token.tag_name === 'colgroup') {
54608     // DONE: A colgroup element’s end tag may be omitted if the colgroup element is not immediately followed by a space character or a comment.
54609     // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.
54610     result = result || this._tag_stack.try_pop('caption', ['table']);
54611
54612   } else if (parser_token.tag_name === 'thead') {
54613     // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.
54614     // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.
54615     result = result || this._tag_stack.try_pop('caption', ['table']);
54616     result = result || this._tag_stack.try_pop('colgroup', ['table']);
54617
54618     //} else if (parser_token.tag_name === 'caption') {
54619     // DONE: A caption element’s end tag may be omitted if the caption element is not immediately followed by a space character or a comment.
54620
54621   } else if (parser_token.tag_name === 'tbody' || parser_token.tag_name === 'tfoot') {
54622     // A thead element’s end tag may be omitted if the thead element is immediately followed by a tbody or tfoot element.
54623     // A tbody element’s end tag may be omitted if the tbody element is immediately followed by a tbody or tfoot element, or if there is no more content in the parent element.
54624     // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.
54625     // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.
54626     result = result || this._tag_stack.try_pop('caption', ['table']);
54627     result = result || this._tag_stack.try_pop('colgroup', ['table']);
54628     result = result || this._tag_stack.try_pop('thead', ['table']);
54629     result = result || this._tag_stack.try_pop('tbody', ['table']);
54630
54631     //} else if (parser_token.tag_name === 'tfoot') {
54632     // DONE: A tfoot element’s end tag may be omitted if there is no more content in the parent element.
54633
54634   } else if (parser_token.tag_name === 'tr') {
54635     // A tr element’s end tag may be omitted if the tr element is immediately followed by another tr element, or if there is no more content in the parent element.
54636     // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started.
54637     // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started.
54638     result = result || this._tag_stack.try_pop('caption', ['table']);
54639     result = result || this._tag_stack.try_pop('colgroup', ['table']);
54640     result = result || this._tag_stack.try_pop('tr', ['table', 'thead', 'tbody', 'tfoot']);
54641
54642   } else if (parser_token.tag_name === 'th' || parser_token.tag_name === 'td') {
54643     // A td element’s end tag may be omitted if the td element is immediately followed by a td or th element, or if there is no more content in the parent element.
54644     // A th element’s end tag may be omitted if the th element is immediately followed by a td or th element, or if there is no more content in the parent element.
54645     result = result || this._tag_stack.try_pop('td', ['table', 'thead', 'tbody', 'tfoot', 'tr']);
54646     result = result || this._tag_stack.try_pop('th', ['table', 'thead', 'tbody', 'tfoot', 'tr']);
54647   }
54648
54649   // Start element omission not handled currently
54650   // A head element’s start tag may be omitted if the element is empty, or if the first thing inside the head element is an element.
54651   // A tbody element’s start tag may be omitted if the first thing inside the tbody element is a tr element, and if the element is not immediately preceded by a tbody, thead, or tfoot element whose end tag has been omitted. (It can’t be omitted if the element is empty.)
54652   // A colgroup element’s start tag may be omitted if the first thing inside the colgroup element is a col element, and if the element is not immediately preceded by another colgroup element whose end tag has been omitted. (It can’t be omitted if the element is empty.)
54653
54654   // Fix up the parent of the parser token
54655   parser_token.parent = this._tag_stack.get_parser_token();
54656
54657   return result;
54658 };
54659
54660 module.exports.Beautifier = Beautifier;
54661
54662
54663 /***/ }),
54664 /* 20 */
54665 /***/ (function(module, exports, __nested_webpack_require_92681__) {
54666
54667 "use strict";
54668 /*jshint node:true */
54669 /*
54670
54671   The MIT License (MIT)
54672
54673   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
54674
54675   Permission is hereby granted, free of charge, to any person
54676   obtaining a copy of this software and associated documentation files
54677   (the "Software"), to deal in the Software without restriction,
54678   including without limitation the rights to use, copy, modify, merge,
54679   publish, distribute, sublicense, and/or sell copies of the Software,
54680   and to permit persons to whom the Software is furnished to do so,
54681   subject to the following conditions:
54682
54683   The above copyright notice and this permission notice shall be
54684   included in all copies or substantial portions of the Software.
54685
54686   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
54687   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
54688   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
54689   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
54690   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
54691   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
54692   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
54693   SOFTWARE.
54694 */
54695
54696
54697
54698 var BaseOptions = __nested_webpack_require_92681__(6).Options;
54699
54700 function Options(options) {
54701   BaseOptions.call(this, options, 'html');
54702   if (this.templating.length === 1 && this.templating[0] === 'auto') {
54703     this.templating = ['django', 'erb', 'handlebars', 'php'];
54704   }
54705
54706   this.indent_inner_html = this._get_boolean('indent_inner_html');
54707   this.indent_body_inner_html = this._get_boolean('indent_body_inner_html', true);
54708   this.indent_head_inner_html = this._get_boolean('indent_head_inner_html', true);
54709
54710   this.indent_handlebars = this._get_boolean('indent_handlebars', true);
54711   this.wrap_attributes = this._get_selection('wrap_attributes',
54712     ['auto', 'force', 'force-aligned', 'force-expand-multiline', 'aligned-multiple', 'preserve', 'preserve-aligned']);
54713   this.wrap_attributes_indent_size = this._get_number('wrap_attributes_indent_size', this.indent_size);
54714   this.extra_liners = this._get_array('extra_liners', ['head', 'body', '/html']);
54715
54716   // Block vs inline elements
54717   // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements
54718   // https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements
54719   // https://www.w3.org/TR/html5/dom.html#phrasing-content
54720   this.inline = this._get_array('inline', [
54721     'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button', 'canvas', 'cite',
54722     'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img',
54723     'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript',
54724     'object', 'output', 'progress', 'q', 'ruby', 's', 'samp', /* 'script', */ 'select', 'small',
54725     'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var',
54726     'video', 'wbr', 'text',
54727     // obsolete inline tags
54728     'acronym', 'big', 'strike', 'tt'
54729   ]);
54730   this.void_elements = this._get_array('void_elements', [
54731     // HTLM void elements - aka self-closing tags - aka singletons
54732     // https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
54733     'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen',
54734     'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr',
54735     // NOTE: Optional tags are too complex for a simple list
54736     // they are hard coded in _do_optional_end_element
54737
54738     // Doctype and xml elements
54739     '!doctype', '?xml',
54740
54741     // obsolete tags
54742     // basefont: https://www.computerhope.com/jargon/h/html-basefont-tag.htm
54743     // isndex: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/isindex
54744     'basefont', 'isindex'
54745   ]);
54746   this.unformatted = this._get_array('unformatted', []);
54747   this.content_unformatted = this._get_array('content_unformatted', [
54748     'pre', 'textarea'
54749   ]);
54750   this.unformatted_content_delimiter = this._get_characters('unformatted_content_delimiter');
54751   this.indent_scripts = this._get_selection('indent_scripts', ['normal', 'keep', 'separate']);
54752
54753 }
54754 Options.prototype = new BaseOptions();
54755
54756
54757
54758 module.exports.Options = Options;
54759
54760
54761 /***/ }),
54762 /* 21 */
54763 /***/ (function(module, exports, __nested_webpack_require_96875__) {
54764
54765 "use strict";
54766 /*jshint node:true */
54767 /*
54768
54769   The MIT License (MIT)
54770
54771   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
54772
54773   Permission is hereby granted, free of charge, to any person
54774   obtaining a copy of this software and associated documentation files
54775   (the "Software"), to deal in the Software without restriction,
54776   including without limitation the rights to use, copy, modify, merge,
54777   publish, distribute, sublicense, and/or sell copies of the Software,
54778   and to permit persons to whom the Software is furnished to do so,
54779   subject to the following conditions:
54780
54781   The above copyright notice and this permission notice shall be
54782   included in all copies or substantial portions of the Software.
54783
54784   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
54785   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
54786   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
54787   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
54788   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
54789   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
54790   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
54791   SOFTWARE.
54792 */
54793
54794
54795
54796 var BaseTokenizer = __nested_webpack_require_96875__(9).Tokenizer;
54797 var BASETOKEN = __nested_webpack_require_96875__(9).TOKEN;
54798 var Directives = __nested_webpack_require_96875__(13).Directives;
54799 var TemplatablePattern = __nested_webpack_require_96875__(14).TemplatablePattern;
54800 var Pattern = __nested_webpack_require_96875__(12).Pattern;
54801
54802 var TOKEN = {
54803   TAG_OPEN: 'TK_TAG_OPEN',
54804   TAG_CLOSE: 'TK_TAG_CLOSE',
54805   ATTRIBUTE: 'TK_ATTRIBUTE',
54806   EQUALS: 'TK_EQUALS',
54807   VALUE: 'TK_VALUE',
54808   COMMENT: 'TK_COMMENT',
54809   TEXT: 'TK_TEXT',
54810   UNKNOWN: 'TK_UNKNOWN',
54811   START: BASETOKEN.START,
54812   RAW: BASETOKEN.RAW,
54813   EOF: BASETOKEN.EOF
54814 };
54815
54816 var directives_core = new Directives(/<\!--/, /-->/);
54817
54818 var Tokenizer = function(input_string, options) {
54819   BaseTokenizer.call(this, input_string, options);
54820   this._current_tag_name = '';
54821
54822   // Words end at whitespace or when a tag starts
54823   // if we are indenting handlebars, they are considered tags
54824   var templatable_reader = new TemplatablePattern(this._input).read_options(this._options);
54825   var pattern_reader = new Pattern(this._input);
54826
54827   this.__patterns = {
54828     word: templatable_reader.until(/[\n\r\t <]/),
54829     single_quote: templatable_reader.until_after(/'/),
54830     double_quote: templatable_reader.until_after(/"/),
54831     attribute: templatable_reader.until(/[\n\r\t =>]|\/>/),
54832     element_name: templatable_reader.until(/[\n\r\t >\/]/),
54833
54834     handlebars_comment: pattern_reader.starting_with(/{{!--/).until_after(/--}}/),
54835     handlebars: pattern_reader.starting_with(/{{/).until_after(/}}/),
54836     handlebars_open: pattern_reader.until(/[\n\r\t }]/),
54837     handlebars_raw_close: pattern_reader.until(/}}/),
54838     comment: pattern_reader.starting_with(/<!--/).until_after(/-->/),
54839     cdata: pattern_reader.starting_with(/<!\[CDATA\[/).until_after(/]]>/),
54840     // https://en.wikipedia.org/wiki/Conditional_comment
54841     conditional_comment: pattern_reader.starting_with(/<!\[/).until_after(/]>/),
54842     processing: pattern_reader.starting_with(/<\?/).until_after(/\?>/)
54843   };
54844
54845   if (this._options.indent_handlebars) {
54846     this.__patterns.word = this.__patterns.word.exclude('handlebars');
54847   }
54848
54849   this._unformatted_content_delimiter = null;
54850
54851   if (this._options.unformatted_content_delimiter) {
54852     var literal_regexp = this._input.get_literal_regexp(this._options.unformatted_content_delimiter);
54853     this.__patterns.unformatted_content_delimiter =
54854       pattern_reader.matching(literal_regexp)
54855       .until_after(literal_regexp);
54856   }
54857 };
54858 Tokenizer.prototype = new BaseTokenizer();
54859
54860 Tokenizer.prototype._is_comment = function(current_token) { // jshint unused:false
54861   return false; //current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.UNKNOWN;
54862 };
54863
54864 Tokenizer.prototype._is_opening = function(current_token) {
54865   return current_token.type === TOKEN.TAG_OPEN;
54866 };
54867
54868 Tokenizer.prototype._is_closing = function(current_token, open_token) {
54869   return current_token.type === TOKEN.TAG_CLOSE &&
54870     (open_token && (
54871       ((current_token.text === '>' || current_token.text === '/>') && open_token.text[0] === '<') ||
54872       (current_token.text === '}}' && open_token.text[0] === '{' && open_token.text[1] === '{')));
54873 };
54874
54875 Tokenizer.prototype._reset = function() {
54876   this._current_tag_name = '';
54877 };
54878
54879 Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false
54880   var token = null;
54881   this._readWhitespace();
54882   var c = this._input.peek();
54883
54884   if (c === null) {
54885     return this._create_token(TOKEN.EOF, '');
54886   }
54887
54888   token = token || this._read_open_handlebars(c, open_token);
54889   token = token || this._read_attribute(c, previous_token, open_token);
54890   token = token || this._read_raw_content(c, previous_token, open_token);
54891   token = token || this._read_close(c, open_token);
54892   token = token || this._read_content_word(c);
54893   token = token || this._read_comment_or_cdata(c);
54894   token = token || this._read_processing(c);
54895   token = token || this._read_open(c, open_token);
54896   token = token || this._create_token(TOKEN.UNKNOWN, this._input.next());
54897
54898   return token;
54899 };
54900
54901 Tokenizer.prototype._read_comment_or_cdata = function(c) { // jshint unused:false
54902   var token = null;
54903   var resulting_string = null;
54904   var directives = null;
54905
54906   if (c === '<') {
54907     var peek1 = this._input.peek(1);
54908     // We treat all comments as literals, even more than preformatted tags
54909     // we only look for the appropriate closing marker
54910     if (peek1 === '!') {
54911       resulting_string = this.__patterns.comment.read();
54912
54913       // only process directive on html comments
54914       if (resulting_string) {
54915         directives = directives_core.get_directives(resulting_string);
54916         if (directives && directives.ignore === 'start') {
54917           resulting_string += directives_core.readIgnored(this._input);
54918         }
54919       } else {
54920         resulting_string = this.__patterns.cdata.read();
54921       }
54922     }
54923
54924     if (resulting_string) {
54925       token = this._create_token(TOKEN.COMMENT, resulting_string);
54926       token.directives = directives;
54927     }
54928   }
54929
54930   return token;
54931 };
54932
54933 Tokenizer.prototype._read_processing = function(c) { // jshint unused:false
54934   var token = null;
54935   var resulting_string = null;
54936   var directives = null;
54937
54938   if (c === '<') {
54939     var peek1 = this._input.peek(1);
54940     if (peek1 === '!' || peek1 === '?') {
54941       resulting_string = this.__patterns.conditional_comment.read();
54942       resulting_string = resulting_string || this.__patterns.processing.read();
54943     }
54944
54945     if (resulting_string) {
54946       token = this._create_token(TOKEN.COMMENT, resulting_string);
54947       token.directives = directives;
54948     }
54949   }
54950
54951   return token;
54952 };
54953
54954 Tokenizer.prototype._read_open = function(c, open_token) {
54955   var resulting_string = null;
54956   var token = null;
54957   if (!open_token) {
54958     if (c === '<') {
54959
54960       resulting_string = this._input.next();
54961       if (this._input.peek() === '/') {
54962         resulting_string += this._input.next();
54963       }
54964       resulting_string += this.__patterns.element_name.read();
54965       token = this._create_token(TOKEN.TAG_OPEN, resulting_string);
54966     }
54967   }
54968   return token;
54969 };
54970
54971 Tokenizer.prototype._read_open_handlebars = function(c, open_token) {
54972   var resulting_string = null;
54973   var token = null;
54974   if (!open_token) {
54975     if (this._options.indent_handlebars && c === '{' && this._input.peek(1) === '{') {
54976       if (this._input.peek(2) === '!') {
54977         resulting_string = this.__patterns.handlebars_comment.read();
54978         resulting_string = resulting_string || this.__patterns.handlebars.read();
54979         token = this._create_token(TOKEN.COMMENT, resulting_string);
54980       } else {
54981         resulting_string = this.__patterns.handlebars_open.read();
54982         token = this._create_token(TOKEN.TAG_OPEN, resulting_string);
54983       }
54984     }
54985   }
54986   return token;
54987 };
54988
54989
54990 Tokenizer.prototype._read_close = function(c, open_token) {
54991   var resulting_string = null;
54992   var token = null;
54993   if (open_token) {
54994     if (open_token.text[0] === '<' && (c === '>' || (c === '/' && this._input.peek(1) === '>'))) {
54995       resulting_string = this._input.next();
54996       if (c === '/') { //  for close tag "/>"
54997         resulting_string += this._input.next();
54998       }
54999       token = this._create_token(TOKEN.TAG_CLOSE, resulting_string);
55000     } else if (open_token.text[0] === '{' && c === '}' && this._input.peek(1) === '}') {
55001       this._input.next();
55002       this._input.next();
55003       token = this._create_token(TOKEN.TAG_CLOSE, '}}');
55004     }
55005   }
55006
55007   return token;
55008 };
55009
55010 Tokenizer.prototype._read_attribute = function(c, previous_token, open_token) {
55011   var token = null;
55012   var resulting_string = '';
55013   if (open_token && open_token.text[0] === '<') {
55014
55015     if (c === '=') {
55016       token = this._create_token(TOKEN.EQUALS, this._input.next());
55017     } else if (c === '"' || c === "'") {
55018       var content = this._input.next();
55019       if (c === '"') {
55020         content += this.__patterns.double_quote.read();
55021       } else {
55022         content += this.__patterns.single_quote.read();
55023       }
55024       token = this._create_token(TOKEN.VALUE, content);
55025     } else {
55026       resulting_string = this.__patterns.attribute.read();
55027
55028       if (resulting_string) {
55029         if (previous_token.type === TOKEN.EQUALS) {
55030           token = this._create_token(TOKEN.VALUE, resulting_string);
55031         } else {
55032           token = this._create_token(TOKEN.ATTRIBUTE, resulting_string);
55033         }
55034       }
55035     }
55036   }
55037   return token;
55038 };
55039
55040 Tokenizer.prototype._is_content_unformatted = function(tag_name) {
55041   // void_elements have no content and so cannot have unformatted content
55042   // script and style tags should always be read as unformatted content
55043   // finally content_unformatted and unformatted element contents are unformatted
55044   return this._options.void_elements.indexOf(tag_name) === -1 &&
55045     (this._options.content_unformatted.indexOf(tag_name) !== -1 ||
55046       this._options.unformatted.indexOf(tag_name) !== -1);
55047 };
55048
55049
55050 Tokenizer.prototype._read_raw_content = function(c, previous_token, open_token) { // jshint unused:false
55051   var resulting_string = '';
55052   if (open_token && open_token.text[0] === '{') {
55053     resulting_string = this.__patterns.handlebars_raw_close.read();
55054   } else if (previous_token.type === TOKEN.TAG_CLOSE && (previous_token.opened.text[0] === '<')) {
55055     var tag_name = previous_token.opened.text.substr(1).toLowerCase();
55056     if (tag_name === 'script' || tag_name === 'style') {
55057       // Script and style tags are allowed to have comments wrapping their content
55058       // or just have regular content.
55059       var token = this._read_comment_or_cdata(c);
55060       if (token) {
55061         token.type = TOKEN.TEXT;
55062         return token;
55063       }
55064       resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\n\\r\\t ]*?>', 'ig'));
55065     } else if (this._is_content_unformatted(tag_name)) {
55066       resulting_string = this._input.readUntil(new RegExp('</' + tag_name + '[\\n\\r\\t ]*?>', 'ig'));
55067     }
55068   }
55069
55070   if (resulting_string) {
55071     return this._create_token(TOKEN.TEXT, resulting_string);
55072   }
55073
55074   return null;
55075 };
55076
55077 Tokenizer.prototype._read_content_word = function(c) {
55078   var resulting_string = '';
55079   if (this._options.unformatted_content_delimiter) {
55080     if (c === this._options.unformatted_content_delimiter[0]) {
55081       resulting_string = this.__patterns.unformatted_content_delimiter.read();
55082     }
55083   }
55084
55085   if (!resulting_string) {
55086     resulting_string = this.__patterns.word.read();
55087   }
55088   if (resulting_string) {
55089     return this._create_token(TOKEN.TEXT, resulting_string);
55090   }
55091 };
55092
55093 module.exports.Tokenizer = Tokenizer;
55094 module.exports.TOKEN = TOKEN;
55095
55096
55097 /***/ })
55098 /******/ ]);
55099
55100 function html_beautify(html_source, options) {
55101     return legacy_beautify_html(html_source, options, _beautify__WEBPACK_IMPORTED_MODULE_1__.js_beautify, _beautify_css__WEBPACK_IMPORTED_MODULE_0__.css_beautify);
55102 }
55103
55104 /***/ }),
55105 /* 123 */
55106 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
55107
55108 __webpack_require__.r(__webpack_exports__);
55109 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
55110 /* harmony export */   "css_beautify": () => /* binding */ css_beautify
55111 /* harmony export */ });
55112 // copied from js-beautify/js/lib/beautify-css.js
55113 // version: 1.11.0
55114 /* AUTO-GENERATED. DO NOT MODIFY. */
55115 /*
55116
55117   The MIT License (MIT)
55118
55119   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
55120
55121   Permission is hereby granted, free of charge, to any person
55122   obtaining a copy of this software and associated documentation files
55123   (the "Software"), to deal in the Software without restriction,
55124   including without limitation the rights to use, copy, modify, merge,
55125   publish, distribute, sublicense, and/or sell copies of the Software,
55126   and to permit persons to whom the Software is furnished to do so,
55127   subject to the following conditions:
55128
55129   The above copyright notice and this permission notice shall be
55130   included in all copies or substantial portions of the Software.
55131
55132   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
55133   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55134   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
55135   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
55136   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
55137   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
55138   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55139   SOFTWARE.
55140
55141
55142  CSS Beautifier
55143 ---------------
55144
55145     Written by Harutyun Amirjanyan, (amirjanyan@gmail.com)
55146
55147     Based on code initially developed by: Einar Lielmanis, <einar@beautifier.io>
55148         https://beautifier.io/
55149
55150     Usage:
55151         css_beautify(source_text);
55152         css_beautify(source_text, options);
55153
55154     The options are (default in brackets):
55155         indent_size (4)                         — indentation size,
55156         indent_char (space)                     — character to indent with,
55157         selector_separator_newline (true)       - separate selectors with newline or
55158                                                   not (e.g. "a,\nbr" or "a, br")
55159         end_with_newline (false)                - end with a newline
55160         newline_between_rules (true)            - add a new line after every css rule
55161         space_around_selector_separator (false) - ensure space around selector separators:
55162                                                   '>', '+', '~' (e.g. "a>b" -> "a > b")
55163     e.g
55164
55165     css_beautify(css_source_text, {
55166       'indent_size': 1,
55167       'indent_char': '\t',
55168       'selector_separator': ' ',
55169       'end_with_newline': false,
55170       'newline_between_rules': true,
55171       'space_around_selector_separator': true
55172     });
55173 */
55174
55175 // http://www.w3.org/TR/CSS21/syndata.html#tokenization
55176 // http://www.w3.org/TR/css3-syntax/
55177
55178 var legacy_beautify_css =
55179 /******/ (function(modules) { // webpackBootstrap
55180 /******/        // The module cache
55181 /******/        var installedModules = {};
55182 /******/
55183 /******/        // The require function
55184 /******/        function __nested_webpack_require_2800__(moduleId) {
55185 /******/
55186 /******/                // Check if module is in cache
55187 /******/                if(installedModules[moduleId]) {
55188 /******/                        return installedModules[moduleId].exports;
55189 /******/                }
55190 /******/                // Create a new module (and put it into the cache)
55191 /******/                var module = installedModules[moduleId] = {
55192 /******/                        i: moduleId,
55193 /******/                        l: false,
55194 /******/                        exports: {}
55195 /******/                };
55196 /******/
55197 /******/                // Execute the module function
55198 /******/                modules[moduleId].call(module.exports, module, module.exports, __nested_webpack_require_2800__);
55199 /******/
55200 /******/                // Flag the module as loaded
55201 /******/                module.l = true;
55202 /******/
55203 /******/                // Return the exports of the module
55204 /******/                return module.exports;
55205 /******/        }
55206 /******/
55207 /******/
55208 /******/        // expose the modules object (__webpack_modules__)
55209 /******/        __nested_webpack_require_2800__.m = modules;
55210 /******/
55211 /******/        // expose the module cache
55212 /******/        __nested_webpack_require_2800__.c = installedModules;
55213 /******/
55214 /******/        // define getter function for harmony exports
55215 /******/        __nested_webpack_require_2800__.d = function(exports, name, getter) {
55216 /******/                if(!__nested_webpack_require_2800__.o(exports, name)) {
55217 /******/                        Object.defineProperty(exports, name, { enumerable: true, get: getter });
55218 /******/                }
55219 /******/        };
55220 /******/
55221 /******/        // define __esModule on exports
55222 /******/        __nested_webpack_require_2800__.r = function(exports) {
55223 /******/                if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
55224 /******/                        Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
55225 /******/                }
55226 /******/                Object.defineProperty(exports, '__esModule', { value: true });
55227 /******/        };
55228 /******/
55229 /******/        // create a fake namespace object
55230 /******/        // mode & 1: value is a module id, require it
55231 /******/        // mode & 2: merge all properties of value into the ns
55232 /******/        // mode & 4: return value when already ns object
55233 /******/        // mode & 8|1: behave like require
55234 /******/        __nested_webpack_require_2800__.t = function(value, mode) {
55235 /******/                if(mode & 1) value = __nested_webpack_require_2800__(value);
55236 /******/                if(mode & 8) return value;
55237 /******/                if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
55238 /******/                var ns = Object.create(null);
55239 /******/                __nested_webpack_require_2800__.r(ns);
55240 /******/                Object.defineProperty(ns, 'default', { enumerable: true, value: value });
55241 /******/                if(mode & 2 && typeof value != 'string') for(var key in value) __nested_webpack_require_2800__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
55242 /******/                return ns;
55243 /******/        };
55244 /******/
55245 /******/        // getDefaultExport function for compatibility with non-harmony modules
55246 /******/        __nested_webpack_require_2800__.n = function(module) {
55247 /******/                var getter = module && module.__esModule ?
55248 /******/                        function getDefault() { return module['default']; } :
55249 /******/                        function getModuleExports() { return module; };
55250 /******/                __nested_webpack_require_2800__.d(getter, 'a', getter);
55251 /******/                return getter;
55252 /******/        };
55253 /******/
55254 /******/        // Object.prototype.hasOwnProperty.call
55255 /******/        __nested_webpack_require_2800__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
55256 /******/
55257 /******/        // __webpack_public_path__
55258 /******/        __nested_webpack_require_2800__.p = "";
55259 /******/
55260 /******/
55261 /******/        // Load entry module and return exports
55262 /******/        return __nested_webpack_require_2800__(__nested_webpack_require_2800__.s = 15);
55263 /******/ })
55264 /************************************************************************/
55265 /******/ ([
55266 /* 0 */,
55267 /* 1 */,
55268 /* 2 */
55269 /***/ (function(module, exports, __nested_webpack_require_6283__) {
55270
55271 "use strict";
55272 /*jshint node:true */
55273 /*
55274   The MIT License (MIT)
55275
55276   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
55277
55278   Permission is hereby granted, free of charge, to any person
55279   obtaining a copy of this software and associated documentation files
55280   (the "Software"), to deal in the Software without restriction,
55281   including without limitation the rights to use, copy, modify, merge,
55282   publish, distribute, sublicense, and/or sell copies of the Software,
55283   and to permit persons to whom the Software is furnished to do so,
55284   subject to the following conditions:
55285
55286   The above copyright notice and this permission notice shall be
55287   included in all copies or substantial portions of the Software.
55288
55289   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
55290   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55291   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
55292   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
55293   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
55294   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
55295   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55296   SOFTWARE.
55297 */
55298
55299
55300
55301 function OutputLine(parent) {
55302   this.__parent = parent;
55303   this.__character_count = 0;
55304   // use indent_count as a marker for this.__lines that have preserved indentation
55305   this.__indent_count = -1;
55306   this.__alignment_count = 0;
55307   this.__wrap_point_index = 0;
55308   this.__wrap_point_character_count = 0;
55309   this.__wrap_point_indent_count = -1;
55310   this.__wrap_point_alignment_count = 0;
55311
55312   this.__items = [];
55313 }
55314
55315 OutputLine.prototype.clone_empty = function() {
55316   var line = new OutputLine(this.__parent);
55317   line.set_indent(this.__indent_count, this.__alignment_count);
55318   return line;
55319 };
55320
55321 OutputLine.prototype.item = function(index) {
55322   if (index < 0) {
55323     return this.__items[this.__items.length + index];
55324   } else {
55325     return this.__items[index];
55326   }
55327 };
55328
55329 OutputLine.prototype.has_match = function(pattern) {
55330   for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) {
55331     if (this.__items[lastCheckedOutput].match(pattern)) {
55332       return true;
55333     }
55334   }
55335   return false;
55336 };
55337
55338 OutputLine.prototype.set_indent = function(indent, alignment) {
55339   if (this.is_empty()) {
55340     this.__indent_count = indent || 0;
55341     this.__alignment_count = alignment || 0;
55342     this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count);
55343   }
55344 };
55345
55346 OutputLine.prototype._set_wrap_point = function() {
55347   if (this.__parent.wrap_line_length) {
55348     this.__wrap_point_index = this.__items.length;
55349     this.__wrap_point_character_count = this.__character_count;
55350     this.__wrap_point_indent_count = this.__parent.next_line.__indent_count;
55351     this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count;
55352   }
55353 };
55354
55355 OutputLine.prototype._should_wrap = function() {
55356   return this.__wrap_point_index &&
55357     this.__character_count > this.__parent.wrap_line_length &&
55358     this.__wrap_point_character_count > this.__parent.next_line.__character_count;
55359 };
55360
55361 OutputLine.prototype._allow_wrap = function() {
55362   if (this._should_wrap()) {
55363     this.__parent.add_new_line();
55364     var next = this.__parent.current_line;
55365     next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count);
55366     next.__items = this.__items.slice(this.__wrap_point_index);
55367     this.__items = this.__items.slice(0, this.__wrap_point_index);
55368
55369     next.__character_count += this.__character_count - this.__wrap_point_character_count;
55370     this.__character_count = this.__wrap_point_character_count;
55371
55372     if (next.__items[0] === " ") {
55373       next.__items.splice(0, 1);
55374       next.__character_count -= 1;
55375     }
55376     return true;
55377   }
55378   return false;
55379 };
55380
55381 OutputLine.prototype.is_empty = function() {
55382   return this.__items.length === 0;
55383 };
55384
55385 OutputLine.prototype.last = function() {
55386   if (!this.is_empty()) {
55387     return this.__items[this.__items.length - 1];
55388   } else {
55389     return null;
55390   }
55391 };
55392
55393 OutputLine.prototype.push = function(item) {
55394   this.__items.push(item);
55395   var last_newline_index = item.lastIndexOf('\n');
55396   if (last_newline_index !== -1) {
55397     this.__character_count = item.length - last_newline_index;
55398   } else {
55399     this.__character_count += item.length;
55400   }
55401 };
55402
55403 OutputLine.prototype.pop = function() {
55404   var item = null;
55405   if (!this.is_empty()) {
55406     item = this.__items.pop();
55407     this.__character_count -= item.length;
55408   }
55409   return item;
55410 };
55411
55412
55413 OutputLine.prototype._remove_indent = function() {
55414   if (this.__indent_count > 0) {
55415     this.__indent_count -= 1;
55416     this.__character_count -= this.__parent.indent_size;
55417   }
55418 };
55419
55420 OutputLine.prototype._remove_wrap_indent = function() {
55421   if (this.__wrap_point_indent_count > 0) {
55422     this.__wrap_point_indent_count -= 1;
55423   }
55424 };
55425 OutputLine.prototype.trim = function() {
55426   while (this.last() === ' ') {
55427     this.__items.pop();
55428     this.__character_count -= 1;
55429   }
55430 };
55431
55432 OutputLine.prototype.toString = function() {
55433   var result = '';
55434   if (this.is_empty()) {
55435     if (this.__parent.indent_empty_lines) {
55436       result = this.__parent.get_indent_string(this.__indent_count);
55437     }
55438   } else {
55439     result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count);
55440     result += this.__items.join('');
55441   }
55442   return result;
55443 };
55444
55445 function IndentStringCache(options, baseIndentString) {
55446   this.__cache = [''];
55447   this.__indent_size = options.indent_size;
55448   this.__indent_string = options.indent_char;
55449   if (!options.indent_with_tabs) {
55450     this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char);
55451   }
55452
55453   // Set to null to continue support for auto detection of base indent
55454   baseIndentString = baseIndentString || '';
55455   if (options.indent_level > 0) {
55456     baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string);
55457   }
55458
55459   this.__base_string = baseIndentString;
55460   this.__base_string_length = baseIndentString.length;
55461 }
55462
55463 IndentStringCache.prototype.get_indent_size = function(indent, column) {
55464   var result = this.__base_string_length;
55465   column = column || 0;
55466   if (indent < 0) {
55467     result = 0;
55468   }
55469   result += indent * this.__indent_size;
55470   result += column;
55471   return result;
55472 };
55473
55474 IndentStringCache.prototype.get_indent_string = function(indent_level, column) {
55475   var result = this.__base_string;
55476   column = column || 0;
55477   if (indent_level < 0) {
55478     indent_level = 0;
55479     result = '';
55480   }
55481   column += indent_level * this.__indent_size;
55482   this.__ensure_cache(column);
55483   result += this.__cache[column];
55484   return result;
55485 };
55486
55487 IndentStringCache.prototype.__ensure_cache = function(column) {
55488   while (column >= this.__cache.length) {
55489     this.__add_column();
55490   }
55491 };
55492
55493 IndentStringCache.prototype.__add_column = function() {
55494   var column = this.__cache.length;
55495   var indent = 0;
55496   var result = '';
55497   if (this.__indent_size && column >= this.__indent_size) {
55498     indent = Math.floor(column / this.__indent_size);
55499     column -= indent * this.__indent_size;
55500     result = new Array(indent + 1).join(this.__indent_string);
55501   }
55502   if (column) {
55503     result += new Array(column + 1).join(' ');
55504   }
55505
55506   this.__cache.push(result);
55507 };
55508
55509 function Output(options, baseIndentString) {
55510   this.__indent_cache = new IndentStringCache(options, baseIndentString);
55511   this.raw = false;
55512   this._end_with_newline = options.end_with_newline;
55513   this.indent_size = options.indent_size;
55514   this.wrap_line_length = options.wrap_line_length;
55515   this.indent_empty_lines = options.indent_empty_lines;
55516   this.__lines = [];
55517   this.previous_line = null;
55518   this.current_line = null;
55519   this.next_line = new OutputLine(this);
55520   this.space_before_token = false;
55521   this.non_breaking_space = false;
55522   this.previous_token_wrapped = false;
55523   // initialize
55524   this.__add_outputline();
55525 }
55526
55527 Output.prototype.__add_outputline = function() {
55528   this.previous_line = this.current_line;
55529   this.current_line = this.next_line.clone_empty();
55530   this.__lines.push(this.current_line);
55531 };
55532
55533 Output.prototype.get_line_number = function() {
55534   return this.__lines.length;
55535 };
55536
55537 Output.prototype.get_indent_string = function(indent, column) {
55538   return this.__indent_cache.get_indent_string(indent, column);
55539 };
55540
55541 Output.prototype.get_indent_size = function(indent, column) {
55542   return this.__indent_cache.get_indent_size(indent, column);
55543 };
55544
55545 Output.prototype.is_empty = function() {
55546   return !this.previous_line && this.current_line.is_empty();
55547 };
55548
55549 Output.prototype.add_new_line = function(force_newline) {
55550   // never newline at the start of file
55551   // otherwise, newline only if we didn't just add one or we're forced
55552   if (this.is_empty() ||
55553     (!force_newline && this.just_added_newline())) {
55554     return false;
55555   }
55556
55557   // if raw output is enabled, don't print additional newlines,
55558   // but still return True as though you had
55559   if (!this.raw) {
55560     this.__add_outputline();
55561   }
55562   return true;
55563 };
55564
55565 Output.prototype.get_code = function(eol) {
55566   this.trim(true);
55567
55568   // handle some edge cases where the last tokens
55569   // has text that ends with newline(s)
55570   var last_item = this.current_line.pop();
55571   if (last_item) {
55572     if (last_item[last_item.length - 1] === '\n') {
55573       last_item = last_item.replace(/\n+$/g, '');
55574     }
55575     this.current_line.push(last_item);
55576   }
55577
55578   if (this._end_with_newline) {
55579     this.__add_outputline();
55580   }
55581
55582   var sweet_code = this.__lines.join('\n');
55583
55584   if (eol !== '\n') {
55585     sweet_code = sweet_code.replace(/[\n]/g, eol);
55586   }
55587   return sweet_code;
55588 };
55589
55590 Output.prototype.set_wrap_point = function() {
55591   this.current_line._set_wrap_point();
55592 };
55593
55594 Output.prototype.set_indent = function(indent, alignment) {
55595   indent = indent || 0;
55596   alignment = alignment || 0;
55597
55598   // Next line stores alignment values
55599   this.next_line.set_indent(indent, alignment);
55600
55601   // Never indent your first output indent at the start of the file
55602   if (this.__lines.length > 1) {
55603     this.current_line.set_indent(indent, alignment);
55604     return true;
55605   }
55606
55607   this.current_line.set_indent();
55608   return false;
55609 };
55610
55611 Output.prototype.add_raw_token = function(token) {
55612   for (var x = 0; x < token.newlines; x++) {
55613     this.__add_outputline();
55614   }
55615   this.current_line.set_indent(-1);
55616   this.current_line.push(token.whitespace_before);
55617   this.current_line.push(token.text);
55618   this.space_before_token = false;
55619   this.non_breaking_space = false;
55620   this.previous_token_wrapped = false;
55621 };
55622
55623 Output.prototype.add_token = function(printable_token) {
55624   this.__add_space_before_token();
55625   this.current_line.push(printable_token);
55626   this.space_before_token = false;
55627   this.non_breaking_space = false;
55628   this.previous_token_wrapped = this.current_line._allow_wrap();
55629 };
55630
55631 Output.prototype.__add_space_before_token = function() {
55632   if (this.space_before_token && !this.just_added_newline()) {
55633     if (!this.non_breaking_space) {
55634       this.set_wrap_point();
55635     }
55636     this.current_line.push(' ');
55637   }
55638 };
55639
55640 Output.prototype.remove_indent = function(index) {
55641   var output_length = this.__lines.length;
55642   while (index < output_length) {
55643     this.__lines[index]._remove_indent();
55644     index++;
55645   }
55646   this.current_line._remove_wrap_indent();
55647 };
55648
55649 Output.prototype.trim = function(eat_newlines) {
55650   eat_newlines = (eat_newlines === undefined) ? false : eat_newlines;
55651
55652   this.current_line.trim();
55653
55654   while (eat_newlines && this.__lines.length > 1 &&
55655     this.current_line.is_empty()) {
55656     this.__lines.pop();
55657     this.current_line = this.__lines[this.__lines.length - 1];
55658     this.current_line.trim();
55659   }
55660
55661   this.previous_line = this.__lines.length > 1 ?
55662     this.__lines[this.__lines.length - 2] : null;
55663 };
55664
55665 Output.prototype.just_added_newline = function() {
55666   return this.current_line.is_empty();
55667 };
55668
55669 Output.prototype.just_added_blankline = function() {
55670   return this.is_empty() ||
55671     (this.current_line.is_empty() && this.previous_line.is_empty());
55672 };
55673
55674 Output.prototype.ensure_empty_line_above = function(starts_with, ends_with) {
55675   var index = this.__lines.length - 2;
55676   while (index >= 0) {
55677     var potentialEmptyLine = this.__lines[index];
55678     if (potentialEmptyLine.is_empty()) {
55679       break;
55680     } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 &&
55681       potentialEmptyLine.item(-1) !== ends_with) {
55682       this.__lines.splice(index + 1, 0, new OutputLine(this));
55683       this.previous_line = this.__lines[this.__lines.length - 2];
55684       break;
55685     }
55686     index--;
55687   }
55688 };
55689
55690 module.exports.Output = Output;
55691
55692
55693 /***/ }),
55694 /* 3 */,
55695 /* 4 */,
55696 /* 5 */,
55697 /* 6 */
55698 /***/ (function(module, exports, __nested_webpack_require_18743__) {
55699
55700 "use strict";
55701 /*jshint node:true */
55702 /*
55703
55704   The MIT License (MIT)
55705
55706   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
55707
55708   Permission is hereby granted, free of charge, to any person
55709   obtaining a copy of this software and associated documentation files
55710   (the "Software"), to deal in the Software without restriction,
55711   including without limitation the rights to use, copy, modify, merge,
55712   publish, distribute, sublicense, and/or sell copies of the Software,
55713   and to permit persons to whom the Software is furnished to do so,
55714   subject to the following conditions:
55715
55716   The above copyright notice and this permission notice shall be
55717   included in all copies or substantial portions of the Software.
55718
55719   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
55720   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55721   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
55722   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
55723   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
55724   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
55725   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55726   SOFTWARE.
55727 */
55728
55729
55730
55731 function Options(options, merge_child_field) {
55732   this.raw_options = _mergeOpts(options, merge_child_field);
55733
55734   // Support passing the source text back with no change
55735   this.disabled = this._get_boolean('disabled');
55736
55737   this.eol = this._get_characters('eol', 'auto');
55738   this.end_with_newline = this._get_boolean('end_with_newline');
55739   this.indent_size = this._get_number('indent_size', 4);
55740   this.indent_char = this._get_characters('indent_char', ' ');
55741   this.indent_level = this._get_number('indent_level');
55742
55743   this.preserve_newlines = this._get_boolean('preserve_newlines', true);
55744   this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786);
55745   if (!this.preserve_newlines) {
55746     this.max_preserve_newlines = 0;
55747   }
55748
55749   this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\t');
55750   if (this.indent_with_tabs) {
55751     this.indent_char = '\t';
55752
55753     // indent_size behavior changed after 1.8.6
55754     // It used to be that indent_size would be
55755     // set to 1 for indent_with_tabs. That is no longer needed and
55756     // actually doesn't make sense - why not use spaces? Further,
55757     // that might produce unexpected behavior - tabs being used
55758     // for single-column alignment. So, when indent_with_tabs is true
55759     // and indent_size is 1, reset indent_size to 4.
55760     if (this.indent_size === 1) {
55761       this.indent_size = 4;
55762     }
55763   }
55764
55765   // Backwards compat with 1.3.x
55766   this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char'));
55767
55768   this.indent_empty_lines = this._get_boolean('indent_empty_lines');
55769
55770   // valid templating languages ['django', 'erb', 'handlebars', 'php']
55771   // For now, 'auto' = all off for javascript, all on for html (and inline javascript).
55772   // other values ignored
55773   this.templating = this._get_selection_list('templating', ['auto', 'none', 'django', 'erb', 'handlebars', 'php'], ['auto']);
55774 }
55775
55776 Options.prototype._get_array = function(name, default_value) {
55777   var option_value = this.raw_options[name];
55778   var result = default_value || [];
55779   if (typeof option_value === 'object') {
55780     if (option_value !== null && typeof option_value.concat === 'function') {
55781       result = option_value.concat();
55782     }
55783   } else if (typeof option_value === 'string') {
55784     result = option_value.split(/[^a-zA-Z0-9_\/\-]+/);
55785   }
55786   return result;
55787 };
55788
55789 Options.prototype._get_boolean = function(name, default_value) {
55790   var option_value = this.raw_options[name];
55791   var result = option_value === undefined ? !!default_value : !!option_value;
55792   return result;
55793 };
55794
55795 Options.prototype._get_characters = function(name, default_value) {
55796   var option_value = this.raw_options[name];
55797   var result = default_value || '';
55798   if (typeof option_value === 'string') {
55799     result = option_value.replace(/\\r/, '\r').replace(/\\n/, '\n').replace(/\\t/, '\t');
55800   }
55801   return result;
55802 };
55803
55804 Options.prototype._get_number = function(name, default_value) {
55805   var option_value = this.raw_options[name];
55806   default_value = parseInt(default_value, 10);
55807   if (isNaN(default_value)) {
55808     default_value = 0;
55809   }
55810   var result = parseInt(option_value, 10);
55811   if (isNaN(result)) {
55812     result = default_value;
55813   }
55814   return result;
55815 };
55816
55817 Options.prototype._get_selection = function(name, selection_list, default_value) {
55818   var result = this._get_selection_list(name, selection_list, default_value);
55819   if (result.length !== 1) {
55820     throw new Error(
55821       "Invalid Option Value: The option '" + name + "' can only be one of the following values:\n" +
55822       selection_list + "\nYou passed in: '" + this.raw_options[name] + "'");
55823   }
55824
55825   return result[0];
55826 };
55827
55828
55829 Options.prototype._get_selection_list = function(name, selection_list, default_value) {
55830   if (!selection_list || selection_list.length === 0) {
55831     throw new Error("Selection list cannot be empty.");
55832   }
55833
55834   default_value = default_value || [selection_list[0]];
55835   if (!this._is_valid_selection(default_value, selection_list)) {
55836     throw new Error("Invalid Default Value!");
55837   }
55838
55839   var result = this._get_array(name, default_value);
55840   if (!this._is_valid_selection(result, selection_list)) {
55841     throw new Error(
55842       "Invalid Option Value: The option '" + name + "' can contain only the following values:\n" +
55843       selection_list + "\nYou passed in: '" + this.raw_options[name] + "'");
55844   }
55845
55846   return result;
55847 };
55848
55849 Options.prototype._is_valid_selection = function(result, selection_list) {
55850   return result.length && selection_list.length &&
55851     !result.some(function(item) { return selection_list.indexOf(item) === -1; });
55852 };
55853
55854
55855 // merges child options up with the parent options object
55856 // Example: obj = {a: 1, b: {a: 2}}
55857 //          mergeOpts(obj, 'b')
55858 //
55859 //          Returns: {a: 2}
55860 function _mergeOpts(allOptions, childFieldName) {
55861   var finalOpts = {};
55862   allOptions = _normalizeOpts(allOptions);
55863   var name;
55864
55865   for (name in allOptions) {
55866     if (name !== childFieldName) {
55867       finalOpts[name] = allOptions[name];
55868     }
55869   }
55870
55871   //merge in the per type settings for the childFieldName
55872   if (childFieldName && allOptions[childFieldName]) {
55873     for (name in allOptions[childFieldName]) {
55874       finalOpts[name] = allOptions[childFieldName][name];
55875     }
55876   }
55877   return finalOpts;
55878 }
55879
55880 function _normalizeOpts(options) {
55881   var convertedOpts = {};
55882   var key;
55883
55884   for (key in options) {
55885     var newKey = key.replace(/-/g, "_");
55886     convertedOpts[newKey] = options[key];
55887   }
55888   return convertedOpts;
55889 }
55890
55891 module.exports.Options = Options;
55892 module.exports.normalizeOpts = _normalizeOpts;
55893 module.exports.mergeOpts = _mergeOpts;
55894
55895
55896 /***/ }),
55897 /* 7 */,
55898 /* 8 */
55899 /***/ (function(module, exports, __nested_webpack_require_25535__) {
55900
55901 "use strict";
55902 /*jshint node:true */
55903 /*
55904
55905   The MIT License (MIT)
55906
55907   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
55908
55909   Permission is hereby granted, free of charge, to any person
55910   obtaining a copy of this software and associated documentation files
55911   (the "Software"), to deal in the Software without restriction,
55912   including without limitation the rights to use, copy, modify, merge,
55913   publish, distribute, sublicense, and/or sell copies of the Software,
55914   and to permit persons to whom the Software is furnished to do so,
55915   subject to the following conditions:
55916
55917   The above copyright notice and this permission notice shall be
55918   included in all copies or substantial portions of the Software.
55919
55920   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
55921   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55922   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
55923   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
55924   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
55925   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
55926   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
55927   SOFTWARE.
55928 */
55929
55930
55931
55932 var regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky');
55933
55934 function InputScanner(input_string) {
55935   this.__input = input_string || '';
55936   this.__input_length = this.__input.length;
55937   this.__position = 0;
55938 }
55939
55940 InputScanner.prototype.restart = function() {
55941   this.__position = 0;
55942 };
55943
55944 InputScanner.prototype.back = function() {
55945   if (this.__position > 0) {
55946     this.__position -= 1;
55947   }
55948 };
55949
55950 InputScanner.prototype.hasNext = function() {
55951   return this.__position < this.__input_length;
55952 };
55953
55954 InputScanner.prototype.next = function() {
55955   var val = null;
55956   if (this.hasNext()) {
55957     val = this.__input.charAt(this.__position);
55958     this.__position += 1;
55959   }
55960   return val;
55961 };
55962
55963 InputScanner.prototype.peek = function(index) {
55964   var val = null;
55965   index = index || 0;
55966   index += this.__position;
55967   if (index >= 0 && index < this.__input_length) {
55968     val = this.__input.charAt(index);
55969   }
55970   return val;
55971 };
55972
55973 // This is a JavaScript only helper function (not in python)
55974 // Javascript doesn't have a match method
55975 // and not all implementation support "sticky" flag.
55976 // If they do not support sticky then both this.match() and this.test() method
55977 // must get the match and check the index of the match.
55978 // If sticky is supported and set, this method will use it.
55979 // Otherwise it will check that global is set, and fall back to the slower method.
55980 InputScanner.prototype.__match = function(pattern, index) {
55981   pattern.lastIndex = index;
55982   var pattern_match = pattern.exec(this.__input);
55983
55984   if (pattern_match && !(regexp_has_sticky && pattern.sticky)) {
55985     if (pattern_match.index !== index) {
55986       pattern_match = null;
55987     }
55988   }
55989
55990   return pattern_match;
55991 };
55992
55993 InputScanner.prototype.test = function(pattern, index) {
55994   index = index || 0;
55995   index += this.__position;
55996
55997   if (index >= 0 && index < this.__input_length) {
55998     return !!this.__match(pattern, index);
55999   } else {
56000     return false;
56001   }
56002 };
56003
56004 InputScanner.prototype.testChar = function(pattern, index) {
56005   // test one character regex match
56006   var val = this.peek(index);
56007   pattern.lastIndex = 0;
56008   return val !== null && pattern.test(val);
56009 };
56010
56011 InputScanner.prototype.match = function(pattern) {
56012   var pattern_match = this.__match(pattern, this.__position);
56013   if (pattern_match) {
56014     this.__position += pattern_match[0].length;
56015   } else {
56016     pattern_match = null;
56017   }
56018   return pattern_match;
56019 };
56020
56021 InputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) {
56022   var val = '';
56023   var match;
56024   if (starting_pattern) {
56025     match = this.match(starting_pattern);
56026     if (match) {
56027       val += match[0];
56028     }
56029   }
56030   if (until_pattern && (match || !starting_pattern)) {
56031     val += this.readUntil(until_pattern, until_after);
56032   }
56033   return val;
56034 };
56035
56036 InputScanner.prototype.readUntil = function(pattern, until_after) {
56037   var val = '';
56038   var match_index = this.__position;
56039   pattern.lastIndex = this.__position;
56040   var pattern_match = pattern.exec(this.__input);
56041   if (pattern_match) {
56042     match_index = pattern_match.index;
56043     if (until_after) {
56044       match_index += pattern_match[0].length;
56045     }
56046   } else {
56047     match_index = this.__input_length;
56048   }
56049
56050   val = this.__input.substring(this.__position, match_index);
56051   this.__position = match_index;
56052   return val;
56053 };
56054
56055 InputScanner.prototype.readUntilAfter = function(pattern) {
56056   return this.readUntil(pattern, true);
56057 };
56058
56059 InputScanner.prototype.get_regexp = function(pattern, match_from) {
56060   var result = null;
56061   var flags = 'g';
56062   if (match_from && regexp_has_sticky) {
56063     flags = 'y';
56064   }
56065   // strings are converted to regexp
56066   if (typeof pattern === "string" && pattern !== '') {
56067     // result = new RegExp(pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), flags);
56068     result = new RegExp(pattern, flags);
56069   } else if (pattern) {
56070     result = new RegExp(pattern.source, flags);
56071   }
56072   return result;
56073 };
56074
56075 InputScanner.prototype.get_literal_regexp = function(literal_string) {
56076   return RegExp(literal_string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'));
56077 };
56078
56079 /* css beautifier legacy helpers */
56080 InputScanner.prototype.peekUntilAfter = function(pattern) {
56081   var start = this.__position;
56082   var val = this.readUntilAfter(pattern);
56083   this.__position = start;
56084   return val;
56085 };
56086
56087 InputScanner.prototype.lookBack = function(testVal) {
56088   var start = this.__position - 1;
56089   return start >= testVal.length && this.__input.substring(start - testVal.length, start)
56090     .toLowerCase() === testVal;
56091 };
56092
56093 module.exports.InputScanner = InputScanner;
56094
56095
56096 /***/ }),
56097 /* 9 */,
56098 /* 10 */,
56099 /* 11 */,
56100 /* 12 */,
56101 /* 13 */
56102 /***/ (function(module, exports, __nested_webpack_require_31287__) {
56103
56104 "use strict";
56105 /*jshint node:true */
56106 /*
56107
56108   The MIT License (MIT)
56109
56110   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
56111
56112   Permission is hereby granted, free of charge, to any person
56113   obtaining a copy of this software and associated documentation files
56114   (the "Software"), to deal in the Software without restriction,
56115   including without limitation the rights to use, copy, modify, merge,
56116   publish, distribute, sublicense, and/or sell copies of the Software,
56117   and to permit persons to whom the Software is furnished to do so,
56118   subject to the following conditions:
56119
56120   The above copyright notice and this permission notice shall be
56121   included in all copies or substantial portions of the Software.
56122
56123   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56124   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56125   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
56126   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
56127   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
56128   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
56129   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56130   SOFTWARE.
56131 */
56132
56133
56134
56135 function Directives(start_block_pattern, end_block_pattern) {
56136   start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source;
56137   end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source;
56138   this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \w+[:]\w+)+ /.source + end_block_pattern, 'g');
56139   this.__directive_pattern = / (\w+)[:](\w+)/g;
56140
56141   this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\sbeautify\signore:end\s/.source + end_block_pattern, 'g');
56142 }
56143
56144 Directives.prototype.get_directives = function(text) {
56145   if (!text.match(this.__directives_block_pattern)) {
56146     return null;
56147   }
56148
56149   var directives = {};
56150   this.__directive_pattern.lastIndex = 0;
56151   var directive_match = this.__directive_pattern.exec(text);
56152
56153   while (directive_match) {
56154     directives[directive_match[1]] = directive_match[2];
56155     directive_match = this.__directive_pattern.exec(text);
56156   }
56157
56158   return directives;
56159 };
56160
56161 Directives.prototype.readIgnored = function(input) {
56162   return input.readUntilAfter(this.__directives_end_ignore_pattern);
56163 };
56164
56165
56166 module.exports.Directives = Directives;
56167
56168
56169 /***/ }),
56170 /* 14 */,
56171 /* 15 */
56172 /***/ (function(module, exports, __nested_webpack_require_33779__) {
56173
56174 "use strict";
56175 /*jshint node:true */
56176 /*
56177
56178   The MIT License (MIT)
56179
56180   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
56181
56182   Permission is hereby granted, free of charge, to any person
56183   obtaining a copy of this software and associated documentation files
56184   (the "Software"), to deal in the Software without restriction,
56185   including without limitation the rights to use, copy, modify, merge,
56186   publish, distribute, sublicense, and/or sell copies of the Software,
56187   and to permit persons to whom the Software is furnished to do so,
56188   subject to the following conditions:
56189
56190   The above copyright notice and this permission notice shall be
56191   included in all copies or substantial portions of the Software.
56192
56193   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56194   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56195   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
56196   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
56197   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
56198   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
56199   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56200   SOFTWARE.
56201 */
56202
56203
56204
56205 var Beautifier = __nested_webpack_require_33779__(16).Beautifier,
56206   Options = __nested_webpack_require_33779__(17).Options;
56207
56208 function css_beautify(source_text, options) {
56209   var beautifier = new Beautifier(source_text, options);
56210   return beautifier.beautify();
56211 }
56212
56213 module.exports = css_beautify;
56214 module.exports.defaultOptions = function() {
56215   return new Options();
56216 };
56217
56218
56219 /***/ }),
56220 /* 16 */
56221 /***/ (function(module, exports, __nested_webpack_require_35400__) {
56222
56223 "use strict";
56224 /*jshint node:true */
56225 /*
56226
56227   The MIT License (MIT)
56228
56229   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
56230
56231   Permission is hereby granted, free of charge, to any person
56232   obtaining a copy of this software and associated documentation files
56233   (the "Software"), to deal in the Software without restriction,
56234   including without limitation the rights to use, copy, modify, merge,
56235   publish, distribute, sublicense, and/or sell copies of the Software,
56236   and to permit persons to whom the Software is furnished to do so,
56237   subject to the following conditions:
56238
56239   The above copyright notice and this permission notice shall be
56240   included in all copies or substantial portions of the Software.
56241
56242   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56243   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56244   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
56245   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
56246   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
56247   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
56248   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56249   SOFTWARE.
56250 */
56251
56252
56253
56254 var Options = __nested_webpack_require_35400__(17).Options;
56255 var Output = __nested_webpack_require_35400__(2).Output;
56256 var InputScanner = __nested_webpack_require_35400__(8).InputScanner;
56257 var Directives = __nested_webpack_require_35400__(13).Directives;
56258
56259 var directives_core = new Directives(/\/\*/, /\*\//);
56260
56261 var lineBreak = /\r\n|[\r\n]/;
56262 var allLineBreaks = /\r\n|[\r\n]/g;
56263
56264 // tokenizer
56265 var whitespaceChar = /\s/;
56266 var whitespacePattern = /(?:\s|\n)+/g;
56267 var block_comment_pattern = /\/\*(?:[\s\S]*?)((?:\*\/)|$)/g;
56268 var comment_pattern = /\/\/(?:[^\n\r\u2028\u2029]*)/g;
56269
56270 function Beautifier(source_text, options) {
56271   this._source_text = source_text || '';
56272   // Allow the setting of language/file-type specific options
56273   // with inheritance of overall settings
56274   this._options = new Options(options);
56275   this._ch = null;
56276   this._input = null;
56277
56278   // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule
56279   this.NESTED_AT_RULE = {
56280     "@page": true,
56281     "@font-face": true,
56282     "@keyframes": true,
56283     // also in CONDITIONAL_GROUP_RULE below
56284     "@media": true,
56285     "@supports": true,
56286     "@document": true
56287   };
56288   this.CONDITIONAL_GROUP_RULE = {
56289     "@media": true,
56290     "@supports": true,
56291     "@document": true
56292   };
56293
56294 }
56295
56296 Beautifier.prototype.eatString = function(endChars) {
56297   var result = '';
56298   this._ch = this._input.next();
56299   while (this._ch) {
56300     result += this._ch;
56301     if (this._ch === "\\") {
56302       result += this._input.next();
56303     } else if (endChars.indexOf(this._ch) !== -1 || this._ch === "\n") {
56304       break;
56305     }
56306     this._ch = this._input.next();
56307   }
56308   return result;
56309 };
56310
56311 // Skips any white space in the source text from the current position.
56312 // When allowAtLeastOneNewLine is true, will output new lines for each
56313 // newline character found; if the user has preserve_newlines off, only
56314 // the first newline will be output
56315 Beautifier.prototype.eatWhitespace = function(allowAtLeastOneNewLine) {
56316   var result = whitespaceChar.test(this._input.peek());
56317   var isFirstNewLine = true;
56318
56319   while (whitespaceChar.test(this._input.peek())) {
56320     this._ch = this._input.next();
56321     if (allowAtLeastOneNewLine && this._ch === '\n') {
56322       if (this._options.preserve_newlines || isFirstNewLine) {
56323         isFirstNewLine = false;
56324         this._output.add_new_line(true);
56325       }
56326     }
56327   }
56328   return result;
56329 };
56330
56331 // Nested pseudo-class if we are insideRule
56332 // and the next special character found opens
56333 // a new block
56334 Beautifier.prototype.foundNestedPseudoClass = function() {
56335   var openParen = 0;
56336   var i = 1;
56337   var ch = this._input.peek(i);
56338   while (ch) {
56339     if (ch === "{") {
56340       return true;
56341     } else if (ch === '(') {
56342       // pseudoclasses can contain ()
56343       openParen += 1;
56344     } else if (ch === ')') {
56345       if (openParen === 0) {
56346         return false;
56347       }
56348       openParen -= 1;
56349     } else if (ch === ";" || ch === "}") {
56350       return false;
56351     }
56352     i++;
56353     ch = this._input.peek(i);
56354   }
56355   return false;
56356 };
56357
56358 Beautifier.prototype.print_string = function(output_string) {
56359   this._output.set_indent(this._indentLevel);
56360   this._output.non_breaking_space = true;
56361   this._output.add_token(output_string);
56362 };
56363
56364 Beautifier.prototype.preserveSingleSpace = function(isAfterSpace) {
56365   if (isAfterSpace) {
56366     this._output.space_before_token = true;
56367   }
56368 };
56369
56370 Beautifier.prototype.indent = function() {
56371   this._indentLevel++;
56372 };
56373
56374 Beautifier.prototype.outdent = function() {
56375   if (this._indentLevel > 0) {
56376     this._indentLevel--;
56377   }
56378 };
56379
56380 /*_____________________--------------------_____________________*/
56381
56382 Beautifier.prototype.beautify = function() {
56383   if (this._options.disabled) {
56384     return this._source_text;
56385   }
56386
56387   var source_text = this._source_text;
56388   var eol = this._options.eol;
56389   if (eol === 'auto') {
56390     eol = '\n';
56391     if (source_text && lineBreak.test(source_text || '')) {
56392       eol = source_text.match(lineBreak)[0];
56393     }
56394   }
56395
56396
56397   // HACK: newline parsing inconsistent. This brute force normalizes the this._input.
56398   source_text = source_text.replace(allLineBreaks, '\n');
56399
56400   // reset
56401   var baseIndentString = source_text.match(/^[\t ]*/)[0];
56402
56403   this._output = new Output(this._options, baseIndentString);
56404   this._input = new InputScanner(source_text);
56405   this._indentLevel = 0;
56406   this._nestedLevel = 0;
56407
56408   this._ch = null;
56409   var parenLevel = 0;
56410
56411   var insideRule = false;
56412   // This is the value side of a property value pair (blue in the following ex)
56413   // label { content: blue }
56414   var insidePropertyValue = false;
56415   var enteringConditionalGroup = false;
56416   var insideAtExtend = false;
56417   var insideAtImport = false;
56418   var topCharacter = this._ch;
56419   var whitespace;
56420   var isAfterSpace;
56421   var previous_ch;
56422
56423   while (true) {
56424     whitespace = this._input.read(whitespacePattern);
56425     isAfterSpace = whitespace !== '';
56426     previous_ch = topCharacter;
56427     this._ch = this._input.next();
56428     if (this._ch === '\\' && this._input.hasNext()) {
56429       this._ch += this._input.next();
56430     }
56431     topCharacter = this._ch;
56432
56433     if (!this._ch) {
56434       break;
56435     } else if (this._ch === '/' && this._input.peek() === '*') {
56436       // /* css comment */
56437       // Always start block comments on a new line.
56438       // This handles scenarios where a block comment immediately
56439       // follows a property definition on the same line or where
56440       // minified code is being beautified.
56441       this._output.add_new_line();
56442       this._input.back();
56443
56444       var comment = this._input.read(block_comment_pattern);
56445
56446       // Handle ignore directive
56447       var directives = directives_core.get_directives(comment);
56448       if (directives && directives.ignore === 'start') {
56449         comment += directives_core.readIgnored(this._input);
56450       }
56451
56452       this.print_string(comment);
56453
56454       // Ensures any new lines following the comment are preserved
56455       this.eatWhitespace(true);
56456
56457       // Block comments are followed by a new line so they don't
56458       // share a line with other properties
56459       this._output.add_new_line();
56460     } else if (this._ch === '/' && this._input.peek() === '/') {
56461       // // single line comment
56462       // Preserves the space before a comment
56463       // on the same line as a rule
56464       this._output.space_before_token = true;
56465       this._input.back();
56466       this.print_string(this._input.read(comment_pattern));
56467
56468       // Ensures any new lines following the comment are preserved
56469       this.eatWhitespace(true);
56470     } else if (this._ch === '@') {
56471       this.preserveSingleSpace(isAfterSpace);
56472
56473       // deal with less propery mixins @{...}
56474       if (this._input.peek() === '{') {
56475         this.print_string(this._ch + this.eatString('}'));
56476       } else {
56477         this.print_string(this._ch);
56478
56479         // strip trailing space, if present, for hash property checks
56480         var variableOrRule = this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);
56481
56482         if (variableOrRule.match(/[ :]$/)) {
56483           // we have a variable or pseudo-class, add it and insert one space before continuing
56484           variableOrRule = this.eatString(": ").replace(/\s$/, '');
56485           this.print_string(variableOrRule);
56486           this._output.space_before_token = true;
56487         }
56488
56489         variableOrRule = variableOrRule.replace(/\s$/, '');
56490
56491         if (variableOrRule === 'extend') {
56492           insideAtExtend = true;
56493         } else if (variableOrRule === 'import') {
56494           insideAtImport = true;
56495         }
56496
56497         // might be a nesting at-rule
56498         if (variableOrRule in this.NESTED_AT_RULE) {
56499           this._nestedLevel += 1;
56500           if (variableOrRule in this.CONDITIONAL_GROUP_RULE) {
56501             enteringConditionalGroup = true;
56502           }
56503           // might be less variable
56504         } else if (!insideRule && parenLevel === 0 && variableOrRule.indexOf(':') !== -1) {
56505           insidePropertyValue = true;
56506           this.indent();
56507         }
56508       }
56509     } else if (this._ch === '#' && this._input.peek() === '{') {
56510       this.preserveSingleSpace(isAfterSpace);
56511       this.print_string(this._ch + this.eatString('}'));
56512     } else if (this._ch === '{') {
56513       if (insidePropertyValue) {
56514         insidePropertyValue = false;
56515         this.outdent();
56516       }
56517       this.indent();
56518       this._output.space_before_token = true;
56519       this.print_string(this._ch);
56520
56521       // when entering conditional groups, only rulesets are allowed
56522       if (enteringConditionalGroup) {
56523         enteringConditionalGroup = false;
56524         insideRule = (this._indentLevel > this._nestedLevel);
56525       } else {
56526         // otherwise, declarations are also allowed
56527         insideRule = (this._indentLevel >= this._nestedLevel);
56528       }
56529       if (this._options.newline_between_rules && insideRule) {
56530         if (this._output.previous_line && this._output.previous_line.item(-1) !== '{') {
56531           this._output.ensure_empty_line_above('/', ',');
56532         }
56533       }
56534       this.eatWhitespace(true);
56535       this._output.add_new_line();
56536     } else if (this._ch === '}') {
56537       this.outdent();
56538       this._output.add_new_line();
56539       if (previous_ch === '{') {
56540         this._output.trim(true);
56541       }
56542       insideAtImport = false;
56543       insideAtExtend = false;
56544       if (insidePropertyValue) {
56545         this.outdent();
56546         insidePropertyValue = false;
56547       }
56548       this.print_string(this._ch);
56549       insideRule = false;
56550       if (this._nestedLevel) {
56551         this._nestedLevel--;
56552       }
56553
56554       this.eatWhitespace(true);
56555       this._output.add_new_line();
56556
56557       if (this._options.newline_between_rules && !this._output.just_added_blankline()) {
56558         if (this._input.peek() !== '}') {
56559           this._output.add_new_line(true);
56560         }
56561       }
56562     } else if (this._ch === ":") {
56563       if ((insideRule || enteringConditionalGroup) && !(this._input.lookBack("&") || this.foundNestedPseudoClass()) && !this._input.lookBack("(") && !insideAtExtend && parenLevel === 0) {
56564         // 'property: value' delimiter
56565         // which could be in a conditional group query
56566         this.print_string(':');
56567         if (!insidePropertyValue) {
56568           insidePropertyValue = true;
56569           this._output.space_before_token = true;
56570           this.eatWhitespace(true);
56571           this.indent();
56572         }
56573       } else {
56574         // sass/less parent reference don't use a space
56575         // sass nested pseudo-class don't use a space
56576
56577         // preserve space before pseudoclasses/pseudoelements, as it means "in any child"
56578         if (this._input.lookBack(" ")) {
56579           this._output.space_before_token = true;
56580         }
56581         if (this._input.peek() === ":") {
56582           // pseudo-element
56583           this._ch = this._input.next();
56584           this.print_string("::");
56585         } else {
56586           // pseudo-class
56587           this.print_string(':');
56588         }
56589       }
56590     } else if (this._ch === '"' || this._ch === '\'') {
56591       this.preserveSingleSpace(isAfterSpace);
56592       this.print_string(this._ch + this.eatString(this._ch));
56593       this.eatWhitespace(true);
56594     } else if (this._ch === ';') {
56595       if (parenLevel === 0) {
56596         if (insidePropertyValue) {
56597           this.outdent();
56598           insidePropertyValue = false;
56599         }
56600         insideAtExtend = false;
56601         insideAtImport = false;
56602         this.print_string(this._ch);
56603         this.eatWhitespace(true);
56604
56605         // This maintains single line comments on the same
56606         // line. Block comments are also affected, but
56607         // a new line is always output before one inside
56608         // that section
56609         if (this._input.peek() !== '/') {
56610           this._output.add_new_line();
56611         }
56612       } else {
56613         this.print_string(this._ch);
56614         this.eatWhitespace(true);
56615         this._output.space_before_token = true;
56616       }
56617     } else if (this._ch === '(') { // may be a url
56618       if (this._input.lookBack("url")) {
56619         this.print_string(this._ch);
56620         this.eatWhitespace();
56621         parenLevel++;
56622         this.indent();
56623         this._ch = this._input.next();
56624         if (this._ch === ')' || this._ch === '"' || this._ch === '\'') {
56625           this._input.back();
56626         } else if (this._ch) {
56627           this.print_string(this._ch + this.eatString(')'));
56628           if (parenLevel) {
56629             parenLevel--;
56630             this.outdent();
56631           }
56632         }
56633       } else {
56634         this.preserveSingleSpace(isAfterSpace);
56635         this.print_string(this._ch);
56636         this.eatWhitespace();
56637         parenLevel++;
56638         this.indent();
56639       }
56640     } else if (this._ch === ')') {
56641       if (parenLevel) {
56642         parenLevel--;
56643         this.outdent();
56644       }
56645       this.print_string(this._ch);
56646     } else if (this._ch === ',') {
56647       this.print_string(this._ch);
56648       this.eatWhitespace(true);
56649       if (this._options.selector_separator_newline && !insidePropertyValue && parenLevel === 0 && !insideAtImport) {
56650         this._output.add_new_line();
56651       } else {
56652         this._output.space_before_token = true;
56653       }
56654     } else if ((this._ch === '>' || this._ch === '+' || this._ch === '~') && !insidePropertyValue && parenLevel === 0) {
56655       //handle combinator spacing
56656       if (this._options.space_around_combinator) {
56657         this._output.space_before_token = true;
56658         this.print_string(this._ch);
56659         this._output.space_before_token = true;
56660       } else {
56661         this.print_string(this._ch);
56662         this.eatWhitespace();
56663         // squash extra whitespace
56664         if (this._ch && whitespaceChar.test(this._ch)) {
56665           this._ch = '';
56666         }
56667       }
56668     } else if (this._ch === ']') {
56669       this.print_string(this._ch);
56670     } else if (this._ch === '[') {
56671       this.preserveSingleSpace(isAfterSpace);
56672       this.print_string(this._ch);
56673     } else if (this._ch === '=') { // no whitespace before or after
56674       this.eatWhitespace();
56675       this.print_string('=');
56676       if (whitespaceChar.test(this._ch)) {
56677         this._ch = '';
56678       }
56679     } else if (this._ch === '!' && !this._input.lookBack("\\")) { // !important
56680       this.print_string(' ');
56681       this.print_string(this._ch);
56682     } else {
56683       this.preserveSingleSpace(isAfterSpace);
56684       this.print_string(this._ch);
56685     }
56686   }
56687
56688   var sweetCode = this._output.get_code(eol);
56689
56690   return sweetCode;
56691 };
56692
56693 module.exports.Beautifier = Beautifier;
56694
56695
56696 /***/ }),
56697 /* 17 */
56698 /***/ (function(module, exports, __nested_webpack_require_50692__) {
56699
56700 "use strict";
56701 /*jshint node:true */
56702 /*
56703
56704   The MIT License (MIT)
56705
56706   Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, and contributors.
56707
56708   Permission is hereby granted, free of charge, to any person
56709   obtaining a copy of this software and associated documentation files
56710   (the "Software"), to deal in the Software without restriction,
56711   including without limitation the rights to use, copy, modify, merge,
56712   publish, distribute, sublicense, and/or sell copies of the Software,
56713   and to permit persons to whom the Software is furnished to do so,
56714   subject to the following conditions:
56715
56716   The above copyright notice and this permission notice shall be
56717   included in all copies or substantial portions of the Software.
56718
56719   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56720   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
56721   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
56722   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
56723   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
56724   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
56725   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
56726   SOFTWARE.
56727 */
56728
56729
56730
56731 var BaseOptions = __nested_webpack_require_50692__(6).Options;
56732
56733 function Options(options) {
56734   BaseOptions.call(this, options, 'css');
56735
56736   this.selector_separator_newline = this._get_boolean('selector_separator_newline', true);
56737   this.newline_between_rules = this._get_boolean('newline_between_rules', true);
56738   var space_around_selector_separator = this._get_boolean('space_around_selector_separator');
56739   this.space_around_combinator = this._get_boolean('space_around_combinator') || space_around_selector_separator;
56740
56741 }
56742 Options.prototype = new BaseOptions();
56743
56744
56745
56746 module.exports.Options = Options;
56747
56748
56749 /***/ })
56750 /******/ ]);
56751
56752 var css_beautify = legacy_beautify_css;
56753
56754 /***/ }),
56755 /* 124 */
56756 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
56757
56758 __webpack_require__.r(__webpack_exports__);
56759 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
56760 /* harmony export */   "js_beautify": () => /* binding */ js_beautify
56761 /* harmony export */ });
56762 /*---------------------------------------------------------------------------------------------
56763  *  Copyright (c) Microsoft Corporation. All rights reserved.
56764  *  Licensed under the MIT License. See License.txt in the project root for license information.
56765  *--------------------------------------------------------------------------------------------*/
56766 /*
56767  * Mock for the JS formatter. Ignore formatting of JS content in HTML.
56768  */
56769 function js_beautify(js_source_text, options) {
56770     // no formatting
56771     return js_source_text;
56772 }
56773
56774
56775 /***/ }),
56776 /* 125 */
56777 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
56778
56779 __webpack_require__.r(__webpack_exports__);
56780 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
56781 /* harmony export */   "findDocumentLinks": () => /* binding */ findDocumentLinks
56782 /* harmony export */ });
56783 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);
56784 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(109);
56785 /* harmony import */ var _utils_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(115);
56786 /* harmony import */ var vscode_uri__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(84);
56787 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(108);
56788 /*---------------------------------------------------------------------------------------------
56789  *  Copyright (c) Microsoft Corporation. All rights reserved.
56790  *  Licensed under the MIT License. See License.txt in the project root for license information.
56791  *--------------------------------------------------------------------------------------------*/
56792
56793
56794
56795
56796
56797 function normalizeRef(url) {
56798     var first = url[0];
56799     var last = url[url.length - 1];
56800     if (first === last && (first === '\'' || first === '\"')) {
56801         url = url.substr(1, url.length - 2);
56802     }
56803     return url;
56804 }
56805 function validateRef(url, languageId) {
56806     if (!url.length) {
56807         return false;
56808     }
56809     if (languageId === 'handlebars' && /{{.*}}/.test(url)) {
56810         return false;
56811     }
56812     return /\b(w[\w\d+.-]*:\/\/)?[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/?))/.test(url);
56813 }
56814 function getWorkspaceUrl(documentUri, tokenContent, documentContext, base) {
56815     if (/^\s*javascript\:/i.test(tokenContent) || /[\n\r]/.test(tokenContent)) {
56816         return undefined;
56817     }
56818     tokenContent = tokenContent.replace(/^\s*/g, '');
56819     if (/^https?:\/\//i.test(tokenContent) || /^file:\/\//i.test(tokenContent)) {
56820         // Absolute link that needs no treatment
56821         return tokenContent;
56822     }
56823     if (/^\#/i.test(tokenContent)) {
56824         return documentUri + tokenContent;
56825     }
56826     if (/^\/\//i.test(tokenContent)) {
56827         // Absolute link (that does not name the protocol)
56828         var pickedScheme = _utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith(documentUri, 'https://') ? 'https' : 'http';
56829         return pickedScheme + ':' + tokenContent.replace(/^\s*/g, '');
56830     }
56831     if (documentContext) {
56832         return documentContext.resolveReference(tokenContent, base || documentUri);
56833     }
56834     return tokenContent;
56835 }
56836 function createLink(document, documentContext, attributeValue, startOffset, endOffset, base) {
56837     var tokenContent = normalizeRef(attributeValue);
56838     if (!validateRef(tokenContent, document.languageId)) {
56839         return undefined;
56840     }
56841     if (tokenContent.length < attributeValue.length) {
56842         startOffset++;
56843         endOffset--;
56844     }
56845     var workspaceUrl = getWorkspaceUrl(document.uri, tokenContent, documentContext, base);
56846     if (!workspaceUrl || !isValidURI(workspaceUrl)) {
56847         return undefined;
56848     }
56849     return {
56850         range: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.Range.create(document.positionAt(startOffset), document.positionAt(endOffset)),
56851         target: workspaceUrl
56852     };
56853 }
56854 function isValidURI(uri) {
56855     try {
56856         vscode_uri__WEBPACK_IMPORTED_MODULE_3__.URI.parse(uri);
56857         return true;
56858     }
56859     catch (e) {
56860         return false;
56861     }
56862 }
56863 function findDocumentLinks(document, documentContext) {
56864     var newLinks = [];
56865     var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner)(document.getText(), 0);
56866     var token = scanner.scan();
56867     var lastAttributeName = undefined;
56868     var afterBase = false;
56869     var base = void 0;
56870     var idLocations = {};
56871     while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_4__.TokenType.EOS) {
56872         switch (token) {
56873             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_4__.TokenType.StartTag:
56874                 if (!base) {
56875                     var tagName = scanner.getTokenText().toLowerCase();
56876                     afterBase = tagName === 'base';
56877                 }
56878                 break;
56879             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_4__.TokenType.AttributeName:
56880                 lastAttributeName = scanner.getTokenText().toLowerCase();
56881                 break;
56882             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_4__.TokenType.AttributeValue:
56883                 if (lastAttributeName === 'src' || lastAttributeName === 'href') {
56884                     var attributeValue = scanner.getTokenText();
56885                     if (!afterBase) { // don't highlight the base link itself
56886                         var link = createLink(document, documentContext, attributeValue, scanner.getTokenOffset(), scanner.getTokenEnd(), base);
56887                         if (link) {
56888                             newLinks.push(link);
56889                         }
56890                     }
56891                     if (afterBase && typeof base === 'undefined') {
56892                         base = normalizeRef(attributeValue);
56893                         if (base && documentContext) {
56894                             base = documentContext.resolveReference(base, document.uri);
56895                         }
56896                     }
56897                     afterBase = false;
56898                     lastAttributeName = undefined;
56899                 }
56900                 else if (lastAttributeName === 'id') {
56901                     var id = normalizeRef(scanner.getTokenText());
56902                     idLocations[id] = scanner.getTokenOffset();
56903                 }
56904                 break;
56905         }
56906         token = scanner.scan();
56907     }
56908     // change local links with ids to actual positions
56909     for (var _i = 0, newLinks_1 = newLinks; _i < newLinks_1.length; _i++) {
56910         var link = newLinks_1[_i];
56911         var localWithHash = document.uri + '#';
56912         if (link.target && _utils_strings__WEBPACK_IMPORTED_MODULE_2__.startsWith(link.target, localWithHash)) {
56913             var target = link.target.substr(localWithHash.length);
56914             var offset = idLocations[target];
56915             if (offset !== undefined) {
56916                 var pos = document.positionAt(offset);
56917                 link.target = "" + localWithHash + (pos.line + 1) + "," + (pos.character + 1);
56918             }
56919         }
56920     }
56921     return newLinks;
56922 }
56923
56924
56925 /***/ }),
56926 /* 126 */
56927 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
56928
56929 __webpack_require__.r(__webpack_exports__);
56930 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
56931 /* harmony export */   "findDocumentHighlights": () => /* binding */ findDocumentHighlights
56932 /* harmony export */ });
56933 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(107);
56934 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(109);
56935 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(108);
56936 /*---------------------------------------------------------------------------------------------
56937  *  Copyright (c) Microsoft Corporation. All rights reserved.
56938  *  Licensed under the MIT License. See License.txt in the project root for license information.
56939  *--------------------------------------------------------------------------------------------*/
56940
56941
56942
56943 function findDocumentHighlights(document, position, htmlDocument) {
56944     var offset = document.offsetAt(position);
56945     var node = htmlDocument.findNodeAt(offset);
56946     if (!node.tag) {
56947         return [];
56948     }
56949     var result = [];
56950     var startTagRange = getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.StartTag, document, node.start);
56951     var endTagRange = typeof node.endTagStart === 'number' && getTagNameRange(_htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EndTag, document, node.endTagStart);
56952     if (startTagRange && covers(startTagRange, position) || endTagRange && covers(endTagRange, position)) {
56953         if (startTagRange) {
56954             result.push({ kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.DocumentHighlightKind.Read, range: startTagRange });
56955         }
56956         if (endTagRange) {
56957             result.push({ kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_1__.DocumentHighlightKind.Read, range: endTagRange });
56958         }
56959     }
56960     return result;
56961 }
56962 function isBeforeOrEqual(pos1, pos2) {
56963     return pos1.line < pos2.line || (pos1.line === pos2.line && pos1.character <= pos2.character);
56964 }
56965 function covers(range, position) {
56966     return isBeforeOrEqual(range.start, position) && isBeforeOrEqual(position, range.end);
56967 }
56968 function getTagNameRange(tokenType, document, startOffset) {
56969     var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_0__.createScanner)(document.getText(), startOffset);
56970     var token = scanner.scan();
56971     while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS && token !== tokenType) {
56972         token = scanner.scan();
56973     }
56974     if (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_2__.TokenType.EOS) {
56975         return { start: document.positionAt(scanner.getTokenOffset()), end: document.positionAt(scanner.getTokenEnd()) };
56976     }
56977     return null;
56978 }
56979
56980
56981 /***/ }),
56982 /* 127 */
56983 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
56984
56985 __webpack_require__.r(__webpack_exports__);
56986 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
56987 /* harmony export */   "findDocumentSymbols": () => /* binding */ findDocumentSymbols
56988 /* harmony export */ });
56989 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
56990 /*---------------------------------------------------------------------------------------------
56991  *  Copyright (c) Microsoft Corporation. All rights reserved.
56992  *  Licensed under the MIT License. See License.txt in the project root for license information.
56993  *--------------------------------------------------------------------------------------------*/
56994
56995 function findDocumentSymbols(document, htmlDocument) {
56996     var symbols = [];
56997     htmlDocument.roots.forEach(function (node) {
56998         provideFileSymbolsInternal(document, node, '', symbols);
56999     });
57000     return symbols;
57001 }
57002 function provideFileSymbolsInternal(document, node, container, symbols) {
57003     var name = nodeToName(node);
57004     var location = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Location.create(document.uri, vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(node.start), document.positionAt(node.end)));
57005     var symbol = {
57006         name: name,
57007         location: location,
57008         containerName: container,
57009         kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SymbolKind.Field
57010     };
57011     symbols.push(symbol);
57012     node.children.forEach(function (child) {
57013         provideFileSymbolsInternal(document, child, name, symbols);
57014     });
57015 }
57016 function nodeToName(node) {
57017     var name = node.tag;
57018     if (node.attributes) {
57019         var id = node.attributes['id'];
57020         var classes = node.attributes['class'];
57021         if (id) {
57022             name += "#" + id.replace(/[\"\']/g, '');
57023         }
57024         if (classes) {
57025             name += classes.replace(/[\"\']/g, '').split(/\s+/).map(function (className) { return "." + className; }).join('');
57026         }
57027     }
57028     return name || '?';
57029 }
57030
57031
57032 /***/ }),
57033 /* 128 */
57034 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
57035
57036 __webpack_require__.r(__webpack_exports__);
57037 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
57038 /* harmony export */   "findOnTypeRenameRanges": () => /* binding */ findOnTypeRenameRanges
57039 /* harmony export */ });
57040 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
57041 /*---------------------------------------------------------------------------------------------
57042  *  Copyright (c) Microsoft Corporation. All rights reserved.
57043  *  Licensed under the MIT License. See License.txt in the project root for license information.
57044  *--------------------------------------------------------------------------------------------*/
57045
57046 function findOnTypeRenameRanges(document, position, htmlDocument) {
57047     var offset = document.offsetAt(position);
57048     var node = htmlDocument.findNodeAt(offset);
57049     var tagLength = node.tag ? node.tag.length : 0;
57050     if (!node.endTagStart) {
57051         return null;
57052     }
57053     if (
57054     // Within open tag, compute close tag
57055     (node.start + '<'.length <= offset && offset <= node.start + '<'.length + tagLength) ||
57056         // Within closing tag, compute open tag
57057         node.endTagStart + '</'.length <= offset && offset <= node.endTagStart + '</'.length + tagLength) {
57058         return [
57059             vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(node.start + '<'.length), document.positionAt(node.start + '<'.length + tagLength)),
57060             vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(node.endTagStart + '</'.length), document.positionAt(node.endTagStart + '</'.length + tagLength))
57061         ];
57062     }
57063     return null;
57064 }
57065
57066
57067 /***/ }),
57068 /* 129 */
57069 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
57070
57071 __webpack_require__.r(__webpack_exports__);
57072 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
57073 /* harmony export */   "getFoldingRanges": () => /* binding */ getFoldingRanges
57074 /* harmony export */ });
57075 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
57076 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(108);
57077 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(107);
57078 /* harmony import */ var _languageFacts_fact__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(111);
57079 /*---------------------------------------------------------------------------------------------
57080  *  Copyright (c) Microsoft Corporation. All rights reserved.
57081  *  Licensed under the MIT License. See License.txt in the project root for license information.
57082  *--------------------------------------------------------------------------------------------*/
57083
57084
57085
57086
57087 function limitRanges(ranges, rangeLimit) {
57088     ranges = ranges.sort(function (r1, r2) {
57089         var diff = r1.startLine - r2.startLine;
57090         if (diff === 0) {
57091             diff = r1.endLine - r2.endLine;
57092         }
57093         return diff;
57094     });
57095     // compute each range's nesting level in 'nestingLevels'.
57096     // count the number of ranges for each level in 'nestingLevelCounts'
57097     var top = void 0;
57098     var previous = [];
57099     var nestingLevels = [];
57100     var nestingLevelCounts = [];
57101     var setNestingLevel = function (index, level) {
57102         nestingLevels[index] = level;
57103         if (level < 30) {
57104             nestingLevelCounts[level] = (nestingLevelCounts[level] || 0) + 1;
57105         }
57106     };
57107     // compute nesting levels and sanitize
57108     for (var i = 0; i < ranges.length; i++) {
57109         var entry = ranges[i];
57110         if (!top) {
57111             top = entry;
57112             setNestingLevel(i, 0);
57113         }
57114         else {
57115             if (entry.startLine > top.startLine) {
57116                 if (entry.endLine <= top.endLine) {
57117                     previous.push(top);
57118                     top = entry;
57119                     setNestingLevel(i, previous.length);
57120                 }
57121                 else if (entry.startLine > top.endLine) {
57122                     do {
57123                         top = previous.pop();
57124                     } while (top && entry.startLine > top.endLine);
57125                     if (top) {
57126                         previous.push(top);
57127                     }
57128                     top = entry;
57129                     setNestingLevel(i, previous.length);
57130                 }
57131             }
57132         }
57133     }
57134     var entries = 0;
57135     var maxLevel = 0;
57136     for (var i = 0; i < nestingLevelCounts.length; i++) {
57137         var n = nestingLevelCounts[i];
57138         if (n) {
57139             if (n + entries > rangeLimit) {
57140                 maxLevel = i;
57141                 break;
57142             }
57143             entries += n;
57144         }
57145     }
57146     var result = [];
57147     for (var i = 0; i < ranges.length; i++) {
57148         var level = nestingLevels[i];
57149         if (typeof level === 'number') {
57150             if (level < maxLevel || (level === maxLevel && entries++ < rangeLimit)) {
57151                 result.push(ranges[i]);
57152             }
57153         }
57154     }
57155     return result;
57156 }
57157 function getFoldingRanges(document, context) {
57158     var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_2__.createScanner)(document.getText());
57159     var token = scanner.scan();
57160     var ranges = [];
57161     var stack = [];
57162     var lastTagName = null;
57163     var prevStart = -1;
57164     function addRange(range) {
57165         ranges.push(range);
57166         prevStart = range.startLine;
57167     }
57168     while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EOS) {
57169         switch (token) {
57170             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTag: {
57171                 var tagName = scanner.getTokenText();
57172                 var startLine = document.positionAt(scanner.getTokenOffset()).line;
57173                 stack.push({ startLine: startLine, tagName: tagName });
57174                 lastTagName = tagName;
57175                 break;
57176             }
57177             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTag: {
57178                 lastTagName = scanner.getTokenText();
57179                 break;
57180             }
57181             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagClose:
57182                 if (!lastTagName || !(0,_languageFacts_fact__WEBPACK_IMPORTED_MODULE_3__.isVoidElement)(lastTagName)) {
57183                     break;
57184                 }
57185             // fallthrough
57186             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.EndTagClose:
57187             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.StartTagSelfClose: {
57188                 var i = stack.length - 1;
57189                 while (i >= 0 && stack[i].tagName !== lastTagName) {
57190                     i--;
57191                 }
57192                 if (i >= 0) {
57193                     var stackElement = stack[i];
57194                     stack.length = i;
57195                     var line = document.positionAt(scanner.getTokenOffset()).line;
57196                     var startLine = stackElement.startLine;
57197                     var endLine = line - 1;
57198                     if (endLine > startLine && prevStart !== startLine) {
57199                         addRange({ startLine: startLine, endLine: endLine });
57200                     }
57201                 }
57202                 break;
57203             }
57204             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_1__.TokenType.Comment: {
57205                 var startLine = document.positionAt(scanner.getTokenOffset()).line;
57206                 var text = scanner.getTokenText();
57207                 var m = text.match(/^\s*#(region\b)|(endregion\b)/);
57208                 if (m) {
57209                     if (m[1]) { // start pattern match
57210                         stack.push({ startLine: startLine, tagName: '' }); // empty tagName marks region
57211                     }
57212                     else {
57213                         var i = stack.length - 1;
57214                         while (i >= 0 && stack[i].tagName.length) {
57215                             i--;
57216                         }
57217                         if (i >= 0) {
57218                             var stackElement = stack[i];
57219                             stack.length = i;
57220                             var endLine = startLine;
57221                             startLine = stackElement.startLine;
57222                             if (endLine > startLine && prevStart !== startLine) {
57223                                 addRange({ startLine: startLine, endLine: endLine, kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRangeKind.Region });
57224                             }
57225                         }
57226                     }
57227                 }
57228                 else {
57229                     var endLine = document.positionAt(scanner.getTokenOffset() + scanner.getTokenLength()).line;
57230                     if (startLine < endLine) {
57231                         addRange({ startLine: startLine, endLine: endLine, kind: vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.FoldingRangeKind.Comment });
57232                     }
57233                 }
57234                 break;
57235             }
57236         }
57237         token = scanner.scan();
57238     }
57239     var rangeLimit = context && context.rangeLimit || Number.MAX_VALUE;
57240     if (ranges.length > rangeLimit) {
57241         return limitRanges(ranges, rangeLimit);
57242     }
57243     return ranges;
57244 }
57245
57246
57247 /***/ }),
57248 /* 130 */
57249 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
57250
57251 __webpack_require__.r(__webpack_exports__);
57252 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
57253 /* harmony export */   "getSelectionRanges": () => /* binding */ getSelectionRanges
57254 /* harmony export */ });
57255 /* harmony import */ var vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(109);
57256 /* harmony import */ var _parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(107);
57257 /* harmony import */ var _parser_htmlParser__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(110);
57258 /* harmony import */ var _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(108);
57259 /**
57260  * Until SelectionRange lands in LSP, we'll return Range from server and convert it to
57261  * SelectionRange on client side
57262  */
57263
57264
57265
57266
57267 function getSelectionRanges(document, positions) {
57268     function getSelectionRange(position) {
57269         var applicableRanges = getApplicableRanges(document, position);
57270         var prev = undefined;
57271         var current = undefined;
57272         for (var index = applicableRanges.length - 1; index >= 0; index--) {
57273             var range = applicableRanges[index];
57274             if (!prev || range[0] !== prev[0] || range[1] !== prev[1]) {
57275                 current = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SelectionRange.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(applicableRanges[index][0]), document.positionAt(applicableRanges[index][1])), current);
57276             }
57277             prev = range;
57278         }
57279         if (!current) {
57280             current = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.SelectionRange.create(vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(position, position));
57281         }
57282         return current;
57283     }
57284     return positions.map(getSelectionRange);
57285 }
57286 function getApplicableRanges(document, position) {
57287     var htmlDoc = (0,_parser_htmlParser__WEBPACK_IMPORTED_MODULE_2__.parse)(document.getText());
57288     var currOffset = document.offsetAt(position);
57289     var currNode = htmlDoc.findNodeAt(currOffset);
57290     var result = getAllParentTagRanges(currNode);
57291     // Self-closing or void elements
57292     if (currNode.startTagEnd && !currNode.endTagStart) {
57293         // THe rare case of unmatching tag pairs like <div></div1>
57294         if (currNode.startTagEnd !== currNode.end) {
57295             return [[currNode.start, currNode.end]];
57296         }
57297         var closeRange = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(currNode.startTagEnd - 2), document.positionAt(currNode.startTagEnd));
57298         var closeText = document.getText(closeRange);
57299         // Self-closing element
57300         if (closeText === '/>') {
57301             result.unshift([currNode.start + 1, currNode.startTagEnd - 2]);
57302         }
57303         // Void element
57304         else {
57305             result.unshift([currNode.start + 1, currNode.startTagEnd - 1]);
57306         }
57307         var attributeLevelRanges = getAttributeLevelRanges(document, currNode, currOffset);
57308         result = attributeLevelRanges.concat(result);
57309         return result;
57310     }
57311     if (!currNode.startTagEnd || !currNode.endTagStart) {
57312         return result;
57313     }
57314     /**
57315      * For html like
57316      * `<div class="foo">bar</div>`
57317      */
57318     result.unshift([currNode.start, currNode.end]);
57319     /**
57320      * Cursor inside `<div class="foo">`
57321      */
57322     if (currNode.start < currOffset && currOffset < currNode.startTagEnd) {
57323         result.unshift([currNode.start + 1, currNode.startTagEnd - 1]);
57324         var attributeLevelRanges = getAttributeLevelRanges(document, currNode, currOffset);
57325         result = attributeLevelRanges.concat(result);
57326         return result;
57327     }
57328     /**
57329      * Cursor inside `bar`
57330      */
57331     else if (currNode.startTagEnd <= currOffset && currOffset <= currNode.endTagStart) {
57332         result.unshift([currNode.startTagEnd, currNode.endTagStart]);
57333         return result;
57334     }
57335     /**
57336      * Cursor inside `</div>`
57337      */
57338     else {
57339         // `div` inside `</div>`
57340         if (currOffset >= currNode.endTagStart + 2) {
57341             result.unshift([currNode.endTagStart + 2, currNode.end - 1]);
57342         }
57343         return result;
57344     }
57345 }
57346 function getAllParentTagRanges(initialNode) {
57347     var currNode = initialNode;
57348     var getNodeRanges = function (n) {
57349         if (n.startTagEnd && n.endTagStart && n.startTagEnd < n.endTagStart) {
57350             return [
57351                 [n.startTagEnd, n.endTagStart],
57352                 [n.start, n.end]
57353             ];
57354         }
57355         return [
57356             [n.start, n.end]
57357         ];
57358     };
57359     var result = [];
57360     while (currNode.parent) {
57361         currNode = currNode.parent;
57362         getNodeRanges(currNode).forEach(function (r) { return result.push(r); });
57363     }
57364     return result;
57365 }
57366 function getAttributeLevelRanges(document, currNode, currOffset) {
57367     var currNodeRange = vscode_languageserver_types__WEBPACK_IMPORTED_MODULE_0__.Range.create(document.positionAt(currNode.start), document.positionAt(currNode.end));
57368     var currNodeText = document.getText(currNodeRange);
57369     var relativeOffset = currOffset - currNode.start;
57370     /**
57371      * Tag level semantic selection
57372      */
57373     var scanner = (0,_parser_htmlScanner__WEBPACK_IMPORTED_MODULE_1__.createScanner)(currNodeText);
57374     var token = scanner.scan();
57375     /**
57376      * For text like
57377      * <div class="foo">bar</div>
57378      */
57379     var positionOffset = currNode.start;
57380     var result = [];
57381     var isInsideAttribute = false;
57382     var attrStart = -1;
57383     while (token !== _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TokenType.EOS) {
57384         switch (token) {
57385             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TokenType.AttributeName: {
57386                 if (relativeOffset < scanner.getTokenOffset()) {
57387                     isInsideAttribute = false;
57388                     break;
57389                 }
57390                 if (relativeOffset <= scanner.getTokenEnd()) {
57391                     // `class`
57392                     result.unshift([scanner.getTokenOffset(), scanner.getTokenEnd()]);
57393                 }
57394                 isInsideAttribute = true;
57395                 attrStart = scanner.getTokenOffset();
57396                 break;
57397             }
57398             case _htmlLanguageTypes__WEBPACK_IMPORTED_MODULE_3__.TokenType.AttributeValue: {
57399                 if (!isInsideAttribute) {
57400                     break;
57401                 }
57402                 var valueText = scanner.getTokenText();
57403                 if (relativeOffset < scanner.getTokenOffset()) {
57404                     // `class="foo"`
57405                     result.push([attrStart, scanner.getTokenEnd()]);
57406                     break;
57407                 }
57408                 if (relativeOffset >= scanner.getTokenOffset() && relativeOffset <= scanner.getTokenEnd()) {
57409                     // `"foo"`
57410                     result.unshift([scanner.getTokenOffset(), scanner.getTokenEnd()]);
57411                     // `foo`
57412                     if ((valueText[0] === "\"" && valueText[valueText.length - 1] === "\"") || (valueText[0] === "'" && valueText[valueText.length - 1] === "'")) {
57413                         if (relativeOffset >= scanner.getTokenOffset() + 1 && relativeOffset <= scanner.getTokenEnd() - 1) {
57414                             result.unshift([scanner.getTokenOffset() + 1, scanner.getTokenEnd() - 1]);
57415                         }
57416                     }
57417                     // `class="foo"`
57418                     result.push([attrStart, scanner.getTokenEnd()]);
57419                 }
57420                 break;
57421             }
57422         }
57423         token = scanner.scan();
57424     }
57425     return result.map(function (pair) {
57426         return [pair[0] + positionOffset, pair[1] + positionOffset];
57427     });
57428 }
57429
57430
57431 /***/ }),
57432 /* 131 */
57433 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
57434
57435 __webpack_require__.r(__webpack_exports__);
57436 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
57437 /* harmony export */   "HTMLDataManager": () => /* binding */ HTMLDataManager
57438 /* harmony export */ });
57439 /* harmony import */ var _dataProvider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(116);
57440 /* harmony import */ var _data_webCustomData__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(132);
57441 /*---------------------------------------------------------------------------------------------
57442  *  Copyright (c) Microsoft Corporation. All rights reserved.
57443  *  Licensed under the MIT License. See License.txt in the project root for license information.
57444  *--------------------------------------------------------------------------------------------*/
57445
57446
57447 var HTMLDataManager = /** @class */ (function () {
57448     function HTMLDataManager(options) {
57449         this.dataProviders = [];
57450         this.setDataProviders(options.useDefaultDataProvider !== false, options.customDataProviders || []);
57451     }
57452     HTMLDataManager.prototype.setDataProviders = function (builtIn, providers) {
57453         var _a;
57454         this.dataProviders = [];
57455         if (builtIn) {
57456             this.dataProviders.push(new _dataProvider__WEBPACK_IMPORTED_MODULE_0__.HTMLDataProvider('html5', _data_webCustomData__WEBPACK_IMPORTED_MODULE_1__.htmlData));
57457         }
57458         (_a = this.dataProviders).push.apply(_a, providers);
57459     };
57460     HTMLDataManager.prototype.getDataProviders = function () {
57461         return this.dataProviders;
57462     };
57463     return HTMLDataManager;
57464 }());
57465
57466
57467
57468 /***/ }),
57469 /* 132 */
57470 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
57471
57472 __webpack_require__.r(__webpack_exports__);
57473 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
57474 /* harmony export */   "htmlData": () => /* binding */ htmlData
57475 /* harmony export */ });
57476 /*---------------------------------------------------------------------------------------------
57477  *  Copyright (c) Microsoft Corporation. All rights reserved.
57478  *  Licensed under the MIT License. See License.txt in the project root for license information.
57479  *--------------------------------------------------------------------------------------------*/
57480 // file generated from vscode-web-custom-data NPM package
57481 var htmlData = {
57482     "version": 1.1,
57483     "tags": [
57484         {
57485             "name": "html",
57486             "description": {
57487                 "kind": "markdown",
57488                 "value": "The html element represents the root of an HTML document."
57489             },
57490             "attributes": [
57491                 {
57492                     "name": "manifest",
57493                     "description": {
57494                         "kind": "markdown",
57495                         "value": "Specifies the URI of a resource manifest indicating resources that should be cached locally. See [Using the application cache](https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache) for details."
57496                     }
57497                 },
57498                 {
57499                     "name": "version",
57500                     "description": "Specifies the version of the HTML [Document Type Definition](https://developer.mozilla.org/en-US/docs/Glossary/DTD \"Document Type Definition: In HTML, the doctype is the required \"<!DOCTYPE html>\" preamble found at the top of all documents. Its sole purpose is to prevent a browser from switching into so-called “quirks mode” when rendering a document; that is, the \"<!DOCTYPE html>\" doctype ensures that the browser makes a best-effort attempt at following the relevant specifications, rather than using a different rendering mode that is incompatible with some specifications.\") that governs the current document. This attribute is not needed, because it is redundant with the version information in the document type declaration."
57501                 },
57502                 {
57503                     "name": "xmlns",
57504                     "description": "Specifies the XML Namespace of the document. Default value is `\"http://www.w3.org/1999/xhtml\"`. This is required in documents parsed with XML parsers, and optional in text/html documents."
57505                 }
57506             ],
57507             "references": [
57508                 {
57509                     "name": "MDN Reference",
57510                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/html"
57511                 }
57512             ]
57513         },
57514         {
57515             "name": "head",
57516             "description": {
57517                 "kind": "markdown",
57518                 "value": "The head element represents a collection of metadata for the Document."
57519             },
57520             "attributes": [
57521                 {
57522                     "name": "profile",
57523                     "description": "The URIs of one or more metadata profiles, separated by white space."
57524                 }
57525             ],
57526             "references": [
57527                 {
57528                     "name": "MDN Reference",
57529                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/head"
57530                 }
57531             ]
57532         },
57533         {
57534             "name": "title",
57535             "description": {
57536                 "kind": "markdown",
57537                 "value": "The title element represents the document's title or name. Authors should use titles that identify their documents even when they are used out of context, for example in a user's history or bookmarks, or in search results. The document's title is often different from its first heading, since the first heading does not have to stand alone when taken out of context."
57538             },
57539             "attributes": [],
57540             "references": [
57541                 {
57542                     "name": "MDN Reference",
57543                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/title"
57544                 }
57545             ]
57546         },
57547         {
57548             "name": "base",
57549             "description": {
57550                 "kind": "markdown",
57551                 "value": "The base element allows authors to specify the document base URL for the purposes of resolving relative URLs, and the name of the default browsing context for the purposes of following hyperlinks. The element does not represent any content beyond this information."
57552             },
57553             "attributes": [
57554                 {
57555                     "name": "href",
57556                     "description": {
57557                         "kind": "markdown",
57558                         "value": "The base URL to be used throughout the document for relative URL addresses. If this attribute is specified, this element must come before any other elements with attributes whose values are URLs. Absolute and relative URLs are allowed."
57559                     }
57560                 },
57561                 {
57562                     "name": "target",
57563                     "description": {
57564                         "kind": "markdown",
57565                         "value": "A name or keyword indicating the default location to display the result when hyperlinks or forms cause navigation, for elements that do not have an explicit target reference. It is a name of, or keyword for, a _browsing context_ (for example: tab, window, or inline frame). The following keywords have special meanings:\n\n*   `_self`: Load the result into the same browsing context as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the result into a new unnamed browsing context.\n*   `_parent`: Load the result into the parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: Load the result into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`.\n\nIf this attribute is specified, this element must come before any other elements with attributes whose values are URLs."
57566                     }
57567                 }
57568             ],
57569             "references": [
57570                 {
57571                     "name": "MDN Reference",
57572                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/base"
57573                 }
57574             ]
57575         },
57576         {
57577             "name": "link",
57578             "description": {
57579                 "kind": "markdown",
57580                 "value": "The link element allows authors to link their document to other resources."
57581             },
57582             "attributes": [
57583                 {
57584                     "name": "href",
57585                     "description": {
57586                         "kind": "markdown",
57587                         "value": "This attribute specifies the [URL](https://developer.mozilla.org/en-US/docs/Glossary/URL \"URL: Uniform Resource Locator (URL) is a text string specifying where a resource can be found on the Internet.\") of the linked resource. A URL can be absolute or relative."
57588                     }
57589                 },
57590                 {
57591                     "name": "crossorigin",
57592                     "valueSet": "xo",
57593                     "description": {
57594                         "kind": "markdown",
57595                         "value": "This enumerated attribute indicates whether [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS \"CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.\") must be used when fetching the resource. [CORS-enabled images](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas \"Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.\") element without being _tainted_. The allowed values are:\n\n`anonymous`\n\nA cross-origin request (i.e. with an [`Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin \"The Origin request header indicates where a fetch originates from. It doesn't include any path information, but only the server name. It is sent with CORS requests, as well as with POST requests. It is similar to the Referer header, but, unlike this header, it doesn't disclose the whole path.\") HTTP header) is performed, but no credential is sent (i.e. no cookie, X.509 certificate, or HTTP Basic authentication). If the server does not give credentials to the origin site (by not setting the [`Access-Control-Allow-Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin \"The Access-Control-Allow-Origin response header indicates whether the response can be shared with requesting code from the given origin.\") HTTP header) the image will be tainted and its usage restricted.\n\n`use-credentials`\n\nA cross-origin request (i.e. with an `Origin` HTTP header) is performed along with a credential sent (i.e. a cookie, certificate, and/or HTTP Basic authentication is performed). If the server does not give credentials to the origin site (through [`Access-Control-Allow-Credentials`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials \"The Access-Control-Allow-Credentials response header tells browsers whether to expose the response to frontend JavaScript code when the request's credentials mode (Request.credentials) is \"include\".\") HTTP header), the resource will be _tainted_ and its usage restricted.\n\nIf the attribute is not present, the resource is fetched without a [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS \"CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.\") request (i.e. without sending the `Origin` HTTP header), preventing its non-tainted usage. If invalid, it is handled as if the enumerated keyword **anonymous** was used. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for additional information."
57596                     }
57597                 },
57598                 {
57599                     "name": "rel",
57600                     "description": {
57601                         "kind": "markdown",
57602                         "value": "This attribute names a relationship of the linked document to the current document. The attribute must be a space-separated list of the [link types values](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)."
57603                     }
57604                 },
57605                 {
57606                     "name": "media",
57607                     "description": {
57608                         "kind": "markdown",
57609                         "value": "This attribute specifies the media that the linked resource applies to. Its value must be a media type / [media query](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries). This attribute is mainly useful when linking to external stylesheets — it allows the user agent to pick the best adapted one for the device it runs on.\n\n**Notes:**\n\n*   In HTML 4, this can only be a simple white-space-separated list of media description literals, i.e., [media types and groups](https://developer.mozilla.org/en-US/docs/Web/CSS/@media), where defined and allowed as values for this attribute, such as `print`, `screen`, `aural`, `braille`. HTML5 extended this to any kind of [media queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries), which are a superset of the allowed values of HTML 4.\n*   Browsers not supporting [CSS3 Media Queries](https://developer.mozilla.org/en-US/docs/Web/CSS/Media_queries) won't necessarily recognize the adequate link; do not forget to set fallback links, the restricted set of media queries defined in HTML 4."
57610                     }
57611                 },
57612                 {
57613                     "name": "hreflang",
57614                     "description": {
57615                         "kind": "markdown",
57616                         "value": "This attribute indicates the language of the linked resource. It is purely advisory. Allowed values are determined by [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt). Use this attribute only if the [`href`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-href) attribute is present."
57617                     }
57618                 },
57619                 {
57620                     "name": "type",
57621                     "description": {
57622                         "kind": "markdown",
57623                         "value": "This attribute is used to define the type of the content linked to. The value of the attribute should be a MIME type such as **text/html**, **text/css**, and so on. The common use of this attribute is to define the type of stylesheet being referenced (such as **text/css**), but given that CSS is the only stylesheet language used on the web, not only is it possible to omit the `type` attribute, but is actually now recommended practice. It is also used on `rel=\"preload\"` link types, to make sure the browser only downloads file types that it supports."
57624                     }
57625                 },
57626                 {
57627                     "name": "sizes",
57628                     "description": {
57629                         "kind": "markdown",
57630                         "value": "This attribute defines the sizes of the icons for visual media contained in the resource. It must be present only if the [`rel`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link#attr-rel) contains a value of `icon` or a non-standard type such as Apple's `apple-touch-icon`. It may have the following values:\n\n*   `any`, meaning that the icon can be scaled to any size as it is in a vector format, like `image/svg+xml`.\n*   a white-space separated list of sizes, each in the format `_<width in pixels>_x_<height in pixels>_` or `_<width in pixels>_X_<height in pixels>_`. Each of these sizes must be contained in the resource.\n\n**Note:** Most icon formats are only able to store one single icon; therefore most of the time the [`sizes`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-sizes) contains only one entry. MS's ICO format does, as well as Apple's ICNS. ICO is more ubiquitous; you should definitely use it."
57631                     }
57632                 },
57633                 {
57634                     "name": "as",
57635                     "description": "This attribute is only used when `rel=\"preload\"` or `rel=\"prefetch\"` has been set on the `<link>` element. It specifies the type of content being loaded by the `<link>`, which is necessary for content prioritization, request matching, application of correct [content security policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP), and setting of correct [`Accept`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept \"The Accept request HTTP header advertises which content types, expressed as MIME types, the client is able to understand. Using content negotiation, the server then selects one of the proposals, uses it and informs the client of its choice with the Content-Type response header. Browsers set adequate values for this header depending on the context where the request is done: when fetching a CSS stylesheet a different value is set for the request than when fetching an image, video or a script.\") request header."
57636                 },
57637                 {
57638                     "name": "importance",
57639                     "description": "Indicates the relative importance of the resource. Priority hints are delegated using the values:"
57640                 },
57641                 {
57642                     "name": "importance",
57643                     "description": "**`auto`**: Indicates **no preference**. The browser may use its own heuristics to decide the priority of the resource.\n\n**`high`**: Indicates to the browser that the resource is of **high** priority.\n\n**`low`**: Indicates to the browser that the resource is of **low** priority.\n\n**Note:** The `importance` attribute may only be used for the `<link>` element if `rel=\"preload\"` or `rel=\"prefetch\"` is present."
57644                 },
57645                 {
57646                     "name": "integrity",
57647                     "description": "Contains inline metadata — a base64-encoded cryptographic hash of the resource (file) you’re telling the browser to fetch. The browser can use this to verify that the fetched resource has been delivered free of unexpected manipulation. See [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)."
57648                 },
57649                 {
57650                     "name": "referrerpolicy",
57651                     "description": "A string indicating which referrer to use when fetching the resource:\n\n*   `no-referrer` means that the [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent.\n*   `no-referrer-when-downgrade` means that no [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will be sent when navigating to an origin without TLS (HTTPS). This is a user agent’s default behavior, if no policy is otherwise specified.\n*   `origin` means that the referrer will be the origin of the page, which is roughly the scheme, the host, and the port.\n*   `origin-when-cross-origin` means that navigating to other origins will be limited to the scheme, the host, and the port, while navigating on the same origin will include the referrer's path.\n*   `unsafe-url` means that the referrer will include the origin and the path (but not the fragment, password, or username). This case is unsafe because it can leak origins and paths from TLS-protected resources to insecure origins."
57652                 },
57653                 {
57654                     "name": "title",
57655                     "description": "The `title` attribute has special semantics on the `<link>` element. When used on a `<link rel=\"stylesheet\">` it defines a [preferred or an alternate stylesheet](https://developer.mozilla.org/en-US/docs/Web/CSS/Alternative_style_sheets). Incorrectly using it may [cause the stylesheet to be ignored](https://developer.mozilla.org/en-US/docs/Correctly_Using_Titles_With_External_Stylesheets)."
57656                 }
57657             ],
57658             "references": [
57659                 {
57660                     "name": "MDN Reference",
57661                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/link"
57662                 }
57663             ]
57664         },
57665         {
57666             "name": "meta",
57667             "description": {
57668                 "kind": "markdown",
57669                 "value": "The meta element represents various kinds of metadata that cannot be expressed using the title, base, link, style, and script elements."
57670             },
57671             "attributes": [
57672                 {
57673                     "name": "name",
57674                     "description": {
57675                         "kind": "markdown",
57676                         "value": "This attribute defines the name of a piece of document-level metadata. It should not be set if one of the attributes [`itemprop`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-itemprop), [`http-equiv`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv) or [`charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) is also set.\n\nThis metadata name is associated with the value contained by the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute. The possible values for the name attribute are:\n\n*   `application-name` which defines the name of the application running in the web page.\n    \n    **Note:**\n    \n    *   Browsers may use this to identify the application. It is different from the [`<title>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/title \"The HTML Title element (<title>) defines the document's title that is shown in a browser's title bar or a page's tab.\") element, which usually contain the application name, but may also contain information like the document name or a status.\n    *   Simple web pages shouldn't define an application-name.\n    \n*   `author` which defines the name of the document's author.\n*   `description` which contains a short and accurate summary of the content of the page. Several browsers, like Firefox and Opera, use this as the default description of bookmarked pages.\n*   `generator` which contains the identifier of the software that generated the page.\n*   `keywords` which contains words relevant to the page's content separated by commas.\n*   `referrer` which controls the [`Referer` HTTP header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) attached to requests sent from the document:\n    \n    Values for the `content` attribute of `<meta name=\"referrer\">`\n    \n    `no-referrer`\n    \n    Do not send a HTTP `Referrer` header.\n    \n    `origin`\n    \n    Send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) of the document.\n    \n    `no-referrer-when-downgrade`\n    \n    Send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) as a referrer to URLs as secure as the current page, (https→https), but does not send a referrer to less secure URLs (https→http). This is the default behaviour.\n    \n    `origin-when-cross-origin`\n    \n    Send the full URL (stripped of parameters) for same-origin requests, but only send the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) for other cases.\n    \n    `same-origin`\n    \n    A referrer will be sent for [same-site origins](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy), but cross-origin requests will contain no referrer information.\n    \n    `strict-origin`\n    \n    Only send the origin of the document as the referrer to a-priori as-much-secure destination (HTTPS->HTTPS), but don't send it to a less secure destination (HTTPS->HTTP).\n    \n    `strict-origin-when-cross-origin`\n    \n    Send a full URL when performing a same-origin request, only send the origin of the document to a-priori as-much-secure destination (HTTPS->HTTPS), and send no header to a less secure destination (HTTPS->HTTP).\n    \n    `unsafe-URL`\n    \n    Send the full URL (stripped of parameters) for same-origin or cross-origin requests.\n    \n    **Notes:**\n    \n    *   Some browsers support the deprecated values of `always`, `default`, and `never` for referrer.\n    *   Dynamically inserting `<meta name=\"referrer\">` (with [`document.write`](https://developer.mozilla.org/en-US/docs/Web/API/Document/write) or [`appendChild`](https://developer.mozilla.org/en-US/docs/Web/API/Node/appendChild)) makes the referrer behaviour unpredictable.\n    *   When several conflicting policies are defined, the no-referrer policy is applied.\n    \n\nThis attribute may also have a value taken from the extended list defined on [WHATWG Wiki MetaExtensions page](https://wiki.whatwg.org/wiki/MetaExtensions). Although none have been formally accepted yet, a few commonly used names are:\n\n*   `creator` which defines the name of the creator of the document, such as an organization or institution. If there are more than one, several [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") elements should be used.\n*   `googlebot`, a synonym of `robots`, is only followed by Googlebot (the indexing crawler for Google).\n*   `publisher` which defines the name of the document's publisher.\n*   `robots` which defines the behaviour that cooperative crawlers, or \"robots\", should use with the page. It is a comma-separated list of the values below:\n    \n    Values for the content of `<meta name=\"robots\">`\n    \n    Value\n    \n    Description\n    \n    Used by\n    \n    `index`\n    \n    Allows the robot to index the page (default).\n    \n    All\n    \n    `noindex`\n    \n    Requests the robot to not index the page.\n    \n    All\n    \n    `follow`\n    \n    Allows the robot to follow the links on the page (default).\n    \n    All\n    \n    `nofollow`\n    \n    Requests the robot to not follow the links on the page.\n    \n    All\n    \n    `none`\n    \n    Equivalent to `noindex, nofollow`\n    \n    [Google](https://support.google.com/webmasters/answer/79812)\n    \n    `noodp`\n    \n    Prevents using the [Open Directory Project](https://www.dmoz.org/) description, if any, as the page description in search engine results.\n    \n    [Google](https://support.google.com/webmasters/answer/35624#nodmoz), [Yahoo](https://help.yahoo.com/kb/search-for-desktop/meta-tags-robotstxt-yahoo-search-sln2213.html#cont5), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)\n    \n    `noarchive`\n    \n    Requests the search engine not to cache the page content.\n    \n    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives), [Yahoo](https://help.yahoo.com/kb/search-for-desktop/SLN2213.html), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)\n    \n    `nosnippet`\n    \n    Prevents displaying any description of the page in search engine results.\n    \n    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives), [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)\n    \n    `noimageindex`\n    \n    Requests this page not to appear as the referring page of an indexed image.\n    \n    [Google](https://developers.google.com/webmasters/control-crawl-index/docs/robots_meta_tag#valid-indexing--serving-directives)\n    \n    `nocache`\n    \n    Synonym of `noarchive`.\n    \n    [Bing](https://www.bing.com/webmaster/help/which-robots-metatags-does-bing-support-5198d240)\n    \n    **Notes:**\n    \n    *   Only cooperative robots follow these rules. Do not expect to prevent e-mail harvesters with them.\n    *   The robot still needs to access the page in order to read these rules. To prevent bandwidth consumption, use a _[robots.txt](https://developer.mozilla.org/en-US/docs/Glossary/robots.txt \"robots.txt: Robots.txt is a file which is usually placed in the root of any website. It decides whether crawlers are permitted or forbidden access to the web site.\")_ file.\n    *   If you want to remove a page, `noindex` will work, but only after the robot visits the page again. Ensure that the `robots.txt` file is not preventing revisits.\n    *   Some values are mutually exclusive, like `index` and `noindex`, or `follow` and `nofollow`. In these cases the robot's behaviour is undefined and may vary between them.\n    *   Some crawler robots, like Google, Yahoo and Bing, support the same values for the HTTP header `X-Robots-Tag`; this allows non-HTML documents like images to use these rules.\n    \n*   `slurp`, is a synonym of `robots`, but only for Slurp - the crawler for Yahoo Search.\n*   `viewport`, which gives hints about the size of the initial size of the [viewport](https://developer.mozilla.org/en-US/docs/Glossary/viewport \"viewport: A viewport represents a polygonal (normally rectangular) area in computer graphics that is currently being viewed. In web browser terms, it refers to the part of the document you're viewing which is currently visible in its window (or the screen, if the document is being viewed in full screen mode). Content outside the viewport is not visible onscreen until scrolled into view.\"). Used by mobile devices only.\n    \n    Values for the content of `<meta name=\"viewport\">`\n    \n    Value\n    \n    Possible subvalues\n    \n    Description\n    \n    `width`\n    \n    A positive integer number, or the text `device-width`\n    \n    Defines the pixel width of the viewport that you want the web site to be rendered at.\n    \n    `height`\n    \n    A positive integer, or the text `device-height`\n    \n    Defines the height of the viewport. Not used by any browser.\n    \n    `initial-scale`\n    \n    A positive number between `0.0` and `10.0`\n    \n    Defines the ratio between the device width (`device-width` in portrait mode or `device-height` in landscape mode) and the viewport size.\n    \n    `maximum-scale`\n    \n    A positive number between `0.0` and `10.0`\n    \n    Defines the maximum amount to zoom in. It must be greater or equal to the `minimum-scale` or the behaviour is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.\n    \n    `minimum-scale`\n    \n    A positive number between `0.0` and `10.0`\n    \n    Defines the minimum zoom level. It must be smaller or equal to the `maximum-scale` or the behaviour is undefined. Browser settings can ignore this rule and iOS10+ ignores it by default.\n    \n    `user-scalable`\n    \n    `yes` or `no`\n    \n    If set to `no`, the user is not able to zoom in the webpage. The default is `yes`. Browser settings can ignore this rule, and iOS10+ ignores it by default.\n    \n    Specification\n    \n    Status\n    \n    Comment\n    \n    [CSS Device Adaptation  \n    The definition of '<meta name=\"viewport\">' in that specification.](https://drafts.csswg.org/css-device-adapt/#viewport-meta)\n    \n    Working Draft\n    \n    Non-normatively describes the Viewport META element\n    \n    See also: [`@viewport`](https://developer.mozilla.org/en-US/docs/Web/CSS/@viewport \"The @viewport CSS at-rule lets you configure the viewport through which the document is viewed. It's primarily used for mobile devices, but is also used by desktop browsers that support features like \"snap to edge\" (such as Microsoft Edge).\")\n    \n    **Notes:**\n    \n    *   Though unstandardized, this declaration is respected by most mobile browsers due to de-facto dominance.\n    *   The default values may vary between devices and browsers.\n    *   To learn about this declaration in Firefox for Mobile, see [this article](https://developer.mozilla.org/en-US/docs/Mobile/Viewport_meta_tag \"Mobile/Viewport meta tag\")."
57677                     }
57678                 },
57679                 {
57680                     "name": "http-equiv",
57681                     "description": {
57682                         "kind": "markdown",
57683                         "value": "Defines a pragma directive. The attribute is named `**http-equiv**(alent)` because all the allowed values are names of particular HTTP headers:\n\n*   `\"content-language\"`  \n    Defines the default language of the page. It can be overridden by the [lang](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang) attribute on any element.\n    \n    **Warning:** Do not use this value, as it is obsolete. Prefer the `lang` attribute on the [`<html>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/html \"The HTML <html> element represents the root (top-level element) of an HTML document, so it is also referred to as the root element. All other elements must be descendants of this element.\") element.\n    \n*   `\"content-security-policy\"`  \n    Allows page authors to define a [content policy](https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives) for the current page. Content policies mostly specify allowed server origins and script endpoints which help guard against cross-site scripting attacks.\n*   `\"content-type\"`  \n    Defines the [MIME type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type) of the document, followed by its character encoding. It follows the same syntax as the HTTP `content-type` entity-header field, but as it is inside a HTML page, most values other than `text/html` are impossible. Therefore the valid syntax for its `content` is the string '`text/html`' followed by a character set with the following syntax: '`; charset=_IANAcharset_`', where `IANAcharset` is the _preferred MIME name_ for a character set as [defined by the IANA.](https://www.iana.org/assignments/character-sets)\n    \n    **Warning:** Do not use this value, as it is obsolete. Use the [`charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) attribute on the [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") element.\n    \n    **Note:** As [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") can't change documents' types in XHTML or HTML5's XHTML serialization, never set the MIME type to an XHTML MIME type with `<meta>`.\n    \n*   `\"refresh\"`  \n    This instruction specifies:\n    *   The number of seconds until the page should be reloaded - only if the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute contains a positive integer.\n    *   The number of seconds until the page should redirect to another - only if the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) attribute contains a positive integer followed by the string '`;url=`', and a valid URL.\n*   `\"set-cookie\"`  \n    Defines a [cookie](https://developer.mozilla.org/en-US/docs/cookie) for the page. Its content must follow the syntax defined in the [IETF HTTP Cookie Specification](https://tools.ietf.org/html/draft-ietf-httpstate-cookie-14).\n    \n    **Warning:** Do not use this instruction, as it is obsolete. Use the HTTP header [`Set-Cookie`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie) instead."
57684                     }
57685                 },
57686                 {
57687                     "name": "content",
57688                     "description": {
57689                         "kind": "markdown",
57690                         "value": "This attribute contains the value for the [`http-equiv`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-http-equiv) or [`name`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-name) attribute, depending on which is used."
57691                     }
57692                 },
57693                 {
57694                     "name": "charset",
57695                     "description": {
57696                         "kind": "markdown",
57697                         "value": "This attribute declares the page's character encoding. It must contain a [standard IANA MIME name for character encodings](https://www.iana.org/assignments/character-sets). Although the standard doesn't request a specific encoding, it suggests:\n\n*   Authors are encouraged to use [`UTF-8`](https://developer.mozilla.org/en-US/docs/Glossary/UTF-8).\n*   Authors should not use ASCII-incompatible encodings to avoid security risk: browsers not supporting them may interpret harmful content as HTML. This happens with the `JIS_C6226-1983`, `JIS_X0212-1990`, `HZ-GB-2312`, `JOHAB`, the ISO-2022 family and the EBCDIC family.\n\n**Note:** ASCII-incompatible encodings are those that don't map the 8-bit code points `0x20` to `0x7E` to the `0x0020` to `0x007E` Unicode code points)\n\n*   Authors **must not** use `CESU-8`, `UTF-7`, `BOCU-1` and/or `SCSU` as [cross-site scripting](https://developer.mozilla.org/en-US/docs/Glossary/Cross-site_scripting) attacks with these encodings have been demonstrated.\n*   Authors should not use `UTF-32` because not all HTML5 encoding algorithms can distinguish it from `UTF-16`.\n\n**Notes:**\n\n*   The declared character encoding must match the one the page was saved with to avoid garbled characters and security holes.\n*   The [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") element declaring the encoding must be inside the [`<head>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head \"The HTML <head> element provides general information (metadata) about the document, including its title and links to its scripts and style sheets.\") element and **within the first 1024 bytes** of the HTML as some browsers only look at those bytes before choosing an encoding.\n*   This [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") element is only one part of the [algorithm to determine a page's character set](https://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#encoding-sniffing-algorithm \"Algorithm charset page\"). The [`Content-Type` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) and any [Byte-Order Marks](https://developer.mozilla.org/en-US/docs/Glossary/Byte-Order_Mark \"The definition of that term (Byte-Order Marks) has not been written yet; please consider contributing it!\") override this element.\n*   It is strongly recommended to define the character encoding. If a page's encoding is undefined, cross-scripting techniques are possible, such as the [`UTF-7` fallback cross-scripting technique](https://code.google.com/p/doctype-mirror/wiki/ArticleUtf7).\n*   The [`<meta>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta \"The HTML <meta> element represents metadata that cannot be represented by other HTML meta-related elements, like <base>, <link>, <script>, <style> or <title>.\") element with a `charset` attribute is a synonym for the pre-HTML5 `<meta http-equiv=\"Content-Type\" content=\"text/html; charset=_IANAcharset_\">`, where _`IANAcharset`_ contains the value of the equivalent [`charset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-charset) attribute. This syntax is still allowed, although no longer recommended."
57698                     }
57699                 },
57700                 {
57701                     "name": "scheme",
57702                     "description": "This attribute defines the scheme in which metadata is described. A scheme is a context leading to the correct interpretations of the [`content`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta#attr-content) value, like a format.\n\n**Warning:** Do not use this value, as it is obsolete. There is no replacement as there was no real usage for it."
57703                 }
57704             ],
57705             "references": [
57706                 {
57707                     "name": "MDN Reference",
57708                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/meta"
57709                 }
57710             ]
57711         },
57712         {
57713             "name": "style",
57714             "description": {
57715                 "kind": "markdown",
57716                 "value": "The style element allows authors to embed style information in their documents. The style element is one of several inputs to the styling processing model. The element does not represent content for the user."
57717             },
57718             "attributes": [
57719                 {
57720                     "name": "media",
57721                     "description": {
57722                         "kind": "markdown",
57723                         "value": "This attribute defines which media the style should be applied to. Its value is a [media query](https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries), which defaults to `all` if the attribute is missing."
57724                     }
57725                 },
57726                 {
57727                     "name": "nonce",
57728                     "description": {
57729                         "kind": "markdown",
57730                         "value": "A cryptographic nonce (number used once) used to whitelist inline styles in a [style-src Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/style-src). The server must generate a unique nonce value each time it transmits a policy. It is critical to provide a nonce that cannot be guessed as bypassing a resource’s policy is otherwise trivial."
57731                     }
57732                 },
57733                 {
57734                     "name": "type",
57735                     "description": {
57736                         "kind": "markdown",
57737                         "value": "This attribute defines the styling language as a MIME type (charset should not be specified). This attribute is optional and defaults to `text/css` if it is not specified — there is very little reason to include this in modern web documents."
57738                     }
57739                 },
57740                 {
57741                     "name": "scoped",
57742                     "valueSet": "v"
57743                 },
57744                 {
57745                     "name": "title",
57746                     "description": "This attribute specifies [alternative style sheet](https://developer.mozilla.org/en-US/docs/Web/CSS/Alternative_style_sheets) sets."
57747                 }
57748             ],
57749             "references": [
57750                 {
57751                     "name": "MDN Reference",
57752                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/style"
57753                 }
57754             ]
57755         },
57756         {
57757             "name": "body",
57758             "description": {
57759                 "kind": "markdown",
57760                 "value": "The body element represents the content of the document."
57761             },
57762             "attributes": [
57763                 {
57764                     "name": "onafterprint",
57765                     "description": {
57766                         "kind": "markdown",
57767                         "value": "Function to call after the user has printed the document."
57768                     }
57769                 },
57770                 {
57771                     "name": "onbeforeprint",
57772                     "description": {
57773                         "kind": "markdown",
57774                         "value": "Function to call when the user requests printing of the document."
57775                     }
57776                 },
57777                 {
57778                     "name": "onbeforeunload",
57779                     "description": {
57780                         "kind": "markdown",
57781                         "value": "Function to call when the document is about to be unloaded."
57782                     }
57783                 },
57784                 {
57785                     "name": "onhashchange",
57786                     "description": {
57787                         "kind": "markdown",
57788                         "value": "Function to call when the fragment identifier part (starting with the hash (`'#'`) character) of the document's current address has changed."
57789                     }
57790                 },
57791                 {
57792                     "name": "onlanguagechange",
57793                     "description": {
57794                         "kind": "markdown",
57795                         "value": "Function to call when the preferred languages changed."
57796                     }
57797                 },
57798                 {
57799                     "name": "onmessage",
57800                     "description": {
57801                         "kind": "markdown",
57802                         "value": "Function to call when the document has received a message."
57803                     }
57804                 },
57805                 {
57806                     "name": "onoffline",
57807                     "description": {
57808                         "kind": "markdown",
57809                         "value": "Function to call when network communication has failed."
57810                     }
57811                 },
57812                 {
57813                     "name": "ononline",
57814                     "description": {
57815                         "kind": "markdown",
57816                         "value": "Function to call when network communication has been restored."
57817                     }
57818                 },
57819                 {
57820                     "name": "onpagehide"
57821                 },
57822                 {
57823                     "name": "onpageshow"
57824                 },
57825                 {
57826                     "name": "onpopstate",
57827                     "description": {
57828                         "kind": "markdown",
57829                         "value": "Function to call when the user has navigated session history."
57830                     }
57831                 },
57832                 {
57833                     "name": "onstorage",
57834                     "description": {
57835                         "kind": "markdown",
57836                         "value": "Function to call when the storage area has changed."
57837                     }
57838                 },
57839                 {
57840                     "name": "onunload",
57841                     "description": {
57842                         "kind": "markdown",
57843                         "value": "Function to call when the document is going away."
57844                     }
57845                 },
57846                 {
57847                     "name": "alink",
57848                     "description": "Color of text for hyperlinks when selected. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color \"The color CSS property sets the foreground color value of an element's text and text decorations, and sets the currentcolor value.\") property in conjunction with the [`:active`](https://developer.mozilla.org/en-US/docs/Web/CSS/:active \"The :active CSS pseudo-class represents an element (such as a button) that is being activated by the user.\") pseudo-class instead._"
57849                 },
57850                 {
57851                     "name": "background",
57852                     "description": "URI of a image to use as a background. _This method is non-conforming, use CSS [`background`](https://developer.mozilla.org/en-US/docs/Web/CSS/background \"The background shorthand CSS property sets all background style properties at once, such as color, image, origin and size, or repeat method.\") property on the element instead._"
57853                 },
57854                 {
57855                     "name": "bgcolor",
57856                     "description": "Background color for the document. _This method is non-conforming, use CSS [`background-color`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color \"The background-color CSS property sets the background color of an element.\") property on the element instead._"
57857                 },
57858                 {
57859                     "name": "bottommargin",
57860                     "description": "The margin of the bottom of the body. _This method is non-conforming, use CSS [`margin-bottom`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-bottom \"The margin-bottom CSS property sets the margin area on the bottom of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") property on the element instead._"
57861                 },
57862                 {
57863                     "name": "leftmargin",
57864                     "description": "The margin of the left of the body. _This method is non-conforming, use CSS [`margin-left`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left \"The margin-left CSS property sets the margin area on the left side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") property on the element instead._"
57865                 },
57866                 {
57867                     "name": "link",
57868                     "description": "Color of text for unvisited hypertext links. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color \"The color CSS property sets the foreground color value of an element's text and text decorations, and sets the currentcolor value.\") property in conjunction with the [`:link`](https://developer.mozilla.org/en-US/docs/Web/CSS/:link \"The :link CSS pseudo-class represents an element that has not yet been visited. It matches every unvisited <a>, <area>, or <link> element that has an href attribute.\") pseudo-class instead._"
57869                 },
57870                 {
57871                     "name": "onblur",
57872                     "description": "Function to call when the document loses focus."
57873                 },
57874                 {
57875                     "name": "onerror",
57876                     "description": "Function to call when the document fails to load properly."
57877                 },
57878                 {
57879                     "name": "onfocus",
57880                     "description": "Function to call when the document receives focus."
57881                 },
57882                 {
57883                     "name": "onload",
57884                     "description": "Function to call when the document has finished loading."
57885                 },
57886                 {
57887                     "name": "onredo",
57888                     "description": "Function to call when the user has moved forward in undo transaction history."
57889                 },
57890                 {
57891                     "name": "onresize",
57892                     "description": "Function to call when the document has been resized."
57893                 },
57894                 {
57895                     "name": "onundo",
57896                     "description": "Function to call when the user has moved backward in undo transaction history."
57897                 },
57898                 {
57899                     "name": "rightmargin",
57900                     "description": "The margin of the right of the body. _This method is non-conforming, use CSS [`margin-right`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right \"The margin-right CSS property sets the margin area on the right side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") property on the element instead._"
57901                 },
57902                 {
57903                     "name": "text",
57904                     "description": "Foreground color of text. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color \"The color CSS property sets the foreground color value of an element's text and text decorations, and sets the currentcolor value.\") property on the element instead._"
57905                 },
57906                 {
57907                     "name": "topmargin",
57908                     "description": "The margin of the top of the body. _This method is non-conforming, use CSS [`margin-top`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-top \"The margin-top CSS property sets the margin area on the top of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") property on the element instead._"
57909                 },
57910                 {
57911                     "name": "vlink",
57912                     "description": "Color of text for visited hypertext links. _This method is non-conforming, use CSS [`color`](https://developer.mozilla.org/en-US/docs/Web/CSS/color \"The color CSS property sets the foreground color value of an element's text and text decorations, and sets the currentcolor value.\") property in conjunction with the [`:visited`](https://developer.mozilla.org/en-US/docs/Web/CSS/:visited \"The :visited CSS pseudo-class represents links that the user has already visited. For privacy reasons, the styles that can be modified using this selector are very limited.\") pseudo-class instead._"
57913                 }
57914             ],
57915             "references": [
57916                 {
57917                     "name": "MDN Reference",
57918                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/body"
57919                 }
57920             ]
57921         },
57922         {
57923             "name": "article",
57924             "description": {
57925                 "kind": "markdown",
57926                 "value": "The article element represents a complete, or self-contained, composition in a document, page, application, or site and that is, in principle, independently distributable or reusable, e.g. in syndication. This could be a forum post, a magazine or newspaper article, a blog entry, a user-submitted comment, an interactive widget or gadget, or any other independent item of content. Each article should be identified, typically by including a heading (h1–h6 element) as a child of the article element."
57927             },
57928             "attributes": [],
57929             "references": [
57930                 {
57931                     "name": "MDN Reference",
57932                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/article"
57933                 }
57934             ]
57935         },
57936         {
57937             "name": "section",
57938             "description": {
57939                 "kind": "markdown",
57940                 "value": "The section element represents a generic section of a document or application. A section, in this context, is a thematic grouping of content. Each section should be identified, typically by including a heading ( h1- h6 element) as a child of the section element."
57941             },
57942             "attributes": [],
57943             "references": [
57944                 {
57945                     "name": "MDN Reference",
57946                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/section"
57947                 }
57948             ]
57949         },
57950         {
57951             "name": "nav",
57952             "description": {
57953                 "kind": "markdown",
57954                 "value": "The nav element represents a section of a page that links to other pages or to parts within the page: a section with navigation links."
57955             },
57956             "attributes": [],
57957             "references": [
57958                 {
57959                     "name": "MDN Reference",
57960                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/nav"
57961                 }
57962             ]
57963         },
57964         {
57965             "name": "aside",
57966             "description": {
57967                 "kind": "markdown",
57968                 "value": "The aside element represents a section of a page that consists of content that is tangentially related to the content around the aside element, and which could be considered separate from that content. Such sections are often represented as sidebars in printed typography."
57969             },
57970             "attributes": [],
57971             "references": [
57972                 {
57973                     "name": "MDN Reference",
57974                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/aside"
57975                 }
57976             ]
57977         },
57978         {
57979             "name": "h1",
57980             "description": {
57981                 "kind": "markdown",
57982                 "value": "The h1 element represents a section heading."
57983             },
57984             "attributes": [],
57985             "references": [
57986                 {
57987                     "name": "MDN Reference",
57988                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
57989                 }
57990             ]
57991         },
57992         {
57993             "name": "h2",
57994             "description": {
57995                 "kind": "markdown",
57996                 "value": "The h2 element represents a section heading."
57997             },
57998             "attributes": [],
57999             "references": [
58000                 {
58001                     "name": "MDN Reference",
58002                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
58003                 }
58004             ]
58005         },
58006         {
58007             "name": "h3",
58008             "description": {
58009                 "kind": "markdown",
58010                 "value": "The h3 element represents a section heading."
58011             },
58012             "attributes": [],
58013             "references": [
58014                 {
58015                     "name": "MDN Reference",
58016                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
58017                 }
58018             ]
58019         },
58020         {
58021             "name": "h4",
58022             "description": {
58023                 "kind": "markdown",
58024                 "value": "The h4 element represents a section heading."
58025             },
58026             "attributes": [],
58027             "references": [
58028                 {
58029                     "name": "MDN Reference",
58030                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
58031                 }
58032             ]
58033         },
58034         {
58035             "name": "h5",
58036             "description": {
58037                 "kind": "markdown",
58038                 "value": "The h5 element represents a section heading."
58039             },
58040             "attributes": [],
58041             "references": [
58042                 {
58043                     "name": "MDN Reference",
58044                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
58045                 }
58046             ]
58047         },
58048         {
58049             "name": "h6",
58050             "description": {
58051                 "kind": "markdown",
58052                 "value": "The h6 element represents a section heading."
58053             },
58054             "attributes": [],
58055             "references": [
58056                 {
58057                     "name": "MDN Reference",
58058                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/Heading_Elements"
58059                 }
58060             ]
58061         },
58062         {
58063             "name": "header",
58064             "description": {
58065                 "kind": "markdown",
58066                 "value": "The header element represents introductory content for its nearest ancestor sectioning content or sectioning root element. A header typically contains a group of introductory or navigational aids. When the nearest ancestor sectioning content or sectioning root element is the body element, then it applies to the whole page."
58067             },
58068             "attributes": [],
58069             "references": [
58070                 {
58071                     "name": "MDN Reference",
58072                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/header"
58073                 }
58074             ]
58075         },
58076         {
58077             "name": "footer",
58078             "description": {
58079                 "kind": "markdown",
58080                 "value": "The footer element represents a footer for its nearest ancestor sectioning content or sectioning root element. A footer typically contains information about its section such as who wrote it, links to related documents, copyright data, and the like."
58081             },
58082             "attributes": [],
58083             "references": [
58084                 {
58085                     "name": "MDN Reference",
58086                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/footer"
58087                 }
58088             ]
58089         },
58090         {
58091             "name": "address",
58092             "description": {
58093                 "kind": "markdown",
58094                 "value": "The address element represents the contact information for its nearest article or body element ancestor. If that is the body element, then the contact information applies to the document as a whole."
58095             },
58096             "attributes": [],
58097             "references": [
58098                 {
58099                     "name": "MDN Reference",
58100                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/address"
58101                 }
58102             ]
58103         },
58104         {
58105             "name": "p",
58106             "description": {
58107                 "kind": "markdown",
58108                 "value": "The p element represents a paragraph."
58109             },
58110             "attributes": [],
58111             "references": [
58112                 {
58113                     "name": "MDN Reference",
58114                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/p"
58115                 }
58116             ]
58117         },
58118         {
58119             "name": "hr",
58120             "description": {
58121                 "kind": "markdown",
58122                 "value": "The hr element represents a paragraph-level thematic break, e.g. a scene change in a story, or a transition to another topic within a section of a reference book."
58123             },
58124             "attributes": [
58125                 {
58126                     "name": "align",
58127                     "description": "Sets the alignment of the rule on the page. If no value is specified, the default value is `left`."
58128                 },
58129                 {
58130                     "name": "color",
58131                     "description": "Sets the color of the rule through color name or hexadecimal value."
58132                 },
58133                 {
58134                     "name": "noshade",
58135                     "description": "Sets the rule to have no shading."
58136                 },
58137                 {
58138                     "name": "size",
58139                     "description": "Sets the height, in pixels, of the rule."
58140                 },
58141                 {
58142                     "name": "width",
58143                     "description": "Sets the length of the rule on the page through a pixel or percentage value."
58144                 }
58145             ],
58146             "references": [
58147                 {
58148                     "name": "MDN Reference",
58149                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/hr"
58150                 }
58151             ]
58152         },
58153         {
58154             "name": "pre",
58155             "description": {
58156                 "kind": "markdown",
58157                 "value": "The pre element represents a block of preformatted text, in which structure is represented by typographic conventions rather than by elements."
58158             },
58159             "attributes": [
58160                 {
58161                     "name": "cols",
58162                     "description": "Contains the _preferred_ count of characters that a line should have. It was a non-standard synonym of [`width`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/pre#attr-width). To achieve such an effect, use CSS [`width`](https://developer.mozilla.org/en-US/docs/Web/CSS/width \"The width CSS property sets an element's width. By default it sets the width of the content area, but if box-sizing is set to border-box, it sets the width of the border area.\") instead."
58163                 },
58164                 {
58165                     "name": "width",
58166                     "description": "Contains the _preferred_ count of characters that a line should have. Though technically still implemented, this attribute has no visual effect; to achieve such an effect, use CSS [`width`](https://developer.mozilla.org/en-US/docs/Web/CSS/width \"The width CSS property sets an element's width. By default it sets the width of the content area, but if box-sizing is set to border-box, it sets the width of the border area.\") instead."
58167                 },
58168                 {
58169                     "name": "wrap",
58170                     "description": "Is a _hint_ indicating how the overflow must happen. In modern browser this hint is ignored and no visual effect results in its present; to achieve such an effect, use CSS [`white-space`](https://developer.mozilla.org/en-US/docs/Web/CSS/white-space \"The white-space CSS property sets how white space inside an element is handled.\") instead."
58171                 }
58172             ],
58173             "references": [
58174                 {
58175                     "name": "MDN Reference",
58176                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/pre"
58177                 }
58178             ]
58179         },
58180         {
58181             "name": "blockquote",
58182             "description": {
58183                 "kind": "markdown",
58184                 "value": "The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a footer or cite element, and optionally with in-line changes such as annotations and abbreviations."
58185             },
58186             "attributes": [
58187                 {
58188                     "name": "cite",
58189                     "description": {
58190                         "kind": "markdown",
58191                         "value": "A URL that designates a source document or message for the information quoted. This attribute is intended to point to information explaining the context or the reference for the quote."
58192                     }
58193                 }
58194             ],
58195             "references": [
58196                 {
58197                     "name": "MDN Reference",
58198                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/blockquote"
58199                 }
58200             ]
58201         },
58202         {
58203             "name": "ol",
58204             "description": {
58205                 "kind": "markdown",
58206                 "value": "The ol element represents a list of items, where the items have been intentionally ordered, such that changing the order would change the meaning of the document."
58207             },
58208             "attributes": [
58209                 {
58210                     "name": "reversed",
58211                     "valueSet": "v",
58212                     "description": {
58213                         "kind": "markdown",
58214                         "value": "This Boolean attribute specifies that the items of the list are specified in reversed order."
58215                     }
58216                 },
58217                 {
58218                     "name": "start",
58219                     "description": {
58220                         "kind": "markdown",
58221                         "value": "This integer attribute specifies the start value for numbering the individual list items. Although the ordering type of list elements might be Roman numerals, such as XXXI, or letters, the value of start is always represented as a number. To start numbering elements from the letter \"C\", use `<ol start=\"3\">`.\n\n**Note**: This attribute was deprecated in HTML4, but reintroduced in HTML5."
58222                     }
58223                 },
58224                 {
58225                     "name": "type",
58226                     "valueSet": "lt",
58227                     "description": {
58228                         "kind": "markdown",
58229                         "value": "Indicates the numbering type:\n\n*   `'a'` indicates lowercase letters,\n*   `'A'` indicates uppercase letters,\n*   `'i'` indicates lowercase Roman numerals,\n*   `'I'` indicates uppercase Roman numerals,\n*   and `'1'` indicates numbers (default).\n\nThe type set is used for the entire list unless a different [`type`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li#attr-type) attribute is used within an enclosed [`<li>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li \"The HTML <li> element is used to represent an item in a list. It must be contained in a parent element: an ordered list (<ol>), an unordered list (<ul>), or a menu (<menu>). In menus and unordered lists, list items are usually displayed using bullet points. In ordered lists, they are usually displayed with an ascending counter on the left, such as a number or letter.\") element.\n\n**Note:** This attribute was deprecated in HTML4, but reintroduced in HTML5.\n\nUnless the value of the list number matters (e.g. in legal or technical documents where items are to be referenced by their number/letter), the CSS [`list-style-type`](https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type \"The list-style-type CSS property sets the marker (such as a disc, character, or custom counter style) of a list item element.\") property should be used instead."
58230                     }
58231                 },
58232                 {
58233                     "name": "compact",
58234                     "description": "This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers.\n\n**Warning:** Do not use this attribute, as it has been deprecated: the [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol \"The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.\") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To give an effect similar to the `compact` attribute, the [CSS](https://developer.mozilla.org/en-US/docs/CSS) property [`line-height`](https://developer.mozilla.org/en-US/docs/Web/CSS/line-height \"The line-height CSS property sets the amount of space used for lines, such as in text. On block-level elements, it specifies the minimum height of line boxes within the element. On non-replaced inline elements, it specifies the height that is used to calculate line box height.\") can be used with a value of `80%`."
58235                 }
58236             ],
58237             "references": [
58238                 {
58239                     "name": "MDN Reference",
58240                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/ol"
58241                 }
58242             ]
58243         },
58244         {
58245             "name": "ul",
58246             "description": {
58247                 "kind": "markdown",
58248                 "value": "The ul element represents a list of items, where the order of the items is not important — that is, where changing the order would not materially change the meaning of the document."
58249             },
58250             "attributes": [
58251                 {
58252                     "name": "compact",
58253                     "description": "This Boolean attribute hints that the list should be rendered in a compact style. The interpretation of this attribute depends on the user agent and it doesn't work in all browsers.\n\n**Usage note: **Do not use this attribute, as it has been deprecated: the [`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul \"The HTML <ul> element represents an unordered list of items, typically rendered as a bulleted list.\") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To give a similar effect as the `compact` attribute, the [CSS](https://developer.mozilla.org/en-US/docs/CSS) property [line-height](https://developer.mozilla.org/en-US/docs/CSS/line-height) can be used with a value of `80%`."
58254                 }
58255             ],
58256             "references": [
58257                 {
58258                     "name": "MDN Reference",
58259                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/ul"
58260                 }
58261             ]
58262         },
58263         {
58264             "name": "li",
58265             "description": {
58266                 "kind": "markdown",
58267                 "value": "The li element represents a list item. If its parent element is an ol, ul, or menu element, then the element is an item of the parent element's list, as defined for those elements. Otherwise, the list item has no defined list-related relationship to any other li element."
58268             },
58269             "attributes": [
58270                 {
58271                     "name": "value",
58272                     "description": {
58273                         "kind": "markdown",
58274                         "value": "This integer attribute indicates the current ordinal value of the list item as defined by the [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol \"The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.\") element. The only allowed value for this attribute is a number, even if the list is displayed with Roman numerals or letters. List items that follow this one continue numbering from the value set. The **value** attribute has no meaning for unordered lists ([`<ul>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ul \"The HTML <ul> element represents an unordered list of items, typically rendered as a bulleted list.\")) or for menus ([`<menu>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/menu \"The HTML <menu> element represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked.\")).\n\n**Note**: This attribute was deprecated in HTML4, but reintroduced in HTML5.\n\n**Note:** Prior to Gecko 9.0, negative values were incorrectly converted to 0. Starting in Gecko 9.0 all integer values are correctly parsed."
58275                     }
58276                 },
58277                 {
58278                     "name": "type",
58279                     "description": "This character attribute indicates the numbering type:\n\n*   `a`: lowercase letters\n*   `A`: uppercase letters\n*   `i`: lowercase Roman numerals\n*   `I`: uppercase Roman numerals\n*   `1`: numbers\n\nThis type overrides the one used by its parent [`<ol>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ol \"The HTML <ol> element represents an ordered list of items, typically rendered as a numbered list.\") element, if any.\n\n**Usage note:** This attribute has been deprecated: use the CSS [`list-style-type`](https://developer.mozilla.org/en-US/docs/Web/CSS/list-style-type \"The list-style-type CSS property sets the marker (such as a disc, character, or custom counter style) of a list item element.\") property instead."
58280                 }
58281             ],
58282             "references": [
58283                 {
58284                     "name": "MDN Reference",
58285                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/li"
58286                 }
58287             ]
58288         },
58289         {
58290             "name": "dl",
58291             "description": {
58292                 "kind": "markdown",
58293                 "value": "The dl element represents an association list consisting of zero or more name-value groups (a description list). A name-value group consists of one or more names (dt elements) followed by one or more values (dd elements), ignoring any nodes other than dt and dd elements. Within a single dl element, there should not be more than one dt element for each name."
58294             },
58295             "attributes": [],
58296             "references": [
58297                 {
58298                     "name": "MDN Reference",
58299                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/dl"
58300                 }
58301             ]
58302         },
58303         {
58304             "name": "dt",
58305             "description": {
58306                 "kind": "markdown",
58307                 "value": "The dt element represents the term, or name, part of a term-description group in a description list (dl element)."
58308             },
58309             "attributes": [],
58310             "references": [
58311                 {
58312                     "name": "MDN Reference",
58313                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/dt"
58314                 }
58315             ]
58316         },
58317         {
58318             "name": "dd",
58319             "description": {
58320                 "kind": "markdown",
58321                 "value": "The dd element represents the description, definition, or value, part of a term-description group in a description list (dl element)."
58322             },
58323             "attributes": [
58324                 {
58325                     "name": "nowrap",
58326                     "description": "If the value of this attribute is set to `yes`, the definition text will not wrap. The default value is `no`."
58327                 }
58328             ],
58329             "references": [
58330                 {
58331                     "name": "MDN Reference",
58332                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/dd"
58333                 }
58334             ]
58335         },
58336         {
58337             "name": "figure",
58338             "description": {
58339                 "kind": "markdown",
58340                 "value": "The figure element represents some flow content, optionally with a caption, that is self-contained (like a complete sentence) and is typically referenced as a single unit from the main flow of the document."
58341             },
58342             "attributes": [],
58343             "references": [
58344                 {
58345                     "name": "MDN Reference",
58346                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/figure"
58347                 }
58348             ]
58349         },
58350         {
58351             "name": "figcaption",
58352             "description": {
58353                 "kind": "markdown",
58354                 "value": "The figcaption element represents a caption or legend for the rest of the contents of the figcaption element's parent figure element, if any."
58355             },
58356             "attributes": [],
58357             "references": [
58358                 {
58359                     "name": "MDN Reference",
58360                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/figcaption"
58361                 }
58362             ]
58363         },
58364         {
58365             "name": "main",
58366             "description": {
58367                 "kind": "markdown",
58368                 "value": "The main element represents the main content of the body of a document or application. The main content area consists of content that is directly related to or expands upon the central topic of a document or central functionality of an application."
58369             },
58370             "attributes": [],
58371             "references": [
58372                 {
58373                     "name": "MDN Reference",
58374                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/main"
58375                 }
58376             ]
58377         },
58378         {
58379             "name": "div",
58380             "description": {
58381                 "kind": "markdown",
58382                 "value": "The div element has no special meaning at all. It represents its children. It can be used with the class, lang, and title attributes to mark up semantics common to a group of consecutive elements."
58383             },
58384             "attributes": [],
58385             "references": [
58386                 {
58387                     "name": "MDN Reference",
58388                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/div"
58389                 }
58390             ]
58391         },
58392         {
58393             "name": "a",
58394             "description": {
58395                 "kind": "markdown",
58396                 "value": "If the a element has an href attribute, then it represents a hyperlink (a hypertext anchor) labeled by its contents."
58397             },
58398             "attributes": [
58399                 {
58400                     "name": "href",
58401                     "description": {
58402                         "kind": "markdown",
58403                         "value": "Contains a URL or a URL fragment that the hyperlink points to."
58404                     }
58405                 },
58406                 {
58407                     "name": "target",
58408                     "description": {
58409                         "kind": "markdown",
58410                         "value": "Specifies where to display the linked URL. It is a name of, or keyword for, a _browsing context_: a tab, window, or `<iframe>`. The following keywords have special meanings:\n\n*   `_self`: Load the URL into the same browsing context as the current one. This is the default behavior.\n*   `_blank`: Load the URL into a new browsing context. This is usually a tab, but users can configure browsers to use new windows instead.\n*   `_parent`: Load the URL into the parent browsing context of the current one. If there is no parent, this behaves the same way as `_self`.\n*   `_top`: Load the URL into the top-level browsing context (that is, the \"highest\" browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this behaves the same way as `_self`.\n\n**Note:** When using `target`, consider adding `rel=\"noreferrer\"` to avoid exploitation of the `window.opener` API.\n\n**Note:** Linking to another page using `target=\"_blank\"` will run the new page on the same process as your page. If the new page is executing expensive JS, your page's performance may suffer. To avoid this use `rel=\"noopener\"`."
58411                     }
58412                 },
58413                 {
58414                     "name": "download",
58415                     "description": {
58416                         "kind": "markdown",
58417                         "value": "This attribute instructs browsers to download a URL instead of navigating to it, so the user will be prompted to save it as a local file. If the attribute has a value, it is used as the pre-filled file name in the Save prompt (the user can still change the file name if they want). There are no restrictions on allowed values, though `/` and `\\` are converted to underscores. Most file systems limit some punctuation in file names, and browsers will adjust the suggested name accordingly.\n\n**Notes:**\n\n*   This attribute only works for [same-origin URLs](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy).\n*   Although HTTP(s) URLs need to be in the same-origin, [`blob:` URLs](https://developer.mozilla.org/en-US/docs/Web/API/URL.createObjectURL) and [`data:` URLs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) are allowed so that content generated by JavaScript, such as pictures created in an image-editor Web app, can be downloaded.\n*   If the HTTP header [`Content-Disposition:`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) gives a different filename than this attribute, the HTTP header takes priority over this attribute.\n*   If `Content-Disposition:` is set to `inline`, Firefox prioritizes `Content-Disposition`, like the filename case, while Chrome prioritizes the `download` attribute."
58418                     }
58419                 },
58420                 {
58421                     "name": "ping",
58422                     "description": {
58423                         "kind": "markdown",
58424                         "value": "Contains a space-separated list of URLs to which, when the hyperlink is followed, [`POST`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST \"The HTTP POST method sends data to the server. The type of the body of the request is indicated by the Content-Type header.\") requests with the body `PING` will be sent by the browser (in the background). Typically used for tracking."
58425                     }
58426                 },
58427                 {
58428                     "name": "rel",
58429                     "description": {
58430                         "kind": "markdown",
58431                         "value": "Specifies the relationship of the target object to the link object. The value is a space-separated list of [link types](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types)."
58432                     }
58433                 },
58434                 {
58435                     "name": "hreflang",
58436                     "description": {
58437                         "kind": "markdown",
58438                         "value": "This attribute indicates the human language of the linked resource. It is purely advisory, with no built-in functionality. Allowed values are determined by [BCP47](https://www.ietf.org/rfc/bcp/bcp47.txt \"Tags for Identifying Languages\")."
58439                     }
58440                 },
58441                 {
58442                     "name": "type",
58443                     "description": {
58444                         "kind": "markdown",
58445                         "value": "Specifies the media type in the form of a [MIME type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type \"MIME type: A MIME type (now properly called \"media type\", but also sometimes \"content type\") is a string sent along with a file indicating the type of the file (describing the content format, for example, a sound file might be labeled audio/ogg, or an image file image/png).\") for the linked URL. It is purely advisory, with no built-in functionality."
58446                     }
58447                 },
58448                 {
58449                     "name": "referrerpolicy",
58450                     "description": "Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer) to send when fetching the URL:\n\n*   `'no-referrer'` means the `Referer:` header will not be sent.\n*   `'no-referrer-when-downgrade'` means no `Referer:` header will be sent when navigating to an origin without HTTPS. This is the default behavior.\n*   `'origin'` means the referrer will be the [origin](https://developer.mozilla.org/en-US/docs/Glossary/Origin) of the page, not including information after the domain.\n*   `'origin-when-cross-origin'` meaning that navigations to other origins will be limited to the scheme, the host and the port, while navigations on the same origin will include the referrer's path.\n*   `'strict-origin-when-cross-origin'`\n*   `'unsafe-url'` means the referrer will include the origin and path, but not the fragment, password, or username. This is unsafe because it can leak data from secure URLs to insecure ones."
58451                 }
58452             ],
58453             "references": [
58454                 {
58455                     "name": "MDN Reference",
58456                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/a"
58457                 }
58458             ]
58459         },
58460         {
58461             "name": "em",
58462             "description": {
58463                 "kind": "markdown",
58464                 "value": "The em element represents stress emphasis of its contents."
58465             },
58466             "attributes": [],
58467             "references": [
58468                 {
58469                     "name": "MDN Reference",
58470                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/em"
58471                 }
58472             ]
58473         },
58474         {
58475             "name": "strong",
58476             "description": {
58477                 "kind": "markdown",
58478                 "value": "The strong element represents strong importance, seriousness, or urgency for its contents."
58479             },
58480             "attributes": [],
58481             "references": [
58482                 {
58483                     "name": "MDN Reference",
58484                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/strong"
58485                 }
58486             ]
58487         },
58488         {
58489             "name": "small",
58490             "description": {
58491                 "kind": "markdown",
58492                 "value": "The small element represents side comments such as small print."
58493             },
58494             "attributes": [],
58495             "references": [
58496                 {
58497                     "name": "MDN Reference",
58498                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/small"
58499                 }
58500             ]
58501         },
58502         {
58503             "name": "s",
58504             "description": {
58505                 "kind": "markdown",
58506                 "value": "The s element represents contents that are no longer accurate or no longer relevant."
58507             },
58508             "attributes": [],
58509             "references": [
58510                 {
58511                     "name": "MDN Reference",
58512                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/s"
58513                 }
58514             ]
58515         },
58516         {
58517             "name": "cite",
58518             "description": {
58519                 "kind": "markdown",
58520                 "value": "The cite element represents a reference to a creative work. It must include the title of the work or the name of the author(person, people or organization) or an URL reference, or a reference in abbreviated form as per the conventions used for the addition of citation metadata."
58521             },
58522             "attributes": [],
58523             "references": [
58524                 {
58525                     "name": "MDN Reference",
58526                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/cite"
58527                 }
58528             ]
58529         },
58530         {
58531             "name": "q",
58532             "description": {
58533                 "kind": "markdown",
58534                 "value": "The q element represents some phrasing content quoted from another source."
58535             },
58536             "attributes": [
58537                 {
58538                     "name": "cite",
58539                     "description": {
58540                         "kind": "markdown",
58541                         "value": "The value of this attribute is a URL that designates a source document or message for the information quoted. This attribute is intended to point to information explaining the context or the reference for the quote."
58542                     }
58543                 }
58544             ],
58545             "references": [
58546                 {
58547                     "name": "MDN Reference",
58548                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/q"
58549                 }
58550             ]
58551         },
58552         {
58553             "name": "dfn",
58554             "description": {
58555                 "kind": "markdown",
58556                 "value": "The dfn element represents the defining instance of a term. The paragraph, description list group, or section that is the nearest ancestor of the dfn element must also contain the definition(s) for the term given by the dfn element."
58557             },
58558             "attributes": [],
58559             "references": [
58560                 {
58561                     "name": "MDN Reference",
58562                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/dfn"
58563                 }
58564             ]
58565         },
58566         {
58567             "name": "abbr",
58568             "description": {
58569                 "kind": "markdown",
58570                 "value": "The abbr element represents an abbreviation or acronym, optionally with its expansion. The title attribute may be used to provide an expansion of the abbreviation. The attribute, if specified, must contain an expansion of the abbreviation, and nothing else."
58571             },
58572             "attributes": [],
58573             "references": [
58574                 {
58575                     "name": "MDN Reference",
58576                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/abbr"
58577                 }
58578             ]
58579         },
58580         {
58581             "name": "ruby",
58582             "description": {
58583                 "kind": "markdown",
58584                 "value": "The ruby element allows one or more spans of phrasing content to be marked with ruby annotations. Ruby annotations are short runs of text presented alongside base text, primarily used in East Asian typography as a guide for pronunciation or to include other annotations. In Japanese, this form of typography is also known as furigana. Ruby text can appear on either side, and sometimes both sides, of the base text, and it is possible to control its position using CSS. A more complete introduction to ruby can be found in the Use Cases & Exploratory Approaches for Ruby Markup document as well as in CSS Ruby Module Level 1. [RUBY-UC] [CSSRUBY]"
58585             },
58586             "attributes": [],
58587             "references": [
58588                 {
58589                     "name": "MDN Reference",
58590                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/ruby"
58591                 }
58592             ]
58593         },
58594         {
58595             "name": "rb",
58596             "description": {
58597                 "kind": "markdown",
58598                 "value": "The rb element marks the base text component of a ruby annotation. When it is the child of a ruby element, it doesn't represent anything itself, but its parent ruby element uses it as part of determining what it represents."
58599             },
58600             "attributes": [],
58601             "references": [
58602                 {
58603                     "name": "MDN Reference",
58604                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/rb"
58605                 }
58606             ]
58607         },
58608         {
58609             "name": "rt",
58610             "description": {
58611                 "kind": "markdown",
58612                 "value": "The rt element marks the ruby text component of a ruby annotation. When it is the child of a ruby element or of an rtc element that is itself the child of a ruby element, it doesn't represent anything itself, but its ancestor ruby element uses it as part of determining what it represents."
58613             },
58614             "attributes": [],
58615             "references": [
58616                 {
58617                     "name": "MDN Reference",
58618                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/rt"
58619                 }
58620             ]
58621         },
58622         {
58623             "name": "rp",
58624             "description": {
58625                 "kind": "markdown",
58626                 "value": "The rp element is used to provide fallback text to be shown by user agents that don't support ruby annotations. One widespread convention is to provide parentheses around the ruby text component of a ruby annotation."
58627             },
58628             "attributes": [],
58629             "references": [
58630                 {
58631                     "name": "MDN Reference",
58632                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/rp"
58633                 }
58634             ]
58635         },
58636         {
58637             "name": "time",
58638             "description": {
58639                 "kind": "markdown",
58640                 "value": "The time element represents its contents, along with a machine-readable form of those contents in the datetime attribute. The kind of content is limited to various kinds of dates, times, time-zone offsets, and durations, as described below."
58641             },
58642             "attributes": [
58643                 {
58644                     "name": "datetime",
58645                     "description": {
58646                         "kind": "markdown",
58647                         "value": "This attribute indicates the time and/or date of the element and must be in one of the formats described below."
58648                     }
58649                 }
58650             ],
58651             "references": [
58652                 {
58653                     "name": "MDN Reference",
58654                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/time"
58655                 }
58656             ]
58657         },
58658         {
58659             "name": "code",
58660             "description": {
58661                 "kind": "markdown",
58662                 "value": "The code element represents a fragment of computer code. This could be an XML element name, a file name, a computer program, or any other string that a computer would recognize."
58663             },
58664             "attributes": [],
58665             "references": [
58666                 {
58667                     "name": "MDN Reference",
58668                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/code"
58669                 }
58670             ]
58671         },
58672         {
58673             "name": "var",
58674             "description": {
58675                 "kind": "markdown",
58676                 "value": "The var element represents a variable. This could be an actual variable in a mathematical expression or programming context, an identifier representing a constant, a symbol identifying a physical quantity, a function parameter, or just be a term used as a placeholder in prose."
58677             },
58678             "attributes": [],
58679             "references": [
58680                 {
58681                     "name": "MDN Reference",
58682                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/var"
58683                 }
58684             ]
58685         },
58686         {
58687             "name": "samp",
58688             "description": {
58689                 "kind": "markdown",
58690                 "value": "The samp element represents sample or quoted output from another program or computing system."
58691             },
58692             "attributes": [],
58693             "references": [
58694                 {
58695                     "name": "MDN Reference",
58696                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/samp"
58697                 }
58698             ]
58699         },
58700         {
58701             "name": "kbd",
58702             "description": {
58703                 "kind": "markdown",
58704                 "value": "The kbd element represents user input (typically keyboard input, although it may also be used to represent other input, such as voice commands)."
58705             },
58706             "attributes": [],
58707             "references": [
58708                 {
58709                     "name": "MDN Reference",
58710                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/kbd"
58711                 }
58712             ]
58713         },
58714         {
58715             "name": "sub",
58716             "description": {
58717                 "kind": "markdown",
58718                 "value": "The sub element represents a subscript."
58719             },
58720             "attributes": [],
58721             "references": [
58722                 {
58723                     "name": "MDN Reference",
58724                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/sub"
58725                 }
58726             ]
58727         },
58728         {
58729             "name": "sup",
58730             "description": {
58731                 "kind": "markdown",
58732                 "value": "The sup element represents a superscript."
58733             },
58734             "attributes": [],
58735             "references": [
58736                 {
58737                     "name": "MDN Reference",
58738                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/sup"
58739                 }
58740             ]
58741         },
58742         {
58743             "name": "i",
58744             "description": {
58745                 "kind": "markdown",
58746                 "value": "The i element represents a span of text in an alternate voice or mood, or otherwise offset from the normal prose in a manner indicating a different quality of text, such as a taxonomic designation, a technical term, an idiomatic phrase from another language, transliteration, a thought, or a ship name in Western texts."
58747             },
58748             "attributes": [],
58749             "references": [
58750                 {
58751                     "name": "MDN Reference",
58752                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/i"
58753                 }
58754             ]
58755         },
58756         {
58757             "name": "b",
58758             "description": {
58759                 "kind": "markdown",
58760                 "value": "The b element represents a span of text to which attention is being drawn for utilitarian purposes without conveying any extra importance and with no implication of an alternate voice or mood, such as key words in a document abstract, product names in a review, actionable words in interactive text-driven software, or an article lede."
58761             },
58762             "attributes": [],
58763             "references": [
58764                 {
58765                     "name": "MDN Reference",
58766                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/b"
58767                 }
58768             ]
58769         },
58770         {
58771             "name": "u",
58772             "description": {
58773                 "kind": "markdown",
58774                 "value": "The u element represents a span of text with an unarticulated, though explicitly rendered, non-textual annotation, such as labeling the text as being a proper name in Chinese text (a Chinese proper name mark), or labeling the text as being misspelt."
58775             },
58776             "attributes": [],
58777             "references": [
58778                 {
58779                     "name": "MDN Reference",
58780                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/u"
58781                 }
58782             ]
58783         },
58784         {
58785             "name": "mark",
58786             "description": {
58787                 "kind": "markdown",
58788                 "value": "The mark element represents a run of text in one document marked or highlighted for reference purposes, due to its relevance in another context. When used in a quotation or other block of text referred to from the prose, it indicates a highlight that was not originally present but which has been added to bring the reader's attention to a part of the text that might not have been considered important by the original author when the block was originally written, but which is now under previously unexpected scrutiny. When used in the main prose of a document, it indicates a part of the document that has been highlighted due to its likely relevance to the user's current activity."
58789             },
58790             "attributes": [],
58791             "references": [
58792                 {
58793                     "name": "MDN Reference",
58794                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/mark"
58795                 }
58796             ]
58797         },
58798         {
58799             "name": "bdi",
58800             "description": {
58801                 "kind": "markdown",
58802                 "value": "The bdi element represents a span of text that is to be isolated from its surroundings for the purposes of bidirectional text formatting. [BIDI]"
58803             },
58804             "attributes": [],
58805             "references": [
58806                 {
58807                     "name": "MDN Reference",
58808                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/bdi"
58809                 }
58810             ]
58811         },
58812         {
58813             "name": "bdo",
58814             "description": {
58815                 "kind": "markdown",
58816                 "value": "The bdo element represents explicit text directionality formatting control for its children. It allows authors to override the Unicode bidirectional algorithm by explicitly specifying a direction override. [BIDI]"
58817             },
58818             "attributes": [
58819                 {
58820                     "name": "dir",
58821                     "description": "The direction in which text should be rendered in this element's contents. Possible values are:\n\n*   `ltr`: Indicates that the text should go in a left-to-right direction.\n*   `rtl`: Indicates that the text should go in a right-to-left direction."
58822                 }
58823             ],
58824             "references": [
58825                 {
58826                     "name": "MDN Reference",
58827                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/bdo"
58828                 }
58829             ]
58830         },
58831         {
58832             "name": "span",
58833             "description": {
58834                 "kind": "markdown",
58835                 "value": "The span element doesn't mean anything on its own, but can be useful when used together with the global attributes, e.g. class, lang, or dir. It represents its children."
58836             },
58837             "attributes": [],
58838             "references": [
58839                 {
58840                     "name": "MDN Reference",
58841                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/span"
58842                 }
58843             ]
58844         },
58845         {
58846             "name": "br",
58847             "description": {
58848                 "kind": "markdown",
58849                 "value": "The br element represents a line break."
58850             },
58851             "attributes": [
58852                 {
58853                     "name": "clear",
58854                     "description": "Indicates where to begin the next line after the break."
58855                 }
58856             ],
58857             "references": [
58858                 {
58859                     "name": "MDN Reference",
58860                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/br"
58861                 }
58862             ]
58863         },
58864         {
58865             "name": "wbr",
58866             "description": {
58867                 "kind": "markdown",
58868                 "value": "The wbr element represents a line break opportunity."
58869             },
58870             "attributes": [],
58871             "references": [
58872                 {
58873                     "name": "MDN Reference",
58874                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/wbr"
58875                 }
58876             ]
58877         },
58878         {
58879             "name": "ins",
58880             "description": {
58881                 "kind": "markdown",
58882                 "value": "The ins element represents an addition to the document."
58883             },
58884             "attributes": [
58885                 {
58886                     "name": "cite",
58887                     "description": "This attribute defines the URI of a resource that explains the change, such as a link to meeting minutes or a ticket in a troubleshooting system."
58888                 },
58889                 {
58890                     "name": "datetime",
58891                     "description": "This attribute indicates the time and date of the change and must be a valid date with an optional time string. If the value cannot be parsed as a date with an optional time string, the element does not have an associated time stamp. For the format of the string without a time, see [Format of a valid date string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_date_string \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\"). The format of the string if it includes both date and time is covered in [Format of a valid local date and time string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_local_date_and_time_string \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\")."
58892                 }
58893             ],
58894             "references": [
58895                 {
58896                     "name": "MDN Reference",
58897                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/ins"
58898                 }
58899             ]
58900         },
58901         {
58902             "name": "del",
58903             "description": {
58904                 "kind": "markdown",
58905                 "value": "The del element represents a removal from the document."
58906             },
58907             "attributes": [
58908                 {
58909                     "name": "cite",
58910                     "description": {
58911                         "kind": "markdown",
58912                         "value": "A URI for a resource that explains the change (for example, meeting minutes)."
58913                     }
58914                 },
58915                 {
58916                     "name": "datetime",
58917                     "description": {
58918                         "kind": "markdown",
58919                         "value": "This attribute indicates the time and date of the change and must be a valid date string with an optional time. If the value cannot be parsed as a date with an optional time string, the element does not have an associated time stamp. For the format of the string without a time, see [Format of a valid date string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_date_string \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\"). The format of the string if it includes both date and time is covered in [Format of a valid local date and time string](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats#Format_of_a_valid_local_date_and_time_string \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\") in [Date and time formats used in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Date_and_time_formats \"Certain HTML elements use date and/or time values. The formats of the strings that specify these are described in this article.\")."
58920                     }
58921                 }
58922             ],
58923             "references": [
58924                 {
58925                     "name": "MDN Reference",
58926                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/del"
58927                 }
58928             ]
58929         },
58930         {
58931             "name": "picture",
58932             "description": {
58933                 "kind": "markdown",
58934                 "value": "The picture element is a container which provides multiple sources to its contained img element to allow authors to declaratively control or give hints to the user agent about which image resource to use, based on the screen pixel density, viewport size, image format, and other factors. It represents its children."
58935             },
58936             "attributes": [],
58937             "references": [
58938                 {
58939                     "name": "MDN Reference",
58940                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/picture"
58941                 }
58942             ]
58943         },
58944         {
58945             "name": "img",
58946             "description": {
58947                 "kind": "markdown",
58948                 "value": "An img element represents an image."
58949             },
58950             "attributes": [
58951                 {
58952                     "name": "alt",
58953                     "description": {
58954                         "kind": "markdown",
58955                         "value": "This attribute defines an alternative text description of the image.\n\n**Note:** Browsers do not always display the image referenced by the element. This is the case for non-graphical browsers (including those used by people with visual impairments), if the user chooses not to display images, or if the browser cannot display the image because it is invalid or an [unsupported type](#Supported_image_formats). In these cases, the browser may replace the image with the text defined in this element's `alt` attribute. You should, for these reasons and others, provide a useful value for `alt` whenever possible.\n\n**Note:** Omitting this attribute altogether indicates that the image is a key part of the content, and no textual equivalent is available. Setting this attribute to an empty string (`alt=\"\"`) indicates that this image is _not_ a key part of the content (decorative), and that non-visual browsers may omit it from rendering."
58956                     }
58957                 },
58958                 {
58959                     "name": "src",
58960                     "description": {
58961                         "kind": "markdown",
58962                         "value": "The image URL. This attribute is mandatory for the `<img>` element. On browsers supporting `srcset`, `src` is treated like a candidate image with a pixel density descriptor `1x` unless an image with this pixel density descriptor is already defined in `srcset,` or unless `srcset` contains '`w`' descriptors."
58963                     }
58964                 },
58965                 {
58966                     "name": "srcset",
58967                     "description": {
58968                         "kind": "markdown",
58969                         "value": "A list of one or more strings separated by commas indicating a set of possible image sources for the user agent to use. Each string is composed of:\n\n1.  a URL to an image,\n2.  optionally, whitespace followed by one of:\n    *   A width descriptor, or a positive integer directly followed by '`w`'. The width descriptor is divided by the source size given in the `sizes` attribute to calculate the effective pixel density.\n    *   A pixel density descriptor, which is a positive floating point number directly followed by '`x`'.\n\nIf no descriptor is specified, the source is assigned the default descriptor: `1x`.\n\nIt is incorrect to mix width descriptors and pixel density descriptors in the same `srcset` attribute. Duplicate descriptors (for instance, two sources in the same `srcset` which are both described with '`2x`') are also invalid.\n\nThe user agent selects any one of the available sources at its discretion. This provides them with significant leeway to tailor their selection based on things like user preferences or bandwidth conditions. See our [Responsive images](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images) tutorial for an example."
58970                     }
58971                 },
58972                 {
58973                     "name": "crossorigin",
58974                     "valueSet": "xo",
58975                     "description": {
58976                         "kind": "markdown",
58977                         "value": "This enumerated attribute indicates if the fetching of the related image must be done using CORS or not. [CORS-enabled images](https://developer.mozilla.org/en-US/docs/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas \"Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.\") element without being \"[tainted](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image#What_is_a_tainted_canvas).\" The allowed values are:"
58978                     }
58979                 },
58980                 {
58981                     "name": "usemap",
58982                     "description": {
58983                         "kind": "markdown",
58984                         "value": "The partial URL (starting with '#') of an [image map](https://developer.mozilla.org/en-US/docs/HTML/Element/map) associated with the element.\n\n**Note:** You cannot use this attribute if the `<img>` element is a descendant of an [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a \"The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL.\") or [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") element."
58985                     }
58986                 },
58987                 {
58988                     "name": "ismap",
58989                     "valueSet": "v",
58990                     "description": {
58991                         "kind": "markdown",
58992                         "value": "This Boolean attribute indicates that the image is part of a server-side map. If so, the precise coordinates of a click are sent to the server.\n\n**Note:** This attribute is allowed only if the `<img>` element is a descendant of an [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a \"The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL.\") element with a valid [`href`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-href) attribute."
58993                     }
58994                 },
58995                 {
58996                     "name": "width",
58997                     "description": {
58998                         "kind": "markdown",
58999                         "value": "The intrinsic width of the image in pixels."
59000                     }
59001                 },
59002                 {
59003                     "name": "height",
59004                     "description": {
59005                         "kind": "markdown",
59006                         "value": "The intrinsic height of the image in pixels."
59007                     }
59008                 },
59009                 {
59010                     "name": "decoding",
59011                     "description": "Provides an image decoding hint to the browser. The allowed values are:"
59012                 },
59013                 {
59014                     "name": "decoding",
59015                     "description": "`sync`\n\nDecode the image synchronously for atomic presentation with other content.\n\n`async`\n\nDecode the image asynchronously to reduce delay in presenting other content.\n\n`auto`\n\nDefault mode, which indicates no preference for the decoding mode. The browser decides what is best for the user."
59016                 },
59017                 {
59018                     "name": "importance",
59019                     "description": "Indicates the relative importance of the resource. Priority hints are delegated using the values:"
59020                 },
59021                 {
59022                     "name": "importance",
59023                     "description": "`auto`: Indicates **no preference**. The browser may use its own heuristics to decide the priority of the image.\n\n`high`: Indicates to the browser that the image is of **high** priority.\n\n`low`: Indicates to the browser that the image is of **low** priority."
59024                 },
59025                 {
59026                     "name": "intrinsicsize",
59027                     "description": "This attribute tells the browser to ignore the actual intrinsic size of the image and pretend it’s the size specified in the attribute. Specifically, the image would raster at these dimensions and `naturalWidth`/`naturalHeight` on images would return the values specified in this attribute. [Explainer](https://github.com/ojanvafai/intrinsicsize-attribute), [examples](https://googlechrome.github.io/samples/intrinsic-size/index.html)"
59028                 },
59029                 {
59030                     "name": "referrerpolicy",
59031                     "description": "A string indicating which referrer to use when fetching the resource:\n\n*   `no-referrer:` The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent.\n*   `no-referrer-when-downgrade:` No `Referer` header will be sent when navigating to an origin without TLS (HTTPS). This is a user agent’s default behavior if no policy is otherwise specified.\n*   `origin:` The `Referer` header will include the page of origin's scheme, the host, and the port.\n*   `origin-when-cross-origin:` Navigating to other origins will limit the included referral data to the scheme, the host and the port, while navigating from the same origin will include the referrer's full path.\n*   `unsafe-url:` The `Referer` header will include the origin and the path, but not the fragment, password, or username. This case is unsafe because it can leak origins and paths from TLS-protected resources to insecure origins."
59032                 },
59033                 {
59034                     "name": "sizes",
59035                     "description": "A list of one or more strings separated by commas indicating a set of source sizes. Each source size consists of:\n\n1.  a media condition. This must be omitted for the last item.\n2.  a source size value.\n\nSource size values specify the intended display size of the image. User agents use the current source size to select one of the sources supplied by the `srcset` attribute, when those sources are described using width ('`w`') descriptors. The selected source size affects the intrinsic size of the image (the image’s display size if no CSS styling is applied). If the `srcset` attribute is absent, or contains no values with a width (`w`) descriptor, then the `sizes` attribute has no effect."
59036                 }
59037             ],
59038             "references": [
59039                 {
59040                     "name": "MDN Reference",
59041                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/img"
59042                 }
59043             ]
59044         },
59045         {
59046             "name": "iframe",
59047             "description": {
59048                 "kind": "markdown",
59049                 "value": "The iframe element represents a nested browsing context."
59050             },
59051             "attributes": [
59052                 {
59053                     "name": "src",
59054                     "description": {
59055                         "kind": "markdown",
59056                         "value": "The URL of the page to embed. Use a value of `about:blank` to embed an empty page that conforms to the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Inherited_origins). Also note that programatically removing an `<iframe>`'s src attribute (e.g. via [`Element.removeAttribute()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/removeAttribute \"The Element method removeAttribute() removes the attribute with the specified name from the element.\")) causes `about:blank` to be loaded in the frame in Firefox (from version 65), Chromium-based browsers, and Safari/iOS."
59057                     }
59058                 },
59059                 {
59060                     "name": "srcdoc",
59061                     "description": {
59062                         "kind": "markdown",
59063                         "value": "Inline HTML to embed, overriding the `src` attribute. If a browser does not support the `srcdoc` attribute, it will fall back to the URL in the `src` attribute."
59064                     }
59065                 },
59066                 {
59067                     "name": "name",
59068                     "description": {
59069                         "kind": "markdown",
59070                         "value": "A targetable name for the embedded browsing context. This can be used in the `target` attribute of the [`<a>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a \"The HTML <a> element (or anchor element) creates a hyperlink to other web pages, files, locations within the same page, email addresses, or any other URL.\"), [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\"), or [`<base>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base \"The HTML <base> element specifies the base URL to use for all relative URLs contained within a document. There can be only one <base> element in a document.\") elements; the `formtarget` attribute of the [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") or [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") elements; or the `windowName` parameter in the [`window.open()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/open \"The Window interface's open() method loads the specified resource into the browsing context (window, <iframe> or tab) with the specified name. If the name doesn't exist, then a new window is opened and the specified resource is loaded into its browsing context.\") method."
59071                     }
59072                 },
59073                 {
59074                     "name": "sandbox",
59075                     "valueSet": "sb",
59076                     "description": {
59077                         "kind": "markdown",
59078                         "value": "Applies extra restrictions to the content in the frame. The value of the attribute can either be empty to apply all restrictions, or space-separated tokens to lift particular restrictions:\n\n*   `allow-forms`: Allows the resource to submit forms. If this keyword is not used, form submission is blocked.\n*   `allow-modals`: Lets the resource [open modal windows](https://html.spec.whatwg.org/multipage/origin.html#sandboxed-modals-flag).\n*   `allow-orientation-lock`: Lets the resource [lock the screen orientation](https://developer.mozilla.org/en-US/docs/Web/API/Screen/lockOrientation).\n*   `allow-pointer-lock`: Lets the resource use the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/WebAPI/Pointer_Lock).\n*   `allow-popups`: Allows popups (such as `window.open()`, `target=\"_blank\"`, or `showModalDialog()`). If this keyword is not used, the popup will silently fail to open.\n*   `allow-popups-to-escape-sandbox`: Lets the sandboxed document open new windows without those windows inheriting the sandboxing. For example, this can safely sandbox an advertisement without forcing the same restrictions upon the page the ad links to.\n*   `allow-presentation`: Lets the resource start a [presentation session](https://developer.mozilla.org/en-US/docs/Web/API/PresentationRequest).\n*   `allow-same-origin`: If this token is not used, the resource is treated as being from a special origin that always fails the [same-origin policy](https://developer.mozilla.org/en-US/docs/Glossary/same-origin_policy \"same-origin policy: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin.\").\n*   `allow-scripts`: Lets the resource run scripts (but not create popup windows).\n*   `allow-storage-access-by-user-activation` : Lets the resource request access to the parent's storage capabilities with the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).\n*   `allow-top-navigation`: Lets the resource navigate the top-level browsing context (the one named `_top`).\n*   `allow-top-navigation-by-user-activation`: Lets the resource navigate the top-level browsing context, but only if initiated by a user gesture.\n\n**Notes about sandboxing:**\n\n*   When the embedded document has the same origin as the embedding page, it is **strongly discouraged** to use both `allow-scripts` and `allow-same-origin`, as that lets the embedded document remove the `sandbox` attribute — making it no more secure than not using the `sandbox` attribute at all.\n*   Sandboxing is useless if the attacker can display content outside a sandboxed `iframe` — such as if the viewer opens the frame in a new tab. Such content should be also served from a _separate origin_ to limit potential damage.\n*   The `sandbox` attribute is unsupported in Internet Explorer 9 and earlier."
59079                     }
59080                 },
59081                 {
59082                     "name": "seamless",
59083                     "valueSet": "v"
59084                 },
59085                 {
59086                     "name": "allowfullscreen",
59087                     "valueSet": "v",
59088                     "description": {
59089                         "kind": "markdown",
59090                         "value": "Set to `true` if the `<iframe>` can activate fullscreen mode by calling the [`requestFullscreen()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen \"The Element.requestFullscreen() method issues an asynchronous request to make the element be displayed in full-screen mode.\") method."
59091                     }
59092                 },
59093                 {
59094                     "name": "width",
59095                     "description": {
59096                         "kind": "markdown",
59097                         "value": "The width of the frame in CSS pixels. Default is `300`."
59098                     }
59099                 },
59100                 {
59101                     "name": "height",
59102                     "description": {
59103                         "kind": "markdown",
59104                         "value": "The height of the frame in CSS pixels. Default is `150`."
59105                     }
59106                 },
59107                 {
59108                     "name": "allow",
59109                     "description": "Specifies a [feature policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Feature_Policy) for the `<iframe>`."
59110                 },
59111                 {
59112                     "name": "allowpaymentrequest",
59113                     "description": "Set to `true` if a cross-origin `<iframe>` should be allowed to invoke the [Payment Request API](https://developer.mozilla.org/en-US/docs/Web/API/Payment_Request_API)."
59114                 },
59115                 {
59116                     "name": "allowpaymentrequest",
59117                     "description": "This attribute is considered a legacy attribute and redefined as `allow=\"payment\"`."
59118                 },
59119                 {
59120                     "name": "csp",
59121                     "description": "A [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) enforced for the embedded resource. See [`HTMLIFrameElement.csp`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/csp \"The csp property of the HTMLIFrameElement interface specifies the Content Security Policy that an embedded document must agree to enforce upon itself.\") for details."
59122                 },
59123                 {
59124                     "name": "importance",
59125                     "description": "The download priority of the resource in the `<iframe>`'s `src` attribute. Allowed values:\n\n`auto` (default)\n\nNo preference. The browser uses its own heuristics to decide the priority of the resource.\n\n`high`\n\nThe resource should be downloaded before other lower-priority page resources.\n\n`low`\n\nThe resource should be downloaded after other higher-priority page resources."
59126                 },
59127                 {
59128                     "name": "referrerpolicy",
59129                     "description": "Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer) to send when fetching the frame's resource:\n\n*   `no-referrer`: The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent.\n*   `no-referrer-when-downgrade` (default): The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent to [origin](https://developer.mozilla.org/en-US/docs/Glossary/origin \"origin: Web content's origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.\")s without [TLS](https://developer.mozilla.org/en-US/docs/Glossary/TLS \"TLS: Transport Layer Security (TLS), previously known as Secure Sockets Layer (SSL), is a protocol used by applications to communicate securely across a network, preventing tampering with and eavesdropping on email, web browsing, messaging, and other protocols.\") ([HTTPS](https://developer.mozilla.org/en-US/docs/Glossary/HTTPS \"HTTPS: HTTPS (HTTP Secure) is an encrypted version of the HTTP protocol. It usually uses SSL or TLS to encrypt all communication between a client and a server. This secure connection allows clients to safely exchange sensitive data with a server, for example for banking activities or online shopping.\")).\n*   `origin`: The sent referrer will be limited to the origin of the referring page: its [scheme](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/URIScheme), [host](https://developer.mozilla.org/en-US/docs/Glossary/host \"host: A host is a device connected to the Internet (or a local network). Some hosts called servers offer additional services like serving webpages or storing files and emails.\"), and [port](https://developer.mozilla.org/en-US/docs/Glossary/port \"port: For a computer connected to a network with an IP address, a port is a communication endpoint. Ports are designated by numbers, and below 1024 each port is associated by default with a specific protocol.\").\n*   `origin-when-cross-origin`: The referrer sent to other origins will be limited to the scheme, the host, and the port. Navigations on the same origin will still include the path.\n*   `same-origin`: A referrer will be sent for [same origin](https://developer.mozilla.org/en-US/docs/Glossary/Same-origin_policy \"same origin: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin.\"), but cross-origin requests will contain no referrer information.\n*   `strict-origin`: Only send the origin of the document as the referrer when the protocol security level stays the same (HTTPS→HTTPS), but don't send it to a less secure destination (HTTPS→HTTP).\n*   `strict-origin-when-cross-origin`: Send a full URL when performing a same-origin request, only send the origin when the protocol security level stays the same (HTTPS→HTTPS), and send no header to a less secure destination (HTTPS→HTTP).\n*   `unsafe-url`: The referrer will include the origin _and_ the path (but not the [fragment](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash), [password](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/password), or [username](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/username)). **This value is unsafe**, because it leaks origins and paths from TLS-protected resources to insecure origins."
59130                 }
59131             ],
59132             "references": [
59133                 {
59134                     "name": "MDN Reference",
59135                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/iframe"
59136                 }
59137             ]
59138         },
59139         {
59140             "name": "embed",
59141             "description": {
59142                 "kind": "markdown",
59143                 "value": "The embed element provides an integration point for an external (typically non-HTML) application or interactive content."
59144             },
59145             "attributes": [
59146                 {
59147                     "name": "src",
59148                     "description": {
59149                         "kind": "markdown",
59150                         "value": "The URL of the resource being embedded."
59151                     }
59152                 },
59153                 {
59154                     "name": "type",
59155                     "description": {
59156                         "kind": "markdown",
59157                         "value": "The MIME type to use to select the plug-in to instantiate."
59158                     }
59159                 },
59160                 {
59161                     "name": "width",
59162                     "description": {
59163                         "kind": "markdown",
59164                         "value": "The displayed width of the resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). This must be an absolute value; percentages are _not_ allowed."
59165                     }
59166                 },
59167                 {
59168                     "name": "height",
59169                     "description": {
59170                         "kind": "markdown",
59171                         "value": "The displayed height of the resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). This must be an absolute value; percentages are _not_ allowed."
59172                     }
59173                 }
59174             ],
59175             "references": [
59176                 {
59177                     "name": "MDN Reference",
59178                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/embed"
59179                 }
59180             ]
59181         },
59182         {
59183             "name": "object",
59184             "description": {
59185                 "kind": "markdown",
59186                 "value": "The object element can represent an external resource, which, depending on the type of the resource, will either be treated as an image, as a nested browsing context, or as an external resource to be processed by a plugin."
59187             },
59188             "attributes": [
59189                 {
59190                     "name": "data",
59191                     "description": {
59192                         "kind": "markdown",
59193                         "value": "The address of the resource as a valid URL. At least one of **data** and **type** must be defined."
59194                     }
59195                 },
59196                 {
59197                     "name": "type",
59198                     "description": {
59199                         "kind": "markdown",
59200                         "value": "The [content type](https://developer.mozilla.org/en-US/docs/Glossary/Content_type) of the resource specified by **data**. At least one of **data** and **type** must be defined."
59201                     }
59202                 },
59203                 {
59204                     "name": "typemustmatch",
59205                     "valueSet": "v",
59206                     "description": {
59207                         "kind": "markdown",
59208                         "value": "This Boolean attribute indicates if the **type** attribute and the actual [content type](https://developer.mozilla.org/en-US/docs/Glossary/Content_type) of the resource must match to be used."
59209                     }
59210                 },
59211                 {
59212                     "name": "name",
59213                     "description": {
59214                         "kind": "markdown",
59215                         "value": "The name of valid browsing context (HTML5), or the name of the control (HTML 4)."
59216                     }
59217                 },
59218                 {
59219                     "name": "usemap",
59220                     "description": {
59221                         "kind": "markdown",
59222                         "value": "A hash-name reference to a [`<map>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map \"The HTML <map> element is used with <area> elements to define an image map (a clickable link area).\") element; that is a '#' followed by the value of a [`name`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map#attr-name) of a map element."
59223                     }
59224                 },
59225                 {
59226                     "name": "form",
59227                     "description": {
59228                         "kind": "markdown",
59229                         "value": "The form element, if any, that the object element is associated with (its _form owner_). The value of the attribute must be an ID of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element in the same document."
59230                     }
59231                 },
59232                 {
59233                     "name": "width",
59234                     "description": {
59235                         "kind": "markdown",
59236                         "value": "The width of the display resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). -- (Absolute values only. [NO percentages](https://html.spec.whatwg.org/multipage/embedded-content.html#dimension-attributes))"
59237                     }
59238                 },
59239                 {
59240                     "name": "height",
59241                     "description": {
59242                         "kind": "markdown",
59243                         "value": "The height of the displayed resource, in [CSS pixels](https://drafts.csswg.org/css-values/#px). -- (Absolute values only. [NO percentages](https://html.spec.whatwg.org/multipage/embedded-content.html#dimension-attributes))"
59244                     }
59245                 },
59246                 {
59247                     "name": "archive",
59248                     "description": "A space-separated list of URIs for archives of resources for the object."
59249                 },
59250                 {
59251                     "name": "border",
59252                     "description": "The width of a border around the control, in pixels."
59253                 },
59254                 {
59255                     "name": "classid",
59256                     "description": "The URI of the object's implementation. It can be used together with, or in place of, the **data** attribute."
59257                 },
59258                 {
59259                     "name": "codebase",
59260                     "description": "The base path used to resolve relative URIs specified by **classid**, **data**, or **archive**. If not specified, the default is the base URI of the current document."
59261                 },
59262                 {
59263                     "name": "codetype",
59264                     "description": "The content type of the data specified by **classid**."
59265                 },
59266                 {
59267                     "name": "declare",
59268                     "description": "The presence of this Boolean attribute makes this element a declaration only. The object must be instantiated by a subsequent `<object>` element. In HTML5, repeat the <object> element completely each that that the resource is reused."
59269                 },
59270                 {
59271                     "name": "standby",
59272                     "description": "A message that the browser can show while loading the object's implementation and data."
59273                 },
59274                 {
59275                     "name": "tabindex",
59276                     "description": "The position of the element in the tabbing navigation order for the current document."
59277                 }
59278             ],
59279             "references": [
59280                 {
59281                     "name": "MDN Reference",
59282                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/object"
59283                 }
59284             ]
59285         },
59286         {
59287             "name": "param",
59288             "description": {
59289                 "kind": "markdown",
59290                 "value": "The param element defines parameters for plugins invoked by object elements. It does not represent anything on its own."
59291             },
59292             "attributes": [
59293                 {
59294                     "name": "name",
59295                     "description": {
59296                         "kind": "markdown",
59297                         "value": "Name of the parameter."
59298                     }
59299                 },
59300                 {
59301                     "name": "value",
59302                     "description": {
59303                         "kind": "markdown",
59304                         "value": "Specifies the value of the parameter."
59305                     }
59306                 },
59307                 {
59308                     "name": "type",
59309                     "description": "Only used if the `valuetype` is set to \"ref\". Specifies the MIME type of values found at the URI specified by value."
59310                 },
59311                 {
59312                     "name": "valuetype",
59313                     "description": "Specifies the type of the `value` attribute. Possible values are:\n\n*   data: Default value. The value is passed to the object's implementation as a string.\n*   ref: The value is a URI to a resource where run-time values are stored.\n*   object: An ID of another [`<object>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/object \"The HTML <object> element represents an external resource, which can be treated as an image, a nested browsing context, or a resource to be handled by a plugin.\") in the same document."
59314                 }
59315             ],
59316             "references": [
59317                 {
59318                     "name": "MDN Reference",
59319                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/param"
59320                 }
59321             ]
59322         },
59323         {
59324             "name": "video",
59325             "description": {
59326                 "kind": "markdown",
59327                 "value": "A video element is used for playing videos or movies, and audio files with captions."
59328             },
59329             "attributes": [
59330                 {
59331                     "name": "src"
59332                 },
59333                 {
59334                     "name": "crossorigin",
59335                     "valueSet": "xo"
59336                 },
59337                 {
59338                     "name": "poster"
59339                 },
59340                 {
59341                     "name": "preload",
59342                     "valueSet": "pl"
59343                 },
59344                 {
59345                     "name": "autoplay",
59346                     "valueSet": "v",
59347                     "description": {
59348                         "kind": "markdown",
59349                         "value": "A Boolean attribute; if specified, the video automatically begins to play back as soon as it can do so without stopping to finish loading the data."
59350                     }
59351                 },
59352                 {
59353                     "name": "mediagroup"
59354                 },
59355                 {
59356                     "name": "loop",
59357                     "valueSet": "v"
59358                 },
59359                 {
59360                     "name": "muted",
59361                     "valueSet": "v"
59362                 },
59363                 {
59364                     "name": "controls",
59365                     "valueSet": "v"
59366                 },
59367                 {
59368                     "name": "width"
59369                 },
59370                 {
59371                     "name": "height"
59372                 }
59373             ],
59374             "references": [
59375                 {
59376                     "name": "MDN Reference",
59377                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/video"
59378                 }
59379             ]
59380         },
59381         {
59382             "name": "audio",
59383             "description": {
59384                 "kind": "markdown",
59385                 "value": "An audio element represents a sound or audio stream."
59386             },
59387             "attributes": [
59388                 {
59389                     "name": "src",
59390                     "description": {
59391                         "kind": "markdown",
59392                         "value": "The URL of the audio to embed. This is subject to [HTTP access controls](https://developer.mozilla.org/en-US/docs/HTTP_access_control). This is optional; you may instead use the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source \"The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.\") element within the audio block to specify the audio to embed."
59393                     }
59394                 },
59395                 {
59396                     "name": "crossorigin",
59397                     "valueSet": "xo",
59398                     "description": {
59399                         "kind": "markdown",
59400                         "value": "This enumerated attribute indicates whether to use CORS to fetch the related image. [CORS-enabled resources](https://developer.mozilla.org/en-US/docs/CORS_Enabled_Image) can be reused in the [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas \"Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.\") element without being _tainted_. The allowed values are:\n\nanonymous\n\nSends a cross-origin request without a credential. In other words, it sends the `Origin:` HTTP header without a cookie, X.509 certificate, or performing HTTP Basic authentication. If the server does not give credentials to the origin site (by not setting the `Access-Control-Allow-Origin:` HTTP header), the image will be _tainted_, and its usage restricted.\n\nuse-credentials\n\nSends a cross-origin request with a credential. In other words, it sends the `Origin:` HTTP header with a cookie, a certificate, or performing HTTP Basic authentication. If the server does not give credentials to the origin site (through `Access-Control-Allow-Credentials:` HTTP header), the image will be _tainted_ and its usage restricted.\n\nWhen not present, the resource is fetched without a CORS request (i.e. without sending the `Origin:` HTTP header), preventing its non-tainted used in [`<canvas>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas \"Use the HTML <canvas> element with either the canvas scripting API or the WebGL API to draw graphics and animations.\") elements. If invalid, it is handled as if the enumerated keyword **anonymous** was used. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes) for additional information."
59401                     }
59402                 },
59403                 {
59404                     "name": "preload",
59405                     "valueSet": "pl",
59406                     "description": {
59407                         "kind": "markdown",
59408                         "value": "This enumerated attribute is intended to provide a hint to the browser about what the author thinks will lead to the best user experience. It may have one of the following values:\n\n*   `none`: Indicates that the audio should not be preloaded.\n*   `metadata`: Indicates that only audio metadata (e.g. length) is fetched.\n*   `auto`: Indicates that the whole audio file can be downloaded, even if the user is not expected to use it.\n*   _empty string_: A synonym of the `auto` value.\n\nIf not set, `preload`'s default value is browser-defined (i.e. each browser may have its own default value). The spec advises it to be set to `metadata`.\n\n**Usage notes:**\n\n*   The `autoplay` attribute has precedence over `preload`. If `autoplay` is specified, the browser would obviously need to start downloading the audio for playback.\n*   The browser is not forced by the specification to follow the value of this attribute; it is a mere hint."
59409                     }
59410                 },
59411                 {
59412                     "name": "autoplay",
59413                     "valueSet": "v",
59414                     "description": {
59415                         "kind": "markdown",
59416                         "value": "A Boolean attribute: if specified, the audio will automatically begin playback as soon as it can do so, without waiting for the entire audio file to finish downloading.\n\n**Note**: Sites that automatically play audio (or videos with an audio track) can be an unpleasant experience for users, so should be avoided when possible. If you must offer autoplay functionality, you should make it opt-in (requiring a user to specifically enable it). However, this can be useful when creating media elements whose source will be set at a later time, under user control."
59417                     }
59418                 },
59419                 {
59420                     "name": "mediagroup"
59421                 },
59422                 {
59423                     "name": "loop",
59424                     "valueSet": "v",
59425                     "description": {
59426                         "kind": "markdown",
59427                         "value": "A Boolean attribute: if specified, the audio player will automatically seek back to the start upon reaching the end of the audio."
59428                     }
59429                 },
59430                 {
59431                     "name": "muted",
59432                     "valueSet": "v",
59433                     "description": {
59434                         "kind": "markdown",
59435                         "value": "A Boolean attribute that indicates whether the audio will be initially silenced. Its default value is `false`."
59436                     }
59437                 },
59438                 {
59439                     "name": "controls",
59440                     "valueSet": "v",
59441                     "description": {
59442                         "kind": "markdown",
59443                         "value": "If this attribute is present, the browser will offer controls to allow the user to control audio playback, including volume, seeking, and pause/resume playback."
59444                     }
59445                 }
59446             ],
59447             "references": [
59448                 {
59449                     "name": "MDN Reference",
59450                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/audio"
59451                 }
59452             ]
59453         },
59454         {
59455             "name": "source",
59456             "description": {
59457                 "kind": "markdown",
59458                 "value": "The source element allows authors to specify multiple alternative media resources for media elements. It does not represent anything on its own."
59459             },
59460             "attributes": [
59461                 {
59462                     "name": "src",
59463                     "description": {
59464                         "kind": "markdown",
59465                         "value": "Required for [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio \"The HTML <audio> element is used to embed sound content in documents. It may contain one or more audio sources, represented using the src attribute or the <source> element: the browser will choose the most suitable one. It can also be the destination for streamed media, using a MediaStream.\") and [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video \"The HTML Video element (<video>) embeds a media player which supports video playback into the document.\"), address of the media resource. The value of this attribute is ignored when the `<source>` element is placed inside a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture \"The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.\") element."
59466                     }
59467                 },
59468                 {
59469                     "name": "type",
59470                     "description": {
59471                         "kind": "markdown",
59472                         "value": "The MIME-type of the resource, optionally with a `codecs` parameter. See [RFC 4281](https://tools.ietf.org/html/rfc4281) for information about how to specify codecs."
59473                     }
59474                 },
59475                 {
59476                     "name": "sizes",
59477                     "description": "Is a list of source sizes that describes the final rendered width of the image represented by the source. Each source size consists of a comma-separated list of media condition-length pairs. This information is used by the browser to determine, before laying the page out, which image defined in [`srcset`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source#attr-srcset) to use.  \nThe `sizes` attribute has an effect only when the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source \"The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.\") element is the direct child of a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture \"The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.\") element."
59478                 },
59479                 {
59480                     "name": "srcset",
59481                     "description": "A list of one or more strings separated by commas indicating a set of possible images represented by the source for the browser to use. Each string is composed of:\n\n1.  one URL to an image,\n2.  a width descriptor, that is a positive integer directly followed by `'w'`. The default value, if missing, is the infinity.\n3.  a pixel density descriptor, that is a positive floating number directly followed by `'x'`. The default value, if missing, is `1x`.\n\nEach string in the list must have at least a width descriptor or a pixel density descriptor to be valid. Among the list, there must be only one string containing the same tuple of width descriptor and pixel density descriptor.  \nThe browser chooses the most adequate image to display at a given point of time.  \nThe `srcset` attribute has an effect only when the [`<source>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source \"The HTML <source> element specifies multiple media resources for the <picture>, the <audio> element, or the <video> element.\") element is the direct child of a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture \"The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.\") element."
59482                 },
59483                 {
59484                     "name": "media",
59485                     "description": "[Media query](https://developer.mozilla.org/en-US/docs/CSS/Media_queries) of the resource's intended media; this should be used only in a [`<picture>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/picture \"The HTML <picture> element contains zero or more <source> elements and one <img> element to provide versions of an image for different display/device scenarios.\") element."
59486                 }
59487             ],
59488             "references": [
59489                 {
59490                     "name": "MDN Reference",
59491                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/source"
59492                 }
59493             ]
59494         },
59495         {
59496             "name": "track",
59497             "description": {
59498                 "kind": "markdown",
59499                 "value": "The track element allows authors to specify explicit external timed text tracks for media elements. It does not represent anything on its own."
59500             },
59501             "attributes": [
59502                 {
59503                     "name": "default",
59504                     "valueSet": "v",
59505                     "description": {
59506                         "kind": "markdown",
59507                         "value": "This attribute indicates that the track should be enabled unless the user's preferences indicate that another track is more appropriate. This may only be used on one `track` element per media element."
59508                     }
59509                 },
59510                 {
59511                     "name": "kind",
59512                     "valueSet": "tk",
59513                     "description": {
59514                         "kind": "markdown",
59515                         "value": "How the text track is meant to be used. If omitted the default kind is `subtitles`. If the attribute is not present, it will use the `subtitles`. If the attribute contains an invalid value, it will use `metadata`. (Versions of Chrome earlier than 52 treated an invalid value as `subtitles`.) The following keywords are allowed:\n\n*   `subtitles`\n    *   Subtitles provide translation of content that cannot be understood by the viewer. For example dialogue or text that is not English in an English language film.\n    *   Subtitles may contain additional content, usually extra background information. For example the text at the beginning of the Star Wars films, or the date, time, and location of a scene.\n*   `captions`\n    *   Closed captions provide a transcription and possibly a translation of audio.\n    *   It may include important non-verbal information such as music cues or sound effects. It may indicate the cue's source (e.g. music, text, character).\n    *   Suitable for users who are deaf or when the sound is muted.\n*   `descriptions`\n    *   Textual description of the video content.\n    *   Suitable for users who are blind or where the video cannot be seen.\n*   `chapters`\n    *   Chapter titles are intended to be used when the user is navigating the media resource.\n*   `metadata`\n    *   Tracks used by scripts. Not visible to the user."
59516                     }
59517                 },
59518                 {
59519                     "name": "label",
59520                     "description": {
59521                         "kind": "markdown",
59522                         "value": "A user-readable title of the text track which is used by the browser when listing available text tracks."
59523                     }
59524                 },
59525                 {
59526                     "name": "src",
59527                     "description": {
59528                         "kind": "markdown",
59529                         "value": "Address of the track (`.vtt` file). Must be a valid URL. This attribute must be specified and its URL value must have the same origin as the document — unless the [`<audio>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/audio \"The HTML <audio> element is used to embed sound content in documents. It may contain one or more audio sources, represented using the src attribute or the <source> element: the browser will choose the most suitable one. It can also be the destination for streamed media, using a MediaStream.\") or [`<video>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video \"The HTML Video element (<video>) embeds a media player which supports video playback into the document.\") parent element of the `track` element has a [`crossorigin`](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) attribute."
59530                     }
59531                 },
59532                 {
59533                     "name": "srclang",
59534                     "description": {
59535                         "kind": "markdown",
59536                         "value": "Language of the track text data. It must be a valid [BCP 47](https://r12a.github.io/app-subtags/) language tag. If the `kind` attribute is set to `subtitles,` then `srclang` must be defined."
59537                     }
59538                 }
59539             ],
59540             "references": [
59541                 {
59542                     "name": "MDN Reference",
59543                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/track"
59544                 }
59545             ]
59546         },
59547         {
59548             "name": "map",
59549             "description": {
59550                 "kind": "markdown",
59551                 "value": "The map element, in conjunction with an img element and any area element descendants, defines an image map. The element represents its children."
59552             },
59553             "attributes": [
59554                 {
59555                     "name": "name",
59556                     "description": {
59557                         "kind": "markdown",
59558                         "value": "The name attribute gives the map a name so that it can be referenced. The attribute must be present and must have a non-empty value with no space characters. The value of the name attribute must not be a compatibility-caseless match for the value of the name attribute of another map element in the same document. If the id attribute is also specified, both attributes must have the same value."
59559                     }
59560                 }
59561             ],
59562             "references": [
59563                 {
59564                     "name": "MDN Reference",
59565                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/map"
59566                 }
59567             ]
59568         },
59569         {
59570             "name": "area",
59571             "description": {
59572                 "kind": "markdown",
59573                 "value": "The area element represents either a hyperlink with some text and a corresponding area on an image map, or a dead area on an image map."
59574             },
59575             "attributes": [
59576                 {
59577                     "name": "alt"
59578                 },
59579                 {
59580                     "name": "coords"
59581                 },
59582                 {
59583                     "name": "shape",
59584                     "valueSet": "sh"
59585                 },
59586                 {
59587                     "name": "href"
59588                 },
59589                 {
59590                     "name": "target"
59591                 },
59592                 {
59593                     "name": "download"
59594                 },
59595                 {
59596                     "name": "ping"
59597                 },
59598                 {
59599                     "name": "rel"
59600                 },
59601                 {
59602                     "name": "hreflang"
59603                 },
59604                 {
59605                     "name": "type"
59606                 },
59607                 {
59608                     "name": "accesskey",
59609                     "description": "Specifies a keyboard navigation accelerator for the element. Pressing ALT or a similar key in association with the specified character selects the form control correlated with that key sequence. Page designers are forewarned to avoid key sequences already bound to browsers. This attribute is global since HTML5."
59610                 }
59611             ],
59612             "references": [
59613                 {
59614                     "name": "MDN Reference",
59615                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/area"
59616                 }
59617             ]
59618         },
59619         {
59620             "name": "table",
59621             "description": {
59622                 "kind": "markdown",
59623                 "value": "The table element represents data with more than one dimension, in the form of a table."
59624             },
59625             "attributes": [
59626                 {
59627                     "name": "border"
59628                 },
59629                 {
59630                     "name": "align",
59631                     "description": "This enumerated attribute indicates how the table must be aligned inside the containing document. It may have the following values:\n\n*   left: the table is displayed on the left side of the document;\n*   center: the table is displayed in the center of the document;\n*   right: the table is displayed on the right side of the document.\n\n**Usage Note**\n\n*   **Do not use this attribute**, as it has been deprecated. The [`<table>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/table \"The HTML <table> element represents tabular data — that is, information presented in a two-dimensional table comprised of rows and columns of cells containing data.\") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). Set [`margin-left`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-left \"The margin-left CSS property sets the margin area on the left side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") and [`margin-right`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin-right \"The margin-right CSS property sets the margin area on the right side of an element. A positive value places it farther from its neighbors, while a negative value places it closer.\") to `auto` or [`margin`](https://developer.mozilla.org/en-US/docs/Web/CSS/margin \"The margin CSS property sets the margin area on all four sides of an element. It is a shorthand for margin-top, margin-right, margin-bottom, and margin-left.\") to `0 auto` to achieve an effect that is similar to the align attribute.\n*   Prior to Firefox 4, Firefox also supported the `middle`, `absmiddle`, and `abscenter` values as synonyms of `center`, in quirks mode only."
59632                 }
59633             ],
59634             "references": [
59635                 {
59636                     "name": "MDN Reference",
59637                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/table"
59638                 }
59639             ]
59640         },
59641         {
59642             "name": "caption",
59643             "description": {
59644                 "kind": "markdown",
59645                 "value": "The caption element represents the title of the table that is its parent, if it has a parent and that is a table element."
59646             },
59647             "attributes": [
59648                 {
59649                     "name": "align",
59650                     "description": "This enumerated attribute indicates how the caption must be aligned with respect to the table. It may have one of the following values:\n\n`left`\n\nThe caption is displayed to the left of the table.\n\n`top`\n\nThe caption is displayed above the table.\n\n`right`\n\nThe caption is displayed to the right of the table.\n\n`bottom`\n\nThe caption is displayed below the table.\n\n**Usage note:** Do not use this attribute, as it has been deprecated. The [`<caption>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/caption \"The HTML Table Caption element (<caption>) specifies the caption (or title) of a table, and if used is always the first child of a <table>.\") element should be styled using the [CSS](https://developer.mozilla.org/en-US/docs/CSS) properties [`caption-side`](https://developer.mozilla.org/en-US/docs/Web/CSS/caption-side \"The caption-side CSS property puts the content of a table's <caption> on the specified side. The values are relative to the writing-mode of the table.\") and [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\")."
59651                 }
59652             ],
59653             "references": [
59654                 {
59655                     "name": "MDN Reference",
59656                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/caption"
59657                 }
59658             ]
59659         },
59660         {
59661             "name": "colgroup",
59662             "description": {
59663                 "kind": "markdown",
59664                 "value": "The colgroup element represents a group of one or more columns in the table that is its parent, if it has a parent and that is a table element."
59665             },
59666             "attributes": [
59667                 {
59668                     "name": "span"
59669                 },
59670                 {
59671                     "name": "align",
59672                     "description": "This enumerated attribute specifies how horizontal alignment of each column cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-charoff) attributes Unimplemented (see [bug 2212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 \"character alignment not implemented (align=char, charoff=, text-align:<string>)\")).\n\nIf this attribute is not set, the `left` value is assumed. The descendant [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col \"The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.\") elements may override this value using their own [`align`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-align) attribute.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values:\n    *   Do not try to set the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property on a selector giving a [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup \"The HTML <colgroup> element defines a group of columns within a table.\") element. Because [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td \"The HTML <td> element defines a cell of a table that contains data. It participates in the table model.\") elements are not descendant of the [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup \"The HTML <colgroup> element defines a group of columns within a table.\") element, they won't inherit it.\n    *   If the table doesn't use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, use one `td:nth-child(an+b)` CSS selector per column, where a is the total number of the columns in the table and b is the ordinal position of this column in the table. Only after this selector the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property can be used.\n    *   If the table does use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, the effect can be achieved by combining adequate CSS attribute selectors like `[colspan=n]`, though this is not trivial.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property Unimplemented."
59673                 }
59674             ],
59675             "references": [
59676                 {
59677                     "name": "MDN Reference",
59678                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/colgroup"
59679                 }
59680             ]
59681         },
59682         {
59683             "name": "col",
59684             "description": {
59685                 "kind": "markdown",
59686                 "value": "If a col element has a parent and that is a colgroup element that itself has a parent that is a table element, then the col element represents one or more columns in the column group represented by that colgroup."
59687             },
59688             "attributes": [
59689                 {
59690                     "name": "span"
59691                 },
59692                 {
59693                     "name": "align",
59694                     "description": "This enumerated attribute specifies how horizontal alignment of each column cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-charoff) attributes Unimplemented (see [bug 2212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 \"character alignment not implemented (align=char, charoff=, text-align:<string>)\")).\n\nIf this attribute is not set, its value is inherited from the [`align`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup#attr-align) of the [`<colgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/colgroup \"The HTML <colgroup> element defines a group of columns within a table.\") element this `<col>` element belongs too. If there are none, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values:\n    *   Do not try to set the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property on a selector giving a [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col \"The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.\") element. Because [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td \"The HTML <td> element defines a cell of a table that contains data. It participates in the table model.\") elements are not descendant of the [`<col>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col \"The HTML <col> element defines a column within a table and is used for defining common semantics on all common cells. It is generally found within a <colgroup> element.\") element, they won't inherit it.\n    *   If the table doesn't use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, use the `td:nth-child(an+b)` CSS selector. Set `a` to zero and `b` to the position of the column in the table, e.g. `td:nth-child(2) { text-align: right; }` to right-align the second column.\n    *   If the table does use a [`colspan`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-colspan) attribute, the effect can be achieved by combining adequate CSS attribute selectors like `[colspan=n]`, though this is not trivial.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property Unimplemented."
59695                 }
59696             ],
59697             "references": [
59698                 {
59699                     "name": "MDN Reference",
59700                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/col"
59701                 }
59702             ]
59703         },
59704         {
59705             "name": "tbody",
59706             "description": {
59707                 "kind": "markdown",
59708                 "value": "The tbody element represents a block of rows that consist of a body of data for the parent table element, if the tbody element has a parent and it is a table."
59709             },
59710             "attributes": [
59711                 {
59712                     "name": "align",
59713                     "description": "This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-charoff) attributes.\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property Unimplemented."
59714                 }
59715             ],
59716             "references": [
59717                 {
59718                     "name": "MDN Reference",
59719                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/tbody"
59720                 }
59721             ]
59722         },
59723         {
59724             "name": "thead",
59725             "description": {
59726                 "kind": "markdown",
59727                 "value": "The thead element represents the block of rows that consist of the column labels (headers) for the parent table element, if the thead element has a parent and it is a table."
59728             },
59729             "attributes": [
59730                 {
59731                     "name": "align",
59732                     "description": "This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-charoff) attributes Unimplemented (see [bug 2212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 \"character alignment not implemented (align=char, charoff=, text-align:<string>)\")).\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/thead#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property Unimplemented."
59733                 }
59734             ],
59735             "references": [
59736                 {
59737                     "name": "MDN Reference",
59738                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/thead"
59739                 }
59740             ]
59741         },
59742         {
59743             "name": "tfoot",
59744             "description": {
59745                 "kind": "markdown",
59746                 "value": "The tfoot element represents the block of rows that consist of the column summaries (footers) for the parent table element, if the tfoot element has a parent and it is a table."
59747             },
59748             "attributes": [
59749                 {
59750                     "name": "align",
59751                     "description": "This enumerated attribute specifies how horizontal alignment of each cell content will be handled. Possible values are:\n\n*   `left`, aligning the content to the left of the cell\n*   `center`, centering the content in the cell\n*   `right`, aligning the content to the right of the cell\n*   `justify`, inserting spaces into the textual content so that the content is justified in the cell\n*   `char`, aligning the textual content on a special character with a minimal offset, defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tbody#attr-charoff) attributes Unimplemented (see [bug 2212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 \"character alignment not implemented (align=char, charoff=, text-align:<string>)\")).\n\nIf this attribute is not set, the `left` value is assumed.\n\n**Note:** Do not use this attribute as it is obsolete (not supported) in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property on it.\n*   To achieve the same effect as the `char` value, in CSS3, you can use the value of the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tfoot#attr-char) as the value of the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property Unimplemented."
59752                 }
59753             ],
59754             "references": [
59755                 {
59756                     "name": "MDN Reference",
59757                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/tfoot"
59758                 }
59759             ]
59760         },
59761         {
59762             "name": "tr",
59763             "description": {
59764                 "kind": "markdown",
59765                 "value": "The tr element represents a row of cells in a table."
59766             },
59767             "attributes": [
59768                 {
59769                     "name": "align",
59770                     "description": "A [`DOMString`](https://developer.mozilla.org/en-US/docs/Web/API/DOMString \"DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.\") which specifies how the cell's context should be aligned horizontally within the cells in the row; this is shorthand for using `align` on every cell in the row individually. Possible values are:\n\n`left`\n\nAlign the content of each cell at its left edge.\n\n`center`\n\nCenter the contents of each cell between their left and right edges.\n\n`right`\n\nAlign the content of each cell at its right edge.\n\n`justify`\n\nWiden whitespaces within the text of each cell so that the text fills the full width of each cell (full justification).\n\n`char`\n\nAlign each cell in the row on a specific character (such that each row in the column that is configured this way will horizontally align its cells on that character). This uses the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/tr#attr-charoff) to establish the alignment character (typically \".\" or \",\" when aligning numerical data) and the number of characters that should follow the alignment character. This alignment type was never widely supported.\n\nIf no value is expressly set for `align`, the parent node's value is inherited.\n\nInstead of using the obsolete `align` attribute, you should instead use the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property to establish `left`, `center`, `right`, or `justify` alignment for the row's cells. To apply character-based alignment, set the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property to the alignment character (such as `\".\"` or `\",\"`)."
59771                 }
59772             ],
59773             "references": [
59774                 {
59775                     "name": "MDN Reference",
59776                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/tr"
59777                 }
59778             ]
59779         },
59780         {
59781             "name": "td",
59782             "description": {
59783                 "kind": "markdown",
59784                 "value": "The td element represents a data cell in a table."
59785             },
59786             "attributes": [
59787                 {
59788                     "name": "colspan"
59789                 },
59790                 {
59791                     "name": "rowspan"
59792                 },
59793                 {
59794                     "name": "headers"
59795                 },
59796                 {
59797                     "name": "abbr",
59798                     "description": "This attribute contains a short abbreviated description of the cell's content. Some user-agents, such as speech readers, may present this description before the content itself.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard. Alternatively, you can put the abbreviated description inside the cell and place the long content in the **title** attribute."
59799                 },
59800                 {
59801                     "name": "align",
59802                     "description": "This enumerated attribute specifies how the cell content's horizontal alignment will be handled. Possible values are:\n\n*   `left`: The content is aligned to the left of the cell.\n*   `center`: The content is centered in the cell.\n*   `right`: The content is aligned to the right of the cell.\n*   `justify` (with text only): The content is stretched out inside the cell so that it covers its entire width.\n*   `char` (with text only): The content is aligned to a character inside the `<th>` element with minimal offset. This character is defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-charoff) attributes Unimplemented (see [bug 2212](https://bugzilla.mozilla.org/show_bug.cgi?id=2212 \"character alignment not implemented (align=char, charoff=, text-align:<string>)\")).\n\nThe default value when this attribute is not specified is `left`.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, apply the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property to the element.\n*   To achieve the same effect as the `char` value, give the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property the same value you would use for the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td#attr-char). Unimplemented in CSS3."
59803                 },
59804                 {
59805                     "name": "axis",
59806                     "description": "This attribute contains a list of space-separated strings. Each string is the `id` of a group of cells that this header applies to.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard."
59807                 },
59808                 {
59809                     "name": "bgcolor",
59810                     "description": "This attribute defines the background color of each cell in a column. It consists of a 6-digit hexadecimal code as defined in [sRGB](https://www.w3.org/Graphics/Color/sRGB) and is prefixed by '#'. This attribute may be used with one of sixteen predefined color strings:\n\n \n\n`black` = \"#000000\"\n\n \n\n`green` = \"#008000\"\n\n \n\n`silver` = \"#C0C0C0\"\n\n \n\n`lime` = \"#00FF00\"\n\n \n\n`gray` = \"#808080\"\n\n \n\n`olive` = \"#808000\"\n\n \n\n`white` = \"#FFFFFF\"\n\n \n\n`yellow` = \"#FFFF00\"\n\n \n\n`maroon` = \"#800000\"\n\n \n\n`navy` = \"#000080\"\n\n \n\n`red` = \"#FF0000\"\n\n \n\n`blue` = \"#0000FF\"\n\n \n\n`purple` = \"#800080\"\n\n \n\n`teal` = \"#008080\"\n\n \n\n`fuchsia` = \"#FF00FF\"\n\n \n\n`aqua` = \"#00FFFF\"\n\n**Note:** Do not use this attribute, as it is non-standard and only implemented in some versions of Microsoft Internet Explorer: The [`<td>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/td \"The HTML <td> element defines a cell of a table that contains data. It participates in the table model.\") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/CSS). To create a similar effect use the [`background-color`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color \"The background-color CSS property sets the background color of an element.\") property in [CSS](https://developer.mozilla.org/en-US/docs/CSS) instead."
59811                 }
59812             ],
59813             "references": [
59814                 {
59815                     "name": "MDN Reference",
59816                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/td"
59817                 }
59818             ]
59819         },
59820         {
59821             "name": "th",
59822             "description": {
59823                 "kind": "markdown",
59824                 "value": "The th element represents a header cell in a table."
59825             },
59826             "attributes": [
59827                 {
59828                     "name": "colspan"
59829                 },
59830                 {
59831                     "name": "rowspan"
59832                 },
59833                 {
59834                     "name": "headers"
59835                 },
59836                 {
59837                     "name": "scope",
59838                     "valueSet": "s"
59839                 },
59840                 {
59841                     "name": "sorted"
59842                 },
59843                 {
59844                     "name": "abbr",
59845                     "description": {
59846                         "kind": "markdown",
59847                         "value": "This attribute contains a short abbreviated description of the cell's content. Some user-agents, such as speech readers, may present this description before the content itself."
59848                     }
59849                 },
59850                 {
59851                     "name": "align",
59852                     "description": "This enumerated attribute specifies how the cell content's horizontal alignment will be handled. Possible values are:\n\n*   `left`: The content is aligned to the left of the cell.\n*   `center`: The content is centered in the cell.\n*   `right`: The content is aligned to the right of the cell.\n*   `justify` (with text only): The content is stretched out inside the cell so that it covers its entire width.\n*   `char` (with text only): The content is aligned to a character inside the `<th>` element with minimal offset. This character is defined by the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-char) and [`charoff`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-charoff) attributes.\n\nThe default value when this attribute is not specified is `left`.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard.\n\n*   To achieve the same effect as the `left`, `center`, `right` or `justify` values, apply the CSS [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property to the element.\n*   To achieve the same effect as the `char` value, give the [`text-align`](https://developer.mozilla.org/en-US/docs/Web/CSS/text-align \"The text-align CSS property sets the horizontal alignment of an inline or table-cell box. This means it works like vertical-align but in the horizontal direction.\") property the same value you would use for the [`char`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-char). Unimplemented in CSS3."
59853                 },
59854                 {
59855                     "name": "axis",
59856                     "description": "This attribute contains a list of space-separated strings. Each string is the `id` of a group of cells that this header applies to.\n\n**Note:** Do not use this attribute as it is obsolete in the latest standard: use the [`scope`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th#attr-scope) attribute instead."
59857                 },
59858                 {
59859                     "name": "bgcolor",
59860                     "description": "This attribute defines the background color of each cell in a column. It consists of a 6-digit hexadecimal code as defined in [sRGB](https://www.w3.org/Graphics/Color/sRGB) and is prefixed by '#'. This attribute may be used with one of sixteen predefined color strings:\n\n \n\n`black` = \"#000000\"\n\n \n\n`green` = \"#008000\"\n\n \n\n`silver` = \"#C0C0C0\"\n\n \n\n`lime` = \"#00FF00\"\n\n \n\n`gray` = \"#808080\"\n\n \n\n`olive` = \"#808000\"\n\n \n\n`white` = \"#FFFFFF\"\n\n \n\n`yellow` = \"#FFFF00\"\n\n \n\n`maroon` = \"#800000\"\n\n \n\n`navy` = \"#000080\"\n\n \n\n`red` = \"#FF0000\"\n\n \n\n`blue` = \"#0000FF\"\n\n \n\n`purple` = \"#800080\"\n\n \n\n`teal` = \"#008080\"\n\n \n\n`fuchsia` = \"#FF00FF\"\n\n \n\n`aqua` = \"#00FFFF\"\n\n**Note:** Do not use this attribute, as it is non-standard and only implemented in some versions of Microsoft Internet Explorer: The [`<th>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/th \"The HTML <th> element defines a cell as header of a group of table cells. The exact nature of this group is defined by the scope and headers attributes.\") element should be styled using [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS). To create a similar effect use the [`background-color`](https://developer.mozilla.org/en-US/docs/Web/CSS/background-color \"The background-color CSS property sets the background color of an element.\") property in [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) instead."
59861                 }
59862             ],
59863             "references": [
59864                 {
59865                     "name": "MDN Reference",
59866                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/th"
59867                 }
59868             ]
59869         },
59870         {
59871             "name": "form",
59872             "description": {
59873                 "kind": "markdown",
59874                 "value": "The form element represents a collection of form-associated elements, some of which can represent editable values that can be submitted to a server for processing."
59875             },
59876             "attributes": [
59877                 {
59878                     "name": "accept-charset",
59879                     "description": {
59880                         "kind": "markdown",
59881                         "value": "A space- or comma-delimited list of character encodings that the server accepts. The browser uses them in the order in which they are listed. The default value, the reserved string `\"UNKNOWN\"`, indicates the same encoding as that of the document containing the form element.  \nIn previous versions of HTML, the different character encodings could be delimited by spaces or commas. In HTML5, only spaces are allowed as delimiters."
59882                     }
59883                 },
59884                 {
59885                     "name": "action",
59886                     "description": {
59887                         "kind": "markdown",
59888                         "value": "The URI of a program that processes the form information. This value can be overridden by a [`formaction`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formaction) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element."
59889                     }
59890                 },
59891                 {
59892                     "name": "autocomplete",
59893                     "valueSet": "o",
59894                     "description": {
59895                         "kind": "markdown",
59896                         "value": "Indicates whether input elements can by default have their values automatically completed by the browser. This setting can be overridden by an `autocomplete` attribute on an element belonging to the form. Possible values are:\n\n*   `off`: The user must explicitly enter a value into each field for every use, or the document provides its own auto-completion method; the browser does not automatically complete entries.\n*   `on`: The browser can automatically complete values based on values that the user has previously entered in the form.\n\nFor most modern browsers (including Firefox 38+, Google Chrome 34+, IE 11+) setting the autocomplete attribute will not prevent a browser's password manager from asking the user if they want to store login fields (username and password), if the user permits the storage the browser will autofill the login the next time the user visits the page. See [The autocomplete attribute and login fields](https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion#The_autocomplete_attribute_and_login_fields)."
59897                     }
59898                 },
59899                 {
59900                     "name": "enctype",
59901                     "valueSet": "et",
59902                     "description": {
59903                         "kind": "markdown",
59904                         "value": "When the value of the `method` attribute is `post`, enctype is the [MIME type](https://en.wikipedia.org/wiki/Mime_type) of content that is used to submit the form to the server. Possible values are:\n\n*   `application/x-www-form-urlencoded`: The default value if the attribute is not specified.\n*   `multipart/form-data`: The value used for an [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element with the `type` attribute set to \"file\".\n*   `text/plain`: (HTML5)\n\nThis value can be overridden by a [`formenctype`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formenctype) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element."
59905                     }
59906                 },
59907                 {
59908                     "name": "method",
59909                     "valueSet": "m",
59910                     "description": {
59911                         "kind": "markdown",
59912                         "value": "The [HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP) method that the browser uses to submit the form. Possible values are:\n\n*   `post`: Corresponds to the HTTP [POST method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5) ; form data are included in the body of the form and sent to the server.\n*   `get`: Corresponds to the HTTP [GET method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3); form data are appended to the `action` attribute URI with a '?' as separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters.\n*   `dialog`: Use when the form is inside a [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog \"The HTML <dialog> element represents a dialog box or other interactive component, such as an inspector or window.\") element to close the dialog when submitted.\n\nThis value can be overridden by a [`formmethod`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formmethod) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element."
59913                     }
59914                 },
59915                 {
59916                     "name": "name",
59917                     "description": {
59918                         "kind": "markdown",
59919                         "value": "The name of the form. In HTML 4, its use is deprecated (`id` should be used instead). It must be unique among the forms in a document and not just an empty string in HTML 5."
59920                     }
59921                 },
59922                 {
59923                     "name": "novalidate",
59924                     "valueSet": "v",
59925                     "description": {
59926                         "kind": "markdown",
59927                         "value": "This Boolean attribute indicates that the form is not to be validated when submitted. If this attribute is not specified (and therefore the form is validated), this default setting can be overridden by a [`formnovalidate`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formnovalidate) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element belonging to the form."
59928                     }
59929                 },
59930                 {
59931                     "name": "target",
59932                     "description": {
59933                         "kind": "markdown",
59934                         "value": "A name or keyword indicating where to display the response that is received after submitting the form. In HTML 4, this is the name/keyword for a frame. In HTML5, it is a name/keyword for a _browsing context_ (for example, tab, window, or inline frame). The following keywords have special meanings:\n\n*   `_self`: Load the response into the same HTML 4 frame (or HTML5 browsing context) as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the response into a new unnamed HTML 4 window or HTML5 browsing context.\n*   `_parent`: Load the response into the HTML 4 frameset parent of the current frame, or HTML5 parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: HTML 4: Load the response into the full original window, and cancel all other frames. HTML5: Load the response into the top-level browsing context (i.e., the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`.\n*   _iframename_: The response is displayed in a named [`<iframe>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe \"The HTML Inline Frame element (<iframe>) represents a nested browsing context, embedding another HTML page into the current one.\").\n\nHTML5: This value can be overridden by a [`formtarget`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-formtarget) attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") or [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element."
59935                     }
59936                 },
59937                 {
59938                     "name": "accept",
59939                     "description": "A comma-separated list of content types that the server accepts.\n\n**Usage note:** This attribute has been removed in HTML5 and should no longer be used. Instead, use the [`accept`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-accept) attribute of the specific [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element."
59940                 },
59941                 {
59942                     "name": "autocapitalize",
59943                     "description": "This is a nonstandard attribute used by iOS Safari Mobile which controls whether and how the text value for textual form control descendants should be automatically capitalized as it is entered/edited by the user. If the `autocapitalize` attribute is specified on an individual form control descendant, it trumps the form-wide `autocapitalize` setting. The non-deprecated values are available in iOS 5 and later. The default value is `sentences`. Possible values are:\n\n*   `none`: Completely disables automatic capitalization\n*   `sentences`: Automatically capitalize the first letter of sentences.\n*   `words`: Automatically capitalize the first letter of words.\n*   `characters`: Automatically capitalize all characters.\n*   `on`: Deprecated since iOS 5.\n*   `off`: Deprecated since iOS 5."
59944                 }
59945             ],
59946             "references": [
59947                 {
59948                     "name": "MDN Reference",
59949                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/form"
59950                 }
59951             ]
59952         },
59953         {
59954             "name": "label",
59955             "description": {
59956                 "kind": "markdown",
59957                 "value": "The label element represents a caption in a user interface. The caption can be associated with a specific form control, known as the label element's labeled control, either using the for attribute, or by putting the form control inside the label element itself."
59958             },
59959             "attributes": [
59960                 {
59961                     "name": "form",
59962                     "description": {
59963                         "kind": "markdown",
59964                         "value": "The [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element with which the label is associated (its _form owner_). If specified, the value of the attribute is the `id` of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element in the same document. This lets you place label elements anywhere within a document, not just as descendants of their form elements."
59965                     }
59966                 },
59967                 {
59968                     "name": "for",
59969                     "description": {
59970                         "kind": "markdown",
59971                         "value": "The [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes#attr-id) of a [labelable](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form_labelable) form-related element in the same document as the `<label>` element. The first element in the document with an `id` matching the value of the `for` attribute is the _labeled control_ for this label element, if it is a labelable element. If it is not labelable then the `for` attribute has no effect. If there are other elements which also match the `id` value, later in the document, they are not considered.\n\n**Note**: A `<label>` element can have both a `for` attribute and a contained control element, as long as the `for` attribute points to the contained control element."
59972                     }
59973                 }
59974             ],
59975             "references": [
59976                 {
59977                     "name": "MDN Reference",
59978                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/label"
59979                 }
59980             ]
59981         },
59982         {
59983             "name": "input",
59984             "description": {
59985                 "kind": "markdown",
59986                 "value": "The input element represents a typed data field, usually with a form control to allow the user to edit the data."
59987             },
59988             "attributes": [
59989                 {
59990                     "name": "accept"
59991                 },
59992                 {
59993                     "name": "alt"
59994                 },
59995                 {
59996                     "name": "autocomplete",
59997                     "valueSet": "inputautocomplete"
59998                 },
59999                 {
60000                     "name": "autofocus",
60001                     "valueSet": "v"
60002                 },
60003                 {
60004                     "name": "checked",
60005                     "valueSet": "v"
60006                 },
60007                 {
60008                     "name": "dirname"
60009                 },
60010                 {
60011                     "name": "disabled",
60012                     "valueSet": "v"
60013                 },
60014                 {
60015                     "name": "form"
60016                 },
60017                 {
60018                     "name": "formaction"
60019                 },
60020                 {
60021                     "name": "formenctype",
60022                     "valueSet": "et"
60023                 },
60024                 {
60025                     "name": "formmethod",
60026                     "valueSet": "fm"
60027                 },
60028                 {
60029                     "name": "formnovalidate",
60030                     "valueSet": "v"
60031                 },
60032                 {
60033                     "name": "formtarget"
60034                 },
60035                 {
60036                     "name": "height"
60037                 },
60038                 {
60039                     "name": "inputmode",
60040                     "valueSet": "im"
60041                 },
60042                 {
60043                     "name": "list"
60044                 },
60045                 {
60046                     "name": "max"
60047                 },
60048                 {
60049                     "name": "maxlength"
60050                 },
60051                 {
60052                     "name": "min"
60053                 },
60054                 {
60055                     "name": "minlength"
60056                 },
60057                 {
60058                     "name": "multiple",
60059                     "valueSet": "v"
60060                 },
60061                 {
60062                     "name": "name"
60063                 },
60064                 {
60065                     "name": "pattern"
60066                 },
60067                 {
60068                     "name": "placeholder"
60069                 },
60070                 {
60071                     "name": "readonly",
60072                     "valueSet": "v"
60073                 },
60074                 {
60075                     "name": "required",
60076                     "valueSet": "v"
60077                 },
60078                 {
60079                     "name": "size"
60080                 },
60081                 {
60082                     "name": "src"
60083                 },
60084                 {
60085                     "name": "step"
60086                 },
60087                 {
60088                     "name": "type",
60089                     "valueSet": "t"
60090                 },
60091                 {
60092                     "name": "value"
60093                 },
60094                 {
60095                     "name": "width"
60096                 }
60097             ],
60098             "references": [
60099                 {
60100                     "name": "MDN Reference",
60101                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/input"
60102                 }
60103             ]
60104         },
60105         {
60106             "name": "button",
60107             "description": {
60108                 "kind": "markdown",
60109                 "value": "The button element represents a button labeled by its contents."
60110             },
60111             "attributes": [
60112                 {
60113                     "name": "autofocus",
60114                     "valueSet": "v",
60115                     "description": {
60116                         "kind": "markdown",
60117                         "value": "This Boolean attribute lets you specify that the button should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified."
60118                     }
60119                 },
60120                 {
60121                     "name": "disabled",
60122                     "valueSet": "v",
60123                     "description": {
60124                         "kind": "markdown",
60125                         "value": "This Boolean attribute indicates that the user cannot interact with the button. If this attribute is not specified, the button inherits its setting from the containing element, for example [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset \"The HTML <fieldset> element is used to group several controls as well as labels (<label>) within a web form.\"); if there is no containing element with the **disabled** attribute set, then the button is enabled.\n\nFirefox will, unlike other browsers, by default, [persist the dynamic disabled state](https://stackoverflow.com/questions/5985839/bug-with-firefox-disabled-attribute-of-input-not-resetting-when-refreshing) of a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") across page loads. Use the [`autocomplete`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-autocomplete) attribute to control this feature."
60126                     }
60127                 },
60128                 {
60129                     "name": "form",
60130                     "description": {
60131                         "kind": "markdown",
60132                         "value": "The form element that the button is associated with (its _form owner_). The value of the attribute must be the **id** attribute of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element in the same document. If this attribute is not specified, the `<button>` element will be associated to an ancestor [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element, if one exists. This attribute enables you to associate `<button>` elements to [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") elements anywhere within a document, not just as descendants of [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") elements."
60133                     }
60134                 },
60135                 {
60136                     "name": "formaction",
60137                     "description": {
60138                         "kind": "markdown",
60139                         "value": "The URI of a program that processes the information submitted by the button. If specified, it overrides the [`action`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-action) attribute of the button's form owner."
60140                     }
60141                 },
60142                 {
60143                     "name": "formenctype",
60144                     "valueSet": "et",
60145                     "description": {
60146                         "kind": "markdown",
60147                         "value": "If the button is a submit button, this attribute specifies the type of content that is used to submit the form to the server. Possible values are:\n\n*   `application/x-www-form-urlencoded`: The default value if the attribute is not specified.\n*   `multipart/form-data`: Use this value if you are using an [`<input>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") element with the [`type`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type) attribute set to `file`.\n*   `text/plain`\n\nIf this attribute is specified, it overrides the [`enctype`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-enctype) attribute of the button's form owner."
60148                     }
60149                 },
60150                 {
60151                     "name": "formmethod",
60152                     "valueSet": "fm",
60153                     "description": {
60154                         "kind": "markdown",
60155                         "value": "If the button is a submit button, this attribute specifies the HTTP method that the browser uses to submit the form. Possible values are:\n\n*   `post`: The data from the form are included in the body of the form and sent to the server.\n*   `get`: The data from the form are appended to the **form** attribute URI, with a '?' as a separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters.\n\nIf specified, this attribute overrides the [`method`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-method) attribute of the button's form owner."
60156                     }
60157                 },
60158                 {
60159                     "name": "formnovalidate",
60160                     "valueSet": "v",
60161                     "description": {
60162                         "kind": "markdown",
60163                         "value": "If the button is a submit button, this Boolean attribute specifies that the form is not to be validated when it is submitted. If this attribute is specified, it overrides the [`novalidate`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate) attribute of the button's form owner."
60164                     }
60165                 },
60166                 {
60167                     "name": "formtarget",
60168                     "description": {
60169                         "kind": "markdown",
60170                         "value": "If the button is a submit button, this attribute is a name or keyword indicating where to display the response that is received after submitting the form. This is a name of, or keyword for, a _browsing context_ (for example, tab, window, or inline frame). If this attribute is specified, it overrides the [`target`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-target) attribute of the button's form owner. The following keywords have special meanings:\n\n*   `_self`: Load the response into the same browsing context as the current one. This value is the default if the attribute is not specified.\n*   `_blank`: Load the response into a new unnamed browsing context.\n*   `_parent`: Load the response into the parent browsing context of the current one. If there is no parent, this option behaves the same way as `_self`.\n*   `_top`: Load the response into the top-level browsing context (that is, the browsing context that is an ancestor of the current one, and has no parent). If there is no parent, this option behaves the same way as `_self`."
60171                     }
60172                 },
60173                 {
60174                     "name": "name",
60175                     "description": {
60176                         "kind": "markdown",
60177                         "value": "The name of the button, which is submitted with the form data."
60178                     }
60179                 },
60180                 {
60181                     "name": "type",
60182                     "valueSet": "bt",
60183                     "description": {
60184                         "kind": "markdown",
60185                         "value": "The type of the button. Possible values are:\n\n*   `submit`: The button submits the form data to the server. This is the default if the attribute is not specified, or if the attribute is dynamically changed to an empty or invalid value.\n*   `reset`: The button resets all the controls to their initial values.\n*   `button`: The button has no default behavior. It can have client-side scripts associated with the element's events, which are triggered when the events occur."
60186                     }
60187                 },
60188                 {
60189                     "name": "value",
60190                     "description": {
60191                         "kind": "markdown",
60192                         "value": "The initial value of the button. It defines the value associated with the button which is submitted with the form data. This value is passed to the server in params when the form is submitted."
60193                     }
60194                 },
60195                 {
60196                     "name": "autocomplete",
60197                     "description": "The use of this attribute on a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") is nonstandard and Firefox-specific. By default, unlike other browsers, [Firefox persists the dynamic disabled state](https://stackoverflow.com/questions/5985839/bug-with-firefox-disabled-attribute-of-input-not-resetting-when-refreshing) of a [`<button>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button \"The HTML <button> element represents a clickable button, which can be used in forms or anywhere in a document that needs simple, standard button functionality.\") across page loads. Setting the value of this attribute to `off` (i.e. `autocomplete=\"off\"`) disables this feature. See [bug 654072](https://bugzilla.mozilla.org/show_bug.cgi?id=654072 \"if disabled state is changed with javascript, the normal state doesn't return after refreshing the page\")."
60198                 }
60199             ],
60200             "references": [
60201                 {
60202                     "name": "MDN Reference",
60203                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/button"
60204                 }
60205             ]
60206         },
60207         {
60208             "name": "select",
60209             "description": {
60210                 "kind": "markdown",
60211                 "value": "The select element represents a control for selecting amongst a set of options."
60212             },
60213             "attributes": [
60214                 {
60215                     "name": "autocomplete",
60216                     "valueSet": "inputautocomplete",
60217                     "description": {
60218                         "kind": "markdown",
60219                         "value": "A [`DOMString`](https://developer.mozilla.org/en-US/docs/Web/API/DOMString \"DOMString is a UTF-16 String. As JavaScript already uses such strings, DOMString is mapped directly to a String.\") providing a hint for a [user agent's](https://developer.mozilla.org/en-US/docs/Glossary/user_agent \"user agent's: A user agent is a computer program representing a person, for example, a browser in a Web context.\") autocomplete feature. See [The HTML autocomplete attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete) for a complete list of values and details on how to use autocomplete."
60220                     }
60221                 },
60222                 {
60223                     "name": "autofocus",
60224                     "valueSet": "v",
60225                     "description": {
60226                         "kind": "markdown",
60227                         "value": "This Boolean attribute lets you specify that a form control should have input focus when the page loads. Only one form element in a document can have the `autofocus` attribute."
60228                     }
60229                 },
60230                 {
60231                     "name": "disabled",
60232                     "valueSet": "v",
60233                     "description": {
60234                         "kind": "markdown",
60235                         "value": "This Boolean attribute indicates that the user cannot interact with the control. If this attribute is not specified, the control inherits its setting from the containing element, for example `fieldset`; if there is no containing element with the `disabled` attribute set, then the control is enabled."
60236                     }
60237                 },
60238                 {
60239                     "name": "form",
60240                     "description": {
60241                         "kind": "markdown",
60242                         "value": "This attribute lets you specify the form element to which the select element is associated (that is, its \"form owner\"). If this attribute is specified, its value must be the same as the `id` of a form element in the same document. This enables you to place select elements anywhere within a document, not just as descendants of their form elements."
60243                     }
60244                 },
60245                 {
60246                     "name": "multiple",
60247                     "valueSet": "v",
60248                     "description": {
60249                         "kind": "markdown",
60250                         "value": "This Boolean attribute indicates that multiple options can be selected in the list. If it is not specified, then only one option can be selected at a time. When `multiple` is specified, most browsers will show a scrolling list box instead of a single line dropdown."
60251                     }
60252                 },
60253                 {
60254                     "name": "name",
60255                     "description": {
60256                         "kind": "markdown",
60257                         "value": "This attribute is used to specify the name of the control."
60258                     }
60259                 },
60260                 {
60261                     "name": "required",
60262                     "valueSet": "v",
60263                     "description": {
60264                         "kind": "markdown",
60265                         "value": "A Boolean attribute indicating that an option with a non-empty string value must be selected."
60266                     }
60267                 },
60268                 {
60269                     "name": "size",
60270                     "description": {
60271                         "kind": "markdown",
60272                         "value": "If the control is presented as a scrolling list box (e.g. when `multiple` is specified), this attribute represents the number of rows in the list that should be visible at one time. Browsers are not required to present a select element as a scrolled list box. The default value is 0.\n\n**Note:** According to the HTML5 specification, the default value for size should be 1; however, in practice, this has been found to break some web sites, and no other browser currently does that, so Mozilla has opted to continue to return 0 for the time being with Firefox."
60273                     }
60274                 }
60275             ],
60276             "references": [
60277                 {
60278                     "name": "MDN Reference",
60279                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/select"
60280                 }
60281             ]
60282         },
60283         {
60284             "name": "datalist",
60285             "description": {
60286                 "kind": "markdown",
60287                 "value": "The datalist element represents a set of option elements that represent predefined options for other controls. In the rendering, the datalist element represents nothing and it, along with its children, should be hidden."
60288             },
60289             "attributes": [],
60290             "references": [
60291                 {
60292                     "name": "MDN Reference",
60293                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/datalist"
60294                 }
60295             ]
60296         },
60297         {
60298             "name": "optgroup",
60299             "description": {
60300                 "kind": "markdown",
60301                 "value": "The optgroup element represents a group of option elements with a common label."
60302             },
60303             "attributes": [
60304                 {
60305                     "name": "disabled",
60306                     "valueSet": "v",
60307                     "description": {
60308                         "kind": "markdown",
60309                         "value": "If this Boolean attribute is set, none of the items in this option group is selectable. Often browsers grey out such control and it won't receive any browsing events, like mouse clicks or focus-related ones."
60310                     }
60311                 },
60312                 {
60313                     "name": "label",
60314                     "description": {
60315                         "kind": "markdown",
60316                         "value": "The name of the group of options, which the browser can use when labeling the options in the user interface. This attribute is mandatory if this element is used."
60317                     }
60318                 }
60319             ],
60320             "references": [
60321                 {
60322                     "name": "MDN Reference",
60323                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/optgroup"
60324                 }
60325             ]
60326         },
60327         {
60328             "name": "option",
60329             "description": {
60330                 "kind": "markdown",
60331                 "value": "The option element represents an option in a select element or as part of a list of suggestions in a datalist element."
60332             },
60333             "attributes": [
60334                 {
60335                     "name": "disabled",
60336                     "valueSet": "v",
60337                     "description": {
60338                         "kind": "markdown",
60339                         "value": "If this Boolean attribute is set, this option is not checkable. Often browsers grey out such control and it won't receive any browsing event, like mouse clicks or focus-related ones. If this attribute is not set, the element can still be disabled if one of its ancestors is a disabled [`<optgroup>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/optgroup \"The HTML <optgroup> element creates a grouping of options within a <select> element.\") element."
60340                     }
60341                 },
60342                 {
60343                     "name": "label",
60344                     "description": {
60345                         "kind": "markdown",
60346                         "value": "This attribute is text for the label indicating the meaning of the option. If the `label` attribute isn't defined, its value is that of the element text content."
60347                     }
60348                 },
60349                 {
60350                     "name": "selected",
60351                     "valueSet": "v",
60352                     "description": {
60353                         "kind": "markdown",
60354                         "value": "If present, this Boolean attribute indicates that the option is initially selected. If the `<option>` element is the descendant of a [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select \"The HTML <select> element represents a control that provides a menu of options\") element whose [`multiple`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select#attr-multiple) attribute is not set, only one single `<option>` of this [`<select>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select \"The HTML <select> element represents a control that provides a menu of options\") element may have the `selected` attribute."
60355                     }
60356                 },
60357                 {
60358                     "name": "value",
60359                     "description": {
60360                         "kind": "markdown",
60361                         "value": "The content of this attribute represents the value to be submitted with the form, should this option be selected. If this attribute is omitted, the value is taken from the text content of the option element."
60362                     }
60363                 }
60364             ],
60365             "references": [
60366                 {
60367                     "name": "MDN Reference",
60368                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/option"
60369                 }
60370             ]
60371         },
60372         {
60373             "name": "textarea",
60374             "description": {
60375                 "kind": "markdown",
60376                 "value": "The textarea element represents a multiline plain text edit control for the element's raw value. The contents of the control represent the control's default value."
60377             },
60378             "attributes": [
60379                 {
60380                     "name": "autocomplete",
60381                     "valueSet": "inputautocomplete",
60382                     "description": {
60383                         "kind": "markdown",
60384                         "value": "This attribute indicates whether the value of the control can be automatically completed by the browser. Possible values are:\n\n*   `off`: The user must explicitly enter a value into this field for every use, or the document provides its own auto-completion method; the browser does not automatically complete the entry.\n*   `on`: The browser can automatically complete the value based on values that the user has entered during previous uses.\n\nIf the `autocomplete` attribute is not specified on a `<textarea>` element, then the browser uses the `autocomplete` attribute value of the `<textarea>` element's form owner. The form owner is either the [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element that this `<textarea>` element is a descendant of or the form element whose `id` is specified by the `form` attribute of the input element. For more information, see the [`autocomplete`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-autocomplete) attribute in [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\")."
60385                     }
60386                 },
60387                 {
60388                     "name": "autofocus",
60389                     "valueSet": "v",
60390                     "description": {
60391                         "kind": "markdown",
60392                         "value": "This Boolean attribute lets you specify that a form control should have input focus when the page loads. Only one form-associated element in a document can have this attribute specified."
60393                     }
60394                 },
60395                 {
60396                     "name": "cols",
60397                     "description": {
60398                         "kind": "markdown",
60399                         "value": "The visible width of the text control, in average character widths. If it is specified, it must be a positive integer. If it is not specified, the default value is `20`."
60400                     }
60401                 },
60402                 {
60403                     "name": "dirname"
60404                 },
60405                 {
60406                     "name": "disabled",
60407                     "valueSet": "v",
60408                     "description": {
60409                         "kind": "markdown",
60410                         "value": "This Boolean attribute indicates that the user cannot interact with the control. If this attribute is not specified, the control inherits its setting from the containing element, for example [`<fieldset>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset \"The HTML <fieldset> element is used to group several controls as well as labels (<label>) within a web form.\"); if there is no containing element when the `disabled` attribute is set, the control is enabled."
60411                     }
60412                 },
60413                 {
60414                     "name": "form",
60415                     "description": {
60416                         "kind": "markdown",
60417                         "value": "The form element that the `<textarea>` element is associated with (its \"form owner\"). The value of the attribute must be the `id` of a form element in the same document. If this attribute is not specified, the `<textarea>` element must be a descendant of a form element. This attribute enables you to place `<textarea>` elements anywhere within a document, not just as descendants of form elements."
60418                     }
60419                 },
60420                 {
60421                     "name": "inputmode",
60422                     "valueSet": "im"
60423                 },
60424                 {
60425                     "name": "maxlength",
60426                     "description": {
60427                         "kind": "markdown",
60428                         "value": "The maximum number of characters (unicode code points) that the user can enter. If this value isn't specified, the user can enter an unlimited number of characters."
60429                     }
60430                 },
60431                 {
60432                     "name": "minlength",
60433                     "description": {
60434                         "kind": "markdown",
60435                         "value": "The minimum number of characters (unicode code points) required that the user should enter."
60436                     }
60437                 },
60438                 {
60439                     "name": "name",
60440                     "description": {
60441                         "kind": "markdown",
60442                         "value": "The name of the control."
60443                     }
60444                 },
60445                 {
60446                     "name": "placeholder",
60447                     "description": {
60448                         "kind": "markdown",
60449                         "value": "A hint to the user of what can be entered in the control. Carriage returns or line-feeds within the placeholder text must be treated as line breaks when rendering the hint.\n\n**Note:** Placeholders should only be used to show an example of the type of data that should be entered into a form; they are _not_ a substitute for a proper [`<label>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label \"The HTML <label> element represents a caption for an item in a user interface.\") element tied to the input. See [Labels and placeholders](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Labels_and_placeholders \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") in [<input>: The Input (Form Input) element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") for a full explanation."
60450                     }
60451                 },
60452                 {
60453                     "name": "readonly",
60454                     "valueSet": "v",
60455                     "description": {
60456                         "kind": "markdown",
60457                         "value": "This Boolean attribute indicates that the user cannot modify the value of the control. Unlike the `disabled` attribute, the `readonly` attribute does not prevent the user from clicking or selecting in the control. The value of a read-only control is still submitted with the form."
60458                     }
60459                 },
60460                 {
60461                     "name": "required",
60462                     "valueSet": "v",
60463                     "description": {
60464                         "kind": "markdown",
60465                         "value": "This attribute specifies that the user must fill in a value before submitting a form."
60466                     }
60467                 },
60468                 {
60469                     "name": "rows",
60470                     "description": {
60471                         "kind": "markdown",
60472                         "value": "The number of visible text lines for the control."
60473                     }
60474                 },
60475                 {
60476                     "name": "wrap",
60477                     "valueSet": "w",
60478                     "description": {
60479                         "kind": "markdown",
60480                         "value": "Indicates how the control wraps text. Possible values are:\n\n*   `hard`: The browser automatically inserts line breaks (CR+LF) so that each line has no more than the width of the control; the `cols` attribute must also be specified for this to take effect.\n*   `soft`: The browser ensures that all line breaks in the value consist of a CR+LF pair, but does not insert any additional line breaks.\n*   `off` : Like `soft` but changes appearance to `white-space: pre` so line segments exceeding `cols` are not wrapped and the `<textarea>` becomes horizontally scrollable.\n\nIf this attribute is not specified, `soft` is its default value."
60481                     }
60482                 },
60483                 {
60484                     "name": "autocapitalize",
60485                     "description": "This is a non-standard attribute supported by WebKit on iOS (therefore nearly all browsers running on iOS, including Safari, Firefox, and Chrome), which controls whether and how the text value should be automatically capitalized as it is entered/edited by the user. The non-deprecated values are available in iOS 5 and later. Possible values are:\n\n*   `none`: Completely disables automatic capitalization.\n*   `sentences`: Automatically capitalize the first letter of sentences.\n*   `words`: Automatically capitalize the first letter of words.\n*   `characters`: Automatically capitalize all characters.\n*   `on`: Deprecated since iOS 5.\n*   `off`: Deprecated since iOS 5."
60486                 },
60487                 {
60488                     "name": "spellcheck",
60489                     "description": "Specifies whether the `<textarea>` is subject to spell checking by the underlying browser/OS. the value can be:\n\n*   `true`: Indicates that the element needs to have its spelling and grammar checked.\n*   `default` : Indicates that the element is to act according to a default behavior, possibly based on the parent element's own `spellcheck` value.\n*   `false` : Indicates that the element should not be spell checked."
60490                 }
60491             ],
60492             "references": [
60493                 {
60494                     "name": "MDN Reference",
60495                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/textarea"
60496                 }
60497             ]
60498         },
60499         {
60500             "name": "output",
60501             "description": {
60502                 "kind": "markdown",
60503                 "value": "The output element represents the result of a calculation performed by the application, or the result of a user action."
60504             },
60505             "attributes": [
60506                 {
60507                     "name": "for",
60508                     "description": {
60509                         "kind": "markdown",
60510                         "value": "A space-separated list of other elements’ [`id`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id)s, indicating that those elements contributed input values to (or otherwise affected) the calculation."
60511                     }
60512                 },
60513                 {
60514                     "name": "form",
60515                     "description": {
60516                         "kind": "markdown",
60517                         "value": "The [form element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form) that this element is associated with (its \"form owner\"). The value of the attribute must be an `id` of a form element in the same document. If this attribute is not specified, the output element must be a descendant of a form element. This attribute enables you to place output elements anywhere within a document, not just as descendants of their form elements."
60518                     }
60519                 },
60520                 {
60521                     "name": "name",
60522                     "description": {
60523                         "kind": "markdown",
60524                         "value": "The name of the element, exposed in the [`HTMLFormElement`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement \"The HTMLFormElement interface represents a <form> element in the DOM; it allows access to and in some cases modification of aspects of the form, as well as access to its component elements.\") API."
60525                     }
60526                 }
60527             ],
60528             "references": [
60529                 {
60530                     "name": "MDN Reference",
60531                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/output"
60532                 }
60533             ]
60534         },
60535         {
60536             "name": "progress",
60537             "description": {
60538                 "kind": "markdown",
60539                 "value": "The progress element represents the completion progress of a task. The progress is either indeterminate, indicating that progress is being made but that it is not clear how much more work remains to be done before the task is complete (e.g. because the task is waiting for a remote host to respond), or the progress is a number in the range zero to a maximum, giving the fraction of work that has so far been completed."
60540             },
60541             "attributes": [
60542                 {
60543                     "name": "value",
60544                     "description": {
60545                         "kind": "markdown",
60546                         "value": "This attribute specifies how much of the task that has been completed. It must be a valid floating point number between 0 and `max`, or between 0 and 1 if `max` is omitted. If there is no `value` attribute, the progress bar is indeterminate; this indicates that an activity is ongoing with no indication of how long it is expected to take."
60547                     }
60548                 },
60549                 {
60550                     "name": "max",
60551                     "description": {
60552                         "kind": "markdown",
60553                         "value": "This attribute describes how much work the task indicated by the `progress` element requires. The `max` attribute, if present, must have a value greater than zero and be a valid floating point number. The default value is 1."
60554                     }
60555                 }
60556             ],
60557             "references": [
60558                 {
60559                     "name": "MDN Reference",
60560                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/progress"
60561                 }
60562             ]
60563         },
60564         {
60565             "name": "meter",
60566             "description": {
60567                 "kind": "markdown",
60568                 "value": "The meter element represents a scalar measurement within a known range, or a fractional value; for example disk usage, the relevance of a query result, or the fraction of a voting population to have selected a particular candidate."
60569             },
60570             "attributes": [
60571                 {
60572                     "name": "value",
60573                     "description": {
60574                         "kind": "markdown",
60575                         "value": "The current numeric value. This must be between the minimum and maximum values (`min` attribute and `max` attribute) if they are specified. If unspecified or malformed, the value is 0. If specified, but not within the range given by the `min` attribute and `max` attribute, the value is equal to the nearest end of the range.\n\n**Usage note:** Unless the `value` attribute is between `0` and `1` (inclusive), the `min` and `max` attributes should define the range so that the `value` attribute's value is within it."
60576                     }
60577                 },
60578                 {
60579                     "name": "min",
60580                     "description": {
60581                         "kind": "markdown",
60582                         "value": "The lower numeric bound of the measured range. This must be less than the maximum value (`max` attribute), if specified. If unspecified, the minimum value is 0."
60583                     }
60584                 },
60585                 {
60586                     "name": "max",
60587                     "description": {
60588                         "kind": "markdown",
60589                         "value": "The upper numeric bound of the measured range. This must be greater than the minimum value (`min` attribute), if specified. If unspecified, the maximum value is 1."
60590                     }
60591                 },
60592                 {
60593                     "name": "low",
60594                     "description": {
60595                         "kind": "markdown",
60596                         "value": "The upper numeric bound of the low end of the measured range. This must be greater than the minimum value (`min` attribute), and it also must be less than the high value and maximum value (`high` attribute and `max` attribute, respectively), if any are specified. If unspecified, or if less than the minimum value, the `low` value is equal to the minimum value."
60597                     }
60598                 },
60599                 {
60600                     "name": "high",
60601                     "description": {
60602                         "kind": "markdown",
60603                         "value": "The lower numeric bound of the high end of the measured range. This must be less than the maximum value (`max` attribute), and it also must be greater than the low value and minimum value (`low` attribute and **min** attribute, respectively), if any are specified. If unspecified, or if greater than the maximum value, the `high` value is equal to the maximum value."
60604                     }
60605                 },
60606                 {
60607                     "name": "optimum",
60608                     "description": {
60609                         "kind": "markdown",
60610                         "value": "This attribute indicates the optimal numeric value. It must be within the range (as defined by the `min` attribute and `max` attribute). When used with the `low` attribute and `high` attribute, it gives an indication where along the range is considered preferable. For example, if it is between the `min` attribute and the `low` attribute, then the lower range is considered preferred."
60611                     }
60612                 },
60613                 {
60614                     "name": "form",
60615                     "description": "This attribute associates the element with a `form` element that has ownership of the `meter` element. For example, a `meter` might be displaying a range corresponding to an `input` element of `type` _number_. This attribute is only used if the `meter` element is being used as a form-associated element; even then, it may be omitted if the element appears as a descendant of a `form` element."
60616                 }
60617             ],
60618             "references": [
60619                 {
60620                     "name": "MDN Reference",
60621                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/meter"
60622                 }
60623             ]
60624         },
60625         {
60626             "name": "fieldset",
60627             "description": {
60628                 "kind": "markdown",
60629                 "value": "The fieldset element represents a set of form controls optionally grouped under a common name."
60630             },
60631             "attributes": [
60632                 {
60633                     "name": "disabled",
60634                     "valueSet": "v",
60635                     "description": {
60636                         "kind": "markdown",
60637                         "value": "If this Boolean attribute is set, all form controls that are descendants of the `<fieldset>`, are disabled, meaning they are not editable and won't be submitted along with the `<form>`. They won't receive any browsing events, like mouse clicks or focus-related events. By default browsers display such controls grayed out. Note that form elements inside the [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend \"The HTML <legend> element represents a caption for the content of its parent <fieldset>.\") element won't be disabled."
60638                     }
60639                 },
60640                 {
60641                     "name": "form",
60642                     "description": {
60643                         "kind": "markdown",
60644                         "value": "This attribute takes the value of the `id` attribute of a [`<form>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form \"The HTML <form> element represents a document section that contains interactive controls for submitting information to a web server.\") element you want the `<fieldset>` to be part of, even if it is not inside the form."
60645                     }
60646                 },
60647                 {
60648                     "name": "name",
60649                     "description": {
60650                         "kind": "markdown",
60651                         "value": "The name associated with the group.\n\n**Note**: The caption for the fieldset is given by the first [`<legend>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/legend \"The HTML <legend> element represents a caption for the content of its parent <fieldset>.\") element nested inside it."
60652                     }
60653                 }
60654             ],
60655             "references": [
60656                 {
60657                     "name": "MDN Reference",
60658                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/fieldset"
60659                 }
60660             ]
60661         },
60662         {
60663             "name": "legend",
60664             "description": {
60665                 "kind": "markdown",
60666                 "value": "The legend element represents a caption for the rest of the contents of the legend element's parent fieldset element, if any."
60667             },
60668             "attributes": [],
60669             "references": [
60670                 {
60671                     "name": "MDN Reference",
60672                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/legend"
60673                 }
60674             ]
60675         },
60676         {
60677             "name": "details",
60678             "description": {
60679                 "kind": "markdown",
60680                 "value": "The details element represents a disclosure widget from which the user can obtain additional information or controls."
60681             },
60682             "attributes": [
60683                 {
60684                     "name": "open",
60685                     "valueSet": "v",
60686                     "description": {
60687                         "kind": "markdown",
60688                         "value": "This Boolean attribute indicates whether or not the details — that is, the contents of the `<details>` element — are currently visible. The default, `false`, means the details are not visible."
60689                     }
60690                 }
60691             ],
60692             "references": [
60693                 {
60694                     "name": "MDN Reference",
60695                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/details"
60696                 }
60697             ]
60698         },
60699         {
60700             "name": "summary",
60701             "description": {
60702                 "kind": "markdown",
60703                 "value": "The summary element represents a summary, caption, or legend for the rest of the contents of the summary element's parent details element, if any."
60704             },
60705             "attributes": [],
60706             "references": [
60707                 {
60708                     "name": "MDN Reference",
60709                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/summary"
60710                 }
60711             ]
60712         },
60713         {
60714             "name": "dialog",
60715             "description": {
60716                 "kind": "markdown",
60717                 "value": "The dialog element represents a part of an application that a user interacts with to perform a task, for example a dialog box, inspector, or window."
60718             },
60719             "attributes": [
60720                 {
60721                     "name": "open",
60722                     "description": "Indicates that the dialog is active and available for interaction. When the `open` attribute is not set, the dialog shouldn't be shown to the user."
60723                 }
60724             ],
60725             "references": [
60726                 {
60727                     "name": "MDN Reference",
60728                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/dialog"
60729                 }
60730             ]
60731         },
60732         {
60733             "name": "script",
60734             "description": {
60735                 "kind": "markdown",
60736                 "value": "The script element allows authors to include dynamic script and data blocks in their documents. The element does not represent content for the user."
60737             },
60738             "attributes": [
60739                 {
60740                     "name": "src",
60741                     "description": {
60742                         "kind": "markdown",
60743                         "value": "This attribute specifies the URI of an external script; this can be used as an alternative to embedding a script directly within a document.\n\nIf a `script` element has a `src` attribute specified, it should not have a script embedded inside its tags."
60744                     }
60745                 },
60746                 {
60747                     "name": "type",
60748                     "description": {
60749                         "kind": "markdown",
60750                         "value": "This attribute indicates the type of script represented. The value of this attribute will be in one of the following categories:\n\n*   **Omitted or a JavaScript MIME type:** For HTML5-compliant browsers this indicates the script is JavaScript. HTML5 specification urges authors to omit the attribute rather than provide a redundant MIME type. In earlier browsers, this identified the scripting language of the embedded or imported (via the `src` attribute) code. JavaScript MIME types are [listed in the specification](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#JavaScript_types).\n*   **`module`:** For HTML5-compliant browsers the code is treated as a JavaScript module. The processing of the script contents is not affected by the `charset` and `defer` attributes. For information on using `module`, see [ES6 in Depth: Modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/). Code may behave differently when the `module` keyword is used.\n*   **Any other value:** The embedded content is treated as a data block which won't be processed by the browser. Developers must use a valid MIME type that is not a JavaScript MIME type to denote data blocks. The `src` attribute will be ignored.\n\n**Note:** in Firefox you could specify the version of JavaScript contained in a `<script>` element by including a non-standard `version` parameter inside the `type` attribute — for example `type=\"text/javascript;version=1.8\"`. This has been removed in Firefox 59 (see [bug 1428745](https://bugzilla.mozilla.org/show_bug.cgi?id=1428745 \"FIXED: Remove support for version parameter from script loader\"))."
60751                     }
60752                 },
60753                 {
60754                     "name": "charset"
60755                 },
60756                 {
60757                     "name": "async",
60758                     "valueSet": "v",
60759                     "description": {
60760                         "kind": "markdown",
60761                         "value": "This is a Boolean attribute indicating that the browser should, if possible, load the script asynchronously.\n\nThis attribute must not be used if the `src` attribute is absent (i.e. for inline scripts). If it is included in this case it will have no effect.\n\nBrowsers usually assume the worst case scenario and load scripts synchronously, (i.e. `async=\"false\"`) during HTML parsing.\n\nDynamically inserted scripts (using [`document.createElement()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement \"In an HTML document, the document.createElement() method creates the HTML element specified by tagName, or an HTMLUnknownElement if tagName isn't recognized.\")) load asynchronously by default, so to turn on synchronous loading (i.e. scripts load in the order they were inserted) set `async=\"false\"`.\n\nSee [Browser compatibility](#Browser_compatibility) for notes on browser support. See also [Async scripts for asm.js](https://developer.mozilla.org/en-US/docs/Games/Techniques/Async_scripts)."
60762                     }
60763                 },
60764                 {
60765                     "name": "defer",
60766                     "valueSet": "v",
60767                     "description": {
60768                         "kind": "markdown",
60769                         "value": "This Boolean attribute is set to indicate to a browser that the script is meant to be executed after the document has been parsed, but before firing [`DOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded \"/en-US/docs/Web/Events/DOMContentLoaded\").\n\nScripts with the `defer` attribute will prevent the `DOMContentLoaded` event from firing until the script has loaded and finished evaluating.\n\nThis attribute must not be used if the `src` attribute is absent (i.e. for inline scripts), in this case it would have no effect.\n\nTo achieve a similar effect for dynamically inserted scripts use `async=\"false\"` instead. Scripts with the `defer` attribute will execute in the order in which they appear in the document."
60770                     }
60771                 },
60772                 {
60773                     "name": "crossorigin",
60774                     "valueSet": "xo",
60775                     "description": {
60776                         "kind": "markdown",
60777                         "value": "Normal `script` elements pass minimal information to the [`window.onerror`](https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror \"The onerror property of the GlobalEventHandlers mixin is an EventHandler that processes error events.\") for scripts which do not pass the standard [CORS](https://developer.mozilla.org/en-US/docs/Glossary/CORS \"CORS: CORS (Cross-Origin Resource Sharing) is a system, consisting of transmitting HTTP headers, that determines whether browsers block frontend JavaScript code from accessing responses for cross-origin requests.\") checks. To allow error logging for sites which use a separate domain for static media, use this attribute. See [CORS settings attributes](https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes) for a more descriptive explanation of its valid arguments."
60778                     }
60779                 },
60780                 {
60781                     "name": "nonce",
60782                     "description": {
60783                         "kind": "markdown",
60784                         "value": "A cryptographic nonce (number used once) to whitelist inline scripts in a [script-src Content-Security-Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src). The server must generate a unique nonce value each time it transmits a policy. It is critical to provide a nonce that cannot be guessed as bypassing a resource's policy is otherwise trivial."
60785                     }
60786                 },
60787                 {
60788                     "name": "integrity",
60789                     "description": "This attribute contains inline metadata that a user agent can use to verify that a fetched resource has been delivered free of unexpected manipulation. See [Subresource Integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)."
60790                 },
60791                 {
60792                     "name": "nomodule",
60793                     "description": "This Boolean attribute is set to indicate that the script should not be executed in browsers that support [ES2015 modules](https://hacks.mozilla.org/2015/08/es6-in-depth-modules/) — in effect, this can be used to serve fallback scripts to older browsers that do not support modular JavaScript code."
60794                 },
60795                 {
60796                     "name": "referrerpolicy",
60797                     "description": "Indicates which [referrer](https://developer.mozilla.org/en-US/docs/Web/API/Document/referrer) to send when fetching the script, or resources fetched by the script:\n\n*   `no-referrer`: The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent.\n*   `no-referrer-when-downgrade` (default): The [`Referer`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer \"The Referer request header contains the address of the previous web page from which a link to the currently requested page was followed. The Referer header allows servers to identify where people are visiting them from and may use that data for analytics, logging, or optimized caching, for example.\") header will not be sent to [origin](https://developer.mozilla.org/en-US/docs/Glossary/origin \"origin: Web content's origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.\")s without [TLS](https://developer.mozilla.org/en-US/docs/Glossary/TLS \"TLS: Transport Layer Security (TLS), previously known as Secure Sockets Layer (SSL), is a protocol used by applications to communicate securely across a network, preventing tampering with and eavesdropping on email, web browsing, messaging, and other protocols.\") ([HTTPS](https://developer.mozilla.org/en-US/docs/Glossary/HTTPS \"HTTPS: HTTPS (HTTP Secure) is an encrypted version of the HTTP protocol. It usually uses SSL or TLS to encrypt all communication between a client and a server. This secure connection allows clients to safely exchange sensitive data with a server, for example for banking activities or online shopping.\")).\n*   `origin`: The sent referrer will be limited to the origin of the referring page: its [scheme](https://developer.mozilla.org/en-US/docs/Archive/Mozilla/URIScheme), [host](https://developer.mozilla.org/en-US/docs/Glossary/host \"host: A host is a device connected to the Internet (or a local network). Some hosts called servers offer additional services like serving webpages or storing files and emails.\"), and [port](https://developer.mozilla.org/en-US/docs/Glossary/port \"port: For a computer connected to a network with an IP address, a port is a communication endpoint. Ports are designated by numbers, and below 1024 each port is associated by default with a specific protocol.\").\n*   `origin-when-cross-origin`: The referrer sent to other origins will be limited to the scheme, the host, and the port. Navigations on the same origin will still include the path.\n*   `same-origin`: A referrer will be sent for [same origin](https://developer.mozilla.org/en-US/docs/Glossary/Same-origin_policy \"same origin: The same-origin policy is a critical security mechanism that restricts how a document or script loaded from one origin can interact with a resource from another origin.\"), but cross-origin requests will contain no referrer information.\n*   `strict-origin`: Only send the origin of the document as the referrer when the protocol security level stays the same (e.g. HTTPS→HTTPS), but don't send it to a less secure destination (e.g. HTTPS→HTTP).\n*   `strict-origin-when-cross-origin`: Send a full URL when performing a same-origin request, but only send the origin when the protocol security level stays the same (e.g.HTTPS→HTTPS), and send no header to a less secure destination (e.g. HTTPS→HTTP).\n*   `unsafe-url`: The referrer will include the origin _and_ the path (but not the [fragment](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash), [password](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/password), or [username](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/username)). **This value is unsafe**, because it leaks origins and paths from TLS-protected resources to insecure origins.\n\n**Note**: An empty string value (`\"\"`) is both the default value, and a fallback value if `referrerpolicy` is not supported. If `referrerpolicy` is not explicitly specified on the `<script>` element, it will adopt a higher-level referrer policy, i.e. one set on the whole document or domain. If a higher-level policy is not available, the empty string is treated as being equivalent to `no-referrer-when-downgrade`."
60798                 },
60799                 {
60800                     "name": "text",
60801                     "description": "Like the `textContent` attribute, this attribute sets the text content of the element. Unlike the `textContent` attribute, however, this attribute is evaluated as executable code after the node is inserted into the DOM."
60802                 }
60803             ],
60804             "references": [
60805                 {
60806                     "name": "MDN Reference",
60807                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/script"
60808                 }
60809             ]
60810         },
60811         {
60812             "name": "noscript",
60813             "description": {
60814                 "kind": "markdown",
60815                 "value": "The noscript element represents nothing if scripting is enabled, and represents its children if scripting is disabled. It is used to present different markup to user agents that support scripting and those that don't support scripting, by affecting how the document is parsed."
60816             },
60817             "attributes": [],
60818             "references": [
60819                 {
60820                     "name": "MDN Reference",
60821                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/noscript"
60822                 }
60823             ]
60824         },
60825         {
60826             "name": "template",
60827             "description": {
60828                 "kind": "markdown",
60829                 "value": "The template element is used to declare fragments of HTML that can be cloned and inserted in the document by script."
60830             },
60831             "attributes": [],
60832             "references": [
60833                 {
60834                     "name": "MDN Reference",
60835                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/template"
60836                 }
60837             ]
60838         },
60839         {
60840             "name": "canvas",
60841             "description": {
60842                 "kind": "markdown",
60843                 "value": "The canvas element provides scripts with a resolution-dependent bitmap canvas, which can be used for rendering graphs, game graphics, art, or other visual images on the fly."
60844             },
60845             "attributes": [
60846                 {
60847                     "name": "width",
60848                     "description": {
60849                         "kind": "markdown",
60850                         "value": "The width of the coordinate space in CSS pixels. Defaults to 300."
60851                     }
60852                 },
60853                 {
60854                     "name": "height",
60855                     "description": {
60856                         "kind": "markdown",
60857                         "value": "The height of the coordinate space in CSS pixels. Defaults to 150."
60858                     }
60859                 },
60860                 {
60861                     "name": "moz-opaque",
60862                     "description": "Lets the canvas know whether or not translucency will be a factor. If the canvas knows there's no translucency, painting performance can be optimized. This is only supported by Mozilla-based browsers; use the standardized [`canvas.getContext('2d', { alpha: false })`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext \"The HTMLCanvasElement.getContext() method returns a drawing context on the canvas, or null if the context identifier is not supported.\") instead."
60863                 }
60864             ],
60865             "references": [
60866                 {
60867                     "name": "MDN Reference",
60868                     "url": "https://developer.mozilla.org/docs/Web/HTML/Element/canvas"
60869                 }
60870             ]
60871         }
60872     ],
60873     "globalAttributes": [
60874         {
60875             "name": "accesskey",
60876             "description": {
60877                 "kind": "markdown",
60878                 "value": "Provides a hint for generating a keyboard shortcut for the current element. This attribute consists of a space-separated list of characters. The browser should use the first one that exists on the computer keyboard layout."
60879             },
60880             "references": [
60881                 {
60882                     "name": "MDN Reference",
60883                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/accesskey"
60884                 }
60885             ]
60886         },
60887         {
60888             "name": "autocapitalize",
60889             "description": {
60890                 "kind": "markdown",
60891                 "value": "Controls whether and how text input is automatically capitalized as it is entered/edited by the user. It can have the following values:\n\n*   `off` or `none`, no autocapitalization is applied (all letters default to lowercase)\n*   `on` or `sentences`, the first letter of each sentence defaults to a capital letter; all other letters default to lowercase\n*   `words`, the first letter of each word defaults to a capital letter; all other letters default to lowercase\n*   `characters`, all letters should default to uppercase"
60892             },
60893             "references": [
60894                 {
60895                     "name": "MDN Reference",
60896                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/autocapitalize"
60897                 }
60898             ]
60899         },
60900         {
60901             "name": "class",
60902             "description": {
60903                 "kind": "markdown",
60904                 "value": "A space-separated list of the classes of the element. Classes allows CSS and JavaScript to select and access specific elements via the [class selectors](/en-US/docs/Web/CSS/Class_selectors) or functions like the method [`Document.getElementsByClassName()`](/en-US/docs/Web/API/Document/getElementsByClassName \"returns an array-like object of all child elements which have all of the given class names.\")."
60905             },
60906             "references": [
60907                 {
60908                     "name": "MDN Reference",
60909                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/class"
60910                 }
60911             ]
60912         },
60913         {
60914             "name": "contenteditable",
60915             "description": {
60916                 "kind": "markdown",
60917                 "value": "An enumerated attribute indicating if the element should be editable by the user. If so, the browser modifies its widget to allow editing. The attribute must take one of the following values:\n\n*   `true` or the _empty string_, which indicates that the element must be editable;\n*   `false`, which indicates that the element must not be editable."
60918             },
60919             "references": [
60920                 {
60921                     "name": "MDN Reference",
60922                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/contenteditable"
60923                 }
60924             ]
60925         },
60926         {
60927             "name": "contextmenu",
60928             "description": {
60929                 "kind": "markdown",
60930                 "value": "The `[**id**](#attr-id)` of a [`<menu>`](/en-US/docs/Web/HTML/Element/menu \"The HTML <menu> element represents a group of commands that a user can perform or activate. This includes both list menus, which might appear across the top of a screen, as well as context menus, such as those that might appear underneath a button after it has been clicked.\") to use as the contextual menu for this element."
60931             },
60932             "references": [
60933                 {
60934                     "name": "MDN Reference",
60935                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/contextmenu"
60936                 }
60937             ]
60938         },
60939         {
60940             "name": "dir",
60941             "description": {
60942                 "kind": "markdown",
60943                 "value": "An enumerated attribute indicating the directionality of the element's text. It can have the following values:\n\n*   `ltr`, which means _left to right_ and is to be used for languages that are written from the left to the right (like English);\n*   `rtl`, which means _right to left_ and is to be used for languages that are written from the right to the left (like Arabic);\n*   `auto`, which lets the user agent decide. It uses a basic algorithm as it parses the characters inside the element until it finds a character with a strong directionality, then it applies that directionality to the whole element."
60944             },
60945             "valueSet": "d",
60946             "references": [
60947                 {
60948                     "name": "MDN Reference",
60949                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/dir"
60950                 }
60951             ]
60952         },
60953         {
60954             "name": "draggable",
60955             "description": {
60956                 "kind": "markdown",
60957                 "value": "An enumerated attribute indicating whether the element can be dragged, using the [Drag and Drop API](/en-us/docs/DragDrop/Drag_and_Drop). It can have the following values:\n\n*   `true`, which indicates that the element may be dragged\n*   `false`, which indicates that the element may not be dragged."
60958             },
60959             "valueSet": "b",
60960             "references": [
60961                 {
60962                     "name": "MDN Reference",
60963                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/draggable"
60964                 }
60965             ]
60966         },
60967         {
60968             "name": "dropzone",
60969             "description": {
60970                 "kind": "markdown",
60971                 "value": "An enumerated attribute indicating what types of content can be dropped on an element, using the [Drag and Drop API](/en-US/docs/DragDrop/Drag_and_Drop). It can have the following values:\n\n*   `copy`, which indicates that dropping will create a copy of the element that was dragged\n*   `move`, which indicates that the element that was dragged will be moved to this new location.\n*   `link`, will create a link to the dragged data."
60972             },
60973             "references": [
60974                 {
60975                     "name": "MDN Reference",
60976                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/dropzone"
60977                 }
60978             ]
60979         },
60980         {
60981             "name": "exportparts",
60982             "description": {
60983                 "kind": "markdown",
60984                 "value": "Used to transitively export shadow parts from a nested shadow tree into a containing light tree."
60985             },
60986             "references": [
60987                 {
60988                     "name": "MDN Reference",
60989                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/exportparts"
60990                 }
60991             ]
60992         },
60993         {
60994             "name": "hidden",
60995             "description": {
60996                 "kind": "markdown",
60997                 "value": "A Boolean attribute indicates that the element is not yet, or is no longer, _relevant_. For example, it can be used to hide elements of the page that can't be used until the login process has been completed. The browser won't render such elements. This attribute must not be used to hide content that could legitimately be shown."
60998             },
60999             "valueSet": "v",
61000             "references": [
61001                 {
61002                     "name": "MDN Reference",
61003                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/hidden"
61004                 }
61005             ]
61006         },
61007         {
61008             "name": "id",
61009             "description": {
61010                 "kind": "markdown",
61011                 "value": "Defines a unique identifier (ID) which must be unique in the whole document. Its purpose is to identify the element when linking (using a fragment identifier), scripting, or styling (with CSS)."
61012             },
61013             "references": [
61014                 {
61015                     "name": "MDN Reference",
61016                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/id"
61017                 }
61018             ]
61019         },
61020         {
61021             "name": "inputmode",
61022             "description": {
61023                 "kind": "markdown",
61024                 "value": "Provides a hint to browsers as to the type of virtual keyboard configuration to use when editing this element or its contents. Used primarily on [`<input>`](/en-US/docs/Web/HTML/Element/input \"The HTML <input> element is used to create interactive controls for web-based forms in order to accept data from the user; a wide variety of types of input data and control widgets are available, depending on the device and user agent.\") elements, but is usable on any element while in `[contenteditable](/en-US/docs/Web/HTML/Global_attributes#attr-contenteditable)` mode."
61025             },
61026             "references": [
61027                 {
61028                     "name": "MDN Reference",
61029                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/inputmode"
61030                 }
61031             ]
61032         },
61033         {
61034             "name": "is",
61035             "description": {
61036                 "kind": "markdown",
61037                 "value": "Allows you to specify that a standard HTML element should behave like a registered custom built-in element (see [Using custom elements](/en-US/docs/Web/Web_Components/Using_custom_elements) for more details)."
61038             },
61039             "references": [
61040                 {
61041                     "name": "MDN Reference",
61042                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/is"
61043                 }
61044             ]
61045         },
61046         {
61047             "name": "itemid",
61048             "description": {
61049                 "kind": "markdown",
61050                 "value": "The unique, global identifier of an item."
61051             },
61052             "references": [
61053                 {
61054                     "name": "MDN Reference",
61055                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemid"
61056                 }
61057             ]
61058         },
61059         {
61060             "name": "itemprop",
61061             "description": {
61062                 "kind": "markdown",
61063                 "value": "Used to add properties to an item. Every HTML element may have an `itemprop` attribute specified, where an `itemprop` consists of a name and value pair."
61064             },
61065             "references": [
61066                 {
61067                     "name": "MDN Reference",
61068                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemprop"
61069                 }
61070             ]
61071         },
61072         {
61073             "name": "itemref",
61074             "description": {
61075                 "kind": "markdown",
61076                 "value": "Properties that are not descendants of an element with the `itemscope` attribute can be associated with the item using an `itemref`. It provides a list of element ids (not `itemid`s) with additional properties elsewhere in the document."
61077             },
61078             "references": [
61079                 {
61080                     "name": "MDN Reference",
61081                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemref"
61082                 }
61083             ]
61084         },
61085         {
61086             "name": "itemscope",
61087             "description": {
61088                 "kind": "markdown",
61089                 "value": "`itemscope` (usually) works along with `[itemtype](/en-US/docs/Web/HTML/Global_attributes#attr-itemtype)` to specify that the HTML contained in a block is about a particular item. `itemscope` creates the Item and defines the scope of the `itemtype` associated with it. `itemtype` is a valid URL of a vocabulary (such as [schema.org](https://schema.org/)) that describes the item and its properties context."
61090             },
61091             "valueSet": "v",
61092             "references": [
61093                 {
61094                     "name": "MDN Reference",
61095                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemscope"
61096                 }
61097             ]
61098         },
61099         {
61100             "name": "itemtype",
61101             "description": {
61102                 "kind": "markdown",
61103                 "value": "Specifies the URL of the vocabulary that will be used to define `itemprop`s (item properties) in the data structure. `[itemscope](/en-US/docs/Web/HTML/Global_attributes#attr-itemscope)` is used to set the scope of where in the data structure the vocabulary set by `itemtype` will be active."
61104             },
61105             "references": [
61106                 {
61107                     "name": "MDN Reference",
61108                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/itemtype"
61109                 }
61110             ]
61111         },
61112         {
61113             "name": "lang",
61114             "description": {
61115                 "kind": "markdown",
61116                 "value": "Helps define the language of an element: the language that non-editable elements are in, or the language that editable elements should be written in by the user. The attribute contains one “language tag” (made of hyphen-separated “language subtags”) in the format defined in [_Tags for Identifying Languages (BCP47)_](https://www.ietf.org/rfc/bcp/bcp47.txt). [**xml:lang**](#attr-xml:lang) has priority over it."
61117             },
61118             "references": [
61119                 {
61120                     "name": "MDN Reference",
61121                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/lang"
61122                 }
61123             ]
61124         },
61125         {
61126             "name": "part",
61127             "description": {
61128                 "kind": "markdown",
61129                 "value": "A space-separated list of the part names of the element. Part names allows CSS to select and style specific elements in a shadow tree via the [`::part`](/en-US/docs/Web/CSS/::part \"The ::part CSS pseudo-element represents any element within a shadow tree that has a matching part attribute.\") pseudo-element."
61130             },
61131             "references": [
61132                 {
61133                     "name": "MDN Reference",
61134                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/part"
61135                 }
61136             ]
61137         },
61138         {
61139             "name": "role",
61140             "valueSet": "roles"
61141         },
61142         {
61143             "name": "slot",
61144             "description": {
61145                 "kind": "markdown",
61146                 "value": "Assigns a slot in a [shadow DOM](/en-US/docs/Web/Web_Components/Shadow_DOM) shadow tree to an element: An element with a `slot` attribute is assigned to the slot created by the [`<slot>`](/en-US/docs/Web/HTML/Element/slot \"The HTML <slot> element—part of the Web Components technology suite—is a placeholder inside a web component that you can fill with your own markup, which lets you create separate DOM trees and present them together.\") element whose `[name](/en-US/docs/Web/HTML/Element/slot#attr-name)` attribute's value matches that `slot` attribute's value."
61147             },
61148             "references": [
61149                 {
61150                     "name": "MDN Reference",
61151                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/slot"
61152                 }
61153             ]
61154         },
61155         {
61156             "name": "spellcheck",
61157             "description": {
61158                 "kind": "markdown",
61159                 "value": "An enumerated attribute defines whether the element may be checked for spelling errors. It may have the following values:\n\n*   `true`, which indicates that the element should be, if possible, checked for spelling errors;\n*   `false`, which indicates that the element should not be checked for spelling errors."
61160             },
61161             "valueSet": "b",
61162             "references": [
61163                 {
61164                     "name": "MDN Reference",
61165                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/spellcheck"
61166                 }
61167             ]
61168         },
61169         {
61170             "name": "style",
61171             "description": {
61172                 "kind": "markdown",
61173                 "value": "Contains [CSS](/en-US/docs/Web/CSS) styling declarations to be applied to the element. Note that it is recommended for styles to be defined in a separate file or files. This attribute and the [`<style>`](/en-US/docs/Web/HTML/Element/style \"The HTML <style> element contains style information for a document, or part of a document.\") element have mainly the purpose of allowing for quick styling, for example for testing purposes."
61174             },
61175             "references": [
61176                 {
61177                     "name": "MDN Reference",
61178                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/style"
61179                 }
61180             ]
61181         },
61182         {
61183             "name": "tabindex",
61184             "description": {
61185                 "kind": "markdown",
61186                 "value": "An integer attribute indicating if the element can take input focus (is _focusable_), if it should participate to sequential keyboard navigation, and if so, at what position. It can take several values:\n\n*   a _negative value_ means that the element should be focusable, but should not be reachable via sequential keyboard navigation;\n*   `0` means that the element should be focusable and reachable via sequential keyboard navigation, but its relative order is defined by the platform convention;\n*   a _positive value_ means that the element should be focusable and reachable via sequential keyboard navigation; the order in which the elements are focused is the increasing value of the [**tabindex**](#attr-tabindex). If several elements share the same tabindex, their relative order follows their relative positions in the document."
61187             },
61188             "references": [
61189                 {
61190                     "name": "MDN Reference",
61191                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/tabindex"
61192                 }
61193             ]
61194         },
61195         {
61196             "name": "title",
61197             "description": {
61198                 "kind": "markdown",
61199                 "value": "Contains a text representing advisory information related to the element it belongs to. Such information can typically, but not necessarily, be presented to the user as a tooltip."
61200             },
61201             "references": [
61202                 {
61203                     "name": "MDN Reference",
61204                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/title"
61205                 }
61206             ]
61207         },
61208         {
61209             "name": "translate",
61210             "description": {
61211                 "kind": "markdown",
61212                 "value": "An enumerated attribute that is used to specify whether an element's attribute values and the values of its [`Text`](/en-US/docs/Web/API/Text \"The Text interface represents the textual content of Element or Attr. If an element has no markup within its content, it has a single child implementing Text that contains the element's text. However, if the element contains markup, it is parsed into information items and Text nodes that form its children.\") node children are to be translated when the page is localized, or whether to leave them unchanged. It can have the following values:\n\n*   empty string and `yes`, which indicates that the element will be translated.\n*   `no`, which indicates that the element will not be translated."
61213             },
61214             "valueSet": "y",
61215             "references": [
61216                 {
61217                     "name": "MDN Reference",
61218                     "url": "https://developer.mozilla.org/docs/Web/HTML/Global_attributes/translate"
61219                 }
61220             ]
61221         },
61222         {
61223             "name": "onabort",
61224             "description": {
61225                 "kind": "markdown",
61226                 "value": "The loading of a resource has been aborted."
61227             }
61228         },
61229         {
61230             "name": "onblur",
61231             "description": {
61232                 "kind": "markdown",
61233                 "value": "An element has lost focus (does not bubble)."
61234             }
61235         },
61236         {
61237             "name": "oncanplay",
61238             "description": {
61239                 "kind": "markdown",
61240                 "value": "The user agent can play the media, but estimates that not enough data has been loaded to play the media up to its end without having to stop for further buffering of content."
61241             }
61242         },
61243         {
61244             "name": "oncanplaythrough",
61245             "description": {
61246                 "kind": "markdown",
61247                 "value": "The user agent can play the media up to its end without having to stop for further buffering of content."
61248             }
61249         },
61250         {
61251             "name": "onchange",
61252             "description": {
61253                 "kind": "markdown",
61254                 "value": "The change event is fired for <input>, <select>, and <textarea> elements when a change to the element's value is committed by the user."
61255             }
61256         },
61257         {
61258             "name": "onclick",
61259             "description": {
61260                 "kind": "markdown",
61261                 "value": "A pointing device button has been pressed and released on an element."
61262             }
61263         },
61264         {
61265             "name": "oncontextmenu",
61266             "description": {
61267                 "kind": "markdown",
61268                 "value": "The right button of the mouse is clicked (before the context menu is displayed)."
61269             }
61270         },
61271         {
61272             "name": "ondblclick",
61273             "description": {
61274                 "kind": "markdown",
61275                 "value": "A pointing device button is clicked twice on an element."
61276             }
61277         },
61278         {
61279             "name": "ondrag",
61280             "description": {
61281                 "kind": "markdown",
61282                 "value": "An element or text selection is being dragged (every 350ms)."
61283             }
61284         },
61285         {
61286             "name": "ondragend",
61287             "description": {
61288                 "kind": "markdown",
61289                 "value": "A drag operation is being ended (by releasing a mouse button or hitting the escape key)."
61290             }
61291         },
61292         {
61293             "name": "ondragenter",
61294             "description": {
61295                 "kind": "markdown",
61296                 "value": "A dragged element or text selection enters a valid drop target."
61297             }
61298         },
61299         {
61300             "name": "ondragleave",
61301             "description": {
61302                 "kind": "markdown",
61303                 "value": "A dragged element or text selection leaves a valid drop target."
61304             }
61305         },
61306         {
61307             "name": "ondragover",
61308             "description": {
61309                 "kind": "markdown",
61310                 "value": "An element or text selection is being dragged over a valid drop target (every 350ms)."
61311             }
61312         },
61313         {
61314             "name": "ondragstart",
61315             "description": {
61316                 "kind": "markdown",
61317                 "value": "The user starts dragging an element or text selection."
61318             }
61319         },
61320         {
61321             "name": "ondrop",
61322             "description": {
61323                 "kind": "markdown",
61324                 "value": "An element is dropped on a valid drop target."
61325             }
61326         },
61327         {
61328             "name": "ondurationchange",
61329             "description": {
61330                 "kind": "markdown",
61331                 "value": "The duration attribute has been updated."
61332             }
61333         },
61334         {
61335             "name": "onemptied",
61336             "description": {
61337                 "kind": "markdown",
61338                 "value": "The media has become empty; for example, this event is sent if the media has already been loaded (or partially loaded), and the load() method is called to reload it."
61339             }
61340         },
61341         {
61342             "name": "onended",
61343             "description": {
61344                 "kind": "markdown",
61345                 "value": "Playback has stopped because the end of the media was reached."
61346             }
61347         },
61348         {
61349             "name": "onerror",
61350             "description": {
61351                 "kind": "markdown",
61352                 "value": "A resource failed to load."
61353             }
61354         },
61355         {
61356             "name": "onfocus",
61357             "description": {
61358                 "kind": "markdown",
61359                 "value": "An element has received focus (does not bubble)."
61360             }
61361         },
61362         {
61363             "name": "onformchange"
61364         },
61365         {
61366             "name": "onforminput"
61367         },
61368         {
61369             "name": "oninput",
61370             "description": {
61371                 "kind": "markdown",
61372                 "value": "The value of an element changes or the content of an element with the attribute contenteditable is modified."
61373             }
61374         },
61375         {
61376             "name": "oninvalid",
61377             "description": {
61378                 "kind": "markdown",
61379                 "value": "A submittable element has been checked and doesn't satisfy its constraints."
61380             }
61381         },
61382         {
61383             "name": "onkeydown",
61384             "description": {
61385                 "kind": "markdown",
61386                 "value": "A key is pressed down."
61387             }
61388         },
61389         {
61390             "name": "onkeypress",
61391             "description": {
61392                 "kind": "markdown",
61393                 "value": "A key is pressed down and that key normally produces a character value (use input instead)."
61394             }
61395         },
61396         {
61397             "name": "onkeyup",
61398             "description": {
61399                 "kind": "markdown",
61400                 "value": "A key is released."
61401             }
61402         },
61403         {
61404             "name": "onload",
61405             "description": {
61406                 "kind": "markdown",
61407                 "value": "A resource and its dependent resources have finished loading."
61408             }
61409         },
61410         {
61411             "name": "onloadeddata",
61412             "description": {
61413                 "kind": "markdown",
61414                 "value": "The first frame of the media has finished loading."
61415             }
61416         },
61417         {
61418             "name": "onloadedmetadata",
61419             "description": {
61420                 "kind": "markdown",
61421                 "value": "The metadata has been loaded."
61422             }
61423         },
61424         {
61425             "name": "onloadstart",
61426             "description": {
61427                 "kind": "markdown",
61428                 "value": "Progress has begun."
61429             }
61430         },
61431         {
61432             "name": "onmousedown",
61433             "description": {
61434                 "kind": "markdown",
61435                 "value": "A pointing device button (usually a mouse) is pressed on an element."
61436             }
61437         },
61438         {
61439             "name": "onmousemove",
61440             "description": {
61441                 "kind": "markdown",
61442                 "value": "A pointing device is moved over an element."
61443             }
61444         },
61445         {
61446             "name": "onmouseout",
61447             "description": {
61448                 "kind": "markdown",
61449                 "value": "A pointing device is moved off the element that has the listener attached or off one of its children."
61450             }
61451         },
61452         {
61453             "name": "onmouseover",
61454             "description": {
61455                 "kind": "markdown",
61456                 "value": "A pointing device is moved onto the element that has the listener attached or onto one of its children."
61457             }
61458         },
61459         {
61460             "name": "onmouseup",
61461             "description": {
61462                 "kind": "markdown",
61463                 "value": "A pointing device button is released over an element."
61464             }
61465         },
61466         {
61467             "name": "onmousewheel"
61468         },
61469         {
61470             "name": "onpause",
61471             "description": {
61472                 "kind": "markdown",
61473                 "value": "Playback has been paused."
61474             }
61475         },
61476         {
61477             "name": "onplay",
61478             "description": {
61479                 "kind": "markdown",
61480                 "value": "Playback has begun."
61481             }
61482         },
61483         {
61484             "name": "onplaying",
61485             "description": {
61486                 "kind": "markdown",
61487                 "value": "Playback is ready to start after having been paused or delayed due to lack of data."
61488             }
61489         },
61490         {
61491             "name": "onprogress",
61492             "description": {
61493                 "kind": "markdown",
61494                 "value": "In progress."
61495             }
61496         },
61497         {
61498             "name": "onratechange",
61499             "description": {
61500                 "kind": "markdown",
61501                 "value": "The playback rate has changed."
61502             }
61503         },
61504         {
61505             "name": "onreset",
61506             "description": {
61507                 "kind": "markdown",
61508                 "value": "A form is reset."
61509             }
61510         },
61511         {
61512             "name": "onresize",
61513             "description": {
61514                 "kind": "markdown",
61515                 "value": "The document view has been resized."
61516             }
61517         },
61518         {
61519             "name": "onreadystatechange",
61520             "description": {
61521                 "kind": "markdown",
61522                 "value": "The readyState attribute of a document has changed."
61523             }
61524         },
61525         {
61526             "name": "onscroll",
61527             "description": {
61528                 "kind": "markdown",
61529                 "value": "The document view or an element has been scrolled."
61530             }
61531         },
61532         {
61533             "name": "onseeked",
61534             "description": {
61535                 "kind": "markdown",
61536                 "value": "A seek operation completed."
61537             }
61538         },
61539         {
61540             "name": "onseeking",
61541             "description": {
61542                 "kind": "markdown",
61543                 "value": "A seek operation began."
61544             }
61545         },
61546         {
61547             "name": "onselect",
61548             "description": {
61549                 "kind": "markdown",
61550                 "value": "Some text is being selected."
61551             }
61552         },
61553         {
61554             "name": "onshow",
61555             "description": {
61556                 "kind": "markdown",
61557                 "value": "A contextmenu event was fired on/bubbled to an element that has a contextmenu attribute"
61558             }
61559         },
61560         {
61561             "name": "onstalled",
61562             "description": {
61563                 "kind": "markdown",
61564                 "value": "The user agent is trying to fetch media data, but data is unexpectedly not forthcoming."
61565             }
61566         },
61567         {
61568             "name": "onsubmit",
61569             "description": {
61570                 "kind": "markdown",
61571                 "value": "A form is submitted."
61572             }
61573         },
61574         {
61575             "name": "onsuspend",
61576             "description": {
61577                 "kind": "markdown",
61578                 "value": "Media data loading has been suspended."
61579             }
61580         },
61581         {
61582             "name": "ontimeupdate",
61583             "description": {
61584                 "kind": "markdown",
61585                 "value": "The time indicated by the currentTime attribute has been updated."
61586             }
61587         },
61588         {
61589             "name": "onvolumechange",
61590             "description": {
61591                 "kind": "markdown",
61592                 "value": "The volume has changed."
61593             }
61594         },
61595         {
61596             "name": "onwaiting",
61597             "description": {
61598                 "kind": "markdown",
61599                 "value": "Playback has stopped because of a temporary lack of data."
61600             }
61601         },
61602         {
61603             "name": "aria-activedescendant",
61604             "references": [
61605                 {
61606                     "name": "WAI-ARIA Reference",
61607                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-activedescendant"
61608                 }
61609             ],
61610             "description": {
61611                 "kind": "markdown",
61612                 "value": "Identifies the currently active element when DOM focus is on a [`composite`](https://www.w3.org/TR/wai-aria-1.1/#composite) widget, [`textbox`](https://www.w3.org/TR/wai-aria-1.1/#textbox), [`group`](https://www.w3.org/TR/wai-aria-1.1/#group), or [`application`](https://www.w3.org/TR/wai-aria-1.1/#application)."
61613             }
61614         },
61615         {
61616             "name": "aria-atomic",
61617             "valueSet": "b",
61618             "references": [
61619                 {
61620                     "name": "WAI-ARIA Reference",
61621                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-atomic"
61622                 }
61623             ],
61624             "description": {
61625                 "kind": "markdown",
61626                 "value": "Indicates whether [assistive technologies](https://www.w3.org/TR/wai-aria-1.1/#dfn-assistive-technology) will present all, or only parts of, the changed region based on the change notifications defined by the [`aria-relevant`](https://www.w3.org/TR/wai-aria-1.1/#aria-relevant) attribute."
61627             }
61628         },
61629         {
61630             "name": "aria-autocomplete",
61631             "valueSet": "autocomplete",
61632             "references": [
61633                 {
61634                     "name": "WAI-ARIA Reference",
61635                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-autocomplete"
61636                 }
61637             ],
61638             "description": {
61639                 "kind": "markdown",
61640                 "value": "Indicates whether inputting text could trigger display of one or more predictions of the user's intended value for an input and specifies how predictions would be presented if they are made."
61641             }
61642         },
61643         {
61644             "name": "aria-busy",
61645             "valueSet": "b",
61646             "references": [
61647                 {
61648                     "name": "WAI-ARIA Reference",
61649                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-busy"
61650                 }
61651             ],
61652             "description": {
61653                 "kind": "markdown",
61654                 "value": "Indicates an element is being modified and that assistive technologies _MAY_ want to wait until the modifications are complete before exposing them to the user."
61655             }
61656         },
61657         {
61658             "name": "aria-checked",
61659             "valueSet": "tristate",
61660             "references": [
61661                 {
61662                     "name": "WAI-ARIA Reference",
61663                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-checked"
61664                 }
61665             ],
61666             "description": {
61667                 "kind": "markdown",
61668                 "value": "Indicates the current \"checked\" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of checkboxes, radio buttons, and other [widgets](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-pressed`](https://www.w3.org/TR/wai-aria-1.1/#aria-pressed) and [`aria-selected`](https://www.w3.org/TR/wai-aria-1.1/#aria-selected)."
61669             }
61670         },
61671         {
61672             "name": "aria-colcount",
61673             "references": [
61674                 {
61675                     "name": "WAI-ARIA Reference",
61676                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-colcount"
61677                 }
61678             ],
61679             "description": {
61680                 "kind": "markdown",
61681                 "value": "Defines the total number of columns in a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-colindex)."
61682             }
61683         },
61684         {
61685             "name": "aria-colindex",
61686             "references": [
61687                 {
61688                     "name": "WAI-ARIA Reference",
61689                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-colindex"
61690                 }
61691             ],
61692             "description": {
61693                 "kind": "markdown",
61694                 "value": "Defines an [element's](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) column index or position with respect to the total number of columns within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colcount`](https://www.w3.org/TR/wai-aria-1.1/#aria-colcount) and [`aria-colspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-colspan)."
61695             }
61696         },
61697         {
61698             "name": "aria-colspan",
61699             "references": [
61700                 {
61701                     "name": "WAI-ARIA Reference",
61702                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-colspan"
61703                 }
61704             ],
61705             "description": {
61706                 "kind": "markdown",
61707                 "value": "Defines the number of columns spanned by a cell or gridcell within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-colindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-colindex) and [`aria-rowspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan)."
61708             }
61709         },
61710         {
61711             "name": "aria-controls",
61712             "references": [
61713                 {
61714                     "name": "WAI-ARIA Reference",
61715                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-controls"
61716                 }
61717             ],
61718             "description": {
61719                 "kind": "markdown",
61720                 "value": "Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) whose contents or presence are controlled by the current element. See related [`aria-owns`](https://www.w3.org/TR/wai-aria-1.1/#aria-owns)."
61721             }
61722         },
61723         {
61724             "name": "aria-current",
61725             "valueSet": "current",
61726             "references": [
61727                 {
61728                     "name": "WAI-ARIA Reference",
61729                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-current"
61730                 }
61731             ],
61732             "description": {
61733                 "kind": "markdown",
61734                 "value": "Indicates the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that represents the current item within a container or set of related elements."
61735             }
61736         },
61737         {
61738             "name": "aria-describedat",
61739             "references": [
61740                 {
61741                     "name": "WAI-ARIA Reference",
61742                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-describedat"
61743                 }
61744             ]
61745         },
61746         {
61747             "name": "aria-describedby",
61748             "references": [
61749                 {
61750                     "name": "WAI-ARIA Reference",
61751                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-describedby"
61752                 }
61753             ],
61754             "description": {
61755                 "kind": "markdown",
61756                 "value": "Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) that describes the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-labelledby`](https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby)."
61757             }
61758         },
61759         {
61760             "name": "aria-disabled",
61761             "valueSet": "b",
61762             "references": [
61763                 {
61764                     "name": "WAI-ARIA Reference",
61765                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-disabled"
61766                 }
61767             ],
61768             "description": {
61769                 "kind": "markdown",
61770                 "value": "Indicates that the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is [perceivable](https://www.w3.org/TR/wai-aria-1.1/#dfn-perceivable) but disabled, so it is not editable or otherwise [operable](https://www.w3.org/TR/wai-aria-1.1/#dfn-operable). See related [`aria-hidden`](https://www.w3.org/TR/wai-aria-1.1/#aria-hidden) and [`aria-readonly`](https://www.w3.org/TR/wai-aria-1.1/#aria-readonly)."
61771             }
61772         },
61773         {
61774             "name": "aria-dropeffect",
61775             "valueSet": "dropeffect",
61776             "references": [
61777                 {
61778                     "name": "WAI-ARIA Reference",
61779                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-dropeffect"
61780                 }
61781             ],
61782             "description": {
61783                 "kind": "markdown",
61784                 "value": "\\[Deprecated in ARIA 1.1\\] Indicates what functions can be performed when a dragged object is released on the drop target."
61785             }
61786         },
61787         {
61788             "name": "aria-errormessage",
61789             "references": [
61790                 {
61791                     "name": "WAI-ARIA Reference",
61792                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage"
61793                 }
61794             ],
61795             "description": {
61796                 "kind": "markdown",
61797                 "value": "Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that provides an error message for the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-invalid`](https://www.w3.org/TR/wai-aria-1.1/#aria-invalid) and [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."
61798             }
61799         },
61800         {
61801             "name": "aria-expanded",
61802             "valueSet": "u",
61803             "references": [
61804                 {
61805                     "name": "WAI-ARIA Reference",
61806                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-expanded"
61807                 }
61808             ],
61809             "description": {
61810                 "kind": "markdown",
61811                 "value": "Indicates whether the element, or another grouping element it controls, is currently expanded or collapsed."
61812             }
61813         },
61814         {
61815             "name": "aria-flowto",
61816             "references": [
61817                 {
61818                     "name": "WAI-ARIA Reference",
61819                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-flowto"
61820                 }
61821             ],
61822             "description": {
61823                 "kind": "markdown",
61824                 "value": "Identifies the next [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) in an alternate reading order of content which, at the user's discretion, allows assistive technology to override the general default of reading in document source order."
61825             }
61826         },
61827         {
61828             "name": "aria-grabbed",
61829             "valueSet": "u",
61830             "references": [
61831                 {
61832                     "name": "WAI-ARIA Reference",
61833                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-grabbed"
61834                 }
61835             ],
61836             "description": {
61837                 "kind": "markdown",
61838                 "value": "\\[Deprecated in ARIA 1.1\\] Indicates an element's \"grabbed\" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) in a drag-and-drop operation."
61839             }
61840         },
61841         {
61842             "name": "aria-haspopup",
61843             "valueSet": "b",
61844             "references": [
61845                 {
61846                     "name": "WAI-ARIA Reference",
61847                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-haspopup"
61848                 }
61849             ],
61850             "description": {
61851                 "kind": "markdown",
61852                 "value": "Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)."
61853             }
61854         },
61855         {
61856             "name": "aria-hidden",
61857             "valueSet": "b",
61858             "references": [
61859                 {
61860                     "name": "WAI-ARIA Reference",
61861                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-hidden"
61862                 }
61863             ],
61864             "description": {
61865                 "kind": "markdown",
61866                 "value": "Indicates whether the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is exposed to an accessibility API. See related [`aria-disabled`](https://www.w3.org/TR/wai-aria-1.1/#aria-disabled)."
61867             }
61868         },
61869         {
61870             "name": "aria-invalid",
61871             "valueSet": "invalid",
61872             "references": [
61873                 {
61874                     "name": "WAI-ARIA Reference",
61875                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-invalid"
61876                 }
61877             ],
61878             "description": {
61879                 "kind": "markdown",
61880                 "value": "Indicates the entered value does not conform to the format expected by the application. See related [`aria-errormessage`](https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage)."
61881             }
61882         },
61883         {
61884             "name": "aria-kbdshortcuts",
61885             "references": [
61886                 {
61887                     "name": "WAI-ARIA Reference",
61888                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-kbdshortcuts"
61889                 }
61890             ]
61891         },
61892         {
61893             "name": "aria-label",
61894             "references": [
61895                 {
61896                     "name": "WAI-ARIA Reference",
61897                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-label"
61898                 }
61899             ],
61900             "description": {
61901                 "kind": "markdown",
61902                 "value": "Defines a string value that labels the current element. See related [`aria-labelledby`](https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby)."
61903             }
61904         },
61905         {
61906             "name": "aria-labelledby",
61907             "references": [
61908                 {
61909                     "name": "WAI-ARIA Reference",
61910                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-labelledby"
61911                 }
61912             ],
61913             "description": {
61914                 "kind": "markdown",
61915                 "value": "Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) that labels the current element. See related [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."
61916             }
61917         },
61918         {
61919             "name": "aria-level",
61920             "references": [
61921                 {
61922                     "name": "WAI-ARIA Reference",
61923                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-level"
61924                 }
61925             ],
61926             "description": {
61927                 "kind": "markdown",
61928                 "value": "Defines the hierarchical level of an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) within a structure."
61929             }
61930         },
61931         {
61932             "name": "aria-live",
61933             "valueSet": "live",
61934             "references": [
61935                 {
61936                     "name": "WAI-ARIA Reference",
61937                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-live"
61938                 }
61939             ],
61940             "description": {
61941                 "kind": "markdown",
61942                 "value": "Indicates that an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) will be updated, and describes the types of updates the [user agents](https://www.w3.org/TR/wai-aria-1.1/#dfn-user-agent), [assistive technologies](https://www.w3.org/TR/wai-aria-1.1/#dfn-assistive-technology), and user can expect from the [live region](https://www.w3.org/TR/wai-aria-1.1/#dfn-live-region)."
61943             }
61944         },
61945         {
61946             "name": "aria-modal",
61947             "valueSet": "b",
61948             "references": [
61949                 {
61950                     "name": "WAI-ARIA Reference",
61951                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-modal"
61952                 }
61953             ],
61954             "description": {
61955                 "kind": "markdown",
61956                 "value": "Indicates whether an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is modal when displayed."
61957             }
61958         },
61959         {
61960             "name": "aria-multiline",
61961             "valueSet": "b",
61962             "references": [
61963                 {
61964                     "name": "WAI-ARIA Reference",
61965                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-multiline"
61966                 }
61967             ],
61968             "description": {
61969                 "kind": "markdown",
61970                 "value": "Indicates whether a text box accepts multiple lines of input or only a single line."
61971             }
61972         },
61973         {
61974             "name": "aria-multiselectable",
61975             "valueSet": "b",
61976             "references": [
61977                 {
61978                     "name": "WAI-ARIA Reference",
61979                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-multiselectable"
61980                 }
61981             ],
61982             "description": {
61983                 "kind": "markdown",
61984                 "value": "Indicates that the user may select more than one item from the current selectable descendants."
61985             }
61986         },
61987         {
61988             "name": "aria-orientation",
61989             "valueSet": "orientation",
61990             "references": [
61991                 {
61992                     "name": "WAI-ARIA Reference",
61993                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-orientation"
61994                 }
61995             ],
61996             "description": {
61997                 "kind": "markdown",
61998                 "value": "Indicates whether the element's orientation is horizontal, vertical, or unknown/ambiguous."
61999             }
62000         },
62001         {
62002             "name": "aria-owns",
62003             "references": [
62004                 {
62005                     "name": "WAI-ARIA Reference",
62006                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-owns"
62007                 }
62008             ],
62009             "description": {
62010                 "kind": "markdown",
62011                 "value": "Identifies an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) (or elements) in order to define a visual, functional, or contextual parent/child [relationship](https://www.w3.org/TR/wai-aria-1.1/#dfn-relationship) between DOM elements where the DOM hierarchy cannot be used to represent the relationship. See related [`aria-controls`](https://www.w3.org/TR/wai-aria-1.1/#aria-controls)."
62012             }
62013         },
62014         {
62015             "name": "aria-placeholder",
62016             "references": [
62017                 {
62018                     "name": "WAI-ARIA Reference",
62019                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-placeholder"
62020                 }
62021             ],
62022             "description": {
62023                 "kind": "markdown",
62024                 "value": "Defines a short hint (a word or short phrase) intended to aid the user with data entry when the control has no value. A hint could be a sample value or a brief description of the expected format."
62025             }
62026         },
62027         {
62028             "name": "aria-posinset",
62029             "references": [
62030                 {
62031                     "name": "WAI-ARIA Reference",
62032                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-posinset"
62033                 }
62034             ],
62035             "description": {
62036                 "kind": "markdown",
62037                 "value": "Defines an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)'s number or position in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. See related [`aria-setsize`](https://www.w3.org/TR/wai-aria-1.1/#aria-setsize)."
62038             }
62039         },
62040         {
62041             "name": "aria-pressed",
62042             "valueSet": "tristate",
62043             "references": [
62044                 {
62045                     "name": "WAI-ARIA Reference",
62046                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-pressed"
62047                 }
62048             ],
62049             "description": {
62050                 "kind": "markdown",
62051                 "value": "Indicates the current \"pressed\" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of toggle buttons. See related [`aria-checked`](https://www.w3.org/TR/wai-aria-1.1/#aria-checked) and [`aria-selected`](https://www.w3.org/TR/wai-aria-1.1/#aria-selected)."
62052             }
62053         },
62054         {
62055             "name": "aria-readonly",
62056             "valueSet": "b",
62057             "references": [
62058                 {
62059                     "name": "WAI-ARIA Reference",
62060                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-readonly"
62061                 }
62062             ],
62063             "description": {
62064                 "kind": "markdown",
62065                 "value": "Indicates that the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) is not editable, but is otherwise [operable](https://www.w3.org/TR/wai-aria-1.1/#dfn-operable). See related [`aria-disabled`](https://www.w3.org/TR/wai-aria-1.1/#aria-disabled)."
62066             }
62067         },
62068         {
62069             "name": "aria-relevant",
62070             "valueSet": "relevant",
62071             "references": [
62072                 {
62073                     "name": "WAI-ARIA Reference",
62074                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-relevant"
62075                 }
62076             ],
62077             "description": {
62078                 "kind": "markdown",
62079                 "value": "Indicates what notifications the user agent will trigger when the accessibility tree within a live region is modified. See related [`aria-atomic`](https://www.w3.org/TR/wai-aria-1.1/#aria-atomic)."
62080             }
62081         },
62082         {
62083             "name": "aria-required",
62084             "valueSet": "b",
62085             "references": [
62086                 {
62087                     "name": "WAI-ARIA Reference",
62088                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-required"
62089                 }
62090             ],
62091             "description": {
62092                 "kind": "markdown",
62093                 "value": "Indicates that user input is required on the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) before a form may be submitted."
62094             }
62095         },
62096         {
62097             "name": "aria-roledescription",
62098             "references": [
62099                 {
62100                     "name": "WAI-ARIA Reference",
62101                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-roledescription"
62102                 }
62103             ],
62104             "description": {
62105                 "kind": "markdown",
62106                 "value": "Defines a human-readable, author-localized description for the [role](https://www.w3.org/TR/wai-aria-1.1/#dfn-role) of an [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element)."
62107             }
62108         },
62109         {
62110             "name": "aria-rowcount",
62111             "references": [
62112                 {
62113                     "name": "WAI-ARIA Reference",
62114                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-rowcount"
62115                 }
62116             ],
62117             "description": {
62118                 "kind": "markdown",
62119                 "value": "Defines the total number of rows in a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex)."
62120             }
62121         },
62122         {
62123             "name": "aria-rowindex",
62124             "references": [
62125                 {
62126                     "name": "WAI-ARIA Reference",
62127                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex"
62128                 }
62129             ],
62130             "description": {
62131                 "kind": "markdown",
62132                 "value": "Defines an [element's](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) row index or position with respect to the total number of rows within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowcount`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowcount) and [`aria-rowspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan)."
62133             }
62134         },
62135         {
62136             "name": "aria-rowspan",
62137             "references": [
62138                 {
62139                     "name": "WAI-ARIA Reference",
62140                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-rowspan"
62141                 }
62142             ],
62143             "description": {
62144                 "kind": "markdown",
62145                 "value": "Defines the number of rows spanned by a cell or gridcell within a [`table`](https://www.w3.org/TR/wai-aria-1.1/#table), [`grid`](https://www.w3.org/TR/wai-aria-1.1/#grid), or [`treegrid`](https://www.w3.org/TR/wai-aria-1.1/#treegrid). See related [`aria-rowindex`](https://www.w3.org/TR/wai-aria-1.1/#aria-rowindex) and [`aria-colspan`](https://www.w3.org/TR/wai-aria-1.1/#aria-colspan)."
62146             }
62147         },
62148         {
62149             "name": "aria-selected",
62150             "valueSet": "u",
62151             "references": [
62152                 {
62153                     "name": "WAI-ARIA Reference",
62154                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-selected"
62155                 }
62156             ],
62157             "description": {
62158                 "kind": "markdown",
62159                 "value": "Indicates the current \"selected\" [state](https://www.w3.org/TR/wai-aria-1.1/#dfn-state) of various [widgets](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-checked`](https://www.w3.org/TR/wai-aria-1.1/#aria-checked) and [`aria-pressed`](https://www.w3.org/TR/wai-aria-1.1/#aria-pressed)."
62160             }
62161         },
62162         {
62163             "name": "aria-setsize",
62164             "references": [
62165                 {
62166                     "name": "WAI-ARIA Reference",
62167                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-setsize"
62168                 }
62169             ],
62170             "description": {
62171                 "kind": "markdown",
62172                 "value": "Defines the number of items in the current set of listitems or treeitems. Not required if all elements in the set are present in the DOM. See related [`aria-posinset`](https://www.w3.org/TR/wai-aria-1.1/#aria-posinset)."
62173             }
62174         },
62175         {
62176             "name": "aria-sort",
62177             "valueSet": "sort",
62178             "references": [
62179                 {
62180                     "name": "WAI-ARIA Reference",
62181                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-sort"
62182                 }
62183             ],
62184             "description": {
62185                 "kind": "markdown",
62186                 "value": "Indicates if items in a table or grid are sorted in ascending or descending order."
62187             }
62188         },
62189         {
62190             "name": "aria-valuemax",
62191             "references": [
62192                 {
62193                     "name": "WAI-ARIA Reference",
62194                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-valuemax"
62195                 }
62196             ],
62197             "description": {
62198                 "kind": "markdown",
62199                 "value": "Defines the maximum allowed value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."
62200             }
62201         },
62202         {
62203             "name": "aria-valuemin",
62204             "references": [
62205                 {
62206                     "name": "WAI-ARIA Reference",
62207                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-valuemin"
62208                 }
62209             ],
62210             "description": {
62211                 "kind": "markdown",
62212                 "value": "Defines the minimum allowed value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."
62213             }
62214         },
62215         {
62216             "name": "aria-valuenow",
62217             "references": [
62218                 {
62219                     "name": "WAI-ARIA Reference",
62220                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-valuenow"
62221                 }
62222             ],
62223             "description": {
62224                 "kind": "markdown",
62225                 "value": "Defines the current value for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget). See related [`aria-valuetext`](https://www.w3.org/TR/wai-aria-1.1/#aria-valuetext)."
62226             }
62227         },
62228         {
62229             "name": "aria-valuetext",
62230             "references": [
62231                 {
62232                     "name": "WAI-ARIA Reference",
62233                     "url": "https://www.w3.org/TR/wai-aria-1.1/#aria-valuetext"
62234                 }
62235             ],
62236             "description": {
62237                 "kind": "markdown",
62238                 "value": "Defines the human readable text alternative of [`aria-valuenow`](https://www.w3.org/TR/wai-aria-1.1/#aria-valuenow) for a range [widget](https://www.w3.org/TR/wai-aria-1.1/#dfn-widget)."
62239             }
62240         },
62241         {
62242             "name": "aria-details",
62243             "description": {
62244                 "kind": "markdown",
62245                 "value": "Identifies the [element](https://www.w3.org/TR/wai-aria-1.1/#dfn-element) that provides a detailed, extended description for the [object](https://www.w3.org/TR/wai-aria-1.1/#dfn-object). See related [`aria-describedby`](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby)."
62246             }
62247         },
62248         {
62249             "name": "aria-keyshortcuts",
62250             "description": {
62251                 "kind": "markdown",
62252                 "value": "Indicates keyboard shortcuts that an author has implemented to activate or give focus to an element."
62253             }
62254         }
62255     ],
62256     "valueSets": [
62257         {
62258             "name": "b",
62259             "values": [
62260                 {
62261                     "name": "true"
62262                 },
62263                 {
62264                     "name": "false"
62265                 }
62266             ]
62267         },
62268         {
62269             "name": "u",
62270             "values": [
62271                 {
62272                     "name": "true"
62273                 },
62274                 {
62275                     "name": "false"
62276                 },
62277                 {
62278                     "name": "undefined"
62279                 }
62280             ]
62281         },
62282         {
62283             "name": "o",
62284             "values": [
62285                 {
62286                     "name": "on"
62287                 },
62288                 {
62289                     "name": "off"
62290                 }
62291             ]
62292         },
62293         {
62294             "name": "y",
62295             "values": [
62296                 {
62297                     "name": "yes"
62298                 },
62299                 {
62300                     "name": "no"
62301                 }
62302             ]
62303         },
62304         {
62305             "name": "w",
62306             "values": [
62307                 {
62308                     "name": "soft"
62309                 },
62310                 {
62311                     "name": "hard"
62312                 }
62313             ]
62314         },
62315         {
62316             "name": "d",
62317             "values": [
62318                 {
62319                     "name": "ltr"
62320                 },
62321                 {
62322                     "name": "rtl"
62323                 },
62324                 {
62325                     "name": "auto"
62326                 }
62327             ]
62328         },
62329         {
62330             "name": "m",
62331             "values": [
62332                 {
62333                     "name": "GET",
62334                     "description": {
62335                         "kind": "markdown",
62336                         "value": "Corresponds to the HTTP [GET method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3); form data are appended to the `action` attribute URI with a '?' as separator, and the resulting URI is sent to the server. Use this method when the form has no side-effects and contains only ASCII characters."
62337                     }
62338                 },
62339                 {
62340                     "name": "POST",
62341                     "description": {
62342                         "kind": "markdown",
62343                         "value": "Corresponds to the HTTP [POST method](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5); form data are included in the body of the form and sent to the server."
62344                     }
62345                 },
62346                 {
62347                     "name": "dialog",
62348                     "description": {
62349                         "kind": "markdown",
62350                         "value": "Use when the form is inside a [`<dialog>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) element to close the dialog when submitted."
62351                     }
62352                 }
62353             ]
62354         },
62355         {
62356             "name": "fm",
62357             "values": [
62358                 {
62359                     "name": "GET"
62360                 },
62361                 {
62362                     "name": "POST"
62363                 }
62364             ]
62365         },
62366         {
62367             "name": "s",
62368             "values": [
62369                 {
62370                     "name": "row"
62371                 },
62372                 {
62373                     "name": "col"
62374                 },
62375                 {
62376                     "name": "rowgroup"
62377                 },
62378                 {
62379                     "name": "colgroup"
62380                 }
62381             ]
62382         },
62383         {
62384             "name": "t",
62385             "values": [
62386                 {
62387                     "name": "hidden"
62388                 },
62389                 {
62390                     "name": "text"
62391                 },
62392                 {
62393                     "name": "search"
62394                 },
62395                 {
62396                     "name": "tel"
62397                 },
62398                 {
62399                     "name": "url"
62400                 },
62401                 {
62402                     "name": "email"
62403                 },
62404                 {
62405                     "name": "password"
62406                 },
62407                 {
62408                     "name": "datetime"
62409                 },
62410                 {
62411                     "name": "date"
62412                 },
62413                 {
62414                     "name": "month"
62415                 },
62416                 {
62417                     "name": "week"
62418                 },
62419                 {
62420                     "name": "time"
62421                 },
62422                 {
62423                     "name": "datetime-local"
62424                 },
62425                 {
62426                     "name": "number"
62427                 },
62428                 {
62429                     "name": "range"
62430                 },
62431                 {
62432                     "name": "color"
62433                 },
62434                 {
62435                     "name": "checkbox"
62436                 },
62437                 {
62438                     "name": "radio"
62439                 },
62440                 {
62441                     "name": "file"
62442                 },
62443                 {
62444                     "name": "submit"
62445                 },
62446                 {
62447                     "name": "image"
62448                 },
62449                 {
62450                     "name": "reset"
62451                 },
62452                 {
62453                     "name": "button"
62454                 }
62455             ]
62456         },
62457         {
62458             "name": "im",
62459             "values": [
62460                 {
62461                     "name": "verbatim"
62462                 },
62463                 {
62464                     "name": "latin"
62465                 },
62466                 {
62467                     "name": "latin-name"
62468                 },
62469                 {
62470                     "name": "latin-prose"
62471                 },
62472                 {
62473                     "name": "full-width-latin"
62474                 },
62475                 {
62476                     "name": "kana"
62477                 },
62478                 {
62479                     "name": "kana-name"
62480                 },
62481                 {
62482                     "name": "katakana"
62483                 },
62484                 {
62485                     "name": "numeric"
62486                 },
62487                 {
62488                     "name": "tel"
62489                 },
62490                 {
62491                     "name": "email"
62492                 },
62493                 {
62494                     "name": "url"
62495                 }
62496             ]
62497         },
62498         {
62499             "name": "bt",
62500             "values": [
62501                 {
62502                     "name": "button"
62503                 },
62504                 {
62505                     "name": "submit"
62506                 },
62507                 {
62508                     "name": "reset"
62509                 },
62510                 {
62511                     "name": "menu"
62512                 }
62513             ]
62514         },
62515         {
62516             "name": "lt",
62517             "values": [
62518                 {
62519                     "name": "1"
62520                 },
62521                 {
62522                     "name": "a"
62523                 },
62524                 {
62525                     "name": "A"
62526                 },
62527                 {
62528                     "name": "i"
62529                 },
62530                 {
62531                     "name": "I"
62532                 }
62533             ]
62534         },
62535         {
62536             "name": "mt",
62537             "values": [
62538                 {
62539                     "name": "context"
62540                 },
62541                 {
62542                     "name": "toolbar"
62543                 }
62544             ]
62545         },
62546         {
62547             "name": "mit",
62548             "values": [
62549                 {
62550                     "name": "command"
62551                 },
62552                 {
62553                     "name": "checkbox"
62554                 },
62555                 {
62556                     "name": "radio"
62557                 }
62558             ]
62559         },
62560         {
62561             "name": "et",
62562             "values": [
62563                 {
62564                     "name": "application/x-www-form-urlencoded"
62565                 },
62566                 {
62567                     "name": "multipart/form-data"
62568                 },
62569                 {
62570                     "name": "text/plain"
62571                 }
62572             ]
62573         },
62574         {
62575             "name": "tk",
62576             "values": [
62577                 {
62578                     "name": "subtitles"
62579                 },
62580                 {
62581                     "name": "captions"
62582                 },
62583                 {
62584                     "name": "descriptions"
62585                 },
62586                 {
62587                     "name": "chapters"
62588                 },
62589                 {
62590                     "name": "metadata"
62591                 }
62592             ]
62593         },
62594         {
62595             "name": "pl",
62596             "values": [
62597                 {
62598                     "name": "none"
62599                 },
62600                 {
62601                     "name": "metadata"
62602                 },
62603                 {
62604                     "name": "auto"
62605                 }
62606             ]
62607         },
62608         {
62609             "name": "sh",
62610             "values": [
62611                 {
62612                     "name": "circle"
62613                 },
62614                 {
62615                     "name": "default"
62616                 },
62617                 {
62618                     "name": "poly"
62619                 },
62620                 {
62621                     "name": "rect"
62622                 }
62623             ]
62624         },
62625         {
62626             "name": "xo",
62627             "values": [
62628                 {
62629                     "name": "anonymous"
62630                 },
62631                 {
62632                     "name": "use-credentials"
62633                 }
62634             ]
62635         },
62636         {
62637             "name": "sb",
62638             "values": [
62639                 {
62640                     "name": "allow-forms"
62641                 },
62642                 {
62643                     "name": "allow-modals"
62644                 },
62645                 {
62646                     "name": "allow-pointer-lock"
62647                 },
62648                 {
62649                     "name": "allow-popups"
62650                 },
62651                 {
62652                     "name": "allow-popups-to-escape-sandbox"
62653                 },
62654                 {
62655                     "name": "allow-same-origin"
62656                 },
62657                 {
62658                     "name": "allow-scripts"
62659                 },
62660                 {
62661                     "name": "allow-top-navigation"
62662                 }
62663             ]
62664         },
62665         {
62666             "name": "tristate",
62667             "values": [
62668                 {
62669                     "name": "true"
62670                 },
62671                 {
62672                     "name": "false"
62673                 },
62674                 {
62675                     "name": "mixed"
62676                 },
62677                 {
62678                     "name": "undefined"
62679                 }
62680             ]
62681         },
62682         {
62683             "name": "inputautocomplete",
62684             "values": [
62685                 {
62686                     "name": "additional-name"
62687                 },
62688                 {
62689                     "name": "address-level1"
62690                 },
62691                 {
62692                     "name": "address-level2"
62693                 },
62694                 {
62695                     "name": "address-level3"
62696                 },
62697                 {
62698                     "name": "address-level4"
62699                 },
62700                 {
62701                     "name": "address-line1"
62702                 },
62703                 {
62704                     "name": "address-line2"
62705                 },
62706                 {
62707                     "name": "address-line3"
62708                 },
62709                 {
62710                     "name": "bday"
62711                 },
62712                 {
62713                     "name": "bday-year"
62714                 },
62715                 {
62716                     "name": "bday-day"
62717                 },
62718                 {
62719                     "name": "bday-month"
62720                 },
62721                 {
62722                     "name": "billing"
62723                 },
62724                 {
62725                     "name": "cc-additional-name"
62726                 },
62727                 {
62728                     "name": "cc-csc"
62729                 },
62730                 {
62731                     "name": "cc-exp"
62732                 },
62733                 {
62734                     "name": "cc-exp-month"
62735                 },
62736                 {
62737                     "name": "cc-exp-year"
62738                 },
62739                 {
62740                     "name": "cc-family-name"
62741                 },
62742                 {
62743                     "name": "cc-given-name"
62744                 },
62745                 {
62746                     "name": "cc-name"
62747                 },
62748                 {
62749                     "name": "cc-number"
62750                 },
62751                 {
62752                     "name": "cc-type"
62753                 },
62754                 {
62755                     "name": "country"
62756                 },
62757                 {
62758                     "name": "country-name"
62759                 },
62760                 {
62761                     "name": "current-password"
62762                 },
62763                 {
62764                     "name": "email"
62765                 },
62766                 {
62767                     "name": "family-name"
62768                 },
62769                 {
62770                     "name": "fax"
62771                 },
62772                 {
62773                     "name": "given-name"
62774                 },
62775                 {
62776                     "name": "home"
62777                 },
62778                 {
62779                     "name": "honorific-prefix"
62780                 },
62781                 {
62782                     "name": "honorific-suffix"
62783                 },
62784                 {
62785                     "name": "impp"
62786                 },
62787                 {
62788                     "name": "language"
62789                 },
62790                 {
62791                     "name": "mobile"
62792                 },
62793                 {
62794                     "name": "name"
62795                 },
62796                 {
62797                     "name": "new-password"
62798                 },
62799                 {
62800                     "name": "nickname"
62801                 },
62802                 {
62803                     "name": "organization"
62804                 },
62805                 {
62806                     "name": "organization-title"
62807                 },
62808                 {
62809                     "name": "pager"
62810                 },
62811                 {
62812                     "name": "photo"
62813                 },
62814                 {
62815                     "name": "postal-code"
62816                 },
62817                 {
62818                     "name": "sex"
62819                 },
62820                 {
62821                     "name": "shipping"
62822                 },
62823                 {
62824                     "name": "street-address"
62825                 },
62826                 {
62827                     "name": "tel-area-code"
62828                 },
62829                 {
62830                     "name": "tel"
62831                 },
62832                 {
62833                     "name": "tel-country-code"
62834                 },
62835                 {
62836                     "name": "tel-extension"
62837                 },
62838                 {
62839                     "name": "tel-local"
62840                 },
62841                 {
62842                     "name": "tel-local-prefix"
62843                 },
62844                 {
62845                     "name": "tel-local-suffix"
62846                 },
62847                 {
62848                     "name": "tel-national"
62849                 },
62850                 {
62851                     "name": "transaction-amount"
62852                 },
62853                 {
62854                     "name": "transaction-currency"
62855                 },
62856                 {
62857                     "name": "url"
62858                 },
62859                 {
62860                     "name": "username"
62861                 },
62862                 {
62863                     "name": "work"
62864                 }
62865             ]
62866         },
62867         {
62868             "name": "autocomplete",
62869             "values": [
62870                 {
62871                     "name": "inline"
62872                 },
62873                 {
62874                     "name": "list"
62875                 },
62876                 {
62877                     "name": "both"
62878                 },
62879                 {
62880                     "name": "none"
62881                 }
62882             ]
62883         },
62884         {
62885             "name": "current",
62886             "values": [
62887                 {
62888                     "name": "page"
62889                 },
62890                 {
62891                     "name": "step"
62892                 },
62893                 {
62894                     "name": "location"
62895                 },
62896                 {
62897                     "name": "date"
62898                 },
62899                 {
62900                     "name": "time"
62901                 },
62902                 {
62903                     "name": "true"
62904                 },
62905                 {
62906                     "name": "false"
62907                 }
62908             ]
62909         },
62910         {
62911             "name": "dropeffect",
62912             "values": [
62913                 {
62914                     "name": "copy"
62915                 },
62916                 {
62917                     "name": "move"
62918                 },
62919                 {
62920                     "name": "link"
62921                 },
62922                 {
62923                     "name": "execute"
62924                 },
62925                 {
62926                     "name": "popup"
62927                 },
62928                 {
62929                     "name": "none"
62930                 }
62931             ]
62932         },
62933         {
62934             "name": "invalid",
62935             "values": [
62936                 {
62937                     "name": "grammar"
62938                 },
62939                 {
62940                     "name": "false"
62941                 },
62942                 {
62943                     "name": "spelling"
62944                 },
62945                 {
62946                     "name": "true"
62947                 }
62948             ]
62949         },
62950         {
62951             "name": "live",
62952             "values": [
62953                 {
62954                     "name": "off"
62955                 },
62956                 {
62957                     "name": "polite"
62958                 },
62959                 {
62960                     "name": "assertive"
62961                 }
62962             ]
62963         },
62964         {
62965             "name": "orientation",
62966             "values": [
62967                 {
62968                     "name": "vertical"
62969                 },
62970                 {
62971                     "name": "horizontal"
62972                 },
62973                 {
62974                     "name": "undefined"
62975                 }
62976             ]
62977         },
62978         {
62979             "name": "relevant",
62980             "values": [
62981                 {
62982                     "name": "additions"
62983                 },
62984                 {
62985                     "name": "removals"
62986                 },
62987                 {
62988                     "name": "text"
62989                 },
62990                 {
62991                     "name": "all"
62992                 },
62993                 {
62994                     "name": "additions text"
62995                 }
62996             ]
62997         },
62998         {
62999             "name": "sort",
63000             "values": [
63001                 {
63002                     "name": "ascending"
63003                 },
63004                 {
63005                     "name": "descending"
63006                 },
63007                 {
63008                     "name": "none"
63009                 },
63010                 {
63011                     "name": "other"
63012                 }
63013             ]
63014         },
63015         {
63016             "name": "roles",
63017             "values": [
63018                 {
63019                     "name": "alert"
63020                 },
63021                 {
63022                     "name": "alertdialog"
63023                 },
63024                 {
63025                     "name": "button"
63026                 },
63027                 {
63028                     "name": "checkbox"
63029                 },
63030                 {
63031                     "name": "dialog"
63032                 },
63033                 {
63034                     "name": "gridcell"
63035                 },
63036                 {
63037                     "name": "link"
63038                 },
63039                 {
63040                     "name": "log"
63041                 },
63042                 {
63043                     "name": "marquee"
63044                 },
63045                 {
63046                     "name": "menuitem"
63047                 },
63048                 {
63049                     "name": "menuitemcheckbox"
63050                 },
63051                 {
63052                     "name": "menuitemradio"
63053                 },
63054                 {
63055                     "name": "option"
63056                 },
63057                 {
63058                     "name": "progressbar"
63059                 },
63060                 {
63061                     "name": "radio"
63062                 },
63063                 {
63064                     "name": "scrollbar"
63065                 },
63066                 {
63067                     "name": "searchbox"
63068                 },
63069                 {
63070                     "name": "slider"
63071                 },
63072                 {
63073                     "name": "spinbutton"
63074                 },
63075                 {
63076                     "name": "status"
63077                 },
63078                 {
63079                     "name": "switch"
63080                 },
63081                 {
63082                     "name": "tab"
63083                 },
63084                 {
63085                     "name": "tabpanel"
63086                 },
63087                 {
63088                     "name": "textbox"
63089                 },
63090                 {
63091                     "name": "timer"
63092                 },
63093                 {
63094                     "name": "tooltip"
63095                 },
63096                 {
63097                     "name": "treeitem"
63098                 },
63099                 {
63100                     "name": "combobox"
63101                 },
63102                 {
63103                     "name": "grid"
63104                 },
63105                 {
63106                     "name": "listbox"
63107                 },
63108                 {
63109                     "name": "menu"
63110                 },
63111                 {
63112                     "name": "menubar"
63113                 },
63114                 {
63115                     "name": "radiogroup"
63116                 },
63117                 {
63118                     "name": "tablist"
63119                 },
63120                 {
63121                     "name": "tree"
63122                 },
63123                 {
63124                     "name": "treegrid"
63125                 },
63126                 {
63127                     "name": "application"
63128                 },
63129                 {
63130                     "name": "article"
63131                 },
63132                 {
63133                     "name": "cell"
63134                 },
63135                 {
63136                     "name": "columnheader"
63137                 },
63138                 {
63139                     "name": "definition"
63140                 },
63141                 {
63142                     "name": "directory"
63143                 },
63144                 {
63145                     "name": "document"
63146                 },
63147                 {
63148                     "name": "feed"
63149                 },
63150                 {
63151                     "name": "figure"
63152                 },
63153                 {
63154                     "name": "group"
63155                 },
63156                 {
63157                     "name": "heading"
63158                 },
63159                 {
63160                     "name": "img"
63161                 },
63162                 {
63163                     "name": "list"
63164                 },
63165                 {
63166                     "name": "listitem"
63167                 },
63168                 {
63169                     "name": "math"
63170                 },
63171                 {
63172                     "name": "none"
63173                 },
63174                 {
63175                     "name": "note"
63176                 },
63177                 {
63178                     "name": "presentation"
63179                 },
63180                 {
63181                     "name": "region"
63182                 },
63183                 {
63184                     "name": "row"
63185                 },
63186                 {
63187                     "name": "rowgroup"
63188                 },
63189                 {
63190                     "name": "rowheader"
63191                 },
63192                 {
63193                     "name": "separator"
63194                 },
63195                 {
63196                     "name": "table"
63197                 },
63198                 {
63199                     "name": "term"
63200                 },
63201                 {
63202                     "name": "text"
63203                 },
63204                 {
63205                     "name": "toolbar"
63206                 },
63207                 {
63208                     "name": "banner"
63209                 },
63210                 {
63211                     "name": "complementary"
63212                 },
63213                 {
63214                     "name": "contentinfo"
63215                 },
63216                 {
63217                     "name": "form"
63218                 },
63219                 {
63220                     "name": "main"
63221                 },
63222                 {
63223                     "name": "navigation"
63224                 },
63225                 {
63226                     "name": "region"
63227                 },
63228                 {
63229                     "name": "search"
63230                 },
63231                 {
63232                     "name": "doc-abstract"
63233                 },
63234                 {
63235                     "name": "doc-acknowledgments"
63236                 },
63237                 {
63238                     "name": "doc-afterword"
63239                 },
63240                 {
63241                     "name": "doc-appendix"
63242                 },
63243                 {
63244                     "name": "doc-backlink"
63245                 },
63246                 {
63247                     "name": "doc-biblioentry"
63248                 },
63249                 {
63250                     "name": "doc-bibliography"
63251                 },
63252                 {
63253                     "name": "doc-biblioref"
63254                 },
63255                 {
63256                     "name": "doc-chapter"
63257                 },
63258                 {
63259                     "name": "doc-colophon"
63260                 },
63261                 {
63262                     "name": "doc-conclusion"
63263                 },
63264                 {
63265                     "name": "doc-cover"
63266                 },
63267                 {
63268                     "name": "doc-credit"
63269                 },
63270                 {
63271                     "name": "doc-credits"
63272                 },
63273                 {
63274                     "name": "doc-dedication"
63275                 },
63276                 {
63277                     "name": "doc-endnote"
63278                 },
63279                 {
63280                     "name": "doc-endnotes"
63281                 },
63282                 {
63283                     "name": "doc-epigraph"
63284                 },
63285                 {
63286                     "name": "doc-epilogue"
63287                 },
63288                 {
63289                     "name": "doc-errata"
63290                 },
63291                 {
63292                     "name": "doc-example"
63293                 },
63294                 {
63295                     "name": "doc-footnote"
63296                 },
63297                 {
63298                     "name": "doc-foreword"
63299                 },
63300                 {
63301                     "name": "doc-glossary"
63302                 },
63303                 {
63304                     "name": "doc-glossref"
63305                 },
63306                 {
63307                     "name": "doc-index"
63308                 },
63309                 {
63310                     "name": "doc-introduction"
63311                 },
63312                 {
63313                     "name": "doc-noteref"
63314                 },
63315                 {
63316                     "name": "doc-notice"
63317                 },
63318                 {
63319                     "name": "doc-pagebreak"
63320                 },
63321                 {
63322                     "name": "doc-pagelist"
63323                 },
63324                 {
63325                     "name": "doc-part"
63326                 },
63327                 {
63328                     "name": "doc-preface"
63329                 },
63330                 {
63331                     "name": "doc-prologue"
63332                 },
63333                 {
63334                     "name": "doc-pullquote"
63335                 },
63336                 {
63337                     "name": "doc-qna"
63338                 },
63339                 {
63340                     "name": "doc-subtitle"
63341                 },
63342                 {
63343                     "name": "doc-tip"
63344                 },
63345                 {
63346                     "name": "doc-toc"
63347                 }
63348             ]
63349         },
63350         {
63351             "name": "metanames",
63352             "values": [
63353                 {
63354                     "name": "application-name"
63355                 },
63356                 {
63357                     "name": "author"
63358                 },
63359                 {
63360                     "name": "description"
63361                 },
63362                 {
63363                     "name": "format-detection"
63364                 },
63365                 {
63366                     "name": "generator"
63367                 },
63368                 {
63369                     "name": "keywords"
63370                 },
63371                 {
63372                     "name": "publisher"
63373                 },
63374                 {
63375                     "name": "referrer"
63376                 },
63377                 {
63378                     "name": "robots"
63379                 },
63380                 {
63381                     "name": "theme-color"
63382                 },
63383                 {
63384                     "name": "viewport"
63385                 }
63386             ]
63387         }
63388     ]
63389 };
63390
63391
63392 /***/ }),
63393 /* 133 */
63394 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
63395
63396 __webpack_require__.r(__webpack_exports__);
63397 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
63398 /* harmony export */   "doRename": () => /* binding */ doRename
63399 /* harmony export */ });
63400 /*---------------------------------------------------------------------------------------------
63401  *  Copyright (c) Microsoft Corporation. All rights reserved.
63402  *  Licensed under the MIT License. See License.txt in the project root for license information.
63403  *--------------------------------------------------------------------------------------------*/
63404 function doRename(document, position, newName, htmlDocument) {
63405     var _a;
63406     var offset = document.offsetAt(position);
63407     var node = htmlDocument.findNodeAt(offset);
63408     if (!node.tag) {
63409         return null;
63410     }
63411     if (!isWithinTagRange(node, offset, node.tag)) {
63412         return null;
63413     }
63414     var edits = [];
63415     var startTagRange = {
63416         start: document.positionAt(node.start + '<'.length),
63417         end: document.positionAt(node.start + '<'.length + node.tag.length)
63418     };
63419     edits.push({
63420         range: startTagRange,
63421         newText: newName
63422     });
63423     if (node.endTagStart) {
63424         var endTagRange = {
63425             start: document.positionAt(node.endTagStart + '</'.length),
63426             end: document.positionAt(node.endTagStart + '</'.length + node.tag.length)
63427         };
63428         edits.push({
63429             range: endTagRange,
63430             newText: newName
63431         });
63432     }
63433     var changes = (_a = {},
63434         _a[document.uri.toString()] = edits,
63435         _a);
63436     return {
63437         changes: changes
63438     };
63439 }
63440 function toLocString(p) {
63441     return "(" + p.line + ", " + p.character + ")";
63442 }
63443 function isWithinTagRange(node, offset, nodeTag) {
63444     // Self-closing tag
63445     if (node.endTagStart) {
63446         if (node.endTagStart + '</'.length <= offset && offset <= node.endTagStart + '</'.length + nodeTag.length) {
63447             return true;
63448         }
63449     }
63450     return node.start + '<'.length <= offset && offset <= node.start + '<'.length + nodeTag.length;
63451 }
63452
63453
63454 /***/ }),
63455 /* 134 */
63456 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
63457
63458 __webpack_require__.r(__webpack_exports__);
63459 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
63460 /* harmony export */   "findMatchingTagPosition": () => /* binding */ findMatchingTagPosition
63461 /* harmony export */ });
63462 /*---------------------------------------------------------------------------------------------
63463  *  Copyright (c) Microsoft Corporation. All rights reserved.
63464  *  Licensed under the MIT License. See License.txt in the project root for license information.
63465  *--------------------------------------------------------------------------------------------*/
63466 function findMatchingTagPosition(document, position, htmlDocument) {
63467     var offset = document.offsetAt(position);
63468     var node = htmlDocument.findNodeAt(offset);
63469     if (!node.tag) {
63470         return null;
63471     }
63472     if (!node.endTagStart) {
63473         return null;
63474     }
63475     // Within open tag, compute close tag
63476     if (node.start + '<'.length <= offset && offset <= node.start + '<'.length + node.tag.length) {
63477         var mirrorOffset = (offset - '<'.length - node.start) + node.endTagStart + '</'.length;
63478         return document.positionAt(mirrorOffset);
63479     }
63480     // Within closing tag, compute open tag
63481     if (node.endTagStart + '</'.length <= offset && offset <= node.endTagStart + '</'.length + node.tag.length) {
63482         var mirrorOffset = (offset - '</'.length - node.endTagStart) + node.start + '<'.length;
63483         return document.positionAt(mirrorOffset);
63484     }
63485     return null;
63486 }
63487
63488
63489 /***/ }),
63490 /* 135 */
63491 /***/ ((__unused_webpack_module, exports) => {
63492
63493
63494 /*---------------------------------------------------------------------------------------------
63495  *  Copyright (c) Microsoft Corporation. All rights reserved.
63496  *  Licensed under the MIT License. See License.txt in the project root for license information.
63497  *--------------------------------------------------------------------------------------------*/
63498 Object.defineProperty(exports, "__esModule", ({ value: true }));
63499 exports.getLanguageModelCache = void 0;
63500 function getLanguageModelCache(maxEntries, cleanupIntervalTimeInSec, parse) {
63501     let languageModels = {};
63502     let nModels = 0;
63503     let cleanupInterval = undefined;
63504     if (cleanupIntervalTimeInSec > 0) {
63505         cleanupInterval = setInterval(() => {
63506             const cutoffTime = Date.now() - cleanupIntervalTimeInSec * 1000;
63507             const uris = Object.keys(languageModels);
63508             for (const uri of uris) {
63509                 const languageModelInfo = languageModels[uri];
63510                 if (languageModelInfo.cTime < cutoffTime) {
63511                     delete languageModels[uri];
63512                     nModels--;
63513                 }
63514             }
63515         }, cleanupIntervalTimeInSec * 1000);
63516     }
63517     return {
63518         get(document) {
63519             const version = document.version;
63520             const languageId = document.languageId;
63521             const languageModelInfo = languageModels[document.uri];
63522             if (languageModelInfo && languageModelInfo.version === version && languageModelInfo.languageId === languageId) {
63523                 languageModelInfo.cTime = Date.now();
63524                 return languageModelInfo.languageModel;
63525             }
63526             const languageModel = parse(document);
63527             languageModels[document.uri] = { languageModel, version, languageId, cTime: Date.now() };
63528             if (!languageModelInfo) {
63529                 nModels++;
63530             }
63531             if (nModels === maxEntries) {
63532                 let oldestTime = Number.MAX_VALUE;
63533                 let oldestUri = null;
63534                 for (const uri in languageModels) {
63535                     const languageModelInfo = languageModels[uri];
63536                     if (languageModelInfo.cTime < oldestTime) {
63537                         oldestUri = uri;
63538                         oldestTime = languageModelInfo.cTime;
63539                     }
63540                 }
63541                 if (oldestUri) {
63542                     delete languageModels[oldestUri];
63543                     nModels--;
63544                 }
63545             }
63546             return languageModel;
63547         },
63548         onDocumentRemoved(document) {
63549             const uri = document.uri;
63550             if (languageModels[uri]) {
63551                 delete languageModels[uri];
63552                 nModels--;
63553             }
63554         },
63555         dispose() {
63556             if (typeof cleanupInterval !== 'undefined') {
63557                 clearInterval(cleanupInterval);
63558                 cleanupInterval = undefined;
63559                 languageModels = {};
63560                 nModels = 0;
63561             }
63562         }
63563     };
63564 }
63565 exports.getLanguageModelCache = getLanguageModelCache;
63566
63567
63568 /***/ }),
63569 /* 136 */
63570 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
63571
63572
63573 /*---------------------------------------------------------------------------------------------
63574  *  Copyright (c) Microsoft Corporation. All rights reserved.
63575  *  Licensed under the MIT License. See License.txt in the project root for license information.
63576  *--------------------------------------------------------------------------------------------*/
63577 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
63578     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
63579     return new (P || (P = Promise))(function (resolve, reject) {
63580         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
63581         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
63582         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
63583         step((generator = generator.apply(thisArg, _arguments || [])).next());
63584     });
63585 };
63586 Object.defineProperty(exports, "__esModule", ({ value: true }));
63587 exports.getCSSMode = void 0;
63588 const languageModelCache_1 = __webpack_require__(135);
63589 const languageModes_1 = __webpack_require__(61);
63590 const embeddedSupport_1 = __webpack_require__(137);
63591 function getCSSMode(cssLanguageService, documentRegions, workspace) {
63592     let embeddedCSSDocuments = languageModelCache_1.getLanguageModelCache(10, 60, document => documentRegions.get(document).getEmbeddedDocument('css'));
63593     let cssStylesheets = languageModelCache_1.getLanguageModelCache(10, 60, document => cssLanguageService.parseStylesheet(document));
63594     return {
63595         getId() {
63596             return 'css';
63597         },
63598         doValidation(document, settings = workspace.settings) {
63599             return __awaiter(this, void 0, void 0, function* () {
63600                 let embedded = embeddedCSSDocuments.get(document);
63601                 return cssLanguageService.doValidation(embedded, cssStylesheets.get(embedded), settings && settings.css);
63602             });
63603         },
63604         doComplete(document, position, documentContext, _settings = workspace.settings) {
63605             return __awaiter(this, void 0, void 0, function* () {
63606                 let embedded = embeddedCSSDocuments.get(document);
63607                 const stylesheet = cssStylesheets.get(embedded);
63608                 return cssLanguageService.doComplete2(embedded, position, stylesheet, documentContext) || languageModes_1.CompletionList.create();
63609             });
63610         },
63611         doHover(document, position) {
63612             return __awaiter(this, void 0, void 0, function* () {
63613                 let embedded = embeddedCSSDocuments.get(document);
63614                 return cssLanguageService.doHover(embedded, position, cssStylesheets.get(embedded));
63615             });
63616         },
63617         findDocumentHighlight(document, position) {
63618             return __awaiter(this, void 0, void 0, function* () {
63619                 let embedded = embeddedCSSDocuments.get(document);
63620                 return cssLanguageService.findDocumentHighlights(embedded, position, cssStylesheets.get(embedded));
63621             });
63622         },
63623         findDocumentSymbols(document) {
63624             return __awaiter(this, void 0, void 0, function* () {
63625                 let embedded = embeddedCSSDocuments.get(document);
63626                 return cssLanguageService.findDocumentSymbols(embedded, cssStylesheets.get(embedded)).filter(s => s.name !== embeddedSupport_1.CSS_STYLE_RULE);
63627             });
63628         },
63629         findDefinition(document, position) {
63630             return __awaiter(this, void 0, void 0, function* () {
63631                 let embedded = embeddedCSSDocuments.get(document);
63632                 return cssLanguageService.findDefinition(embedded, position, cssStylesheets.get(embedded));
63633             });
63634         },
63635         findReferences(document, position) {
63636             return __awaiter(this, void 0, void 0, function* () {
63637                 let embedded = embeddedCSSDocuments.get(document);
63638                 return cssLanguageService.findReferences(embedded, position, cssStylesheets.get(embedded));
63639             });
63640         },
63641         findDocumentColors(document) {
63642             return __awaiter(this, void 0, void 0, function* () {
63643                 let embedded = embeddedCSSDocuments.get(document);
63644                 return cssLanguageService.findDocumentColors(embedded, cssStylesheets.get(embedded));
63645             });
63646         },
63647         getColorPresentations(document, color, range) {
63648             return __awaiter(this, void 0, void 0, function* () {
63649                 let embedded = embeddedCSSDocuments.get(document);
63650                 return cssLanguageService.getColorPresentations(embedded, cssStylesheets.get(embedded), color, range);
63651             });
63652         },
63653         getFoldingRanges(document) {
63654             return __awaiter(this, void 0, void 0, function* () {
63655                 let embedded = embeddedCSSDocuments.get(document);
63656                 return cssLanguageService.getFoldingRanges(embedded, {});
63657             });
63658         },
63659         getSelectionRange(document, position) {
63660             return __awaiter(this, void 0, void 0, function* () {
63661                 let embedded = embeddedCSSDocuments.get(document);
63662                 return cssLanguageService.getSelectionRanges(embedded, [position], cssStylesheets.get(embedded))[0];
63663             });
63664         },
63665         onDocumentRemoved(document) {
63666             embeddedCSSDocuments.onDocumentRemoved(document);
63667             cssStylesheets.onDocumentRemoved(document);
63668         },
63669         dispose() {
63670             embeddedCSSDocuments.dispose();
63671             cssStylesheets.dispose();
63672         }
63673     };
63674 }
63675 exports.getCSSMode = getCSSMode;
63676
63677
63678 /***/ }),
63679 /* 137 */
63680 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
63681
63682
63683 /*---------------------------------------------------------------------------------------------
63684  *  Copyright (c) Microsoft Corporation. All rights reserved.
63685  *  Licensed under the MIT License. See License.txt in the project root for license information.
63686  *--------------------------------------------------------------------------------------------*/
63687 Object.defineProperty(exports, "__esModule", ({ value: true }));
63688 exports.getDocumentRegions = exports.CSS_STYLE_RULE = void 0;
63689 const languageModes_1 = __webpack_require__(61);
63690 exports.CSS_STYLE_RULE = '__';
63691 function getDocumentRegions(languageService, document) {
63692     let regions = [];
63693     let scanner = languageService.createScanner(document.getText());
63694     let lastTagName = '';
63695     let lastAttributeName = null;
63696     let languageIdFromType = undefined;
63697     let importedScripts = [];
63698     let token = scanner.scan();
63699     while (token !== languageModes_1.TokenType.EOS) {
63700         switch (token) {
63701             case languageModes_1.TokenType.StartTag:
63702                 lastTagName = scanner.getTokenText();
63703                 lastAttributeName = null;
63704                 languageIdFromType = 'javascript';
63705                 break;
63706             case languageModes_1.TokenType.Styles:
63707                 regions.push({ languageId: 'css', start: scanner.getTokenOffset(), end: scanner.getTokenEnd() });
63708                 break;
63709             case languageModes_1.TokenType.Script:
63710                 regions.push({ languageId: languageIdFromType, start: scanner.getTokenOffset(), end: scanner.getTokenEnd() });
63711                 break;
63712             case languageModes_1.TokenType.AttributeName:
63713                 lastAttributeName = scanner.getTokenText();
63714                 break;
63715             case languageModes_1.TokenType.AttributeValue:
63716                 if (lastAttributeName === 'src' && lastTagName.toLowerCase() === 'script') {
63717                     let value = scanner.getTokenText();
63718                     if (value[0] === '\'' || value[0] === '"') {
63719                         value = value.substr(1, value.length - 1);
63720                     }
63721                     importedScripts.push(value);
63722                 }
63723                 else if (lastAttributeName === 'type' && lastTagName.toLowerCase() === 'script') {
63724                     if (/["'](module|(text|application)\/(java|ecma)script|text\/babel)["']/.test(scanner.getTokenText())) {
63725                         languageIdFromType = 'javascript';
63726                     }
63727                     else if (/["']text\/typescript["']/.test(scanner.getTokenText())) {
63728                         languageIdFromType = 'typescript';
63729                     }
63730                     else {
63731                         languageIdFromType = undefined;
63732                     }
63733                 }
63734                 else {
63735                     let attributeLanguageId = getAttributeLanguage(lastAttributeName);
63736                     if (attributeLanguageId) {
63737                         let start = scanner.getTokenOffset();
63738                         let end = scanner.getTokenEnd();
63739                         let firstChar = document.getText()[start];
63740                         if (firstChar === '\'' || firstChar === '"') {
63741                             start++;
63742                             end--;
63743                         }
63744                         regions.push({ languageId: attributeLanguageId, start, end, attributeValue: true });
63745                     }
63746                 }
63747                 lastAttributeName = null;
63748                 break;
63749         }
63750         token = scanner.scan();
63751     }
63752     return {
63753         getLanguageRanges: (range) => getLanguageRanges(document, regions, range),
63754         getEmbeddedDocument: (languageId, ignoreAttributeValues) => getEmbeddedDocument(document, regions, languageId, ignoreAttributeValues),
63755         getLanguageAtPosition: (position) => getLanguageAtPosition(document, regions, position),
63756         getLanguagesInDocument: () => getLanguagesInDocument(document, regions),
63757         getImportedScripts: () => importedScripts
63758     };
63759 }
63760 exports.getDocumentRegions = getDocumentRegions;
63761 function getLanguageRanges(document, regions, range) {
63762     let result = [];
63763     let currentPos = range ? range.start : languageModes_1.Position.create(0, 0);
63764     let currentOffset = range ? document.offsetAt(range.start) : 0;
63765     let endOffset = range ? document.offsetAt(range.end) : document.getText().length;
63766     for (let region of regions) {
63767         if (region.end > currentOffset && region.start < endOffset) {
63768             let start = Math.max(region.start, currentOffset);
63769             let startPos = document.positionAt(start);
63770             if (currentOffset < region.start) {
63771                 result.push({
63772                     start: currentPos,
63773                     end: startPos,
63774                     languageId: 'html'
63775                 });
63776             }
63777             let end = Math.min(region.end, endOffset);
63778             let endPos = document.positionAt(end);
63779             if (end > region.start) {
63780                 result.push({
63781                     start: startPos,
63782                     end: endPos,
63783                     languageId: region.languageId,
63784                     attributeValue: region.attributeValue
63785                 });
63786             }
63787             currentOffset = end;
63788             currentPos = endPos;
63789         }
63790     }
63791     if (currentOffset < endOffset) {
63792         let endPos = range ? range.end : document.positionAt(endOffset);
63793         result.push({
63794             start: currentPos,
63795             end: endPos,
63796             languageId: 'html'
63797         });
63798     }
63799     return result;
63800 }
63801 function getLanguagesInDocument(_document, regions) {
63802     let result = [];
63803     for (let region of regions) {
63804         if (region.languageId && result.indexOf(region.languageId) === -1) {
63805             result.push(region.languageId);
63806             if (result.length === 3) {
63807                 return result;
63808             }
63809         }
63810     }
63811     result.push('html');
63812     return result;
63813 }
63814 function getLanguageAtPosition(document, regions, position) {
63815     let offset = document.offsetAt(position);
63816     for (let region of regions) {
63817         if (region.start <= offset) {
63818             if (offset <= region.end) {
63819                 return region.languageId;
63820             }
63821         }
63822         else {
63823             break;
63824         }
63825     }
63826     return 'html';
63827 }
63828 function getEmbeddedDocument(document, contents, languageId, ignoreAttributeValues) {
63829     let currentPos = 0;
63830     let oldContent = document.getText();
63831     let result = '';
63832     let lastSuffix = '';
63833     for (let c of contents) {
63834         if (c.languageId === languageId && (!ignoreAttributeValues || !c.attributeValue)) {
63835             result = substituteWithWhitespace(result, currentPos, c.start, oldContent, lastSuffix, getPrefix(c));
63836             result += oldContent.substring(c.start, c.end);
63837             currentPos = c.end;
63838             lastSuffix = getSuffix(c);
63839         }
63840     }
63841     result = substituteWithWhitespace(result, currentPos, oldContent.length, oldContent, lastSuffix, '');
63842     return languageModes_1.TextDocument.create(document.uri, languageId, document.version, result);
63843 }
63844 function getPrefix(c) {
63845     if (c.attributeValue) {
63846         switch (c.languageId) {
63847             case 'css': return exports.CSS_STYLE_RULE + '{';
63848         }
63849     }
63850     return '';
63851 }
63852 function getSuffix(c) {
63853     if (c.attributeValue) {
63854         switch (c.languageId) {
63855             case 'css': return '}';
63856             case 'javascript': return ';';
63857         }
63858     }
63859     return '';
63860 }
63861 function substituteWithWhitespace(result, start, end, oldContent, before, after) {
63862     let accumulatedWS = 0;
63863     result += before;
63864     for (let i = start + before.length; i < end; i++) {
63865         let ch = oldContent[i];
63866         if (ch === '\n' || ch === '\r') {
63867             // only write new lines, skip the whitespace
63868             accumulatedWS = 0;
63869             result += ch;
63870         }
63871         else {
63872             accumulatedWS++;
63873         }
63874     }
63875     result = append(result, ' ', accumulatedWS - after.length);
63876     result += after;
63877     return result;
63878 }
63879 function append(result, str, n) {
63880     while (n > 0) {
63881         if (n & 1) {
63882             result += str;
63883         }
63884         n >>= 1;
63885         str += str;
63886     }
63887     return result;
63888 }
63889 function getAttributeLanguage(attributeName) {
63890     let match = attributeName.match(/^(style)$|^(on\w+)$/i);
63891     if (!match) {
63892         return null;
63893     }
63894     return match[1] ? 'css' : 'javascript';
63895 }
63896
63897
63898 /***/ }),
63899 /* 138 */
63900 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
63901
63902
63903 /*---------------------------------------------------------------------------------------------
63904  *  Copyright (c) Microsoft Corporation. All rights reserved.
63905  *  Licensed under the MIT License. See License.txt in the project root for license information.
63906  *--------------------------------------------------------------------------------------------*/
63907 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
63908     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
63909     return new (P || (P = Promise))(function (resolve, reject) {
63910         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
63911         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
63912         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
63913         step((generator = generator.apply(thisArg, _arguments || [])).next());
63914     });
63915 };
63916 Object.defineProperty(exports, "__esModule", ({ value: true }));
63917 exports.getHTMLMode = void 0;
63918 const languageModelCache_1 = __webpack_require__(135);
63919 function getHTMLMode(htmlLanguageService, workspace) {
63920     let htmlDocuments = languageModelCache_1.getLanguageModelCache(10, 60, document => htmlLanguageService.parseHTMLDocument(document));
63921     return {
63922         getId() {
63923             return 'html';
63924         },
63925         getSelectionRange(document, position) {
63926             return __awaiter(this, void 0, void 0, function* () {
63927                 return htmlLanguageService.getSelectionRanges(document, [position])[0];
63928             });
63929         },
63930         doComplete(document, position, documentContext, settings = workspace.settings) {
63931             let options = settings && settings.html && settings.html.suggest;
63932             let doAutoComplete = settings && settings.html && settings.html.autoClosingTags;
63933             if (doAutoComplete) {
63934                 options.hideAutoCompleteProposals = true;
63935             }
63936             const htmlDocument = htmlDocuments.get(document);
63937             let completionList = htmlLanguageService.doComplete2(document, position, htmlDocument, documentContext, options);
63938             return completionList;
63939         },
63940         doHover(document, position) {
63941             return __awaiter(this, void 0, void 0, function* () {
63942                 return htmlLanguageService.doHover(document, position, htmlDocuments.get(document));
63943             });
63944         },
63945         findDocumentHighlight(document, position) {
63946             return __awaiter(this, void 0, void 0, function* () {
63947                 return htmlLanguageService.findDocumentHighlights(document, position, htmlDocuments.get(document));
63948             });
63949         },
63950         findDocumentLinks(document, documentContext) {
63951             return __awaiter(this, void 0, void 0, function* () {
63952                 return htmlLanguageService.findDocumentLinks(document, documentContext);
63953             });
63954         },
63955         findDocumentSymbols(document) {
63956             return __awaiter(this, void 0, void 0, function* () {
63957                 return htmlLanguageService.findDocumentSymbols(document, htmlDocuments.get(document));
63958             });
63959         },
63960         format(document, range, formatParams, settings = workspace.settings) {
63961             return __awaiter(this, void 0, void 0, function* () {
63962                 let formatSettings = settings && settings.html && settings.html.format;
63963                 if (formatSettings) {
63964                     formatSettings = merge(formatSettings, {});
63965                 }
63966                 else {
63967                     formatSettings = {};
63968                 }
63969                 if (formatSettings.contentUnformatted) {
63970                     formatSettings.contentUnformatted = formatSettings.contentUnformatted + ',script';
63971                 }
63972                 else {
63973                     formatSettings.contentUnformatted = 'script';
63974                 }
63975                 formatSettings = merge(formatParams, formatSettings);
63976                 return htmlLanguageService.format(document, range, formatSettings);
63977             });
63978         },
63979         getFoldingRanges(document) {
63980             return __awaiter(this, void 0, void 0, function* () {
63981                 return htmlLanguageService.getFoldingRanges(document);
63982             });
63983         },
63984         doAutoClose(document, position) {
63985             return __awaiter(this, void 0, void 0, function* () {
63986                 let offset = document.offsetAt(position);
63987                 let text = document.getText();
63988                 if (offset > 0 && text.charAt(offset - 1).match(/[>\/]/g)) {
63989                     return htmlLanguageService.doTagComplete(document, position, htmlDocuments.get(document));
63990                 }
63991                 return null;
63992             });
63993         },
63994         doRename(document, position, newName) {
63995             return __awaiter(this, void 0, void 0, function* () {
63996                 const htmlDocument = htmlDocuments.get(document);
63997                 return htmlLanguageService.doRename(document, position, newName, htmlDocument);
63998             });
63999         },
64000         onDocumentRemoved(document) {
64001             return __awaiter(this, void 0, void 0, function* () {
64002                 htmlDocuments.onDocumentRemoved(document);
64003             });
64004         },
64005         findMatchingTagPosition(document, position) {
64006             return __awaiter(this, void 0, void 0, function* () {
64007                 const htmlDocument = htmlDocuments.get(document);
64008                 return htmlLanguageService.findMatchingTagPosition(document, position, htmlDocument);
64009             });
64010         },
64011         doOnTypeRename(document, position) {
64012             return __awaiter(this, void 0, void 0, function* () {
64013                 const htmlDocument = htmlDocuments.get(document);
64014                 return htmlLanguageService.findOnTypeRenameRanges(document, position, htmlDocument);
64015             });
64016         },
64017         dispose() {
64018             htmlDocuments.dispose();
64019         }
64020     };
64021 }
64022 exports.getHTMLMode = getHTMLMode;
64023 function merge(src, dst) {
64024     for (const key in src) {
64025         if (src.hasOwnProperty(key)) {
64026             dst[key] = src[key];
64027         }
64028     }
64029     return dst;
64030 }
64031
64032
64033 /***/ }),
64034 /* 139 */
64035 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
64036
64037
64038 /*---------------------------------------------------------------------------------------------
64039  *  Copyright (c) Microsoft Corporation. All rights reserved.
64040  *  Licensed under the MIT License. See License.txt in the project root for license information.
64041  *--------------------------------------------------------------------------------------------*/
64042 var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
64043     if (k2 === undefined) k2 = k;
64044     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
64045 }) : (function(o, m, k, k2) {
64046     if (k2 === undefined) k2 = k;
64047     o[k2] = m[k];
64048 }));
64049 var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
64050     Object.defineProperty(o, "default", { enumerable: true, value: v });
64051 }) : function(o, v) {
64052     o["default"] = v;
64053 });
64054 var __importStar = (this && this.__importStar) || function (mod) {
64055     if (mod && mod.__esModule) return mod;
64056     var result = {};
64057     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
64058     __setModuleDefault(result, mod);
64059     return result;
64060 };
64061 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
64062     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
64063     return new (P || (P = Promise))(function (resolve, reject) {
64064         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
64065         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
64066         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
64067         step((generator = generator.apply(thisArg, _arguments || [])).next());
64068     });
64069 };
64070 Object.defineProperty(exports, "__esModule", ({ value: true }));
64071 exports.getJavaScriptMode = void 0;
64072 const languageModelCache_1 = __webpack_require__(135);
64073 const languageModes_1 = __webpack_require__(61);
64074 const strings_1 = __webpack_require__(140);
64075 const ts = __importStar(__webpack_require__(141));
64076 const javascriptSemanticTokens_1 = __webpack_require__(142);
64077 const JS_WORD_REGEX = /(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g;
64078 function getLanguageServiceHost(scriptKind) {
64079     const compilerOptions = { allowNonTsExtensions: true, allowJs: true, lib: ['lib.es6.d.ts'], target: ts.ScriptTarget.Latest, moduleResolution: ts.ModuleResolutionKind.Classic, experimentalDecorators: false };
64080     let currentTextDocument = languageModes_1.TextDocument.create('init', 'javascript', 1, '');
64081     const jsLanguageService = Promise.resolve().then(() => __importStar(__webpack_require__(/* webpackChunkName: "javascriptLibs" */ 143))).then(libs => {
64082         const host = {
64083             getCompilationSettings: () => compilerOptions,
64084             getScriptFileNames: () => [currentTextDocument.uri, 'jquery'],
64085             getScriptKind: (fileName) => {
64086                 if (fileName === currentTextDocument.uri) {
64087                     return scriptKind;
64088                 }
64089                 return fileName.substr(fileName.length - 2) === 'ts' ? ts.ScriptKind.TS : ts.ScriptKind.JS;
64090             },
64091             getScriptVersion: (fileName) => {
64092                 if (fileName === currentTextDocument.uri) {
64093                     return String(currentTextDocument.version);
64094                 }
64095                 return '1'; // default lib an jquery.d.ts are static
64096             },
64097             getScriptSnapshot: (fileName) => {
64098                 let text = '';
64099                 if (fileName === currentTextDocument.uri) {
64100                     text = currentTextDocument.getText();
64101                 }
64102                 else {
64103                     text = libs.loadLibrary(fileName);
64104                 }
64105                 return {
64106                     getText: (start, end) => text.substring(start, end),
64107                     getLength: () => text.length,
64108                     getChangeRange: () => undefined
64109                 };
64110             },
64111             getCurrentDirectory: () => '',
64112             getDefaultLibFileName: (_options) => 'es6'
64113         };
64114         return ts.createLanguageService(host);
64115     });
64116     return {
64117         getLanguageService(jsDocument) {
64118             return __awaiter(this, void 0, void 0, function* () {
64119                 currentTextDocument = jsDocument;
64120                 return jsLanguageService;
64121             });
64122         },
64123         getCompilationSettings() {
64124             return compilerOptions;
64125         },
64126         dispose() {
64127             if (jsLanguageService) {
64128                 jsLanguageService.then(s => s.dispose());
64129             }
64130         }
64131     };
64132 }
64133 function getJavaScriptMode(documentRegions, languageId, workspace) {
64134     let jsDocuments = languageModelCache_1.getLanguageModelCache(10, 60, document => documentRegions.get(document).getEmbeddedDocument(languageId));
64135     const host = getLanguageServiceHost(languageId === 'javascript' ? ts.ScriptKind.JS : ts.ScriptKind.TS);
64136     let globalSettings = {};
64137     return {
64138         getId() {
64139             return languageId;
64140         },
64141         doValidation(document, settings = workspace.settings) {
64142             return __awaiter(this, void 0, void 0, function* () {
64143                 host.getCompilationSettings()['experimentalDecorators'] = settings && settings.javascript && settings.javascript.implicitProjectConfig && settings.javascript.implicitProjectConfig.experimentalDecorators;
64144                 const jsDocument = jsDocuments.get(document);
64145                 const languageService = yield host.getLanguageService(jsDocument);
64146                 const syntaxDiagnostics = languageService.getSyntacticDiagnostics(jsDocument.uri);
64147                 const semanticDiagnostics = languageService.getSemanticDiagnostics(jsDocument.uri);
64148                 return syntaxDiagnostics.concat(semanticDiagnostics).map((diag) => {
64149                     return {
64150                         range: convertRange(jsDocument, diag),
64151                         severity: languageModes_1.DiagnosticSeverity.Error,
64152                         source: languageId,
64153                         message: ts.flattenDiagnosticMessageText(diag.messageText, '\n')
64154                     };
64155                 });
64156             });
64157         },
64158         doComplete(document, position, _documentContext) {
64159             return __awaiter(this, void 0, void 0, function* () {
64160                 const jsDocument = jsDocuments.get(document);
64161                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64162                 let offset = jsDocument.offsetAt(position);
64163                 let completions = jsLanguageService.getCompletionsAtPosition(jsDocument.uri, offset, { includeExternalModuleExports: false, includeInsertTextCompletions: false });
64164                 if (!completions) {
64165                     return { isIncomplete: false, items: [] };
64166                 }
64167                 let replaceRange = convertRange(jsDocument, strings_1.getWordAtText(jsDocument.getText(), offset, JS_WORD_REGEX));
64168                 return {
64169                     isIncomplete: false,
64170                     items: completions.entries.map(entry => {
64171                         return {
64172                             uri: document.uri,
64173                             position: position,
64174                             label: entry.name,
64175                             sortText: entry.sortText,
64176                             kind: convertKind(entry.kind),
64177                             textEdit: languageModes_1.TextEdit.replace(replaceRange, entry.name),
64178                             data: {
64179                                 languageId,
64180                                 uri: document.uri,
64181                                 offset: offset
64182                             }
64183                         };
64184                     })
64185                 };
64186             });
64187         },
64188         doResolve(document, item) {
64189             return __awaiter(this, void 0, void 0, function* () {
64190                 const jsDocument = jsDocuments.get(document);
64191                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64192                 let details = jsLanguageService.getCompletionEntryDetails(jsDocument.uri, item.data.offset, item.label, undefined, undefined, undefined);
64193                 if (details) {
64194                     item.detail = ts.displayPartsToString(details.displayParts);
64195                     item.documentation = ts.displayPartsToString(details.documentation);
64196                     delete item.data;
64197                 }
64198                 return item;
64199             });
64200         },
64201         doHover(document, position) {
64202             return __awaiter(this, void 0, void 0, function* () {
64203                 const jsDocument = jsDocuments.get(document);
64204                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64205                 let info = jsLanguageService.getQuickInfoAtPosition(jsDocument.uri, jsDocument.offsetAt(position));
64206                 if (info) {
64207                     let contents = ts.displayPartsToString(info.displayParts);
64208                     return {
64209                         range: convertRange(jsDocument, info.textSpan),
64210                         contents: languageModes_1.MarkedString.fromPlainText(contents)
64211                     };
64212                 }
64213                 return null;
64214             });
64215         },
64216         doSignatureHelp(document, position) {
64217             return __awaiter(this, void 0, void 0, function* () {
64218                 const jsDocument = jsDocuments.get(document);
64219                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64220                 let signHelp = jsLanguageService.getSignatureHelpItems(jsDocument.uri, jsDocument.offsetAt(position), undefined);
64221                 if (signHelp) {
64222                     let ret = {
64223                         activeSignature: signHelp.selectedItemIndex,
64224                         activeParameter: signHelp.argumentIndex,
64225                         signatures: []
64226                     };
64227                     signHelp.items.forEach(item => {
64228                         let signature = {
64229                             label: '',
64230                             documentation: undefined,
64231                             parameters: []
64232                         };
64233                         signature.label += ts.displayPartsToString(item.prefixDisplayParts);
64234                         item.parameters.forEach((p, i, a) => {
64235                             let label = ts.displayPartsToString(p.displayParts);
64236                             let parameter = {
64237                                 label: label,
64238                                 documentation: ts.displayPartsToString(p.documentation)
64239                             };
64240                             signature.label += label;
64241                             signature.parameters.push(parameter);
64242                             if (i < a.length - 1) {
64243                                 signature.label += ts.displayPartsToString(item.separatorDisplayParts);
64244                             }
64245                         });
64246                         signature.label += ts.displayPartsToString(item.suffixDisplayParts);
64247                         ret.signatures.push(signature);
64248                     });
64249                     return ret;
64250                 }
64251                 return null;
64252             });
64253         },
64254         findDocumentHighlight(document, position) {
64255             return __awaiter(this, void 0, void 0, function* () {
64256                 const jsDocument = jsDocuments.get(document);
64257                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64258                 const highlights = jsLanguageService.getDocumentHighlights(jsDocument.uri, jsDocument.offsetAt(position), [jsDocument.uri]);
64259                 const out = [];
64260                 for (const entry of highlights || []) {
64261                     for (const highlight of entry.highlightSpans) {
64262                         out.push({
64263                             range: convertRange(jsDocument, highlight.textSpan),
64264                             kind: highlight.kind === 'writtenReference' ? languageModes_1.DocumentHighlightKind.Write : languageModes_1.DocumentHighlightKind.Text
64265                         });
64266                     }
64267                 }
64268                 return out;
64269             });
64270         },
64271         findDocumentSymbols(document) {
64272             return __awaiter(this, void 0, void 0, function* () {
64273                 const jsDocument = jsDocuments.get(document);
64274                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64275                 let items = jsLanguageService.getNavigationBarItems(jsDocument.uri);
64276                 if (items) {
64277                     let result = [];
64278                     let existing = Object.create(null);
64279                     let collectSymbols = (item, containerLabel) => {
64280                         let sig = item.text + item.kind + item.spans[0].start;
64281                         if (item.kind !== 'script' && !existing[sig]) {
64282                             let symbol = {
64283                                 name: item.text,
64284                                 kind: convertSymbolKind(item.kind),
64285                                 location: {
64286                                     uri: document.uri,
64287                                     range: convertRange(jsDocument, item.spans[0])
64288                                 },
64289                                 containerName: containerLabel
64290                             };
64291                             existing[sig] = true;
64292                             result.push(symbol);
64293                             containerLabel = item.text;
64294                         }
64295                         if (item.childItems && item.childItems.length > 0) {
64296                             for (let child of item.childItems) {
64297                                 collectSymbols(child, containerLabel);
64298                             }
64299                         }
64300                     };
64301                     items.forEach(item => collectSymbols(item));
64302                     return result;
64303                 }
64304                 return [];
64305             });
64306         },
64307         findDefinition(document, position) {
64308             return __awaiter(this, void 0, void 0, function* () {
64309                 const jsDocument = jsDocuments.get(document);
64310                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64311                 let definition = jsLanguageService.getDefinitionAtPosition(jsDocument.uri, jsDocument.offsetAt(position));
64312                 if (definition) {
64313                     return definition.filter(d => d.fileName === jsDocument.uri).map(d => {
64314                         return {
64315                             uri: document.uri,
64316                             range: convertRange(jsDocument, d.textSpan)
64317                         };
64318                     });
64319                 }
64320                 return null;
64321             });
64322         },
64323         findReferences(document, position) {
64324             return __awaiter(this, void 0, void 0, function* () {
64325                 const jsDocument = jsDocuments.get(document);
64326                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64327                 let references = jsLanguageService.getReferencesAtPosition(jsDocument.uri, jsDocument.offsetAt(position));
64328                 if (references) {
64329                     return references.filter(d => d.fileName === jsDocument.uri).map(d => {
64330                         return {
64331                             uri: document.uri,
64332                             range: convertRange(jsDocument, d.textSpan)
64333                         };
64334                     });
64335                 }
64336                 return [];
64337             });
64338         },
64339         getSelectionRange(document, position) {
64340             return __awaiter(this, void 0, void 0, function* () {
64341                 const jsDocument = jsDocuments.get(document);
64342                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64343                 function convertSelectionRange(selectionRange) {
64344                     const parent = selectionRange.parent ? convertSelectionRange(selectionRange.parent) : undefined;
64345                     return languageModes_1.SelectionRange.create(convertRange(jsDocument, selectionRange.textSpan), parent);
64346                 }
64347                 const range = jsLanguageService.getSmartSelectionRange(jsDocument.uri, jsDocument.offsetAt(position));
64348                 return convertSelectionRange(range);
64349             });
64350         },
64351         format(document, range, formatParams, settings = globalSettings) {
64352             return __awaiter(this, void 0, void 0, function* () {
64353                 const jsDocument = documentRegions.get(document).getEmbeddedDocument('javascript', true);
64354                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64355                 let formatterSettings = settings && settings.javascript && settings.javascript.format;
64356                 let initialIndentLevel = computeInitialIndent(document, range, formatParams);
64357                 let formatSettings = convertOptions(formatParams, formatterSettings, initialIndentLevel + 1);
64358                 let start = jsDocument.offsetAt(range.start);
64359                 let end = jsDocument.offsetAt(range.end);
64360                 let lastLineRange = null;
64361                 if (range.end.line > range.start.line && (range.end.character === 0 || strings_1.isWhitespaceOnly(jsDocument.getText().substr(end - range.end.character, range.end.character)))) {
64362                     end -= range.end.character;
64363                     lastLineRange = languageModes_1.Range.create(languageModes_1.Position.create(range.end.line, 0), range.end);
64364                 }
64365                 let edits = jsLanguageService.getFormattingEditsForRange(jsDocument.uri, start, end, formatSettings);
64366                 if (edits) {
64367                     let result = [];
64368                     for (let edit of edits) {
64369                         if (edit.span.start >= start && edit.span.start + edit.span.length <= end) {
64370                             result.push({
64371                                 range: convertRange(jsDocument, edit.span),
64372                                 newText: edit.newText
64373                             });
64374                         }
64375                     }
64376                     if (lastLineRange) {
64377                         result.push({
64378                             range: lastLineRange,
64379                             newText: generateIndent(initialIndentLevel, formatParams)
64380                         });
64381                     }
64382                     return result;
64383                 }
64384                 return [];
64385             });
64386         },
64387         getFoldingRanges(document) {
64388             return __awaiter(this, void 0, void 0, function* () {
64389                 const jsDocument = jsDocuments.get(document);
64390                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64391                 let spans = jsLanguageService.getOutliningSpans(jsDocument.uri);
64392                 let ranges = [];
64393                 for (let span of spans) {
64394                     let curr = convertRange(jsDocument, span.textSpan);
64395                     let startLine = curr.start.line;
64396                     let endLine = curr.end.line;
64397                     if (startLine < endLine) {
64398                         let foldingRange = { startLine, endLine };
64399                         let match = document.getText(curr).match(/^\s*\/(?:(\/\s*#(?:end)?region\b)|(\*|\/))/);
64400                         if (match) {
64401                             foldingRange.kind = match[1] ? languageModes_1.FoldingRangeKind.Region : languageModes_1.FoldingRangeKind.Comment;
64402                         }
64403                         ranges.push(foldingRange);
64404                     }
64405                 }
64406                 return ranges;
64407             });
64408         },
64409         onDocumentRemoved(document) {
64410             jsDocuments.onDocumentRemoved(document);
64411         },
64412         getSemanticTokens(document) {
64413             return __awaiter(this, void 0, void 0, function* () {
64414                 const jsDocument = jsDocuments.get(document);
64415                 const jsLanguageService = yield host.getLanguageService(jsDocument);
64416                 return javascriptSemanticTokens_1.getSemanticTokens(jsLanguageService, jsDocument, jsDocument.uri);
64417             });
64418         },
64419         getSemanticTokenLegend() {
64420             return javascriptSemanticTokens_1.getSemanticTokenLegend();
64421         },
64422         dispose() {
64423             host.dispose();
64424             jsDocuments.dispose();
64425         }
64426     };
64427 }
64428 exports.getJavaScriptMode = getJavaScriptMode;
64429 function convertRange(document, span) {
64430     if (typeof span.start === 'undefined') {
64431         const pos = document.positionAt(0);
64432         return languageModes_1.Range.create(pos, pos);
64433     }
64434     const startPosition = document.positionAt(span.start);
64435     const endPosition = document.positionAt(span.start + (span.length || 0));
64436     return languageModes_1.Range.create(startPosition, endPosition);
64437 }
64438 function convertKind(kind) {
64439     switch (kind) {
64440         case 'primitive type':
64441         case 'keyword':
64442             return languageModes_1.CompletionItemKind.Keyword;
64443         case 'var':
64444         case 'local var':
64445             return languageModes_1.CompletionItemKind.Variable;
64446         case 'property':
64447         case 'getter':
64448         case 'setter':
64449             return languageModes_1.CompletionItemKind.Field;
64450         case 'function':
64451         case 'method':
64452         case 'construct':
64453         case 'call':
64454         case 'index':
64455             return languageModes_1.CompletionItemKind.Function;
64456         case 'enum':
64457             return languageModes_1.CompletionItemKind.Enum;
64458         case 'module':
64459             return languageModes_1.CompletionItemKind.Module;
64460         case 'class':
64461             return languageModes_1.CompletionItemKind.Class;
64462         case 'interface':
64463             return languageModes_1.CompletionItemKind.Interface;
64464         case 'warning':
64465             return languageModes_1.CompletionItemKind.File;
64466     }
64467     return languageModes_1.CompletionItemKind.Property;
64468 }
64469 function convertSymbolKind(kind) {
64470     switch (kind) {
64471         case 'var':
64472         case 'local var':
64473         case 'const':
64474             return languageModes_1.SymbolKind.Variable;
64475         case 'function':
64476         case 'local function':
64477             return languageModes_1.SymbolKind.Function;
64478         case 'enum':
64479             return languageModes_1.SymbolKind.Enum;
64480         case 'module':
64481             return languageModes_1.SymbolKind.Module;
64482         case 'class':
64483             return languageModes_1.SymbolKind.Class;
64484         case 'interface':
64485             return languageModes_1.SymbolKind.Interface;
64486         case 'method':
64487             return languageModes_1.SymbolKind.Method;
64488         case 'property':
64489         case 'getter':
64490         case 'setter':
64491             return languageModes_1.SymbolKind.Property;
64492     }
64493     return languageModes_1.SymbolKind.Variable;
64494 }
64495 function convertOptions(options, formatSettings, initialIndentLevel) {
64496     return {
64497         ConvertTabsToSpaces: options.insertSpaces,
64498         TabSize: options.tabSize,
64499         IndentSize: options.tabSize,
64500         IndentStyle: ts.IndentStyle.Smart,
64501         NewLineCharacter: '\n',
64502         BaseIndentSize: options.tabSize * initialIndentLevel,
64503         InsertSpaceAfterCommaDelimiter: Boolean(!formatSettings || formatSettings.insertSpaceAfterCommaDelimiter),
64504         InsertSpaceAfterSemicolonInForStatements: Boolean(!formatSettings || formatSettings.insertSpaceAfterSemicolonInForStatements),
64505         InsertSpaceBeforeAndAfterBinaryOperators: Boolean(!formatSettings || formatSettings.insertSpaceBeforeAndAfterBinaryOperators),
64506         InsertSpaceAfterKeywordsInControlFlowStatements: Boolean(!formatSettings || formatSettings.insertSpaceAfterKeywordsInControlFlowStatements),
64507         InsertSpaceAfterFunctionKeywordForAnonymousFunctions: Boolean(!formatSettings || formatSettings.insertSpaceAfterFunctionKeywordForAnonymousFunctions),
64508         InsertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyParenthesis),
64509         InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets),
64510         InsertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces),
64511         InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: Boolean(formatSettings && formatSettings.insertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces),
64512         PlaceOpenBraceOnNewLineForControlBlocks: Boolean(formatSettings && formatSettings.placeOpenBraceOnNewLineForFunctions),
64513         PlaceOpenBraceOnNewLineForFunctions: Boolean(formatSettings && formatSettings.placeOpenBraceOnNewLineForControlBlocks)
64514     };
64515 }
64516 function computeInitialIndent(document, range, options) {
64517     let lineStart = document.offsetAt(languageModes_1.Position.create(range.start.line, 0));
64518     let content = document.getText();
64519     let i = lineStart;
64520     let nChars = 0;
64521     let tabSize = options.tabSize || 4;
64522     while (i < content.length) {
64523         let ch = content.charAt(i);
64524         if (ch === ' ') {
64525             nChars++;
64526         }
64527         else if (ch === '\t') {
64528             nChars += tabSize;
64529         }
64530         else {
64531             break;
64532         }
64533         i++;
64534     }
64535     return Math.floor(nChars / tabSize);
64536 }
64537 function generateIndent(level, options) {
64538     if (options.insertSpaces) {
64539         return strings_1.repeat(' ', level * options.tabSize);
64540     }
64541     else {
64542         return strings_1.repeat('\t', level);
64543     }
64544 }
64545
64546
64547 /***/ }),
64548 /* 140 */
64549 /***/ ((__unused_webpack_module, exports) => {
64550
64551
64552 /*---------------------------------------------------------------------------------------------
64553  *  Copyright (c) Microsoft Corporation. All rights reserved.
64554  *  Licensed under the MIT License. See License.txt in the project root for license information.
64555  *--------------------------------------------------------------------------------------------*/
64556 Object.defineProperty(exports, "__esModule", ({ value: true }));
64557 exports.isNewlineCharacter = exports.isEOL = exports.isWhitespaceOnly = exports.repeat = exports.endsWith = exports.startsWith = exports.getWordAtText = void 0;
64558 function getWordAtText(text, offset, wordDefinition) {
64559     let lineStart = offset;
64560     while (lineStart > 0 && !isNewlineCharacter(text.charCodeAt(lineStart - 1))) {
64561         lineStart--;
64562     }
64563     let offsetInLine = offset - lineStart;
64564     let lineText = text.substr(lineStart);
64565     // make a copy of the regex as to not keep the state
64566     let flags = wordDefinition.ignoreCase ? 'gi' : 'g';
64567     wordDefinition = new RegExp(wordDefinition.source, flags);
64568     let match = wordDefinition.exec(lineText);
64569     while (match && match.index + match[0].length < offsetInLine) {
64570         match = wordDefinition.exec(lineText);
64571     }
64572     if (match && match.index <= offsetInLine) {
64573         return { start: match.index + lineStart, length: match[0].length };
64574     }
64575     return { start: offset, length: 0 };
64576 }
64577 exports.getWordAtText = getWordAtText;
64578 function startsWith(haystack, needle) {
64579     if (haystack.length < needle.length) {
64580         return false;
64581     }
64582     for (let i = 0; i < needle.length; i++) {
64583         if (haystack[i] !== needle[i]) {
64584             return false;
64585         }
64586     }
64587     return true;
64588 }
64589 exports.startsWith = startsWith;
64590 function endsWith(haystack, needle) {
64591     let diff = haystack.length - needle.length;
64592     if (diff > 0) {
64593         return haystack.indexOf(needle, diff) === diff;
64594     }
64595     else if (diff === 0) {
64596         return haystack === needle;
64597     }
64598     else {
64599         return false;
64600     }
64601 }
64602 exports.endsWith = endsWith;
64603 function repeat(value, count) {
64604     let s = '';
64605     while (count > 0) {
64606         if ((count & 1) === 1) {
64607             s += value;
64608         }
64609         value += value;
64610         count = count >>> 1;
64611     }
64612     return s;
64613 }
64614 exports.repeat = repeat;
64615 function isWhitespaceOnly(str) {
64616     return /^\s*$/.test(str);
64617 }
64618 exports.isWhitespaceOnly = isWhitespaceOnly;
64619 function isEOL(content, offset) {
64620     return isNewlineCharacter(content.charCodeAt(offset));
64621 }
64622 exports.isEOL = isEOL;
64623 const CR = '\r'.charCodeAt(0);
64624 const NL = '\n'.charCodeAt(0);
64625 function isNewlineCharacter(charCode) {
64626     return charCode === CR || charCode === NL;
64627 }
64628 exports.isNewlineCharacter = isNewlineCharacter;
64629
64630
64631 /***/ }),
64632 /* 141 */
64633 /***/ ((module) => {
64634
64635 module.exports = require("typescript");;
64636
64637 /***/ }),
64638 /* 142 */
64639 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
64640
64641
64642 /*---------------------------------------------------------------------------------------------
64643  *  Copyright (c) Microsoft Corporation. All rights reserved.
64644  *  Licensed under the MIT License. See License.txt in the project root for license information.
64645  *--------------------------------------------------------------------------------------------*/
64646 var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
64647     if (k2 === undefined) k2 = k;
64648     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
64649 }) : (function(o, m, k, k2) {
64650     if (k2 === undefined) k2 = k;
64651     o[k2] = m[k];
64652 }));
64653 var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
64654     Object.defineProperty(o, "default", { enumerable: true, value: v });
64655 }) : function(o, v) {
64656     o["default"] = v;
64657 });
64658 var __importStar = (this && this.__importStar) || function (mod) {
64659     if (mod && mod.__esModule) return mod;
64660     var result = {};
64661     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
64662     __setModuleDefault(result, mod);
64663     return result;
64664 };
64665 Object.defineProperty(exports, "__esModule", ({ value: true }));
64666 exports.getSemanticTokens = exports.getSemanticTokenLegend = void 0;
64667 const ts = __importStar(__webpack_require__(141));
64668 function getSemanticTokenLegend() {
64669     if (tokenTypes.length !== 11 /* _ */) {
64670         console.warn('TokenType has added new entries.');
64671     }
64672     if (tokenModifiers.length !== 4 /* _ */) {
64673         console.warn('TokenModifier has added new entries.');
64674     }
64675     return { types: tokenTypes, modifiers: tokenModifiers };
64676 }
64677 exports.getSemanticTokenLegend = getSemanticTokenLegend;
64678 function getSemanticTokens(jsLanguageService, currentTextDocument, fileName) {
64679     //https://ts-ast-viewer.com/#code/AQ0g2CmAuwGbALzAJwG4BQZQGNwEMBnQ4AQQEYBmYAb2C22zgEtJwATJVTRxgcwD27AQAp8AGmAAjAJS0A9POB8+7NQ168oscAJz5wANXwAnLug2bsJmAFcTAO2XAA1MHyvgu-UdOeWbOw8ViAAvpagocBAA
64680     let resultTokens = [];
64681     const collector = (node, typeIdx, modifierSet) => {
64682         resultTokens.push({ start: currentTextDocument.positionAt(node.getStart()), length: node.getWidth(), typeIdx, modifierSet });
64683     };
64684     collectTokens(jsLanguageService, fileName, { start: 0, length: currentTextDocument.getText().length }, collector);
64685     return resultTokens;
64686 }
64687 exports.getSemanticTokens = getSemanticTokens;
64688 function collectTokens(jsLanguageService, fileName, span, collector) {
64689     const program = jsLanguageService.getProgram();
64690     if (program) {
64691         const typeChecker = program.getTypeChecker();
64692         function visit(node) {
64693             if (!node || !ts.textSpanIntersectsWith(span, node.pos, node.getFullWidth())) {
64694                 return;
64695             }
64696             if (ts.isIdentifier(node)) {
64697                 let symbol = typeChecker.getSymbolAtLocation(node);
64698                 if (symbol) {
64699                     if (symbol.flags & ts.SymbolFlags.Alias) {
64700                         symbol = typeChecker.getAliasedSymbol(symbol);
64701                     }
64702                     let typeIdx = classifySymbol(symbol);
64703                     if (typeIdx !== undefined) {
64704                         let modifierSet = 0;
64705                         if (node.parent) {
64706                             const parentTypeIdx = tokenFromDeclarationMapping[node.parent.kind];
64707                             if (parentTypeIdx === typeIdx && node.parent.name === node) {
64708                                 modifierSet = 1 << 0 /* declaration */;
64709                             }
64710                         }
64711                         const decl = symbol.valueDeclaration;
64712                         const modifiers = decl ? ts.getCombinedModifierFlags(decl) : 0;
64713                         const nodeFlags = decl ? ts.getCombinedNodeFlags(decl) : 0;
64714                         if (modifiers & ts.ModifierFlags.Static) {
64715                             modifierSet |= 1 << 1 /* static */;
64716                         }
64717                         if (modifiers & ts.ModifierFlags.Async) {
64718                             modifierSet |= 1 << 2 /* async */;
64719                         }
64720                         if ((modifiers & ts.ModifierFlags.Readonly) || (nodeFlags & ts.NodeFlags.Const) || (symbol.getFlags() & ts.SymbolFlags.EnumMember)) {
64721                             modifierSet |= 1 << 3 /* readonly */;
64722                         }
64723                         collector(node, typeIdx, modifierSet);
64724                     }
64725                 }
64726             }
64727             ts.forEachChild(node, visit);
64728         }
64729         const sourceFile = program.getSourceFile(fileName);
64730         if (sourceFile) {
64731             visit(sourceFile);
64732         }
64733     }
64734 }
64735 function classifySymbol(symbol) {
64736     const flags = symbol.getFlags();
64737     if (flags & ts.SymbolFlags.Class) {
64738         return 0 /* class */;
64739     }
64740     else if (flags & ts.SymbolFlags.Enum) {
64741         return 1 /* enum */;
64742     }
64743     else if (flags & ts.SymbolFlags.TypeAlias) {
64744         return 5 /* type */;
64745     }
64746     else if (flags & ts.SymbolFlags.Type) {
64747         if (flags & ts.SymbolFlags.Interface) {
64748             return 2 /* interface */;
64749         }
64750         if (flags & ts.SymbolFlags.TypeParameter) {
64751             return 4 /* typeParameter */;
64752         }
64753     }
64754     const decl = symbol.valueDeclaration || symbol.declarations && symbol.declarations[0];
64755     return decl && tokenFromDeclarationMapping[decl.kind];
64756 }
64757 const tokenTypes = [];
64758 tokenTypes[0 /* class */] = 'class';
64759 tokenTypes[1 /* enum */] = 'enum';
64760 tokenTypes[2 /* interface */] = 'interface';
64761 tokenTypes[3 /* namespace */] = 'namespace';
64762 tokenTypes[4 /* typeParameter */] = 'typeParameter';
64763 tokenTypes[5 /* type */] = 'type';
64764 tokenTypes[6 /* parameter */] = 'parameter';
64765 tokenTypes[7 /* variable */] = 'variable';
64766 tokenTypes[8 /* property */] = 'property';
64767 tokenTypes[9 /* function */] = 'function';
64768 tokenTypes[10 /* member */] = 'member';
64769 const tokenModifiers = [];
64770 tokenModifiers[2 /* async */] = 'async';
64771 tokenModifiers[0 /* declaration */] = 'declaration';
64772 tokenModifiers[3 /* readonly */] = 'readonly';
64773 tokenModifiers[1 /* static */] = 'static';
64774 const tokenFromDeclarationMapping = {
64775     [ts.SyntaxKind.VariableDeclaration]: 7 /* variable */,
64776     [ts.SyntaxKind.Parameter]: 6 /* parameter */,
64777     [ts.SyntaxKind.PropertyDeclaration]: 8 /* property */,
64778     [ts.SyntaxKind.ModuleDeclaration]: 3 /* namespace */,
64779     [ts.SyntaxKind.EnumDeclaration]: 1 /* enum */,
64780     [ts.SyntaxKind.EnumMember]: 8 /* property */,
64781     [ts.SyntaxKind.ClassDeclaration]: 0 /* class */,
64782     [ts.SyntaxKind.MethodDeclaration]: 10 /* member */,
64783     [ts.SyntaxKind.FunctionDeclaration]: 9 /* function */,
64784     [ts.SyntaxKind.MethodSignature]: 10 /* member */,
64785     [ts.SyntaxKind.GetAccessor]: 8 /* property */,
64786     [ts.SyntaxKind.PropertySignature]: 8 /* property */,
64787     [ts.SyntaxKind.InterfaceDeclaration]: 2 /* interface */,
64788     [ts.SyntaxKind.TypeAliasDeclaration]: 5 /* type */,
64789     [ts.SyntaxKind.TypeParameter]: 4 /* typeParameter */
64790 };
64791
64792
64793 /***/ }),
64794 /* 143 */
64795 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
64796
64797
64798 /*---------------------------------------------------------------------------------------------
64799  *  Copyright (c) Microsoft Corporation. All rights reserved.
64800  *  Licensed under the MIT License. See License.txt in the project root for license information.
64801  *--------------------------------------------------------------------------------------------*/
64802 Object.defineProperty(exports, "__esModule", ({ value: true }));
64803 exports.loadLibrary = void 0;
64804 const path_1 = __webpack_require__(3);
64805 const fs_1 = __webpack_require__(54);
64806 const contents = {};
64807 const serverFolder = path_1.dirname(__dirname);
64808 const TYPESCRIPT_LIB_SOURCE = path_1.join(serverFolder, './node_modules/typescript/lib');
64809 const JQUERY_PATH = path_1.join(serverFolder, 'jquery.d.ts');
64810 function loadLibrary(name) {
64811     let content = contents[name];
64812     if (typeof content !== 'string') {
64813         let libPath;
64814         if (name === 'jquery') {
64815             libPath = JQUERY_PATH;
64816         }
64817         else {
64818             libPath = path_1.join(TYPESCRIPT_LIB_SOURCE, name); // from source
64819         }
64820         try {
64821             content = fs_1.readFileSync(libPath).toString();
64822         }
64823         catch (e) {
64824             console.log(`Unable to load library ${name} at ${libPath}: ${e.message}`);
64825             content = '';
64826         }
64827         contents[name] = content;
64828     }
64829     return content;
64830 }
64831 exports.loadLibrary = loadLibrary;
64832
64833
64834 /***/ }),
64835 /* 144 */
64836 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
64837
64838
64839 /*---------------------------------------------------------------------------------------------
64840  *  Copyright (c) Microsoft Corporation. All rights reserved.
64841  *  Licensed under the MIT License. See License.txt in the project root for license information.
64842  *--------------------------------------------------------------------------------------------*/
64843 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
64844     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
64845     return new (P || (P = Promise))(function (resolve, reject) {
64846         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
64847         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
64848         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
64849         step((generator = generator.apply(thisArg, _arguments || [])).next());
64850     });
64851 };
64852 Object.defineProperty(exports, "__esModule", ({ value: true }));
64853 exports.format = void 0;
64854 const languageModes_1 = __webpack_require__(61);
64855 const arrays_1 = __webpack_require__(145);
64856 const strings_1 = __webpack_require__(140);
64857 function format(languageModes, document, formatRange, formattingOptions, settings, enabledModes) {
64858     return __awaiter(this, void 0, void 0, function* () {
64859         let result = [];
64860         let endPos = formatRange.end;
64861         let endOffset = document.offsetAt(endPos);
64862         let content = document.getText();
64863         if (endPos.character === 0 && endPos.line > 0 && endOffset !== content.length) {
64864             // if selection ends after a new line, exclude that new line
64865             let prevLineStart = document.offsetAt(languageModes_1.Position.create(endPos.line - 1, 0));
64866             while (strings_1.isEOL(content, endOffset - 1) && endOffset > prevLineStart) {
64867                 endOffset--;
64868             }
64869             formatRange = languageModes_1.Range.create(formatRange.start, document.positionAt(endOffset));
64870         }
64871         // run the html formatter on the full range and pass the result content to the embedded formatters.
64872         // from the final content create a single edit
64873         // advantages of this approach are
64874         //  - correct indents in the html document
64875         //  - correct initial indent for embedded formatters
64876         //  - no worrying of overlapping edits
64877         // make sure we start in html
64878         let allRanges = languageModes.getModesInRange(document, formatRange);
64879         let i = 0;
64880         let startPos = formatRange.start;
64881         let isHTML = (range) => range.mode && range.mode.getId() === 'html';
64882         while (i < allRanges.length && !isHTML(allRanges[i])) {
64883             let range = allRanges[i];
64884             if (!range.attributeValue && range.mode && range.mode.format) {
64885                 let edits = yield range.mode.format(document, languageModes_1.Range.create(startPos, range.end), formattingOptions, settings);
64886                 arrays_1.pushAll(result, edits);
64887             }
64888             startPos = range.end;
64889             i++;
64890         }
64891         if (i === allRanges.length) {
64892             return result;
64893         }
64894         // modify the range
64895         formatRange = languageModes_1.Range.create(startPos, formatRange.end);
64896         // perform a html format and apply changes to a new document
64897         let htmlMode = languageModes.getMode('html');
64898         let htmlEdits = yield htmlMode.format(document, formatRange, formattingOptions, settings);
64899         let htmlFormattedContent = languageModes_1.TextDocument.applyEdits(document, htmlEdits);
64900         let newDocument = languageModes_1.TextDocument.create(document.uri + '.tmp', document.languageId, document.version, htmlFormattedContent);
64901         try {
64902             // run embedded formatters on html formatted content: - formatters see correct initial indent
64903             let afterFormatRangeLength = document.getText().length - document.offsetAt(formatRange.end); // length of unchanged content after replace range
64904             let newFormatRange = languageModes_1.Range.create(formatRange.start, newDocument.positionAt(htmlFormattedContent.length - afterFormatRangeLength));
64905             let embeddedRanges = languageModes.getModesInRange(newDocument, newFormatRange);
64906             let embeddedEdits = [];
64907             for (let r of embeddedRanges) {
64908                 let mode = r.mode;
64909                 if (mode && mode.format && enabledModes[mode.getId()] && !r.attributeValue) {
64910                     let edits = yield mode.format(newDocument, r, formattingOptions, settings);
64911                     for (let edit of edits) {
64912                         embeddedEdits.push(edit);
64913                     }
64914                 }
64915             }
64916             if (embeddedEdits.length === 0) {
64917                 arrays_1.pushAll(result, htmlEdits);
64918                 return result;
64919             }
64920             // apply all embedded format edits and create a single edit for all changes
64921             let resultContent = languageModes_1.TextDocument.applyEdits(newDocument, embeddedEdits);
64922             let resultReplaceText = resultContent.substring(document.offsetAt(formatRange.start), resultContent.length - afterFormatRangeLength);
64923             result.push(languageModes_1.TextEdit.replace(formatRange, resultReplaceText));
64924             return result;
64925         }
64926         finally {
64927             languageModes.onDocumentRemoved(newDocument);
64928         }
64929     });
64930 }
64931 exports.format = format;
64932
64933
64934 /***/ }),
64935 /* 145 */
64936 /***/ ((__unused_webpack_module, exports) => {
64937
64938
64939 /*---------------------------------------------------------------------------------------------
64940  *  Copyright (c) Microsoft Corporation. All rights reserved.
64941  *  Licensed under the MIT License. See License.txt in the project root for license information.
64942  *--------------------------------------------------------------------------------------------*/
64943 Object.defineProperty(exports, "__esModule", ({ value: true }));
64944 exports.binarySearch = exports.mergeSort = exports.contains = exports.pushAll = void 0;
64945 function pushAll(to, from) {
64946     if (from) {
64947         for (const e of from) {
64948             to.push(e);
64949         }
64950     }
64951 }
64952 exports.pushAll = pushAll;
64953 function contains(arr, val) {
64954     return arr.indexOf(val) !== -1;
64955 }
64956 exports.contains = contains;
64957 /**
64958  * Like `Array#sort` but always stable. Usually runs a little slower `than Array#sort`
64959  * so only use this when actually needing stable sort.
64960  */
64961 function mergeSort(data, compare) {
64962     _divideAndMerge(data, compare);
64963     return data;
64964 }
64965 exports.mergeSort = mergeSort;
64966 function _divideAndMerge(data, compare) {
64967     if (data.length <= 1) {
64968         // sorted
64969         return;
64970     }
64971     const p = (data.length / 2) | 0;
64972     const left = data.slice(0, p);
64973     const right = data.slice(p);
64974     _divideAndMerge(left, compare);
64975     _divideAndMerge(right, compare);
64976     let leftIdx = 0;
64977     let rightIdx = 0;
64978     let i = 0;
64979     while (leftIdx < left.length && rightIdx < right.length) {
64980         let ret = compare(left[leftIdx], right[rightIdx]);
64981         if (ret <= 0) {
64982             // smaller_equal -> take left to preserve order
64983             data[i++] = left[leftIdx++];
64984         }
64985         else {
64986             // greater -> take right
64987             data[i++] = right[rightIdx++];
64988         }
64989     }
64990     while (leftIdx < left.length) {
64991         data[i++] = left[leftIdx++];
64992     }
64993     while (rightIdx < right.length) {
64994         data[i++] = right[rightIdx++];
64995     }
64996 }
64997 function binarySearch(array, key, comparator) {
64998     let low = 0, high = array.length - 1;
64999     while (low <= high) {
65000         let mid = ((low + high) / 2) | 0;
65001         let comp = comparator(array[mid], key);
65002         if (comp < 0) {
65003             low = mid + 1;
65004         }
65005         else if (comp > 0) {
65006             high = mid - 1;
65007         }
65008         else {
65009             return mid;
65010         }
65011     }
65012     return -(low + 1);
65013 }
65014 exports.binarySearch = binarySearch;
65015
65016
65017 /***/ }),
65018 /* 146 */
65019 /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
65020
65021
65022 /*---------------------------------------------------------------------------------------------
65023  *  Copyright (c) Microsoft Corporation. All rights reserved.
65024  *  Licensed under the MIT License. See License.txt in the project root for license information.
65025  *--------------------------------------------------------------------------------------------*/
65026 Object.defineProperty(exports, "__esModule", ({ value: true }));
65027 exports.getDocumentContext = void 0;
65028 const strings_1 = __webpack_require__(140);
65029 const requests_1 = __webpack_require__(147);
65030 function getDocumentContext(documentUri, workspaceFolders) {
65031     function getRootFolder() {
65032         for (let folder of workspaceFolders) {
65033             let folderURI = folder.uri;
65034             if (!strings_1.endsWith(folderURI, '/')) {
65035                 folderURI = folderURI + '/';
65036             }
65037             if (strings_1.startsWith(documentUri, folderURI)) {
65038                 return folderURI;
65039             }
65040         }
65041         return undefined;
65042     }
65043     return {
65044         resolveReference: (ref, base = documentUri) => {
65045             if (ref[0] === '/') { // resolve absolute path against the current workspace folder
65046                 let folderUri = getRootFolder();
65047                 if (folderUri) {
65048                     return folderUri + ref.substr(1);
65049                 }
65050             }
65051             base = base.substr(0, base.lastIndexOf('/') + 1);
65052             return requests_1.resolvePath(base, ref);
65053         },
65054     };
65055 }
65056 exports.getDocumentContext = getDocumentContext;
65057
65058
65059 /***/ }),
65060 /* 147 */
65061 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65062
65063
65064 /*---------------------------------------------------------------------------------------------
65065  *  Copyright (c) Microsoft Corporation. All rights reserved.
65066  *  Licensed under the MIT License. See License.txt in the project root for license information.
65067  *--------------------------------------------------------------------------------------------*/
65068 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
65069     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
65070     return new (P || (P = Promise))(function (resolve, reject) {
65071         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
65072         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65073         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
65074         step((generator = generator.apply(thisArg, _arguments || [])).next());
65075     });
65076 };
65077 Object.defineProperty(exports, "__esModule", ({ value: true }));
65078 exports.joinPath = exports.normalizePath = exports.resolvePath = exports.isAbsolutePath = exports.extname = exports.basename = exports.dirname = exports.getScheme = exports.getRequestService = exports.FileType = exports.FsReadDirRequest = exports.FsStatRequest = exports.FsContentRequest = void 0;
65079 const vscode_uri_1 = __webpack_require__(84);
65080 const vscode_languageserver_1 = __webpack_require__(44);
65081 var FsContentRequest;
65082 (function (FsContentRequest) {
65083     FsContentRequest.type = new vscode_languageserver_1.RequestType('fs/content');
65084 })(FsContentRequest = exports.FsContentRequest || (exports.FsContentRequest = {}));
65085 var FsStatRequest;
65086 (function (FsStatRequest) {
65087     FsStatRequest.type = new vscode_languageserver_1.RequestType('fs/stat');
65088 })(FsStatRequest = exports.FsStatRequest || (exports.FsStatRequest = {}));
65089 var FsReadDirRequest;
65090 (function (FsReadDirRequest) {
65091     FsReadDirRequest.type = new vscode_languageserver_1.RequestType('fs/readDir');
65092 })(FsReadDirRequest = exports.FsReadDirRequest || (exports.FsReadDirRequest = {}));
65093 var FileType;
65094 (function (FileType) {
65095     /**
65096      * The file type is unknown.
65097      */
65098     FileType[FileType["Unknown"] = 0] = "Unknown";
65099     /**
65100      * A regular file.
65101      */
65102     FileType[FileType["File"] = 1] = "File";
65103     /**
65104      * A directory.
65105      */
65106     FileType[FileType["Directory"] = 2] = "Directory";
65107     /**
65108      * A symbolic link to a file.
65109      */
65110     FileType[FileType["SymbolicLink"] = 64] = "SymbolicLink";
65111 })(FileType = exports.FileType || (exports.FileType = {}));
65112 function getRequestService(handledSchemas, connection, runtime) {
65113     const builtInHandlers = {};
65114     for (let protocol of handledSchemas) {
65115         if (protocol === 'file') {
65116             builtInHandlers[protocol] = runtime.file;
65117         }
65118         else if (protocol === 'http' || protocol === 'https') {
65119             builtInHandlers[protocol] = runtime.http;
65120         }
65121     }
65122     return {
65123         stat(uri) {
65124             return __awaiter(this, void 0, void 0, function* () {
65125                 const handler = builtInHandlers[getScheme(uri)];
65126                 if (handler) {
65127                     return handler.stat(uri);
65128                 }
65129                 const res = yield connection.sendRequest(FsStatRequest.type, uri.toString());
65130                 return res;
65131             });
65132         },
65133         readDirectory(uri) {
65134             const handler = builtInHandlers[getScheme(uri)];
65135             if (handler) {
65136                 return handler.readDirectory(uri);
65137             }
65138             return connection.sendRequest(FsReadDirRequest.type, uri.toString());
65139         },
65140         getContent(uri, encoding) {
65141             const handler = builtInHandlers[getScheme(uri)];
65142             if (handler) {
65143                 return handler.getContent(uri, encoding);
65144             }
65145             return connection.sendRequest(FsContentRequest.type, { uri: uri.toString(), encoding });
65146         }
65147     };
65148 }
65149 exports.getRequestService = getRequestService;
65150 function getScheme(uri) {
65151     return uri.substr(0, uri.indexOf(':'));
65152 }
65153 exports.getScheme = getScheme;
65154 function dirname(uri) {
65155     const lastIndexOfSlash = uri.lastIndexOf('/');
65156     return lastIndexOfSlash !== -1 ? uri.substr(0, lastIndexOfSlash) : '';
65157 }
65158 exports.dirname = dirname;
65159 function basename(uri) {
65160     const lastIndexOfSlash = uri.lastIndexOf('/');
65161     return uri.substr(lastIndexOfSlash + 1);
65162 }
65163 exports.basename = basename;
65164 const Slash = '/'.charCodeAt(0);
65165 const Dot = '.'.charCodeAt(0);
65166 function extname(uri) {
65167     for (let i = uri.length - 1; i >= 0; i--) {
65168         const ch = uri.charCodeAt(i);
65169         if (ch === Dot) {
65170             if (i > 0 && uri.charCodeAt(i - 1) !== Slash) {
65171                 return uri.substr(i);
65172             }
65173             else {
65174                 break;
65175             }
65176         }
65177         else if (ch === Slash) {
65178             break;
65179         }
65180     }
65181     return '';
65182 }
65183 exports.extname = extname;
65184 function isAbsolutePath(path) {
65185     return path.charCodeAt(0) === Slash;
65186 }
65187 exports.isAbsolutePath = isAbsolutePath;
65188 function resolvePath(uriString, path) {
65189     if (isAbsolutePath(path)) {
65190         const uri = vscode_uri_1.URI.parse(uriString);
65191         const parts = path.split('/');
65192         return uri.with({ path: normalizePath(parts) }).toString();
65193     }
65194     return joinPath(uriString, path);
65195 }
65196 exports.resolvePath = resolvePath;
65197 function normalizePath(parts) {
65198     const newParts = [];
65199     for (const part of parts) {
65200         if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) {
65201             // ignore
65202         }
65203         else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) {
65204             newParts.pop();
65205         }
65206         else {
65207             newParts.push(part);
65208         }
65209     }
65210     if (parts.length > 1 && parts[parts.length - 1].length === 0) {
65211         newParts.push('');
65212     }
65213     let res = newParts.join('/');
65214     if (parts[0].length === 0) {
65215         res = '/' + res;
65216     }
65217     return res;
65218 }
65219 exports.normalizePath = normalizePath;
65220 function joinPath(uriString, ...paths) {
65221     const uri = vscode_uri_1.URI.parse(uriString);
65222     const parts = uri.path.split('/');
65223     for (let path of paths) {
65224         parts.push(...path.split('/'));
65225     }
65226     return uri.with({ path: normalizePath(parts) }).toString();
65227 }
65228 exports.joinPath = joinPath;
65229
65230
65231 /***/ }),
65232 /* 148 */
65233 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65234
65235
65236 /*---------------------------------------------------------------------------------------------
65237  *  Copyright (c) Microsoft Corporation. All rights reserved.
65238  *  Licensed under the MIT License. See License.txt in the project root for license information.
65239  *--------------------------------------------------------------------------------------------*/
65240 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
65241     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
65242     return new (P || (P = Promise))(function (resolve, reject) {
65243         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
65244         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65245         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
65246         step((generator = generator.apply(thisArg, _arguments || [])).next());
65247     });
65248 };
65249 Object.defineProperty(exports, "__esModule", ({ value: true }));
65250 exports.getFoldingRanges = void 0;
65251 const languageModes_1 = __webpack_require__(61);
65252 function getFoldingRanges(languageModes, document, maxRanges, _cancellationToken) {
65253     return __awaiter(this, void 0, void 0, function* () {
65254         let htmlMode = languageModes.getMode('html');
65255         let range = languageModes_1.Range.create(languageModes_1.Position.create(0, 0), languageModes_1.Position.create(document.lineCount, 0));
65256         let result = [];
65257         if (htmlMode && htmlMode.getFoldingRanges) {
65258             result.push(...yield htmlMode.getFoldingRanges(document));
65259         }
65260         // cache folding ranges per mode
65261         let rangesPerMode = Object.create(null);
65262         let getRangesForMode = (mode) => __awaiter(this, void 0, void 0, function* () {
65263             if (mode.getFoldingRanges) {
65264                 let ranges = rangesPerMode[mode.getId()];
65265                 if (!Array.isArray(ranges)) {
65266                     ranges = (yield mode.getFoldingRanges(document)) || [];
65267                     rangesPerMode[mode.getId()] = ranges;
65268                 }
65269                 return ranges;
65270             }
65271             return [];
65272         });
65273         let modeRanges = languageModes.getModesInRange(document, range);
65274         for (let modeRange of modeRanges) {
65275             let mode = modeRange.mode;
65276             if (mode && mode !== htmlMode && !modeRange.attributeValue) {
65277                 const ranges = yield getRangesForMode(mode);
65278                 result.push(...ranges.filter(r => r.startLine >= modeRange.start.line && r.endLine < modeRange.end.line));
65279             }
65280         }
65281         if (maxRanges && result.length > maxRanges) {
65282             result = limitRanges(result, maxRanges);
65283         }
65284         return result;
65285     });
65286 }
65287 exports.getFoldingRanges = getFoldingRanges;
65288 function limitRanges(ranges, maxRanges) {
65289     ranges = ranges.sort((r1, r2) => {
65290         let diff = r1.startLine - r2.startLine;
65291         if (diff === 0) {
65292             diff = r1.endLine - r2.endLine;
65293         }
65294         return diff;
65295     });
65296     // compute each range's nesting level in 'nestingLevels'.
65297     // count the number of ranges for each level in 'nestingLevelCounts'
65298     let top = undefined;
65299     let previous = [];
65300     let nestingLevels = [];
65301     let nestingLevelCounts = [];
65302     let setNestingLevel = (index, level) => {
65303         nestingLevels[index] = level;
65304         if (level < 30) {
65305             nestingLevelCounts[level] = (nestingLevelCounts[level] || 0) + 1;
65306         }
65307     };
65308     // compute nesting levels and sanitize
65309     for (let i = 0; i < ranges.length; i++) {
65310         let entry = ranges[i];
65311         if (!top) {
65312             top = entry;
65313             setNestingLevel(i, 0);
65314         }
65315         else {
65316             if (entry.startLine > top.startLine) {
65317                 if (entry.endLine <= top.endLine) {
65318                     previous.push(top);
65319                     top = entry;
65320                     setNestingLevel(i, previous.length);
65321                 }
65322                 else if (entry.startLine > top.endLine) {
65323                     do {
65324                         top = previous.pop();
65325                     } while (top && entry.startLine > top.endLine);
65326                     if (top) {
65327                         previous.push(top);
65328                     }
65329                     top = entry;
65330                     setNestingLevel(i, previous.length);
65331                 }
65332             }
65333         }
65334     }
65335     let entries = 0;
65336     let maxLevel = 0;
65337     for (let i = 0; i < nestingLevelCounts.length; i++) {
65338         let n = nestingLevelCounts[i];
65339         if (n) {
65340             if (n + entries > maxRanges) {
65341                 maxLevel = i;
65342                 break;
65343             }
65344             entries += n;
65345         }
65346     }
65347     let result = [];
65348     for (let i = 0; i < ranges.length; i++) {
65349         let level = nestingLevels[i];
65350         if (typeof level === 'number') {
65351             if (level < maxLevel || (level === maxLevel && entries++ < maxRanges)) {
65352                 result.push(ranges[i]);
65353             }
65354         }
65355     }
65356     return result;
65357 }
65358
65359
65360 /***/ }),
65361 /* 149 */
65362 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65363
65364
65365 /*---------------------------------------------------------------------------------------------
65366  *  Copyright (c) Microsoft Corporation. All rights reserved.
65367  *  Licensed under the MIT License. See License.txt in the project root for license information.
65368  *--------------------------------------------------------------------------------------------*/
65369 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
65370     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
65371     return new (P || (P = Promise))(function (resolve, reject) {
65372         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
65373         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65374         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
65375         step((generator = generator.apply(thisArg, _arguments || [])).next());
65376     });
65377 };
65378 Object.defineProperty(exports, "__esModule", ({ value: true }));
65379 exports.fetchHTMLDataProviders = void 0;
65380 const vscode_html_languageservice_1 = __webpack_require__(106);
65381 function fetchHTMLDataProviders(dataPaths, requestService) {
65382     const providers = dataPaths.map((p) => __awaiter(this, void 0, void 0, function* () {
65383         try {
65384             const content = yield requestService.getContent(p);
65385             return parseHTMLData(p, content);
65386         }
65387         catch (e) {
65388             return vscode_html_languageservice_1.newHTMLDataProvider(p, { version: 1 });
65389         }
65390     }));
65391     return Promise.all(providers);
65392 }
65393 exports.fetchHTMLDataProviders = fetchHTMLDataProviders;
65394 function parseHTMLData(id, source) {
65395     let rawData;
65396     try {
65397         rawData = JSON.parse(source);
65398     }
65399     catch (err) {
65400         return vscode_html_languageservice_1.newHTMLDataProvider(id, { version: 1 });
65401     }
65402     return vscode_html_languageservice_1.newHTMLDataProvider(id, {
65403         version: rawData.version || 1,
65404         tags: rawData.tags || [],
65405         globalAttributes: rawData.globalAttributes || [],
65406         valueSets: rawData.valueSets || []
65407     });
65408 }
65409
65410
65411 /***/ }),
65412 /* 150 */
65413 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65414
65415
65416 /*---------------------------------------------------------------------------------------------
65417  *  Copyright (c) Microsoft Corporation. All rights reserved.
65418  *  Licensed under the MIT License. See License.txt in the project root for license information.
65419  *--------------------------------------------------------------------------------------------*/
65420 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
65421     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
65422     return new (P || (P = Promise))(function (resolve, reject) {
65423         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
65424         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65425         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
65426         step((generator = generator.apply(thisArg, _arguments || [])).next());
65427     });
65428 };
65429 Object.defineProperty(exports, "__esModule", ({ value: true }));
65430 exports.getSelectionRanges = void 0;
65431 const languageModes_1 = __webpack_require__(61);
65432 const positions_1 = __webpack_require__(151);
65433 function getSelectionRanges(languageModes, document, positions) {
65434     return __awaiter(this, void 0, void 0, function* () {
65435         const htmlMode = languageModes.getMode('html');
65436         return Promise.all(positions.map((position) => __awaiter(this, void 0, void 0, function* () {
65437             const htmlRange = yield htmlMode.getSelectionRange(document, position);
65438             const mode = languageModes.getModeAtPosition(document, position);
65439             if (mode && mode.getSelectionRange) {
65440                 let range = yield mode.getSelectionRange(document, position);
65441                 let top = range;
65442                 while (top.parent && positions_1.insideRangeButNotSame(htmlRange.range, top.parent.range)) {
65443                     top = top.parent;
65444                 }
65445                 top.parent = htmlRange;
65446                 return range;
65447             }
65448             return htmlRange || languageModes_1.SelectionRange.create(languageModes_1.Range.create(position, position));
65449         })));
65450     });
65451 }
65452 exports.getSelectionRanges = getSelectionRanges;
65453
65454
65455 /***/ }),
65456 /* 151 */
65457 /***/ ((__unused_webpack_module, exports) => {
65458
65459
65460 /*---------------------------------------------------------------------------------------------
65461  *  Copyright (c) Microsoft Corporation. All rights reserved.
65462  *  Licensed under the MIT License. See License.txt in the project root for license information.
65463  *--------------------------------------------------------------------------------------------*/
65464 Object.defineProperty(exports, "__esModule", ({ value: true }));
65465 exports.equalRange = exports.insideRangeButNotSame = exports.beforeOrSame = void 0;
65466 function beforeOrSame(p1, p2) {
65467     return p1.line < p2.line || p1.line === p2.line && p1.character <= p2.character;
65468 }
65469 exports.beforeOrSame = beforeOrSame;
65470 function insideRangeButNotSame(r1, r2) {
65471     return beforeOrSame(r1.start, r2.start) && beforeOrSame(r2.end, r1.end) && !equalRange(r1, r2);
65472 }
65473 exports.insideRangeButNotSame = insideRangeButNotSame;
65474 function equalRange(r1, r2) {
65475     return r1.start.line === r2.start.line && r1.start.character === r2.start.character && r1.end.line === r2.end.line && r1.end.character === r2.end.character;
65476 }
65477 exports.equalRange = equalRange;
65478
65479
65480 /***/ }),
65481 /* 152 */
65482 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65483
65484
65485 /*---------------------------------------------------------------------------------------------
65486  *  Copyright (c) Microsoft Corporation. All rights reserved.
65487  *  Licensed under the MIT License. See License.txt in the project root for license information.
65488  *--------------------------------------------------------------------------------------------*/
65489 var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
65490     function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
65491     return new (P || (P = Promise))(function (resolve, reject) {
65492         function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
65493         function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65494         function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
65495         step((generator = generator.apply(thisArg, _arguments || [])).next());
65496     });
65497 };
65498 Object.defineProperty(exports, "__esModule", ({ value: true }));
65499 exports.newSemanticTokenProvider = void 0;
65500 const languageModes_1 = __webpack_require__(61);
65501 const positions_1 = __webpack_require__(151);
65502 function newSemanticTokenProvider(languageModes) {
65503     // combined legend across modes
65504     const legend = { types: [], modifiers: [] };
65505     const legendMappings = {};
65506     for (let mode of languageModes.getAllModes()) {
65507         if (mode.getSemanticTokenLegend && mode.getSemanticTokens) {
65508             const modeLegend = mode.getSemanticTokenLegend();
65509             legendMappings[mode.getId()] = { types: createMapping(modeLegend.types, legend.types), modifiers: createMapping(modeLegend.modifiers, legend.modifiers) };
65510         }
65511     }
65512     return {
65513         legend,
65514         getSemanticTokens(document, ranges) {
65515             return __awaiter(this, void 0, void 0, function* () {
65516                 const allTokens = [];
65517                 for (let mode of languageModes.getAllModesInDocument(document)) {
65518                     if (mode.getSemanticTokens) {
65519                         const mapping = legendMappings[mode.getId()];
65520                         const tokens = yield mode.getSemanticTokens(document);
65521                         applyTypesMapping(tokens, mapping.types);
65522                         applyModifiersMapping(tokens, mapping.modifiers);
65523                         for (let token of tokens) {
65524                             allTokens.push(token);
65525                         }
65526                     }
65527                 }
65528                 return encodeTokens(allTokens, ranges);
65529             });
65530         }
65531     };
65532 }
65533 exports.newSemanticTokenProvider = newSemanticTokenProvider;
65534 function createMapping(origLegend, newLegend) {
65535     const mapping = [];
65536     let needsMapping = false;
65537     for (let origIndex = 0; origIndex < origLegend.length; origIndex++) {
65538         const entry = origLegend[origIndex];
65539         let newIndex = newLegend.indexOf(entry);
65540         if (newIndex === -1) {
65541             newIndex = newLegend.length;
65542             newLegend.push(entry);
65543         }
65544         mapping.push(newIndex);
65545         needsMapping = needsMapping || (newIndex !== origIndex);
65546     }
65547     return needsMapping ? mapping : undefined;
65548 }
65549 function applyTypesMapping(tokens, typesMapping) {
65550     if (typesMapping) {
65551         for (let token of tokens) {
65552             token.typeIdx = typesMapping[token.typeIdx];
65553         }
65554     }
65555 }
65556 function applyModifiersMapping(tokens, modifiersMapping) {
65557     if (modifiersMapping) {
65558         for (let token of tokens) {
65559             let modifierSet = token.modifierSet;
65560             if (modifierSet) {
65561                 let index = 0;
65562                 let result = 0;
65563                 while (modifierSet > 0) {
65564                     if ((modifierSet & 1) !== 0) {
65565                         result = result + (1 << modifiersMapping[index]);
65566                     }
65567                     index++;
65568                     modifierSet = modifierSet >> 1;
65569                 }
65570                 token.modifierSet = result;
65571             }
65572         }
65573     }
65574 }
65575 const fullRange = [languageModes_1.Range.create(languageModes_1.Position.create(0, 0), languageModes_1.Position.create(Number.MAX_VALUE, 0))];
65576 function encodeTokens(tokens, ranges) {
65577     const resultTokens = tokens.sort((d1, d2) => d1.start.line - d2.start.line || d1.start.character - d2.start.character);
65578     if (ranges) {
65579         ranges = ranges.sort((d1, d2) => d1.start.line - d2.start.line || d1.start.character - d2.start.character);
65580     }
65581     else {
65582         ranges = fullRange;
65583     }
65584     let rangeIndex = 0;
65585     let currRange = ranges[rangeIndex++];
65586     let prefLine = 0;
65587     let prevChar = 0;
65588     let encodedResult = [];
65589     for (let k = 0; k < resultTokens.length && currRange; k++) {
65590         const curr = resultTokens[k];
65591         const start = curr.start;
65592         while (currRange && positions_1.beforeOrSame(currRange.end, start)) {
65593             currRange = ranges[rangeIndex++];
65594         }
65595         if (currRange && positions_1.beforeOrSame(currRange.start, start) && positions_1.beforeOrSame({ line: start.line, character: start.character + curr.length }, currRange.end)) {
65596             // token inside a range
65597             if (prefLine !== start.line) {
65598                 prevChar = 0;
65599             }
65600             encodedResult.push(start.line - prefLine); // line delta
65601             encodedResult.push(start.character - prevChar); // line delta
65602             encodedResult.push(curr.length); // length
65603             encodedResult.push(curr.typeIdx); // tokenType
65604             encodedResult.push(curr.modifierSet); // tokenModifier
65605             prefLine = start.line;
65606             prevChar = start.character;
65607         }
65608     }
65609     return encodedResult;
65610 }
65611
65612
65613 /***/ }),
65614 /* 153 */
65615 /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
65616
65617
65618 /*---------------------------------------------------------------------------------------------
65619  *  Copyright (c) Microsoft Corporation. All rights reserved.
65620  *  Licensed under the MIT License. See License.txt in the project root for license information.
65621  *--------------------------------------------------------------------------------------------*/
65622 var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
65623     if (k2 === undefined) k2 = k;
65624     Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
65625 }) : (function(o, m, k, k2) {
65626     if (k2 === undefined) k2 = k;
65627     o[k2] = m[k];
65628 }));
65629 var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
65630     Object.defineProperty(o, "default", { enumerable: true, value: v });
65631 }) : function(o, v) {
65632     o["default"] = v;
65633 });
65634 var __importStar = (this && this.__importStar) || function (mod) {
65635     if (mod && mod.__esModule) return mod;
65636     var result = {};
65637     if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
65638     __setModuleDefault(result, mod);
65639     return result;
65640 };
65641 Object.defineProperty(exports, "__esModule", ({ value: true }));
65642 exports.getNodeFSRequestService = void 0;
65643 const requests_1 = __webpack_require__(147);
65644 const vscode_uri_1 = __webpack_require__(84);
65645 const fs = __importStar(__webpack_require__(54));
65646 const vscode_css_languageservice_1 = __webpack_require__(62);
65647 function getNodeFSRequestService() {
65648     function ensureFileUri(location) {
65649         if (requests_1.getScheme(location) !== 'file') {
65650             throw new Error('fileRequestService can only handle file URLs');
65651         }
65652     }
65653     return {
65654         getContent(location, encoding) {
65655             ensureFileUri(location);
65656             return new Promise((c, e) => {
65657                 const uri = vscode_uri_1.URI.parse(location);
65658                 fs.readFile(uri.fsPath, encoding, (err, buf) => {
65659                     if (err) {
65660                         return e(err);
65661                     }
65662                     c(buf.toString());
65663                 });
65664             });
65665         },
65666         stat(location) {
65667             ensureFileUri(location);
65668             return new Promise((c, e) => {
65669                 const uri = vscode_uri_1.URI.parse(location);
65670                 fs.stat(uri.fsPath, (err, stats) => {
65671                     if (err) {
65672                         if (err.code === 'ENOENT') {
65673                             return c({ type: vscode_css_languageservice_1.FileType.Unknown, ctime: -1, mtime: -1, size: -1 });
65674                         }
65675                         else {
65676                             return e(err);
65677                         }
65678                     }
65679                     let type = vscode_css_languageservice_1.FileType.Unknown;
65680                     if (stats.isFile()) {
65681                         type = vscode_css_languageservice_1.FileType.File;
65682                     }
65683                     else if (stats.isDirectory()) {
65684                         type = vscode_css_languageservice_1.FileType.Directory;
65685                     }
65686                     else if (stats.isSymbolicLink()) {
65687                         type = vscode_css_languageservice_1.FileType.SymbolicLink;
65688                     }
65689                     c({
65690                         type,
65691                         ctime: stats.ctime.getTime(),
65692                         mtime: stats.mtime.getTime(),
65693                         size: stats.size
65694                     });
65695                 });
65696             });
65697         },
65698         readDirectory(location) {
65699             ensureFileUri(location);
65700             return new Promise((c, e) => {
65701                 const path = vscode_uri_1.URI.parse(location).fsPath;
65702                 fs.readdir(path, { withFileTypes: true }, (err, children) => {
65703                     if (err) {
65704                         return e(err);
65705                     }
65706                     c(children.map(stat => {
65707                         if (stat.isSymbolicLink()) {
65708                             return [stat.name, vscode_css_languageservice_1.FileType.SymbolicLink];
65709                         }
65710                         else if (stat.isDirectory()) {
65711                             return [stat.name, vscode_css_languageservice_1.FileType.Directory];
65712                         }
65713                         else if (stat.isFile()) {
65714                             return [stat.name, vscode_css_languageservice_1.FileType.File];
65715                         }
65716                         else {
65717                             return [stat.name, vscode_css_languageservice_1.FileType.Unknown];
65718                         }
65719                     }));
65720                 });
65721             });
65722         }
65723     };
65724 }
65725 exports.getNodeFSRequestService = getNodeFSRequestService;
65726
65727
65728 /***/ })
65729 /******/        ]);
65730 /************************************************************************/
65731 /******/        // The module cache
65732 /******/        var __webpack_module_cache__ = {};
65733 /******/        
65734 /******/        // The require function
65735 /******/        function __webpack_require__(moduleId) {
65736 /******/                // Check if module is in cache
65737 /******/                if(__webpack_module_cache__[moduleId]) {
65738 /******/                        return __webpack_module_cache__[moduleId].exports;
65739 /******/                }
65740 /******/                // Create a new module (and put it into the cache)
65741 /******/                var module = __webpack_module_cache__[moduleId] = {
65742 /******/                        // no module.id needed
65743 /******/                        // no module.loaded needed
65744 /******/                        exports: {}
65745 /******/                };
65746 /******/        
65747 /******/                // Execute the module function
65748 /******/                __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
65749 /******/        
65750 /******/                // Return the exports of the module
65751 /******/                return module.exports;
65752 /******/        }
65753 /******/        
65754 /************************************************************************/
65755 /******/        /* webpack/runtime/define property getters */
65756 /******/        (() => {
65757 /******/                // define getter functions for harmony exports
65758 /******/                __webpack_require__.d = (exports, definition) => {
65759 /******/                        for(var key in definition) {
65760 /******/                                if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
65761 /******/                                        Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
65762 /******/                                }
65763 /******/                        }
65764 /******/                };
65765 /******/        })();
65766 /******/        
65767 /******/        /* webpack/runtime/hasOwnProperty shorthand */
65768 /******/        (() => {
65769 /******/                __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
65770 /******/        })();
65771 /******/        
65772 /******/        /* webpack/runtime/make namespace object */
65773 /******/        (() => {
65774 /******/                // define __esModule on exports
65775 /******/                __webpack_require__.r = (exports) => {
65776 /******/                        if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
65777 /******/                                Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
65778 /******/                        }
65779 /******/                        Object.defineProperty(exports, '__esModule', { value: true });
65780 /******/                };
65781 /******/        })();
65782 /******/        
65783 /************************************************************************/
65784 /******/        // module exports must be returned from runtime so entry inlining is disabled
65785 /******/        // startup
65786 /******/        // Load entry module and return exports
65787 /******/        return __webpack_require__(42);
65788 /******/ })()
65789
65790 ));