PageSourceSearch

https://secularpolicyinstitute.net/wp-content/plugins/pdf-print/js/html2canvas.js?ver=6.2.11

js secularpolicyinstitute.net collected 2026-09-25 03:49:15 UTC 372,812 bytes, 6,994 lines download raw bytes

vendor: 4,648 bytes, lines 1-85
1/*!
2 * html2canvas 1.0.0-rc.3 <https://html2canvas.hertzen.com>
3 * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>
4 * Released under MIT License
5 */
6(function (global, factory) {
7    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8    typeof define === 'function' && define.amd ? define(factory) :
9    (global = global || self, global.html2canvas = factory());
10}(this, function () { 'use strict';
11
12    /*! *****************************************************************************
13    Copyright (c) Microsoft Corporation. All rights reserved.
14    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
15    this file except in compliance with the License. You may obtain a copy of the
16    License at http://www.apache.org/licenses/LICENSE-2.0
17
18    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
20    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
21    MERCHANTABLITY OR NON-INFRINGEMENT.
22
23    See the Apache Version 2.0 License for specific language governing permissions
24    and limitations under the License.
25    ***************************************************************************** */
26    /* global Reflect, Promise */
27
28    var extendStatics = function(d, b) {
29        extendStatics = Object.setPrototypeOf ||
30            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
31            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
32        return extendStatics(d, b);
33    };
34
35    function __extends(d, b) {
36        extendStatics(d, b);
37        function __() { this.constructor = d; }
38        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
39    }
40
41    var __assign = function() {
42        __assign = Object.assign || function __assign(t) {
43            for (var s, i = 1, n = arguments.length; i < n; i++) {
44                s = arguments[i];
45                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
46            }
47            return t;
48        };
49        return __assign.apply(this, arguments);
50    };
51
52    function __awaiter(thisArg, _arguments, P, generator) {
53        return new (P || (P = Promise))(function (resolve, reject) {
54            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56            function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
57            step((generator = generator.apply(thisArg, _arguments || [])).next());
58        });
59    }
60
61    function __generator(thisArg, body) {
62        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
63        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
64        function verb(n) { return function (v) { return step([n, v]); }; }
65        function step(op) {
66            if (f) throw new TypeError("Generator is already executing.");
67            while (_) try {
68                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;
69                if (y = 0, t) op = [op[0] & 2, t.value];
70                switch (op[0]) {
71                    case 0: case 1: t = op; break;
72                    case 4: _.label++; return { value: op[1], done: false };
73                    case 5: _.label++; y = op[1]; op = [0]; continue;
74                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
75                    default:
76                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
77                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
78                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
79                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
80                        if (t[2]) _.ops.pop();
81                        _.trys.pop(); continue;
82                }
83                op = body.call(thisArg, _);
84            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
85            if (op[0] & 5) throw op[1];
vendor: 17,953 bytes, lines 85-361
85 return { value: op[0] ? op[1] : void 0, done: true };
86        }
87    }
88
89    var Bounds = /** @class */ (function () {
90        function Bounds(x, y, w, h) {
91            this.left = x;
92            this.top = y;
93            this.width = w;
94            this.height = h;
95        }
96        Bounds.prototype.add = function (x, y, w, h) {
97            return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);
98        };
99        Bounds.fromClientRect = function (clientRect) {
100            return new Bounds(clientRect.left, clientRect.top, clientRect.width, clientRect.height);
101        };
102        return Bounds;
103    }());
104    var parseBounds = function (node) {
105        return Bounds.fromClientRect(node.getBoundingClientRect());
106    };
107    var parseDocumentSize = function (document) {
108        var body = document.body;
109        var documentElement = document.documentElement;
110        if (!body || !documentElement) {
111            throw new Error("Unable to get document size");
112        }
113        var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));
114        var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));
115        return new Bounds(0, 0, width, height);
116    };
117
118    /*
119     * css-line-break 1.1.1 <https://github.com/niklasvh/css-line-break#readme>
120     * Copyright (c) 2019 Niklas von Hertzen <https://hertzen.com>
121     * Released under MIT License
122     */
123    var toCodePoints = function (str) {
124        var codePoints = [];
125        var i = 0;
126        var length = str.length;
127        while (i < length) {
128            var value = str.charCodeAt(i++);
129            if (value >= 0xd800 && value <= 0xdbff && i < length) {
130                var extra = str.charCodeAt(i++);
131                if ((extra & 0xfc00) === 0xdc00) {
132                    codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);
133                }
134                else {
135                    codePoints.push(value);
136                    i--;
137                }
138            }
139            else {
140                codePoints.push(value);
141            }
142        }
143        return codePoints;
144    };
145    var fromCodePoint = function () {
146        var codePoints = [];
147        for (var _i = 0; _i < arguments.length; _i++) {
148            codePoints[_i] = arguments[_i];
149        }
150        if (String.fromCodePoint) {
151            return String.fromCodePoint.apply(String, codePoints);
152        }
153        var length = codePoints.length;
154        if (!length) {
155            return '';
156        }
157        var codeUnits = [];
158        var index = -1;
159        var result = '';
160        while (++index < length) {
161            var codePoint = codePoints[index];
162            if (codePoint <= 0xffff) {
163                codeUnits.push(codePoint);
164            }
165            else {
166                codePoint -= 0x10000;
167                codeUnits.push((codePoint >> 10) + 0xd800, codePoint % 0x400 + 0xdc00);
168            }
169            if (index + 1 === length || codeUnits.length > 0x4000) {
170                result += String.fromCharCode.apply(String, codeUnits);
171                codeUnits.length = 0;
172            }
173        }
174        return result;
175    };
176    var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
177    // Use a lookup table to find the index.
178    var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);
179    for (var i = 0; i < chars.length; i++) {
180        lookup[chars.charCodeAt(i)] = i;
181    }
182    var decode = function (base64) {
183        var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;
184        if (base64[base64.length - 1] === '=') {
185            bufferLength--;
186            if (base64[base64.length - 2] === '=') {
187                bufferLength--;
188            }
189        }
190        var buffer = typeof ArrayBuffer !== 'undefined' &&
191            typeof Uint8Array !== 'undefined' &&
192            typeof Uint8Array.prototype.slice !== 'undefined'
193            ? new ArrayBuffer(bufferLength)
194            : new Array(bufferLength);
195        var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);
196        for (i = 0; i < len; i += 4) {
197            encoded1 = lookup[base64.charCodeAt(i)];
198            encoded2 = lookup[base64.charCodeAt(i + 1)];
199            encoded3 = lookup[base64.charCodeAt(i + 2)];
200            encoded4 = lookup[base64.charCodeAt(i + 3)];
201            bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
202            bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
203            bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
204        }
205        return buffer;
206    };
207    var polyUint16Array = function (buffer) {
208        var length = buffer.length;
209        var bytes = [];
210        for (var i = 0; i < length; i += 2) {
211            bytes.push((buffer[i + 1] << 8) | buffer[i]);
212        }
213        return bytes;
214    };
215    var polyUint32Array = function (buffer) {
216        var length = buffer.length;
217        var bytes = [];
218        for (var i = 0; i < length; i += 4) {
219            bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);
220        }
221        return bytes;
222    };
223
224    /** Shift size for getting the index-2 table offset. */
225    var UTRIE2_SHIFT_2 = 5;
226    /** Shift size for getting the index-1 table offset. */
227    var UTRIE2_SHIFT_1 = 6 + 5;
228    /**
229     * Shift size for shifting left the index array values.
230     * Increases possible data size with 16-bit index values at the cost
231     * of compactability.
232     * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.
233     */
234    var UTRIE2_INDEX_SHIFT = 2;
235    /**
236     * Difference between the two shift sizes,
237     * for getting an index-1 offset from an index-2 offset. 6=11-5
238     */
239    var UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;
240    /**
241     * The part of the index-2 table for U+D800..U+DBFF stores values for
242     * lead surrogate code _units_ not code _points_.
243     * Values for lead surrogate code _points_ are indexed with this portion of the table.
244     * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)
245     */
246    var UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;
247    /** Number of entries in a data block. 32=0x20 */
248    var UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;
249    /** Mask for getting the lower bits for the in-data-block offset. */
250    var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;
251    var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;
252    /** Count the lengths of both BMP pieces. 2080=0x820 */
253    var UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;
254    /**
255     * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.
256     * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.
257     */
258    var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;
259    var UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */
260    /**
261     * The index-1 table, only used for supplementary code points, at offset 2112=0x840.
262     * Variable length, for code points up to highStart, where the last single-value range starts.
263     * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.
264     * (For 0x100000 supplementary code points U+10000..U+10ffff.)
265     *
266     * The part of the index-2 table for supplementary code points starts
267     * after this index-1 table.
268     *
269     * Both the index-1 table and the following part of the index-2 table
270     * are omitted completely if there is only BMP data.
271     */
272    var UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;
273    /**
274     * Number of index-1 entries for the BMP. 32=0x20
275     * This part of the index-1 table is omitted from the serialized form.
276     */
277    var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;
278    /** Number of entries in an index-2 block. 64=0x40 */
279    var UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;
280    /** Mask for getting the lower bits for the in-index-2-block offset. */
281    var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;
282    var slice16 = function (view, start, end) {
283        if (view.slice) {
284            return view.slice(start, end);
285        }
286        return new Uint16Array(Array.prototype.slice.call(view, start, end));
287    };
288    var slice32 = function (view, start, end) {
289        if (view.slice) {
290            return view.slice(start, end);
291        }
292        return new Uint32Array(Array.prototype.slice.call(view, start, end));
293    };
294    var createTrieFromBase64 = function (base64) {
295        var buffer = decode(base64);
296        var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);
297        var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);
298        var headerLength = 24;
299        var index = slice16(view16, headerLength / 2, view32[4] / 2);
300        var data = view32[5] === 2
301            ? slice16(view16, (headerLength + view32[4]) / 2)
302            : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));
303        return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);
304    };
305    var Trie = /** @class */ (function () {
306        function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {
307            this.initialValue = initialValue;
308            this.errorValue = errorValue;
309            this.highStart = highStart;
310            this.highValueIndex = highValueIndex;
311            this.index = index;
312            this.data = data;
313        }
314        /**
315         * Get the value for a code point as stored in the Trie.
316         *
317         * @param codePoint the code point
318         * @return the value
319         */
320        Trie.prototype.get = function (codePoint) {
321            var ix;
322            if (codePoint >= 0) {
323                if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {
324                    // Ordinary BMP code point, excluding leading surrogates.
325                    // BMP uses a single level lookup.  BMP index starts at offset 0 in the Trie2 index.
326                    // 16 bit data is stored in the index array itself.
327                    ix = this.index[codePoint >> UTRIE2_SHIFT_2];
328                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
329                    return this.data[ix];
330                }
331                if (codePoint <= 0xffff) {
332                    // Lead Surrogate Code Point.  A Separate index section is stored for
333                    // lead surrogate code units and code points.
334                    //   The main index has the code unit data.
335                    //   For this function, we need the code point data.
336                    // Note: this expression could be refactored for slightly improved efficiency, but
337                    //       surrogate code points will be so rare in practice that it's not worth it.
338                    ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];
339                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
340                    return this.data[ix];
341                }
342                if (codePoint < this.highStart) {
343                    // Supplemental code point, use two-level lookup.
344                    ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);
345                    ix = this.index[ix];
346                    ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;
347                    ix = this.index[ix];
348                    ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);
349                    return this.data[ix];
350                }
351                if (codePoint <= 0x10ffff) {
352                    return this.data[this.highValueIndex];
353                }
354            }
355            // Fall through.  The code point is outside of the legal range of 0..0x10ffff.
356            return this.errorValue;
357        };
358        return Trie;
359    }());
360
361    var base64 = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAA
361XgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwA
361KAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AH
361QAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATw
361BPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATw
361BPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUA
vendor: 6,833 bytes, lines 361-427
361BQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA';
362
363    /* @flow */
364    var LETTER_NUMBER_MODIFIER = 50;
365    // Non-tailorable Line Breaking Classes
366    var BK = 1; //  Cause a line break (after)
367    var CR = 2; //  Cause a line break (after), except between CR and LF
368    var LF = 3; //  Cause a line break (after)
369    var CM = 4; //  Prohibit a line break between the character and the preceding character
370    var NL = 5; //  Cause a line break (after)
371    var WJ = 7; //  Prohibit line breaks before and after
372    var ZW = 8; //  Provide a break opportunity
373    var GL = 9; //  Prohibit line breaks before and after
374    var SP = 10; // Enable indirect line breaks
375    var ZWJ = 11; // Prohibit line breaks within joiner sequences
376    // Break Opportunities
377    var B2 = 12; //  Provide a line break opportunity before and after the character
378    var BA = 13; //  Generally provide a line break opportunity after the character
379    var BB = 14; //  Generally provide a line break opportunity before the character
380    var HY = 15; //  Provide a line break opportunity after the character, except in numeric context
381    var CB = 16; //   Provide a line break opportunity contingent on additional information
382    // Characters Prohibiting Certain Breaks
383    var CL = 17; //  Prohibit line breaks before
384    var CP = 18; //  Prohibit line breaks before
385    var EX = 19; //  Prohibit line breaks before
386    var IN = 20; //  Allow only indirect line breaks between pairs
387    var NS = 21; //  Allow only indirect line breaks before
388    var OP = 22; //  Prohibit line breaks after
389    var QU = 23; //  Act like they are both opening and closing
390    // Numeric Context
391    var IS = 24; //  Prevent breaks after any and before numeric
392    var NU = 25; //  Form numeric expressions for line breaking purposes
393    var PO = 26; //  Do not break following a numeric expression
394    var PR = 27; //  Do not break in front of a numeric expression
395    var SY = 28; //  Prevent a break before; and allow a break after
396    // Other Characters
397    var AI = 29; //  Act like AL when the resolvedEAW is N; otherwise; act as ID
398    var AL = 30; //  Are alphabetic characters or symbols that are used with alphabetic characters
399    var CJ = 31; //  Treat as NS or ID for strict or normal breaking.
400    var EB = 32; //  Do not break from following Emoji Modifier
401    var EM = 33; //  Do not break from preceding Emoji Base
402    var H2 = 34; //  Form Korean syllable blocks
403    var H3 = 35; //  Form Korean syllable blocks
404    var HL = 36; //  Do not break around a following hyphen; otherwise act as Alphabetic
405    var ID = 37; //  Break before or after; except in some numeric context
406    var JL = 38; //  Form Korean syllable blocks
407    var JV = 39; //  Form Korean syllable blocks
408    var JT = 40; //  Form Korean syllable blocks
409    var RI = 41; //  Keep pairs together. For pairs; break before and after other classes
410    var SA = 42; //  Provide a line break opportunity contingent on additional, language-specific context analysis
411    var XX = 43; //  Have as yet unknown line breaking behavior or unassigned code positions
412    var BREAK_MANDATORY = '!';
413    var BREAK_NOT_ALLOWED = '×';
414    var BREAK_ALLOWED = '÷';
415    var UnicodeTrie = createTrieFromBase64(base64);
416    var ALPHABETICS = [AL, HL];
417    var HARD_LINE_BREAKS = [BK, CR, LF, NL];
418    var SPACE = [SP, ZW];
419    var PREFIX_POSTFIX = [PR, PO];
420    var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE);
421    var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];
422    var HYPHEN = [HY, BA];
423    var codePointsToCharacterClasses = function (codePoints, lineBreak) {
424        if (lineBreak === void 0) { lineBreak = 'strict'; }
425        var types = [];
426        var indicies = [];
427        var categories = [];
vendor: 34,373 bytes, lines 428-1216
428        codePoints.forEach(function (codePoint, index) {
429            var classType = UnicodeTrie.get(codePoint);
430            if (classType > LETTER_NUMBER_MODIFIER) {
431                categories.push(true);
432                classType -= LETTER_NUMBER_MODIFIER;
433            }
434            else {
435                categories.push(false);
436            }
437            if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {
438                // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0
439                if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {
440                    indicies.push(index);
441                    return types.push(CB);
442                }
443            }
444            if (classType === CM || classType === ZWJ) {
445                // LB10 Treat any remaining combining mark or ZWJ as AL.
446                if (index === 0) {
447                    indicies.push(index);
448                    return types.push(AL);
449                }
450                // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of
451                // the base character in all of the following rules. Treat ZWJ as if it were CM.
452                var prev = types[index - 1];
453                if (LINE_BREAKS.indexOf(prev) === -1) {
454                    indicies.push(indicies[index - 1]);
455                    return types.push(prev);
456                }
457                indicies.push(index);
458                return types.push(AL);
459            }
460            indicies.push(index);
461            if (classType === CJ) {
462                return types.push(lineBreak === 'strict' ? NS : ID);
463            }
464            if (classType === SA) {
465                return types.push(AL);
466            }
467            if (classType === AI) {
468                return types.push(AL);
469            }
470            // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL
471            // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised
472            // to take into account the actual line breaking properties for these characters.
473            if (classType === XX) {
474                if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {
475                    return types.push(ID);
476                }
477                else {
478                    return types.push(AL);
479                }
480            }
481            types.push(classType);
482        });
483        return [indicies, types, categories];
484    };
485    var isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) {
486        var current = classTypes[currentIndex];
487        if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {
488            var i = currentIndex;
489            while (i <= classTypes.length) {
490                i++;
491                var next = classTypes[i];
492                if (next === b) {
493                    return true;
494                }
495                if (next !== SP) {
496                    break;
497                }
498            }
499        }
500        if (current === SP) {
501            var i = currentIndex;
502            while (i > 0) {
503                i--;
504                var prev = classTypes[i];
505                if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {
506                    var n = currentIndex;
507                    while (n <= classTypes.length) {
508                        n++;
509                        var next = classTypes[n];
510                        if (next === b) {
511                            return true;
512                        }
513                        if (next !== SP) {
514                            break;
515                        }
516                    }
517                }
518                if (prev !== SP) {
519                    break;
520                }
521            }
522        }
523        return false;
524    };
525    var previousNonSpaceClassType = function (currentIndex, classTypes) {
526        var i = currentIndex;
527        while (i >= 0) {
528            var type = classTypes[i];
529            if (type === SP) {
530                i--;
531            }
532            else {
533                return type;
534            }
535        }
536        return 0;
537    };
538    var _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) {
539        if (indicies[index] === 0) {
540            return BREAK_NOT_ALLOWED;
541        }
542        var currentIndex = index - 1;
543        if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {
544            return BREAK_NOT_ALLOWED;
545        }
546        var beforeIndex = currentIndex - 1;
547        var afterIndex = currentIndex + 1;
548        var current = classTypes[currentIndex];
549        // LB4 Always break after hard line breaks.
550        // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.
551        var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;
552        var next = classTypes[afterIndex];
553        if (current === CR && next === LF) {
554            return BREAK_NOT_ALLOWED;
555        }
556        if (HARD_LINE_BREAKS.indexOf(current) !== -1) {
557            return BREAK_MANDATORY;
558        }
559        // LB6 Do not break before hard line breaks.
560        if (HARD_LINE_BREAKS.indexOf(next) !== -1) {
561            return BREAK_NOT_ALLOWED;
562        }
563        // LB7 Do not break before spaces or zero width space.
564        if (SPACE.indexOf(next) !== -1) {
565            return BREAK_NOT_ALLOWED;
566        }
567        // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.
568        if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {
569            return BREAK_ALLOWED;
570        }
571        // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier.
572        if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) {
573            return BREAK_NOT_ALLOWED;
574        }
575        // LB11 Do not break before or after Word joiner and related characters.
576        if (current === WJ || next === WJ) {
577            return BREAK_NOT_ALLOWED;
578        }
579        // LB12 Do not break after NBSP and related characters.
580        if (current === GL) {
581            return BREAK_NOT_ALLOWED;
582        }
583        // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.
584        if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {
585            return BREAK_NOT_ALLOWED;
586        }
587        // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.
588        if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {
589            return BREAK_NOT_ALLOWED;
590        }
591        // LB14 Do not break after ‘[’, even after spaces.
592        if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {
593            return BREAK_NOT_ALLOWED;
594        }
595        // LB15 Do not break within ‘”[’, even with intervening spaces.
596        if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {
597            return BREAK_NOT_ALLOWED;
598        }
599        // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.
600        if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {
601            return BREAK_NOT_ALLOWED;
602        }
603        // LB17 Do not break within ‘——’, even with intervening spaces.
604        if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {
605            return BREAK_NOT_ALLOWED;
606        }
607        // LB18 Break after spaces.
608        if (current === SP) {
609            return BREAK_ALLOWED;
610        }
611        // LB19 Do not break before or after quotation marks, such as ‘ ” ’.
612        if (current === QU || next === QU) {
613            return BREAK_NOT_ALLOWED;
614        }
615        // LB20 Break before and after unresolved CB.
616        if (next === CB || current === CB) {
617            return BREAK_ALLOWED;
618        }
619        // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.
620        if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {
621            return BREAK_NOT_ALLOWED;
622        }
623        // LB21a Don't break after Hebrew + Hyphen.
624        if (before === HL && HYPHEN.indexOf(current) !== -1) {
625            return BREAK_NOT_ALLOWED;
626        }
627        // LB21b Don’t break between Solidus and Hebrew letters.
628        if (current === SY && next === HL) {
629            return BREAK_NOT_ALLOWED;
630        }
631        // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis.
632        if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) {
633            return BREAK_NOT_ALLOWED;
634        }
635        // LB23 Do not break between digits and letters.
636        if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {
637            return BREAK_NOT_ALLOWED;
638        }
639        // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.
640        if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) ||
641            ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) {
642            return BREAK_NOT_ALLOWED;
643        }
644        // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.
645        if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||
646            (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) {
647            return BREAK_NOT_ALLOWED;
648        }
649        // LB25 Do not break between the following pairs of classes relevant to numbers:
650        if (
651        // (PR | PO) × ( OP | HY )? NU
652        ([PR, PO].indexOf(current) !== -1 &&
653            (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||
654            // ( OP | HY ) × NU
655            ([OP, HY].indexOf(current) !== -1 && next === NU) ||
656            // NU ×	(NU | SY | IS)
657            (current === NU && [NU, SY, IS].indexOf(next) !== -1)) {
658            return BREAK_NOT_ALLOWED;
659        }
660        // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)
661        if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {
662            var prevIndex = currentIndex;
663            while (prevIndex >= 0) {
664                var type = classTypes[prevIndex];
665                if (type === NU) {
666                    return BREAK_NOT_ALLOWED;
667                }
668                else if ([SY, IS].indexOf(type) !== -1) {
669                    prevIndex--;
670                }
671                else {
672                    break;
673                }
674            }
675        }
676        // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))
677        if ([PR, PO].indexOf(next) !== -1) {
678            var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;
679            while (prevIndex >= 0) {
680                var type = classTypes[prevIndex];
681                if (type === NU) {
682                    return BREAK_NOT_ALLOWED;
683                }
684                else if ([SY, IS].indexOf(type) !== -1) {
685                    prevIndex--;
686                }
687                else {
688                    break;
689                }
690            }
691        }
692        // LB26 Do not break a Korean syllable.
693        if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||
694            ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||
695            ([JT, H3].indexOf(current) !== -1 && next === JT)) {
696            return BREAK_NOT_ALLOWED;
697        }
698        // LB27 Treat a Korean Syllable Block the same as ID.
699        if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||
700            (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) {
701            return BREAK_NOT_ALLOWED;
702        }
703        // LB28 Do not break between alphabetics (“at”).
704        if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {
705            return BREAK_NOT_ALLOWED;
706        }
707        // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).
708        if (current === IS && ALPHABETICS.indexOf(next) !== -1) {
709            return BREAK_NOT_ALLOWED;
710        }
711        // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.
712        if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP) ||
713            (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) {
714            return BREAK_NOT_ALLOWED;
715        }
716        // LB30a Break between two regional indicator symbols if and only if there are an even number of regional
717        // indicators preceding the position of the break.
718        if (current === RI && next === RI) {
719            var i = indicies[currentIndex];
720            var count = 1;
721            while (i > 0) {
722                i--;
723                if (classTypes[i] === RI) {
724                    count++;
725                }
726                else {
727                    break;
728                }
729            }
730            if (count % 2 !== 0) {
731                return BREAK_NOT_ALLOWED;
732            }
733        }
734        // LB30b Do not break between an emoji base and an emoji modifier.
735        if (current === EB && next === EM) {
736            return BREAK_NOT_ALLOWED;
737        }
738        return BREAK_ALLOWED;
739    };
740    var cssFormattedClasses = function (codePoints, options) {
741        if (!options) {
742            options = { lineBreak: 'normal', wordBreak: 'normal' };
743        }
744        var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2];
745        if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {
746            classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); });
747        }
748        var forbiddenBreakpoints = options.wordBreak === 'keep-all'
749            ? isLetterNumber.map(function (letterNumber, i) {
750                return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;
751            })
752            : undefined;
753        return [indicies, classTypes, forbiddenBreakpoints];
754    };
755    var Break = /** @class */ (function () {
756        function Break(codePoints, lineBreak, start, end) {
757            this.codePoints = codePoints;
758            this.required = lineBreak === BREAK_MANDATORY;
759            this.start = start;
760            this.end = end;
761        }
762        Break.prototype.slice = function () {
763            return fromCodePoint.apply(void 0, this.codePoints.slice(this.start, this.end));
764        };
765        return Break;
766    }());
767    var LineBreaker = function (str, options) {
768        var codePoints = toCodePoints(str);
769        var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2];
770        var length = codePoints.length;
771        var lastEnd = 0;
772        var nextIndex = 0;
773        return {
774            next: function () {
775                if (nextIndex >= length) {
776                    return { done: true, value: null };
777                }
778                var lineBreak = BREAK_NOT_ALLOWED;
779                while (nextIndex < length &&
780                    (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===
781                        BREAK_NOT_ALLOWED) { }
782                if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) {
783                    var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);
784                    lastEnd = nextIndex;
785                    return { value: value, done: false };
786                }
787                return { done: true, value: null };
788            },
789        };
790    };
791
792    // https://www.w3.org/TR/css-syntax-3
793    var TokenType;
794    (function (TokenType) {
795        TokenType[TokenType["STRING_TOKEN"] = 0] = "STRING_TOKEN";
796        TokenType[TokenType["BAD_STRING_TOKEN"] = 1] = "BAD_STRING_TOKEN";
797        TokenType[TokenType["LEFT_PARENTHESIS_TOKEN"] = 2] = "LEFT_PARENTHESIS_TOKEN";
798        TokenType[TokenType["RIGHT_PARENTHESIS_TOKEN"] = 3] = "RIGHT_PARENTHESIS_TOKEN";
799        TokenType[TokenType["COMMA_TOKEN"] = 4] = "COMMA_TOKEN";
800        TokenType[TokenType["HASH_TOKEN"] = 5] = "HASH_TOKEN";
801        TokenType[TokenType["DELIM_TOKEN"] = 6] = "DELIM_TOKEN";
802        TokenType[TokenType["AT_KEYWORD_TOKEN"] = 7] = "AT_KEYWORD_TOKEN";
803        TokenType[TokenType["PREFIX_MATCH_TOKEN"] = 8] = "PREFIX_MATCH_TOKEN";
804        TokenType[TokenType["DASH_MATCH_TOKEN"] = 9] = "DASH_MATCH_TOKEN";
805        TokenType[TokenType["INCLUDE_MATCH_TOKEN"] = 10] = "INCLUDE_MATCH_TOKEN";
806        TokenType[TokenType["LEFT_CURLY_BRACKET_TOKEN"] = 11] = "LEFT_CURLY_BRACKET_TOKEN";
807        TokenType[TokenType["RIGHT_CURLY_BRACKET_TOKEN"] = 12] = "RIGHT_CURLY_BRACKET_TOKEN";
808        TokenType[TokenType["SUFFIX_MATCH_TOKEN"] = 13] = "SUFFIX_MATCH_TOKEN";
809        TokenType[TokenType["SUBSTRING_MATCH_TOKEN"] = 14] = "SUBSTRING_MATCH_TOKEN";
810        TokenType[TokenType["DIMENSION_TOKEN"] = 15] = "DIMENSION_TOKEN";
811        TokenType[TokenType["PERCENTAGE_TOKEN"] = 16] = "PERCENTAGE_TOKEN";
812        TokenType[TokenType["NUMBER_TOKEN"] = 17] = "NUMBER_TOKEN";
813        TokenType[TokenType["FUNCTION"] = 18] = "FUNCTION";
814        TokenType[TokenType["FUNCTION_TOKEN"] = 19] = "FUNCTION_TOKEN";
815        TokenType[TokenType["IDENT_TOKEN"] = 20] = "IDENT_TOKEN";
816        TokenType[TokenType["COLUMN_TOKEN"] = 21] = "COLUMN_TOKEN";
817        TokenType[TokenType["URL_TOKEN"] = 22] = "URL_TOKEN";
818        TokenType[TokenType["BAD_URL_TOKEN"] = 23] = "BAD_URL_TOKEN";
819        TokenType[TokenType["CDC_TOKEN"] = 24] = "CDC_TOKEN";
820        TokenType[TokenType["CDO_TOKEN"] = 25] = "CDO_TOKEN";
821        TokenType[TokenType["COLON_TOKEN"] = 26] = "COLON_TOKEN";
822        TokenType[TokenType["SEMICOLON_TOKEN"] = 27] = "SEMICOLON_TOKEN";
823        TokenType[TokenType["LEFT_SQUARE_BRACKET_TOKEN"] = 28] = "LEFT_SQUARE_BRACKET_TOKEN";
824        TokenType[TokenType["RIGHT_SQUARE_BRACKET_TOKEN"] = 29] = "RIGHT_SQUARE_BRACKET_TOKEN";
825        TokenType[TokenType["UNICODE_RANGE_TOKEN"] = 30] = "UNICODE_RANGE_TOKEN";
826        TokenType[TokenType["WHITESPACE_TOKEN"] = 31] = "WHITESPACE_TOKEN";
827        TokenType[TokenType["EOF_TOKEN"] = 32] = "EOF_TOKEN";
828    })(TokenType || (TokenType = {}));
829    var FLAG_UNRESTRICTED = 1 << 0;
830    var FLAG_ID = 1 << 1;
831    var FLAG_INTEGER = 1 << 2;
832    var FLAG_NUMBER = 1 << 3;
833    var LINE_FEED = 0x000a;
834    var SOLIDUS = 0x002f;
835    var REVERSE_SOLIDUS = 0x005c;
836    var CHARACTER_TABULATION = 0x0009;
837    var SPACE$1 = 0x0020;
838    var QUOTATION_MARK = 0x0022;
839    var EQUALS_SIGN = 0x003d;
840    var NUMBER_SIGN = 0x0023;
841    var DOLLAR_SIGN = 0x0024;
842    var PERCENTAGE_SIGN = 0x0025;
843    var APOSTROPHE = 0x0027;
844    var LEFT_PARENTHESIS = 0x0028;
845    var RIGHT_PARENTHESIS = 0x0029;
846    var LOW_LINE = 0x005f;
847    var HYPHEN_MINUS = 0x002d;
848    var EXCLAMATION_MARK = 0x0021;
849    var LESS_THAN_SIGN = 0x003c;
850    var GREATER_THAN_SIGN = 0x003e;
851    var COMMERCIAL_AT = 0x0040;
852    var LEFT_SQUARE_BRACKET = 0x005b;
853    var RIGHT_SQUARE_BRACKET = 0x005d;
854    var CIRCUMFLEX_ACCENT = 0x003d;
855    var LEFT_CURLY_BRACKET = 0x007b;
856    var QUESTION_MARK = 0x003f;
857    var RIGHT_CURLY_BRACKET = 0x007d;
858    var VERTICAL_LINE = 0x007c;
859    var TILDE = 0x007e;
860    var CONTROL = 0x0080;
861    var REPLACEMENT_CHARACTER = 0xfffd;
862    var ASTERISK = 0x002a;
863    var PLUS_SIGN = 0x002b;
864    var COMMA = 0x002c;
865    var COLON = 0x003a;
866    var SEMICOLON = 0x003b;
867    var FULL_STOP = 0x002e;
868    var NULL = 0x0000;
869    var BACKSPACE = 0x0008;
870    var LINE_TABULATION = 0x000b;
871    var SHIFT_OUT = 0x000e;
872    var INFORMATION_SEPARATOR_ONE = 0x001f;
873    var DELETE = 0x007f;
874    var EOF = -1;
875    var ZERO = 0x0030;
876    var a = 0x0061;
877    var e = 0x0065;
878    var f = 0x0066;
879    var u = 0x0075;
880    var z = 0x007a;
881    var A = 0x0041;
882    var E = 0x0045;
883    var F = 0x0046;
884    var U = 0x0055;
885    var Z = 0x005a;
886    var isDigit = function (codePoint) { return codePoint >= ZERO && codePoint <= 0x0039; };
887    var isSurrogateCodePoint = function (codePoint) { return codePoint >= 0xd800 && codePoint <= 0xdfff; };
888    var isHex = function (codePoint) {
889        return isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);
890    };
891    var isLowerCaseLetter = function (codePoint) { return codePoint >= a && codePoint <= z; };
892    var isUpperCaseLetter = function (codePoint) { return codePoint >= A && codePoint <= Z; };
893    var isLetter = function (codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); };
894    var isNonASCIICodePoint = function (codePoint) { return codePoint >= CONTROL; };
895    var isWhiteSpace = function (codePoint) {
896        return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE$1;
897    };
898    var isNameStartCodePoint = function (codePoint) {
899        return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;
900    };
901    var isNameCodePoint = function (codePoint) {
902        return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;
903    };
904    var isNonPrintableCodePoint = function (codePoint) {
905        return ((codePoint >= NULL && codePoint <= BACKSPACE) ||
906            codePoint === LINE_TABULATION ||
907            (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||
908            codePoint === DELETE);
909    };
910    var isValidEscape = function (c1, c2) {
911        if (c1 !== REVERSE_SOLIDUS) {
912            return false;
913        }
914        return c2 !== LINE_FEED;
915    };
916    var isIdentifierStart = function (c1, c2, c3) {
917        if (c1 === HYPHEN_MINUS) {
918            return isNameStartCodePoint(c2) || isValidEscape(c2, c3);
919        }
920        else if (isNameStartCodePoint(c1)) {
921            return true;
922        }
923        else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {
924            return true;
925        }
926        return false;
927    };
928    var isNumberStart = function (c1, c2, c3) {
929        if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
930            if (isDigit(c2)) {
931                return true;
932            }
933            return c2 === FULL_STOP && isDigit(c3);
934        }
935        if (c1 === FULL_STOP) {
936            return isDigit(c2);
937        }
938        return isDigit(c1);
939    };
940    var stringToNumber = function (codePoints) {
941        var c = 0;
942        var sign = 1;
943        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
944            if (codePoints[c] === HYPHEN_MINUS) {
945                sign = -1;
946            }
947            c++;
948        }
949        var integers = [];
950        while (isDigit(codePoints[c])) {
951            integers.push(codePoints[c++]);
952        }
953        var int = integers.length ? parseInt(fromCodePoint.apply(void 0, integers), 10) : 0;
954        if (codePoints[c] === FULL_STOP) {
955            c++;
956        }
957        var fraction = [];
958        while (isDigit(codePoints[c])) {
959            fraction.push(codePoints[c++]);
960        }
961        var fracd = fraction.length;
962        var frac = fracd ? parseInt(fromCodePoint.apply(void 0, fraction), 10) : 0;
963        if (codePoints[c] === E || codePoints[c] === e) {
964            c++;
965        }
966        var expsign = 1;
967        if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {
968            if (codePoints[c] === HYPHEN_MINUS) {
969                expsign = -1;
970            }
971            c++;
972        }
973        var exponent = [];
974        while (isDigit(codePoints[c])) {
975            exponent.push(codePoints[c++]);
976        }
977        var exp = exponent.length ? parseInt(fromCodePoint.apply(void 0, exponent), 10) : 0;
978        return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);
979    };
980    var LEFT_PARENTHESIS_TOKEN = {
981        type: TokenType.LEFT_PARENTHESIS_TOKEN
982    };
983    var RIGHT_PARENTHESIS_TOKEN = {
984        type: TokenType.RIGHT_PARENTHESIS_TOKEN
985    };
986    var COMMA_TOKEN = { type: TokenType.COMMA_TOKEN };
987    var SUFFIX_MATCH_TOKEN = { type: TokenType.SUFFIX_MATCH_TOKEN };
988    var PREFIX_MATCH_TOKEN = { type: TokenType.PREFIX_MATCH_TOKEN };
989    var COLUMN_TOKEN = { type: TokenType.COLUMN_TOKEN };
990    var DASH_MATCH_TOKEN = { type: TokenType.DASH_MATCH_TOKEN };
991    var INCLUDE_MATCH_TOKEN = { type: TokenType.INCLUDE_MATCH_TOKEN };
992    var LEFT_CURLY_BRACKET_TOKEN = {
993        type: TokenType.LEFT_CURLY_BRACKET_TOKEN
994    };
995    var RIGHT_CURLY_BRACKET_TOKEN = {
996        type: TokenType.RIGHT_CURLY_BRACKET_TOKEN
997    };
998    var SUBSTRING_MATCH_TOKEN = { type: TokenType.SUBSTRING_MATCH_TOKEN };
999    var BAD_URL_TOKEN = { type: TokenType.BAD_URL_TOKEN };
1000    var BAD_STRING_TOKEN = { type: TokenType.BAD_STRING_TOKEN };
1001    var CDO_TOKEN = { type: TokenType.CDO_TOKEN };
1002    var CDC_TOKEN = { type: TokenType.CDC_TOKEN };
1003    var COLON_TOKEN = { type: TokenType.COLON_TOKEN };
1004    var SEMICOLON_TOKEN = { type: TokenType.SEMICOLON_TOKEN };
1005    var LEFT_SQUARE_BRACKET_TOKEN = {
1006        type: TokenType.LEFT_SQUARE_BRACKET_TOKEN
1007    };
1008    var RIGHT_SQUARE_BRACKET_TOKEN = {
1009        type: TokenType.RIGHT_SQUARE_BRACKET_TOKEN
1010    };
1011    var WHITESPACE_TOKEN = { type: TokenType.WHITESPACE_TOKEN };
1012    var EOF_TOKEN = { type: TokenType.EOF_TOKEN };
1013    var Tokenizer = /** @class */ (function () {
1014        function Tokenizer() {
1015            this._value = [];
1016        }
1017        Tokenizer.prototype.write = function (chunk) {
1018            this._value = this._value.concat(toCodePoints(chunk));
1019        };
1020        Tokenizer.prototype.read = function () {
1021            var tokens = [];
1022            var token = this.consumeToken();
1023            while (token !== EOF_TOKEN) {
1024                tokens.push(token);
1025                token = this.consumeToken();
1026            }
1027            return tokens;
1028        };
1029        Tokenizer.prototype.consumeToken = function () {
1030            var codePoint = this.consumeCodePoint();
1031            switch (codePoint) {
1032                case QUOTATION_MARK:
1033                    return this.consumeStringToken(QUOTATION_MARK);
1034                case NUMBER_SIGN:
1035                    var c1 = this.peekCodePoint(0);
1036                    var c2 = this.peekCodePoint(1);
1037                    var c3 = this.peekCodePoint(2);
1038                    if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {
1039                        var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;
1040                        var value = this.consumeName();
1041                        return { type: TokenType.HASH_TOKEN, value: value, flags: flags };
1042                    }
1043                    break;
1044                case DOLLAR_SIGN:
1045                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
1046                        this.consumeCodePoint();
1047                        return SUFFIX_MATCH_TOKEN;
1048                    }
1049                    break;
1050                case APOSTROPHE:
1051                    return this.consumeStringToken(APOSTROPHE);
1052                case LEFT_PARENTHESIS:
1053                    return LEFT_PARENTHESIS_TOKEN;
1054                case RIGHT_PARENTHESIS:
1055                    return RIGHT_PARENTHESIS_TOKEN;
1056                case ASTERISK:
1057                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
1058                        this.consumeCodePoint();
1059                        return SUBSTRING_MATCH_TOKEN;
1060                    }
1061                    break;
1062                case PLUS_SIGN:
1063                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
1064                        this.reconsumeCodePoint(codePoint);
1065                        return this.consumeNumericToken();
1066                    }
1067                    break;
1068                case COMMA:
1069                    return COMMA_TOKEN;
1070                case HYPHEN_MINUS:
1071                    var e1 = codePoint;
1072                    var e2 = this.peekCodePoint(0);
1073                    var e3 = this.peekCodePoint(1);
1074                    if (isNumberStart(e1, e2, e3)) {
1075                        this.reconsumeCodePoint(codePoint);
1076                        return this.consumeNumericToken();
1077                    }
1078                    if (isIdentifierStart(e1, e2, e3)) {
1079                        this.reconsumeCodePoint(codePoint);
1080                        return this.consumeIdentLikeToken();
1081                    }
1082                    if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {
1083                        this.consumeCodePoint();
1084                        this.consumeCodePoint();
1085                        return CDC_TOKEN;
1086                    }
1087                    break;
1088                case FULL_STOP:
1089                    if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {
1090                        this.reconsumeCodePoint(codePoint);
1091                        return this.consumeNumericToken();
1092                    }
1093                    break;
1094                case SOLIDUS:
1095                    if (this.peekCodePoint(0) === ASTERISK) {
1096                        this.consumeCodePoint();
1097                        while (true) {
1098                            var c = this.consumeCodePoint();
1099                            if (c === ASTERISK) {
1100                                c = this.consumeCodePoint();
1101                                if (c === SOLIDUS) {
1102                                    return this.consumeToken();
1103                                }
1104                            }
1105                            if (c === EOF) {
1106                                return this.consumeToken();
1107                            }
1108                        }
1109                    }
1110                    break;
1111                case COLON:
1112                    return COLON_TOKEN;
1113                case SEMICOLON:
1114                    return SEMICOLON_TOKEN;
1115                case LESS_THAN_SIGN:
1116                    if (this.peekCodePoint(0) === EXCLAMATION_MARK &&
1117                        this.peekCodePoint(1) === HYPHEN_MINUS &&
1118                        this.peekCodePoint(2) === HYPHEN_MINUS) {
1119                        this.consumeCodePoint();
1120                        this.consumeCodePoint();
1121                        return CDO_TOKEN;
1122                    }
1123                    break;
1124                case COMMERCIAL_AT:
1125                    var a1 = this.peekCodePoint(0);
1126                    var a2 = this.peekCodePoint(1);
1127                    var a3 = this.peekCodePoint(2);
1128                    if (isIdentifierStart(a1, a2, a3)) {
1129                        var value = this.consumeName();
1130                        return { type: TokenType.AT_KEYWORD_TOKEN, value: value };
1131                    }
1132                    break;
1133                case LEFT_SQUARE_BRACKET:
1134                    return LEFT_SQUARE_BRACKET_TOKEN;
1135                case REVERSE_SOLIDUS:
1136                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {
1137                        this.reconsumeCodePoint(codePoint);
1138                        return this.consumeIdentLikeToken();
1139                    }
1140                    break;
1141                case RIGHT_SQUARE_BRACKET:
1142                    return RIGHT_SQUARE_BRACKET_TOKEN;
1143                case CIRCUMFLEX_ACCENT:
1144                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
1145                        this.consumeCodePoint();
1146                        return PREFIX_MATCH_TOKEN;
1147                    }
1148                    break;
1149                case LEFT_CURLY_BRACKET:
1150                    return LEFT_CURLY_BRACKET_TOKEN;
1151                case RIGHT_CURLY_BRACKET:
1152                    return RIGHT_CURLY_BRACKET_TOKEN;
1153                case u:
1154                case U:
1155                    var u1 = this.peekCodePoint(0);
1156                    var u2 = this.peekCodePoint(1);
1157                    if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {
1158                        this.consumeCodePoint();
1159                        this.consumeUnicodeRangeToken();
1160                    }
1161                    this.reconsumeCodePoint(codePoint);
1162                    return this.consumeIdentLikeToken();
1163                case VERTICAL_LINE:
1164                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
1165                        this.consumeCodePoint();
1166                        return DASH_MATCH_TOKEN;
1167                    }
1168                    if (this.peekCodePoint(0) === VERTICAL_LINE) {
1169                        this.consumeCodePoint();
1170                        return COLUMN_TOKEN;
1171                    }
1172                    break;
1173                case TILDE:
1174                    if (this.peekCodePoint(0) === EQUALS_SIGN) {
1175                        this.consumeCodePoint();
1176                        return INCLUDE_MATCH_TOKEN;
1177                    }
1178                    break;
1179                case EOF:
1180                    return EOF_TOKEN;
1181            }
1182            if (isWhiteSpace(codePoint)) {
1183                this.consumeWhiteSpace();
1184                return WHITESPACE_TOKEN;
1185            }
1186            if (isDigit(codePoint)) {
1187                this.reconsumeCodePoint(codePoint);
1188                return this.consumeNumericToken();
1189            }
1190            if (isNameStartCodePoint(codePoint)) {
1191                this.reconsumeCodePoint(codePoint);
1192                return this.consumeIdentLikeToken();
1193            }
1194            return { type: TokenType.DELIM_TOKEN, value: fromCodePoint(codePoint) };
1195        };
1196        Tokenizer.prototype.consumeCodePoint = function () {
1197            var value = this._value.shift();
1198            return typeof value === 'undefined' ? -1 : value;
1199        };
1200        Tokenizer.prototype.reconsumeCodePoint = function (codePoint) {
1201            this._value.unshift(codePoint);
1202        };
1203        Tokenizer.prototype.peekCodePoint = function (delta) {
1204            if (delta >= this._value.length) {
1205                return -1;
1206            }
1207            return this._value[delta];
1208        };
1209        Tokenizer.prototype.consumeUnicodeRangeToken = function () {
1210            var digits = [];
1211            var codePoint = this.consumeCodePoint();
1212            while (isHex(codePoint) && digits.length < 6) {
1213                digits.push(codePoint);
1214                codePoint = this.consumeCodePoint();
1215            }
1216            var questionMarks = false;
vendor: 21,493 bytes, lines 1217-1728
1217            while (codePoint === QUESTION_MARK && digits.length < 6) {
1218                digits.push(codePoint);
1219                codePoint = this.consumeCodePoint();
1220                questionMarks = true;
1221            }
1222            if (questionMarks) {
1223                var start_1 = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? ZERO : digit); })), 16);
1224                var end = parseInt(fromCodePoint.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? F : digit); })), 16);
1225                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start_1, end: end };
1226            }
1227            var start = parseInt(fromCodePoint.apply(void 0, digits), 16);
1228            if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {
1229                this.consumeCodePoint();
1230                codePoint = this.consumeCodePoint();
1231                var endDigits = [];
1232                while (isHex(codePoint) && endDigits.length < 6) {
1233                    endDigits.push(codePoint);
1234                    codePoint = this.consumeCodePoint();
1235                }
1236                var end = parseInt(fromCodePoint.apply(void 0, endDigits), 16);
1237                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: end };
1238            }
1239            else {
1240                return { type: TokenType.UNICODE_RANGE_TOKEN, start: start, end: start };
1241            }
1242        };
1243        Tokenizer.prototype.consumeIdentLikeToken = function () {
1244            var value = this.consumeName();
1245            if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {
1246                this.consumeCodePoint();
1247                return this.consumeUrlToken();
1248            }
1249            else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {
1250                this.consumeCodePoint();
1251                return { type: TokenType.FUNCTION_TOKEN, value: value };
1252            }
1253            return { type: TokenType.IDENT_TOKEN, value: value };
1254        };
1255        Tokenizer.prototype.consumeUrlToken = function () {
1256            var value = [];
1257            this.consumeWhiteSpace();
1258            if (this.peekCodePoint(0) === EOF) {
1259                return { type: TokenType.URL_TOKEN, value: '' };
1260            }
1261            var next = this.peekCodePoint(0);
1262            if (next === APOSTROPHE || next === QUOTATION_MARK) {
1263                var stringToken = this.consumeStringToken(this.consumeCodePoint());
1264                if (stringToken.type === TokenType.STRING_TOKEN) {
1265                    this.consumeWhiteSpace();
1266                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
1267                        this.consumeCodePoint();
1268                        return { type: TokenType.URL_TOKEN, value: stringToken.value };
1269                    }
1270                }
1271                this.consumeBadUrlRemnants();
1272                return BAD_URL_TOKEN;
1273            }
1274            while (true) {
1275                var codePoint = this.consumeCodePoint();
1276                if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {
1277                    return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
1278                }
1279                else if (isWhiteSpace(codePoint)) {
1280                    this.consumeWhiteSpace();
1281                    if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {
1282                        this.consumeCodePoint();
1283                        return { type: TokenType.URL_TOKEN, value: fromCodePoint.apply(void 0, value) };
1284                    }
1285                    this.consumeBadUrlRemnants();
1286                    return BAD_URL_TOKEN;
1287                }
1288                else if (codePoint === QUOTATION_MARK ||
1289                    codePoint === APOSTROPHE ||
1290                    codePoint === LEFT_PARENTHESIS ||
1291                    isNonPrintableCodePoint(codePoint)) {
1292                    this.consumeBadUrlRemnants();
1293                    return BAD_URL_TOKEN;
1294                }
1295                else if (codePoint === REVERSE_SOLIDUS) {
1296                    if (isValidEscape(codePoint, this.peekCodePoint(0))) {
1297                        value.push(this.consumeEscapedCodePoint());
1298                    }
1299                    else {
1300                        this.consumeBadUrlRemnants();
1301                        return BAD_URL_TOKEN;
1302                    }
1303                }
1304                else {
1305                    value.push(codePoint);
1306                }
1307            }
1308        };
1309        Tokenizer.prototype.consumeWhiteSpace = function () {
1310            while (isWhiteSpace(this.peekCodePoint(0))) {
1311                this.consumeCodePoint();
1312            }
1313        };
1314        Tokenizer.prototype.consumeBadUrlRemnants = function () {
1315            while (true) {
1316                var codePoint = this.consumeCodePoint();
1317                if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {
1318                    return;
1319                }
1320                if (isValidEscape(codePoint, this.peekCodePoint(0))) {
1321                    this.consumeEscapedCodePoint();
1322                }
1323            }
1324        };
1325        Tokenizer.prototype.consumeStringSlice = function (count) {
1326            var SLICE_STACK_SIZE = 60000;
1327            var value = '';
1328            while (count > 0) {
1329                var amount = Math.min(SLICE_STACK_SIZE, count);
1330                value += fromCodePoint.apply(void 0, this._value.splice(0, amount));
1331                count -= amount;
1332            }
1333            this._value.shift();
1334            return value;
1335        };
1336        Tokenizer.prototype.consumeStringToken = function (endingCodePoint) {
1337            var value = '';
1338            var i = 0;
1339            do {
1340                var codePoint = this._value[i];
1341                if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {
1342                    value += this.consumeStringSlice(i);
1343                    return { type: TokenType.STRING_TOKEN, value: value };
1344                }
1345                if (codePoint === LINE_FEED) {
1346                    this._value.splice(0, i);
1347                    return BAD_STRING_TOKEN;
1348                }
1349                if (codePoint === REVERSE_SOLIDUS) {
1350                    var next = this._value[i + 1];
1351                    if (next !== EOF && next !== undefined) {
1352                        if (next === LINE_FEED) {
1353                            value += this.consumeStringSlice(i);
1354                            i = -1;
1355                            this._value.shift();
1356                        }
1357                        else if (isValidEscape(codePoint, next)) {
1358                            value += this.consumeStringSlice(i);
1359                            value += fromCodePoint(this.consumeEscapedCodePoint());
1360                            i = -1;
1361                        }
1362                    }
1363                }
1364                i++;
1365            } while (true);
1366        };
1367        Tokenizer.prototype.consumeNumber = function () {
1368            var repr = [];
1369            var type = FLAG_INTEGER;
1370            var c1 = this.peekCodePoint(0);
1371            if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {
1372                repr.push(this.consumeCodePoint());
1373            }
1374            while (isDigit(this.peekCodePoint(0))) {
1375                repr.push(this.consumeCodePoint());
1376            }
1377            c1 = this.peekCodePoint(0);
1378            var c2 = this.peekCodePoint(1);
1379            if (c1 === FULL_STOP && isDigit(c2)) {
1380                repr.push(this.consumeCodePoint(), this.consumeCodePoint());
1381                type = FLAG_NUMBER;
1382                while (isDigit(this.peekCodePoint(0))) {
1383                    repr.push(this.consumeCodePoint());
1384                }
1385            }
1386            c1 = this.peekCodePoint(0);
1387            c2 = this.peekCodePoint(1);
1388            var c3 = this.peekCodePoint(2);
1389            if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {
1390                repr.push(this.consumeCodePoint(), this.consumeCodePoint());
1391                type = FLAG_NUMBER;
1392                while (isDigit(this.peekCodePoint(0))) {
1393                    repr.push(this.consumeCodePoint());
1394                }
1395            }
1396            return [stringToNumber(repr), type];
1397        };
1398        Tokenizer.prototype.consumeNumericToken = function () {
1399            var _a = this.consumeNumber(), number = _a[0], flags = _a[1];
1400            var c1 = this.peekCodePoint(0);
1401            var c2 = this.peekCodePoint(1);
1402            var c3 = this.peekCodePoint(2);
1403            if (isIdentifierStart(c1, c2, c3)) {
1404                var unit = this.consumeName();
1405                return { type: TokenType.DIMENSION_TOKEN, number: number, flags: flags, unit: unit };
1406            }
1407            if (c1 === PERCENTAGE_SIGN) {
1408                this.consumeCodePoint();
1409                return { type: TokenType.PERCENTAGE_TOKEN, number: number, flags: flags };
1410            }
1411            return { type: TokenType.NUMBER_TOKEN, number: number, flags: flags };
1412        };
1413        Tokenizer.prototype.consumeEscapedCodePoint = function () {
1414            var codePoint = this.consumeCodePoint();
1415            if (isHex(codePoint)) {
1416                var hex = fromCodePoint(codePoint);
1417                while (isHex(this.peekCodePoint(0)) && hex.length < 6) {
1418                    hex += fromCodePoint(this.consumeCodePoint());
1419                }
1420                if (isWhiteSpace(this.peekCodePoint(0))) {
1421                    this.consumeCodePoint();
1422                }
1423                var hexCodePoint = parseInt(hex, 16);
1424                if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {
1425                    return REPLACEMENT_CHARACTER;
1426                }
1427                return hexCodePoint;
1428            }
1429            if (codePoint === EOF) {
1430                return REPLACEMENT_CHARACTER;
1431            }
1432            return codePoint;
1433        };
1434        Tokenizer.prototype.consumeName = function () {
1435            var result = '';
1436            while (true) {
1437                var codePoint = this.consumeCodePoint();
1438                if (isNameCodePoint(codePoint)) {
1439                    result += fromCodePoint(codePoint);
1440                }
1441                else if (isValidEscape(codePoint, this.peekCodePoint(0))) {
1442                    result += fromCodePoint(this.consumeEscapedCodePoint());
1443                }
1444                else {
1445                    this.reconsumeCodePoint(codePoint);
1446                    return result;
1447                }
1448            }
1449        };
1450        return Tokenizer;
1451    }());
1452
1453    var Parser = /** @class */ (function () {
1454        function Parser(tokens) {
1455            this._tokens = tokens;
1456        }
1457        Parser.create = function (value) {
1458            var tokenizer = new Tokenizer();
1459            tokenizer.write(value);
1460            return new Parser(tokenizer.read());
1461        };
1462        Parser.parseValue = function (value) {
1463            return Parser.create(value).parseComponentValue();
1464        };
1465        Parser.parseValues = function (value) {
1466            return Parser.create(value).parseComponentValues();
1467        };
1468        Parser.prototype.parseComponentValue = function () {
1469            var token = this.consumeToken();
1470            while (token.type === TokenType.WHITESPACE_TOKEN) {
1471                token = this.consumeToken();
1472            }
1473            if (token.type === TokenType.EOF_TOKEN) {
1474                throw new SyntaxError("Error parsing CSS component value, unexpected EOF");
1475            }
1476            this.reconsumeToken(token);
1477            var value = this.consumeComponentValue();
1478            do {
1479                token = this.consumeToken();
1480            } while (token.type === TokenType.WHITESPACE_TOKEN);
1481            if (token.type === TokenType.EOF_TOKEN) {
1482                return value;
1483            }
1484            throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one");
1485        };
1486        Parser.prototype.parseComponentValues = function () {
1487            var values = [];
1488            while (true) {
1489                var value = this.consumeComponentValue();
1490                if (value.type === TokenType.EOF_TOKEN) {
1491                    return values;
1492                }
1493                values.push(value);
1494                values.push();
1495            }
1496        };
1497        Parser.prototype.consumeComponentValue = function () {
1498            var token = this.consumeToken();
1499            switch (token.type) {
1500                case TokenType.LEFT_CURLY_BRACKET_TOKEN:
1501                case TokenType.LEFT_SQUARE_BRACKET_TOKEN:
1502                case TokenType.LEFT_PARENTHESIS_TOKEN:
1503                    return this.consumeSimpleBlock(token.type);
1504                case TokenType.FUNCTION_TOKEN:
1505                    return this.consumeFunction(token);
1506            }
1507            return token;
1508        };
1509        Parser.prototype.consumeSimpleBlock = function (type) {
1510            var block = { type: type, values: [] };
1511            var token = this.consumeToken();
1512            while (true) {
1513                if (token.type === TokenType.EOF_TOKEN || isEndingTokenFor(token, type)) {
1514                    return block;
1515                }
1516                this.reconsumeToken(token);
1517                block.values.push(this.consumeComponentValue());
1518                token = this.consumeToken();
1519            }
1520        };
1521        Parser.prototype.consumeFunction = function (functionToken) {
1522            var cssFunction = {
1523                name: functionToken.value,
1524                values: [],
1525                type: TokenType.FUNCTION
1526            };
1527            while (true) {
1528                var token = this.consumeToken();
1529                if (token.type === TokenType.EOF_TOKEN || token.type === TokenType.RIGHT_PARENTHESIS_TOKEN) {
1530                    return cssFunction;
1531                }
1532                this.reconsumeToken(token);
1533                cssFunction.values.push(this.consumeComponentValue());
1534            }
1535        };
1536        Parser.prototype.consumeToken = function () {
1537            var token = this._tokens.shift();
1538            return typeof token === 'undefined' ? EOF_TOKEN : token;
1539        };
1540        Parser.prototype.reconsumeToken = function (token) {
1541            this._tokens.unshift(token);
1542        };
1543        return Parser;
1544    }());
1545    var isDimensionToken = function (token) { return token.type === TokenType.DIMENSION_TOKEN; };
1546    var isNumberToken = function (token) { return token.type === TokenType.NUMBER_TOKEN; };
1547    var isIdentToken = function (token) { return token.type === TokenType.IDENT_TOKEN; };
1548    var isStringToken = function (token) { return token.type === TokenType.STRING_TOKEN; };
1549    var isIdentWithValue = function (token, value) {
1550        return isIdentToken(token) && token.value === value;
1551    };
1552    var nonWhiteSpace = function (token) { return token.type !== TokenType.WHITESPACE_TOKEN; };
1553    var nonFunctionArgSeparator = function (token) {
1554        return token.type !== TokenType.WHITESPACE_TOKEN && token.type !== TokenType.COMMA_TOKEN;
1555    };
1556    var parseFunctionArgs = function (tokens) {
1557        var args = [];
1558        var arg = [];
1559        tokens.forEach(function (token) {
1560            if (token.type === TokenType.COMMA_TOKEN) {
1561                if (arg.length === 0) {
1562                    throw new Error("Error parsing function args, zero tokens for arg");
1563                }
1564                args.push(arg);
1565                arg = [];
1566                return;
1567            }
1568            if (token.type !== TokenType.WHITESPACE_TOKEN) {
1569                arg.push(token);
1570            }
1571        });
1572        if (arg.length) {
1573            args.push(arg);
1574        }
1575        return args;
1576    };
1577    var isEndingTokenFor = function (token, type) {
1578        if (type === TokenType.LEFT_CURLY_BRACKET_TOKEN && token.type === TokenType.RIGHT_CURLY_BRACKET_TOKEN) {
1579            return true;
1580        }
1581        if (type === TokenType.LEFT_SQUARE_BRACKET_TOKEN && token.type === TokenType.RIGHT_SQUARE_BRACKET_TOKEN) {
1582            return true;
1583        }
1584        return type === TokenType.LEFT_PARENTHESIS_TOKEN && token.type === TokenType.RIGHT_PARENTHESIS_TOKEN;
1585    };
1586
1587    var isLength = function (token) {
1588        return token.type === TokenType.NUMBER_TOKEN || token.type === TokenType.DIMENSION_TOKEN;
1589    };
1590
1591    var isLengthPercentage = function (token) {
1592        return token.type === TokenType.PERCENTAGE_TOKEN || isLength(token);
1593    };
1594    var parseLengthPercentageTuple = function (tokens) {
1595        return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];
1596    };
1597    var ZERO_LENGTH = {
1598        type: TokenType.NUMBER_TOKEN,
1599        number: 0,
1600        flags: FLAG_INTEGER
1601    };
1602    var FIFTY_PERCENT = {
1603        type: TokenType.PERCENTAGE_TOKEN,
1604        number: 50,
1605        flags: FLAG_INTEGER
1606    };
1607    var HUNDRED_PERCENT = {
1608        type: TokenType.PERCENTAGE_TOKEN,
1609        number: 100,
1610        flags: FLAG_INTEGER
1611    };
1612    var getAbsoluteValueForTuple = function (tuple, width, height) {
1613        var x = tuple[0], y = tuple[1];
1614        return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];
1615    };
1616    var getAbsoluteValue = function (token, parent) {
1617        if (token.type === TokenType.PERCENTAGE_TOKEN) {
1618            return (token.number / 100) * parent;
1619        }
1620        if (isDimensionToken(token)) {
1621            switch (token.unit) {
1622                case 'rem':
1623                case 'em':
1624                    return 16 * token.number; // TODO use correct font-size
1625                case 'px':
1626                default:
1627                    return token.number;
1628            }
1629        }
1630        return token.number;
1631    };
1632
1633    var DEG = 'deg';
1634    var GRAD = 'grad';
1635    var RAD = 'rad';
1636    var TURN = 'turn';
1637    var angle = {
1638        name: 'angle',
1639        parse: function (value) {
1640            if (value.type === TokenType.DIMENSION_TOKEN) {
1641                switch (value.unit) {
1642                    case DEG:
1643                        return (Math.PI * value.number) / 180;
1644                    case GRAD:
1645                        return (Math.PI / 200) * value.number;
1646                    case RAD:
1647                        return value.number;
1648                    case TURN:
1649                        return Math.PI * 2 * value.number;
1650                }
1651            }
1652            throw new Error("Unsupported angle type");
1653        }
1654    };
1655    var isAngle = function (value) {
1656        if (value.type === TokenType.DIMENSION_TOKEN) {
1657            if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {
1658                return true;
1659            }
1660        }
1661        return false;
1662    };
1663    var parseNamedSide = function (tokens) {
1664        var sideOrCorner = tokens
1665            .filter(isIdentToken)
1666            .map(function (ident) { return ident.value; })
1667            .join(' ');
1668        switch (sideOrCorner) {
1669            case 'to bottom right':
1670            case 'to right bottom':
1671            case 'left top':
1672            case 'top left':
1673                return [ZERO_LENGTH, ZERO_LENGTH];
1674            case 'to top':
1675            case 'bottom':
1676                return deg(0);
1677            case 'to bottom left':
1678            case 'to left bottom':
1679            case 'right top':
1680            case 'top right':
1681                return [ZERO_LENGTH, HUNDRED_PERCENT];
1682            case 'to right':
1683            case 'left':
1684                return deg(90);
1685            case 'to top left':
1686            case 'to left top':
1687            case 'right bottom':
1688            case 'bottom right':
1689                return [HUNDRED_PERCENT, HUNDRED_PERCENT];
1690            case 'to bottom':
1691            case 'top':
1692                return deg(180);
1693            case 'to top right':
1694            case 'to right top':
1695            case 'left bottom':
1696            case 'bottom left':
1697                return [HUNDRED_PERCENT, ZERO_LENGTH];
1698            case 'to left':
1699            case 'right':
1700                return deg(270);
1701        }
1702        return 0;
1703    };
1704    var deg = function (deg) { return (Math.PI * deg) / 180; };
1705
1706    var color = {
1707        name: 'color',
1708        parse: function (value) {
1709            if (value.type === TokenType.FUNCTION) {
1710                var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];
1711                if (typeof colorFunction === 'undefined') {
1712                    throw new Error("Attempting to parse an unsupported color function \"" + value.name + "\"");
1713                }
1714                return colorFunction(value.values);
1715            }
1716            if (value.type === TokenType.HASH_TOKEN) {
1717                if (value.value.length === 3) {
1718                    var r = value.value.substring(0, 1);
1719                    var g = value.value.substring(1, 2);
1720                    var b = value.value.substring(2, 3);
1721                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);
1722                }
1723                if (value.value.length === 4) {
1724                    var r = value.value.substring(0, 1);
1725                    var g = value.value.substring(1, 2);
1726                    var b = value.value.substring(2, 3);
1727                    var a = value.value.substring(3, 4);
1728                    return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 25
vendor: 4,189 bytes, lines 1728-1837
17285);
1729                }
1730                if (value.value.length === 6) {
1731                    var r = value.value.substring(0, 2);
1732                    var g = value.value.substring(2, 4);
1733                    var b = value.value.substring(4, 6);
1734                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);
1735                }
1736                if (value.value.length === 8) {
1737                    var r = value.value.substring(0, 2);
1738                    var g = value.value.substring(2, 4);
1739                    var b = value.value.substring(4, 6);
1740                    var a = value.value.substring(6, 8);
1741                    return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);
1742                }
1743            }
1744            if (value.type === TokenType.IDENT_TOKEN) {
1745                var namedColor = COLORS[value.value.toUpperCase()];
1746                if (typeof namedColor !== 'undefined') {
1747                    return namedColor;
1748                }
1749            }
1750            return COLORS.TRANSPARENT;
1751        }
1752    };
1753    var isTransparent = function (color) { return (0xff & color) === 0; };
1754    var asString = function (color) {
1755        var alpha = 0xff & color;
1756        var blue = 0xff & (color >> 8);
1757        var green = 0xff & (color >> 16);
1758        var red = 0xff & (color >> 24);
1759        return alpha < 255 ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" : "rgb(" + red + "," + green + "," + blue + ")";
1760    };
1761    var pack = function (r, g, b, a) {
1762        return ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;
1763    };
1764    var getTokenColorValue = function (token, i) {
1765        if (token.type === TokenType.NUMBER_TOKEN) {
1766            return token.number;
1767        }
1768        if (token.type === TokenType.PERCENTAGE_TOKEN) {
1769            var max = i === 3 ? 1 : 255;
1770            return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);
1771        }
1772        return 0;
1773    };
1774    var rgb = function (args) {
1775        var tokens = args.filter(nonFunctionArgSeparator);
1776        if (tokens.length === 3) {
1777            var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2];
1778            return pack(r, g, b, 1);
1779        }
1780        if (tokens.length === 4) {
1781            var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a = _b[3];
1782            return pack(r, g, b, a);
1783        }
1784        return 0;
1785    };
1786    function hue2rgb(t1, t2, hue) {
1787        if (hue < 0) {
1788            hue += 1;
1789        }
1790        if (hue >= 1) {
1791            hue -= 1;
1792        }
1793        if (hue < 1 / 6) {
1794            return (t2 - t1) * hue * 6 + t1;
1795        }
1796        else if (hue < 1 / 2) {
1797            return t2;
1798        }
1799        else if (hue < 2 / 3) {
1800            return (t2 - t1) * 6 * (2 / 3 - hue) + t1;
1801        }
1802        else {
1803            return t1;
1804        }
1805    }
1806    var hsl = function (args) {
1807        var tokens = args.filter(nonFunctionArgSeparator);
1808        var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3];
1809        var h = (hue.type === TokenType.NUMBER_TOKEN ? deg(hue.number) : angle.parse(hue)) / (Math.PI * 2);
1810        var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;
1811        var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;
1812        var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;
1813        if (s === 0) {
1814            return pack(l * 255, l * 255, l * 255, 1);
1815        }
1816        var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;
1817        var t1 = l * 2 - t2;
1818        var r = hue2rgb(t1, t2, h + 1 / 3);
1819        var g = hue2rgb(t1, t2, h);
1820        var b = hue2rgb(t1, t2, h - 1 / 3);
1821        return pack(r * 255, g * 255, b * 255, a);
1822    };
1823    var SUPPORTED_COLOR_FUNCTIONS = {
1824        hsl: hsl,
1825        hsla: hsl,
1826        rgb: rgb,
1827        rgba: rgb
1828    };
1829    var COLORS = {
1830        ALICEBLUE: 0xf0f8ffff,
1831        ANTIQUEWHITE: 0xfaebd7ff,
1832        AQUA: 0x00ffffff,
1833        AQUAMARINE: 0x7fffd4ff,
1834        AZURE: 0xf0ffffff,
1835        BEIGE: 0xf5f5dcff,
1836        BISQUE: 0xffe4c4ff,
1837        BLACK: 0x000000ff,
1838        BLANCHEDALMOND: 0xffebcdff,
1839        BLUE: 0x0000ffff,
1840        BLUEVIOLET: 0x8a2be2ff,
1841        BROWN: 0xa52a2aff,
1842        BURLYWOOD: 0xdeb887ff,
1843        CADETBLUE: 0x5f9ea0ff,
1844        CHARTREUSE: 0x7fff00ff,
1845        CHOCOLATE: 0xd2691eff,
1846        CORAL: 0xff7f50ff,
1847        CORNFLOWERBLUE: 0x6495edff,
1848        CORNSILK: 0xfff8dcff,
1849        CRIMSON: 0xdc143cff,
1850        CYAN: 0x00ffffff,
1851        DARKBLUE: 0x00008bff,
1852        DARKCYAN: 0x008b8bff,
1853        DARKGOLDENROD: 0xb886bbff,
1854        DARKGRAY: 0xa9a9a9ff,
1855        DARKGREEN: 0x006400ff,
1856        DARKGREY: 0xa9a9a9ff,
1857        DARKKHAKI: 0xbdb76bff,
1858        DARKMAGENTA: 0x8b008bff,
1859        DARKOLIVEGREEN: 0x556b2fff,
1860        DARKORANGE: 0xff8c00ff,
1861        DARKORCHID: 0x9932ccff,
1862        DARKRED: 0x8b0000ff,
1863        DARKSALMON: 0xe9967aff,
1864        DARKSEAGREEN: 0x8fbc8fff,
1865        DARKSLATEBLUE: 0x483d8bff,
1866        DARKSLATEGRAY: 0x2f4f4fff,
1867        DARKSLATEGREY: 0x2f4f4fff,
1868        DARKTURQUOISE: 0x00ced1ff,
1869        DARKVIOLET: 0x9400d3ff,
1870        DEEPPINK: 0xff1493ff,
1871        DEEPSKYBLUE: 0x00bfffff,
1872        DIMGRAY: 0x696969ff,
1873        DIMGREY: 0x696969ff,
1874        DODGERBLUE: 0x1e90ffff,
1875        FIREBRICK: 0xb22222ff,
1876        FLORALWHITE: 0xfffaf0ff,
1877        FORESTGREEN: 0x228b22ff,
1878        FUCHSIA: 0xff00ffff,
1879        GAINSBORO: 0xdcdcdcff,
1880        GHOSTWHITE: 0xf8f8ffff,
1881        GOLD: 0xffd700ff,
1882        GOLDENROD: 0xdaa520ff,
1883        GRAY: 0x808080ff,
1884        GREEN: 0x008000ff,
1885        GREENYELLOW: 0xadff2fff,
1886        GREY: 0x808080ff,
1887        HONEYDEW: 0xf0fff0ff,
1888        HOTPINK: 0xff69b4ff,
1889        INDIANRED: 0xcd5c5cff,
1890        INDIGO: 0x4b0082ff,
1891        IVORY: 0xfffff0ff,
1892        KHAKI: 0xf0e68cff,
1893        LAVENDER: 0xe6e6faff,
1894        LAVENDERBLUSH: 0xfff0f5ff,
1895        LAWNGREEN: 0x7cfc00ff,
1896        LEMONCHIFFON: 0xfffacdff,
1897        LIGHTBLUE: 0xadd8e6ff,
1898        LIGHTCORAL: 0xf08080ff,
1899        LIGHTCYAN: 0xe0ffffff,
1900        LIGHTGOLDENRODYELLOW: 0xfafad2ff,
1901        LIGHTGRAY: 0xd3d3d3ff,
1902        LIGHTGREEN: 0x90ee90ff,
1903        LIGHTGREY: 0xd3d3d3ff,
1904        LIGHTPINK: 0xffb6c1ff,
1905        LIGHTSALMON: 0xffa07aff,
1906        LIGHTSEAGREEN: 0x20b2aaff,
1907        LIGHTSKYBLUE: 0x87cefaff,
1908        LIGHTSLATEGRAY: 0x778899ff,
1909        LIGHTSLATEGREY: 0x778899ff,
1910        LIGHTSTEELBLUE: 0xb0c4deff,
1911        LIGHTYELLOW: 0xffffe0ff,
1912        LIME: 0x00ff00ff,
1913        LIMEGREEN: 0x32cd32ff,
1914        LINEN: 0xfaf0e6ff,
1915        MAGENTA: 0xff00ffff,
1916        MAROON: 0x800000ff,
1917        MEDIUMAQUAMARINE: 0x66cdaaff,
1918        MEDIUMBLUE: 0x0000cdff,
1919        MEDIUMORCHID: 0xba55d3ff,
1920        MEDIUMPURPLE: 0x9370dbff,
1921        MEDIUMSEAGREEN: 0x3cb371ff,
1922        MEDIUMSLATEBLUE: 0x7b68eeff,
1923        MEDIUMSPRINGGREEN: 0x00fa9aff,
1924        MEDIUMTURQUOISE: 0x48d1ccff,
1925        MEDIUMVIOLETRED: 0xc71585ff,
1926        MIDNIGHTBLUE: 0x191970ff,
1927        MINTCREAM: 0xf5fffaff,
1928        MISTYROSE: 0xffe4e1ff,
1929        MOCCASIN: 0xffe4b5ff,
1930        NAVAJOWHITE: 0xffdeadff,
1931        NAVY: 0x000080ff,
1932        OLDLACE: 0xfdf5e6ff,
1933        OLIVE: 0x808000ff,
1934        OLIVEDRAB: 0x6b8e23ff,
1935        ORANGE: 0xffa500ff,
1936        ORANGERED: 0xff4500ff,
1937        ORCHID: 0xda70d6ff,
1938        PALEGOLDENROD: 0xeee8aaff,
1939        PALEGREEN: 0x98fb98ff,
1940        PALETURQUOISE: 0xafeeeeff,
1941        PALEVIOLETRED: 0xdb7093ff,
1942        PAPAYAWHIP: 0xffefd5ff,
1943        PEACHPUFF: 0xffdab9ff,
1944        PERU: 0xcd853fff,
1945        PINK: 0xffc0cbff,
1946        PLUM: 0xdda0ddff,
1947        POWDERBLUE: 0xb0e0e6ff,
1948        PURPLE: 0x800080ff,
1949        REBECCAPURPLE: 0x663399ff,
1950        RED: 0xff0000ff,
1951        ROSYBROWN: 0xbc8f8fff,
1952        ROYALBLUE: 0x4169e1ff,
1953        SADDLEBROWN: 0x8b4513ff,
1954        SALMON: 0xfa8072ff,
1955        SANDYBROWN: 0xf4a460ff,
1956        SEAGREEN: 0x2e8b57ff,
1957        SEASHELL: 0xfff5eeff,
1958        SIENNA: 0xa0522dff,
1959        SILVER: 0xc0c0c0ff,
1960        SKYBLUE: 0x87ceebff,
1961        SLATEBLUE: 0x6a5acdff,
1962        SLATEGRAY: 0x708090ff,
1963        SLATEGREY: 0x708090ff,
1964        SNOW: 0xfffafaff,
1965        SPRINGGREEN: 0x00ff7fff,
1966        STEELBLUE: 0x4682b4ff,
1967        TAN: 0xd2b48cff,
1968        TEAL: 0x008080ff,
1969        THISTLE: 0xd8bfd8ff,
1970        TOMATO: 0xff6347ff,
1971        TRANSPARENT: 0x00000000,
1972        TURQUOISE: 0x40e0d0ff,
1973        VIOLET: 0xee82eeff,
1974        WHEAT: 0xf5deb3ff,
1975        WHITE: 0xffffffff,
1976        WHITESMOKE: 0xf5f5f5ff,
1977        YELLOW: 0xffff00ff,
1978        YELLOWGREEN: 0x9acd32ff
1979    };
1980
1981    var PropertyDescriptorParsingType;
1982    (function (PropertyDescriptorParsingType) {
1983        PropertyDescriptorParsingType[PropertyDescriptorParsingType["VALUE"] = 0] = "VALUE";
1984        PropertyDescriptorParsingType[PropertyDescriptorParsingType["LIST"] = 1] = "LIST";
1985        PropertyDescriptorParsingType[PropertyDescriptorParsingType["IDENT_VALUE"] = 2] = "IDENT_VALUE";
1986        PropertyDescriptorParsingType[PropertyDescriptorParsingType["TYPE_VALUE"] = 3] = "TYPE_VALUE";
1987        PropertyDescriptorParsingType[PropertyDescriptorParsingType["TOKEN_VALUE"] = 4] = "TOKEN_VALUE";
1988    })(PropertyDescriptorParsingType || (PropertyDescriptorParsingType = {}));
1989
1990    var BACKGROUND_CLIP;
1991    (function (BACKGROUND_CLIP) {
1992        BACKGROUND_CLIP[BACKGROUND_CLIP["BORDER_BOX"] = 0] = "BORDER_BOX";
1993        BACKGROUND_CLIP[BACKGROUND_CLIP["PADDING_BOX"] = 1] = "PADD
vendor: 22,877 bytes, lines 1993-2521
1993ING_BOX";
1994        BACKGROUND_CLIP[BACKGROUND_CLIP["CONTENT_BOX"] = 2] = "CONTENT_BOX";
1995    })(BACKGROUND_CLIP || (BACKGROUND_CLIP = {}));
1996    var backgroundClip = {
1997        name: 'background-clip',
1998        initialValue: 'border-box',
1999        prefix: false,
2000        type: PropertyDescriptorParsingType.LIST,
2001        parse: function (tokens) {
2002            return tokens.map(function (token) {
2003                if (isIdentToken(token)) {
2004                    switch (token.value) {
2005                        case 'padding-box':
2006                            return BACKGROUND_CLIP.PADDING_BOX;
2007                        case 'content-box':
2008                            return BACKGROUND_CLIP.CONTENT_BOX;
2009                    }
2010                }
2011                return BACKGROUND_CLIP.BORDER_BOX;
2012            });
2013        }
2014    };
2015
2016    var backgroundColor = {
2017        name: "background-color",
2018        initialValue: 'transparent',
2019        prefix: false,
2020        type: PropertyDescriptorParsingType.TYPE_VALUE,
2021        format: 'color'
2022    };
2023
2024    var parseColorStop = function (args) {
2025        var color$1 = color.parse(args[0]);
2026        var stop = args[1];
2027        return stop && isLengthPercentage(stop) ? { color: color$1, stop: stop } : { color: color$1, stop: null };
2028    };
2029    var processColorStops = function (stops, lineLength) {
2030        var first = stops[0];
2031        var last = stops[stops.length - 1];
2032        if (first.stop === null) {
2033            first.stop = ZERO_LENGTH;
2034        }
2035        if (last.stop === null) {
2036            last.stop = HUNDRED_PERCENT;
2037        }
2038        var processStops = [];
2039        var previous = 0;
2040        for (var i = 0; i < stops.length; i++) {
2041            var stop_1 = stops[i].stop;
2042            if (stop_1 !== null) {
2043                var absoluteValue = getAbsoluteValue(stop_1, lineLength);
2044                if (absoluteValue > previous) {
2045                    processStops.push(absoluteValue);
2046                }
2047                else {
2048                    processStops.push(previous);
2049                }
2050                previous = absoluteValue;
2051            }
2052            else {
2053                processStops.push(null);
2054            }
2055        }
2056        var gapBegin = null;
2057        for (var i = 0; i < processStops.length; i++) {
2058            var stop_2 = processStops[i];
2059            if (stop_2 === null) {
2060                if (gapBegin === null) {
2061                    gapBegin = i;
2062                }
2063            }
2064            else if (gapBegin !== null) {
2065                var gapLength = i - gapBegin;
2066                var beforeGap = processStops[gapBegin - 1];
2067                var gapValue = (stop_2 - beforeGap) / (gapLength + 1);
2068                for (var g = 1; g <= gapLength; g++) {
2069                    processStops[gapBegin + g - 1] = gapValue * g;
2070                }
2071                gapBegin = null;
2072            }
2073        }
2074        return stops.map(function (_a, i) {
2075            var color = _a.color;
2076            return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) };
2077        });
2078    };
2079    var getAngleFromCorner = function (corner, width, height) {
2080        var centerX = width / 2;
2081        var centerY = height / 2;
2082        var x = getAbsoluteValue(corner[0], width) - centerX;
2083        var y = centerY - getAbsoluteValue(corner[1], height);
2084        return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);
2085    };
2086    var calculateGradientDirection = function (angle, width, height) {
2087        var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);
2088        var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));
2089        var halfWidth = width / 2;
2090        var halfHeight = height / 2;
2091        var halfLineLength = lineLength / 2;
2092        var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;
2093        var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;
2094        return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];
2095    };
2096    var distance = function (a, b) { return Math.sqrt(a * a + b * b); };
2097    var findCorner = function (width, height, x, y, closest) {
2098        var corners = [[0, 0], [0, height], [width, 0], [width, height]];
2099        return corners.reduce(function (stat, corner) {
2100            var cx = corner[0], cy = corner[1];
2101            var d = distance(x - cx, y - cy);
2102            if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {
2103                return {
2104                    optimumCorner: corner,
2105                    optimumDistance: d
2106                };
2107            }
2108            return stat;
2109        }, {
2110            optimumDistance: closest ? Infinity : -Infinity,
2111            optimumCorner: null
2112        }).optimumCorner;
2113    };
2114    var calculateRadius = function (gradient, x, y, width, height) {
2115        var rx = 0;
2116        var ry = 0;
2117        switch (gradient.size) {
2118            case CSSRadialExtent.CLOSEST_SIDE:
2119                // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.
2120                // If the shape is an ellipse, it exactly meets the closest side in each dimension.
2121                if (gradient.shape === CSSRadialShape.CIRCLE) {
2122                    rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
2123                }
2124                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
2125                    rx = Math.min(Math.abs(x), Math.abs(x - width));
2126                    ry = Math.min(Math.abs(y), Math.abs(y - height));
2127                }
2128                break;
2129            case CSSRadialExtent.CLOSEST_CORNER:
2130                // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.
2131                // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.
2132                if (gradient.shape === CSSRadialShape.CIRCLE) {
2133                    rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
2134                }
2135                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
2136                    // Compute the ratio ry/rx (which is to be the same as for "closest-side")
2137                    var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));
2138                    var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1];
2139                    rx = distance(cx - x, (cy - y) / c);
2140                    ry = c * rx;
2141                }
2142                break;
2143            case CSSRadialExtent.FARTHEST_SIDE:
2144                // Same as closest-side, except the ending shape is sized based on the farthest side(s)
2145                if (gradient.shape === CSSRadialShape.CIRCLE) {
2146                    rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));
2147                }
2148                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
2149                    rx = Math.max(Math.abs(x), Math.abs(x - width));
2150                    ry = Math.max(Math.abs(y), Math.abs(y - height));
2151                }
2152                break;
2153            case CSSRadialExtent.FARTHEST_CORNER:
2154                // Same as closest-corner, except the ending shape is sized based on the farthest corner.
2155                // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.
2156                if (gradient.shape === CSSRadialShape.CIRCLE) {
2157                    rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));
2158                }
2159                else if (gradient.shape === CSSRadialShape.ELLIPSE) {
2160                    // Compute the ratio ry/rx (which is to be the same as for "farthest-side")
2161                    var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));
2162                    var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1];
2163                    rx = distance(cx - x, (cy - y) / c);
2164                    ry = c * rx;
2165                }
2166                break;
2167        }
2168        if (Array.isArray(gradient.size)) {
2169            rx = getAbsoluteValue(gradient.size[0], width);
2170            ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;
2171        }
2172        return [rx, ry];
2173    };
2174
2175    var linearGradient = function (tokens) {
2176        var angle$1 = deg(180);
2177        var stops = [];
2178        parseFunctionArgs(tokens).forEach(function (arg, i) {
2179            if (i === 0) {
2180                var firstToken = arg[0];
2181                if (firstToken.type === TokenType.IDENT_TOKEN && firstToken.value === 'to') {
2182                    angle$1 = parseNamedSide(arg);
2183                    return;
2184                }
2185                else if (isAngle(firstToken)) {
2186                    angle$1 = angle.parse(firstToken);
2187                    return;
2188                }
2189            }
2190            var colorStop = parseColorStop(arg);
2191            stops.push(colorStop);
2192        });
2193        return { angle: angle$1, stops: stops, type: CSSImageType.LINEAR_GRADIENT };
2194    };
2195
2196    var prefixLinearGradient = function (tokens) {
2197        var angle$1 = deg(180);
2198        var stops = [];
2199        parseFunctionArgs(tokens).forEach(function (arg, i) {
2200            if (i === 0) {
2201                var firstToken = arg[0];
2202                if (firstToken.type === TokenType.IDENT_TOKEN &&
2203                    ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) {
2204                    angle$1 = parseNamedSide(arg);
2205                    return;
2206                }
2207                else if (isAngle(firstToken)) {
2208                    angle$1 = (angle.parse(firstToken) + deg(270)) % deg(360);
2209                    return;
2210                }
2211            }
2212            var colorStop = parseColorStop(arg);
2213            stops.push(colorStop);
2214        });
2215        return {
2216            angle: angle$1,
2217            stops: stops,
2218            type: CSSImageType.LINEAR_GRADIENT
2219        };
2220    };
2221
2222    var testRangeBounds = function (document) {
2223        var TEST_HEIGHT = 123;
2224        if (document.createRange) {
2225            var range = document.createRange();
2226            if (range.getBoundingClientRect) {
2227                var testElement = document.createElement('boundtest');
2228                testElement.style.height = TEST_HEIGHT + "px";
2229                testElement.style.display = 'block';
2230                document.body.appendChild(testElement);
2231                range.selectNode(testElement);
2232                var rangeBounds = range.getBoundingClientRect();
2233                var rangeHeight = Math.round(rangeBounds.height);
2234                document.body.removeChild(testElement);
2235                if (rangeHeight === TEST_HEIGHT) {
2236                    return true;
2237                }
2238            }
2239        }
2240        return false;
2241    };
2242    var testCORS = function () { return typeof new Image().crossOrigin !== 'undefined'; };
2243    var testResponseType = function () { return typeof new XMLHttpRequest().responseType === 'string'; };
2244    var testSVG = function (document) {
2245        var img = new Image();
2246        var canvas = document.createElement('canvas');
2247        var ctx = canvas.getContext('2d');
2248        if (!ctx) {
2249            return false;
2250        }
2251        img.src = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'></svg>";
2252        try {
2253            ctx.drawImage(img, 0, 0);
2254            canvas.toDataURL();
2255        }
2256        catch (e) {
2257            return false;
2258        }
2259        return true;
2260    };
2261    var isGreenPixel = function (data) {
2262        return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;
2263    };
2264    var testForeignObject = function (document) {
2265        var canvas = document.createElement('canvas');
2266        var size = 100;
2267        canvas.width = size;
2268        canvas.height = size;
2269        var ctx = canvas.getContext('2d');
2270        if (!ctx) {
2271            return Promise.reject(false);
2272        }
2273        ctx.fillStyle = 'rgb(0, 255, 0)';
2274        ctx.fillRect(0, 0, size, size);
2275        var img = new Image();
2276        var greenImageSrc = canvas.toDataURL();
2277        img.src = greenImageSrc;
2278        var svg = createForeignObjectSVG(size, size, 0, 0, img);
2279        ctx.fillStyle = 'red';
2280        ctx.fillRect(0, 0, size, size);
2281        return loadSerializedSVG(svg)
2282            .then(function (img) {
2283            ctx.drawImage(img, 0, 0);
2284            var data = ctx.getImageData(0, 0, size, size).data;
2285            ctx.fillStyle = 'red';
2286            ctx.fillRect(0, 0, size, size);
2287            var node = document.createElement('div');
2288            node.style.backgroundImage = "url(" + greenImageSrc + ")";
2289            node.style.height = size + "px";
2290            // Firefox 55 does not render inline <img /> tags
2291            return isGreenPixel(data)
2292                ? loadSerializedSVG(createForeignObjectSVG(size, size, 0, 0, node))
2293                : Promise.reject(false);
2294        })
2295            .then(function (img) {
2296            ctx.drawImage(img, 0, 0);
2297            // Edge does not render background-images
2298            return isGreenPixel(ctx.getImageData(0, 0, size, size).data);
2299        })
2300            .catch(function () { return false; });
2301    };
2302    var createForeignObjectSVG = function (width, height, x, y, node) {
2303        var xmlns = 'http://www.w3.org/2000/svg';
2304        var svg = document.createElementNS(xmlns, 'svg');
2305        var foreignObject = document.createElementNS(xmlns, 'foreignObject');
2306        svg.setAttributeNS(null, 'width', width.toString());
2307        svg.setAttributeNS(null, 'height', height.toString());
2308        foreignObject.setAttributeNS(null, 'width', '100%');
2309        foreignObject.setAttributeNS(null, 'height', '100%');
2310        foreignObject.setAttributeNS(null, 'x', x.toString());
2311        foreignObject.setAttributeNS(null, 'y', y.toString());
2312        foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');
2313        svg.appendChild(foreignObject);
2314        foreignObject.appendChild(node);
2315        return svg;
2316    };
2317    var loadSerializedSVG = function (svg) {
2318        return new Promise(function (resolve, reject) {
2319            var img = new Image();
2320            img.onload = function () { return resolve(img); };
2321            img.onerror = reject;
2322            img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));
2323        });
2324    };
2325    var FEATURES = {
2326        get SUPPORT_RANGE_BOUNDS() {
2327            var value = testRangeBounds(document);
2328            Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });
2329            return value;
2330        },
2331        get SUPPORT_SVG_DRAWING() {
2332            var value = testSVG(document);
2333            Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });
2334            return value;
2335        },
2336        get SUPPORT_FOREIGNOBJECT_DRAWING() {
2337            var value = typeof Array.from === 'function' && typeof window.fetch === 'function'
2338                ? testForeignObject(document)
2339                : Promise.resolve(false);
2340            Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });
2341            return value;
2342        },
2343        get SUPPORT_CORS_IMAGES() {
2344            var value = testCORS();
2345            Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });
2346            return value;
2347        },
2348        get SUPPORT_RESPONSE_TYPE() {
2349            var value = testResponseType();
2350            Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });
2351            return value;
2352        },
2353        get SUPPORT_CORS_XHR() {
2354            var value = 'withCredentials' in new XMLHttpRequest();
2355            Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });
2356            return value;
2357        }
2358    };
2359
2360    var Logger = /** @class */ (function () {
2361        function Logger(id) {
2362            this.id = id;
2363            this.start = Date.now();
2364        }
2365        // eslint-disable-next-line @typescript-eslint/no-explicit-any
2366        Logger.prototype.debug = function () {
2367            var args = [];
2368            for (var _i = 0; _i < arguments.length; _i++) {
2369                args[_i] = arguments[_i];
2370            }
2371            // eslint-disable-next-line no-console
2372            if (typeof window !== 'undefined' && window.console && typeof console.debug === 'function') {
2373                // eslint-disable-next-line no-console
2374                console.debug.apply(console, [this.id, this.getTime() + "ms"].concat(args));
2375            }
2376            else {
2377                this.info.apply(this, args);
2378            }
2379        };
2380        Logger.prototype.getTime = function () {
2381            return Date.now() - this.start;
2382        };
2383        Logger.create = function (id) {
2384            Logger.instances[id] = new Logger(id);
2385        };
2386        Logger.destroy = function (id) {
2387            delete Logger.instances[id];
2388        };
2389        Logger.getInstance = function (id) {
2390            var instance = Logger.instances[id];
2391            if (typeof instance === 'undefined') {
2392                throw new Error("No logger instance found with id " + id);
2393            }
2394            return instance;
2395        };
2396        // eslint-disable-next-line @typescript-eslint/no-explicit-any
2397        Logger.prototype.info = function () {
2398            var args = [];
2399            for (var _i = 0; _i < arguments.length; _i++) {
2400                args[_i] = arguments[_i];
2401            }
2402            // eslint-disable-next-line no-console
2403            if (typeof window !== 'undefined' && window.console && typeof console.info === 'function') {
2404                // eslint-disable-next-line no-console
2405                console.info.apply(console, [this.id, this.getTime() + "ms"].concat(args));
2406            }
2407        };
2408        // eslint-disable-next-line @typescript-eslint/no-explicit-any
2409        Logger.prototype.error = function () {
2410            var args = [];
2411            for (var _i = 0; _i < arguments.length; _i++) {
2412                args[_i] = arguments[_i];
2413            }
2414            // eslint-disable-next-line no-console
2415            if (typeof window !== 'undefined' && window.console && typeof console.error === 'function') {
2416                // eslint-disable-next-line no-console
2417                console.error.apply(console, [this.id, this.getTime() + "ms"].concat(args));
2418            }
2419            else {
2420                this.info.apply(this, args);
2421            }
2422        };
2423        Logger.instances = {};
2424        return Logger;
2425    }());
2426
2427    var CacheStorage = /** @class */ (function () {
2428        function CacheStorage() {
2429        }
2430        CacheStorage.create = function (name, options) {
2431            return (CacheStorage._caches[name] = new Cache(name, options));
2432        };
2433        CacheStorage.destroy = function (name) {
2434            delete CacheStorage._caches[name];
2435        };
2436        CacheStorage.open = function (name) {
2437            var cache = CacheStorage._caches[name];
2438            if (typeof cache !== 'undefined') {
2439                return cache;
2440            }
2441            throw new Error("Cache with key \"" + name + "\" not found");
2442        };
2443        CacheStorage.getOrigin = function (url) {
2444            var link = CacheStorage._link;
2445            if (!link) {
2446                return 'about:blank';
2447            }
2448            link.href = url;
2449            link.href = link.href; // IE9, LOL! - http://jsfiddle.net/niklasvh/2e48b/
2450            return link.protocol + link.hostname + link.port;
2451        };
2452        CacheStorage.isSameOrigin = function (src) {
2453            return CacheStorage.getOrigin(src) === CacheStorage._origin;
2454        };
2455        CacheStorage.setContext = function (window) {
2456            CacheStorage._link = window.document.createElement('a');
2457            CacheStorage._origin = CacheStorage.getOrigin(window.location.href);
2458        };
2459        CacheStorage.getInstance = function () {
2460            var current = CacheStorage._current;
2461            if (current === null) {
2462                throw new Error("No cache instance attached");
2463            }
2464            return current;
2465        };
2466        CacheStorage.attachInstance = function (cache) {
2467            CacheStorage._current = cache;
2468        };
2469        CacheStorage.detachInstance = function () {
2470            CacheStorage._current = null;
2471        };
2472        CacheStorage._caches = {};
2473        CacheStorage._origin = 'about:blank';
2474        CacheStorage._current = null;
2475        return CacheStorage;
2476    }());
2477    var Cache = /** @class */ (function () {
2478        function Cache(id, options) {
2479            this.id = id;
2480            this._options = options;
2481            this._cache = {};
2482        }
2483        Cache.prototype.addImage = function (src) {
2484            var result = Promise.resolve();
2485            if (this.has(src)) {
2486                return result;
2487            }
2488            if (isBlobImage(src) || isRenderable(src)) {
2489                this._cache[src] = this.loadImage(src);
2490                return result;
2491            }
2492            return result;
2493        };
2494        // eslint-disable-next-line @typescript-eslint/no-explicit-any
2495        Cache.prototype.match = function (src) {
2496            return this._cache[src];
2497        };
2498        Cache.prototype.loadImage = function (key) {
2499            return __awaiter(this, void 0, void 0, function () {
2500                var isSameOrigin, useCORS, useProxy, src;
2501                var _this = this;
2502                return __generator(this, function (_a) {
2503                    switch (_a.label) {
2504                        case 0:
2505                            isSameOrigin = CacheStorage.isSameOrigin(key);
2506                            useCORS = !isInlineImage(key) && this._options.useCORS === true && FEATURES.SUPPORT_CORS_IMAGES && !isSameOrigin;
2507                            useProxy = !isInlineImage(key) &&
2508                                !isSameOrigin &&
2509                                typeof this._options.proxy === 'string' &&
2510                                FEATURES.SUPPORT_CORS_XHR &&
2511                                !useCORS;
2512                            if (!isSameOrigin && this._options.allowTaint === false && !isInlineImage(key) && !useProxy && !useCORS) {
2513                                return [2 /*return*/];
2514                            }
2515                            src = key;
2516                            if (!useProxy) return [3 /*break*/, 2];
2517                            return [4 /*yield*/, this.proxy(src)];
2518                        case 1:
2519                            src = _a.sent();
2520                            _a.label = 2;
2521                        case 2:
vendor: 4,574 bytes, lines 2522-2607
2522                            Logger.getInstance(this.id).debug("Added image " + key.substring(0, 256));
2523                            return [4 /*yield*/, new Promise(function (resolve, reject) {
2524                                    var img = new Image();
2525                                    img.onload = function () { return resolve(img); };
2526                                    img.onerror = reject;
2527                                    //ios safari 10.3 taints canvas with data urls unless crossOrigin is set to anonymous
2528                                    if (isInlineBase64Image(src) || useCORS) {
2529                                        img.crossOrigin = 'anonymous';
2530                                    }
2531                                    img.src = src;
2532                                    if (img.complete === true) {
2533                                        // Inline XML images may fail to parse, throwing an Error later on
2534                                        setTimeout(function () { return resolve(img); }, 500);
2535                                    }
2536                                    if (_this._options.imageTimeout > 0) {
2537                                        setTimeout(function () { return reject("Timed out (" + _this._options.imageTimeout + "ms) loading image"); }, _this._options.imageTimeout);
2538                                    }
2539                                })];
2540                        case 3: return [2 /*return*/, _a.sent()];
2541                    }
2542                });
2543            });
2544        };
2545        Cache.prototype.has = function (key) {
2546            return typeof this._cache[key] !== 'undefined';
2547        };
2548        Cache.prototype.keys = function () {
2549            return Promise.resolve(Object.keys(this._cache));
2550        };
2551        Cache.prototype.proxy = function (src) {
2552            var _this = this;
2553            var proxy = this._options.proxy;
2554            if (!proxy) {
2555                throw new Error('No proxy defined');
2556            }
2557            var key = src.substring(0, 256);
2558            return new Promise(function (resolve, reject) {
2559                var responseType = FEATURES.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text';
2560                var xhr = new XMLHttpRequest();
2561                xhr.onload = function () {
2562                    if (xhr.status === 200) {
2563                        if (responseType === 'text') {
2564                            resolve(xhr.response);
2565                        }
2566                        else {
2567                            var reader_1 = new FileReader();
2568                            reader_1.addEventListener('load', function () { return resolve(reader_1.result); }, false);
2569                            reader_1.addEventListener('error', function (e) { return reject(e); }, false);
2570                            reader_1.readAsDataURL(xhr.response);
2571                        }
2572                    }
2573                    else {
2574                        reject("Failed to proxy resource " + key + " with status code " + xhr.status);
2575                    }
2576                };
2577                xhr.onerror = reject;
2578                xhr.open('GET', proxy + "?url=" + encodeURIComponent(src) + "&responseType=" + responseType);
2579                if (responseType !== 'text' && xhr instanceof XMLHttpRequest) {
2580                    xhr.responseType = responseType;
2581                }
2582                if (_this._options.imageTimeout) {
2583                    var timeout_1 = _this._options.imageTimeout;
2584                    xhr.timeout = timeout_1;
2585                    xhr.ontimeout = function () { return reject("Timed out (" + timeout_1 + "ms) proxying " + key); };
2586                }
2587                xhr.send();
2588            });
2589        };
2590        return Cache;
2591    }());
2592    var INLINE_SVG = /^data:image\/svg\+xml/i;
2593    var INLINE_BASE64 = /^data:image\/.*;base64,/i;
2594    var INLINE_IMG = /^data:image\/.*/i;
2595    var isRenderable = function (src) { return FEATURES.SUPPORT_SVG_DRAWING || !isSVG(src); };
2596    var isInlineImage = function (src) { return INLINE_IMG.test(src); };
2597    var isInlineBase64Image = function (src) { return INLINE_BASE64.test(src); };
2598    var isBlobImage = function (src) { return src.substr(0, 4) === 'blob'; };
2599    var isSVG = function (src) { return src.substr(-3).toLowerCase() === 'svg' || INLINE_SVG.test(src); };
2600
2601    var webkitGradient = function (tokens) {
2602        var angle = deg(180);
2603        var stops = [];
2604        var type = CSSImageType.LINEAR_GRADIENT;
2605        var shape = CSSRadialShape.CIRCLE;
2606        var size = CSSRadialExtent.FARTHEST_CORNER;
2607        var position = [];
2608        parseFunctionArgs(tokens).forEach(function (arg, i) {
2609            var firstToken = arg[0];
2610            if (i === 0) {
2611                if (isIdentToken(firstToken) && firstToken.value === 'linear') {
2612                    type = CSSImageType.LINEAR_GRADIENT;
2613                    return;
2614                }
2615                else if (isIdentToken(firstToken) && firstToken.value === 'radial') {
2616                    type = CSSImageType.RADIAL_GRADIENT;
2617                    return;
2618                }
2619            }
2620            if (firstToken.type === TokenType.FUNCTION) {
2621                if (firstToken.name === 'from') {
2622                    var color$1 = color.parse(firstToken.values[0]);
2623                    stops.push({ stop: ZERO_LENGTH, color: color$1 });
2624                }
2625                else if (firstToken.name === 'to') {
2626                    var color$1 = color.parse(firstToken.values[0]);
2627                    stops.push({ stop: HUNDRED_PERCENT, color: color$1 });
2628                }
2629                else if (firstToken.name === 'color-stop') {
2630                    var values = firstToken.values.filter(nonFunctionArgSeparator);
2631                    if (values.length === 2) {
2632                        var color$1 = color.parse(values[1]);
2633                        var stop_1 = values[0];
2634                        if (isNumberToken(stop_1)) {
2635                            stops.push({
2636                                stop: { type: TokenType.PERCENTAGE_TOKEN, number: stop_1.number * 100, flags: stop_1.flags },
2637                                color: color$1
2638                            });
2639                        }
2640                    }
2641                }
2642            }
2643        });
2644        return type === CSSImageType.LINEAR_GRADIENT
2645            ? {
2646                angle: (angle + deg(180)) % deg(360),
2647                stops: stops,
2648                type: type
2649            }
2650            : { size: size, shape: shape, stops: stops, position: position, type: type };
2651    };
2652
2653    var CLOSEST_SIDE = 'closest-side';
2654    var FARTHEST_SIDE = 'farthest-side';
2655    var CLOSEST_CORNER = 'closest-corner';
2656    var FARTHEST_CORNER = 'farthest-corner';
2657    var CIRCLE = 'circle';
2658    var ELLIPSE = 'ellipse';
2659    var COVER = 'cover';
2660    var CONTAIN = 'contain';
2661    var radialGradient = function (tokens) {
2662        var shape = CSSRadialShape.CIRCLE;
2663        var size = CSSRadialExtent.FARTHEST_CORNER;
2664        var stops = [];
2665        var position = [];
2666        parseFunctionArgs(tokens).forEach(function (arg, i) {
2667            var isColorStop = true;
2668            if (i === 0) {
2669                var isAtPosition_1 = false;
2670                isColorStop = arg.reduce(function (acc, token) {
2671                    if (isAtPosition_1) {
2672                        if (isIdentToken(token)) {
2673                            switch (token.value) {
2674                                case 'center':
2675                                    position.push(FIFTY_PERCENT);
2676                                    return acc;
2677                                case 'top':
2678                                case 'left':
2679                                    position.push(ZERO_LENGTH);
2680                                    return acc;
2681                                case 'right':
2682                                case 'bottom':
2683                                    position.push(HUNDRED_PERCENT);
2684                                    return acc;
2685                            }
2686                        }
2687                        else if (isLengthPercentage(token) || isLength(token)) {
2688                            position.push(token);
2689                        }
2690                    }
2691                    else if (isIdentToken(token)) {
2692                        switch (token.value) {
2693                            case CIRCLE:
2694                                shape = CSSRadialShape.CIRCLE;
2695                                return false;
2696                            case ELLIPSE:
2697                                shape = CSSRadialShape.ELLIPSE;
2698                                return false;
2699                            case 'at':
2700                                isAtPosition_1 = true;
2701                                return false;
vendor: 4,318 bytes, lines 2702-2798
2702                            case CLOSEST_SIDE:
2703                                size = CSSRadialExtent.CLOSEST_SIDE;
2704                                return false;
2705                            case COVER:
2706                            case FARTHEST_SIDE:
2707                                size = CSSRadialExtent.FARTHEST_SIDE;
2708                                return false;
2709                            case CONTAIN:
2710                            case CLOSEST_CORNER:
2711                                size = CSSRadialExtent.CLOSEST_CORNER;
2712                                return false;
2713                            case FARTHEST_CORNER:
2714                                size = CSSRadialExtent.FARTHEST_CORNER;
2715                                return false;
2716                        }
2717                    }
2718                    else if (isLength(token) || isLengthPercentage(token)) {
2719                        if (!Array.isArray(size)) {
2720                            size = [];
2721                        }
2722                        size.push(token);
2723                        return false;
2724                    }
2725                    return acc;
2726                }, isColorStop);
2727            }
2728            if (isColorStop) {
2729                var colorStop = parseColorStop(arg);
2730                stops.push(colorStop);
2731            }
2732        });
2733        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
2734    };
2735
2736    var prefixRadialGradient = function (tokens) {
2737        var shape = CSSRadialShape.CIRCLE;
2738        var size = CSSRadialExtent.FARTHEST_CORNER;
2739        var stops = [];
2740        var position = [];
2741        parseFunctionArgs(tokens).forEach(function (arg, i) {
2742            var isColorStop = true;
2743            if (i === 0) {
2744                isColorStop = arg.reduce(function (acc, token) {
2745                    if (isIdentToken(token)) {
2746                        switch (token.value) {
2747                            case 'center':
2748                                position.push(FIFTY_PERCENT);
2749                                return false;
2750                            case 'top':
2751                            case 'left':
2752                                position.push(ZERO_LENGTH);
2753                                return false;
2754                            case 'right':
2755                            case 'bottom':
2756                                position.push(HUNDRED_PERCENT);
2757                                return false;
2758                        }
2759                    }
2760                    else if (isLengthPercentage(token) || isLength(token)) {
2761                        position.push(token);
2762                        return false;
2763                    }
2764                    return acc;
2765                }, isColorStop);
2766            }
2767            else if (i === 1) {
2768                isColorStop = arg.reduce(function (acc, token) {
2769                    if (isIdentToken(token)) {
2770                        switch (token.value) {
2771                            case CIRCLE:
2772                                shape = CSSRadialShape.CIRCLE;
2773                                return false;
2774                            case ELLIPSE:
2775                                shape = CSSRadialShape.ELLIPSE;
2776                                return false;
2777                            case CONTAIN:
2778                            case CLOSEST_SIDE:
2779                                size = CSSRadialExtent.CLOSEST_SIDE;
2780                                return false;
2781                            case FARTHEST_SIDE:
2782                                size = CSSRadialExtent.FARTHEST_SIDE;
2783                                return false;
2784                            case CLOSEST_CORNER:
2785                                size = CSSRadialExtent.CLOSEST_CORNER;
2786                                return false;
2787                            case COVER:
2788                            case FARTHEST_CORNER:
2789                                size = CSSRadialExtent.FARTHEST_CORNER;
2790                                return false;
2791                        }
2792                    }
2793                    else if (isLength(token) || isLengthPercentage(token)) {
2794                        if (!Array.isArray(size)) {
2795                            size = [];
2796                        }
2797                        size.push(token);
2798                        return false;
2799                    }
2800                    return acc;
2801                }, isColorStop);
2802            }
2803            if (isColorStop) {
2804                var colorStop = parseColorStop(arg);
2805                stops.push(colorStop);
2806            }
2807        });
2808        return { size: size, shape: shape, stops: stops, position: position, type: CSSImageType.RADIAL_GRADIENT };
2809    };
2810
2811    var CSSImageType;
2812    (function (CSSImageType) {
2813        CSSImageType[CSSImageType["URL"] = 0] = "URL";
2814        CSSImageType[CSSImageType["LINEAR_GRADIENT"] = 1] = "LINEAR_GRADIENT";
2815        CSSImageType[CSSImageType["RADIAL_GRADIENT"] = 2] = "RADIAL_GRADIENT";
2816    })(CSSImageType || (CSSImageType = {}));
2817    var isLinearGradient = function (background) {
2818        return background.type === CSSImageType.LINEAR_GRADIENT;
2819    };
2820    var isRadialGradient = function (background) {
2821        return background.type === CSSImageType.RADIAL_GRADIENT;
2822    };
2823    var CSSRadialShape;
2824    (function (CSSRadialShape) {
2825        CSSRadialShape[CSSRadialShape["CIRCLE"] = 0] = "CIRCLE";
2826        CSSRadialShape[CSSRadialShape["ELLIPSE"] = 1] = "ELLIPSE";
2827    })(CSSRadialShape || (CSSRadialShape = {}));
2828    var CSSRadialExtent;
2829    (function (CSSRadialExtent) {
2830        CSSRadialExtent[CSSRadialExtent["CLOSEST_SIDE"] = 0] = "CLOSEST_SIDE";
2831        CSSRadialExtent[CSSRadialExtent["FARTHEST_SIDE"] = 1] = "FARTHEST_SIDE";
2832        CSSRadialExtent[CSSRadialExtent["CLOSEST_CORNER"] = 2] = "CLOSEST_CORNER";
2833        CSSRadialExtent[CSSRadialExtent["FARTHEST_CORNER"] = 3] = "FARTHEST_CORNER";
2834    })(CSSRadialExtent || (CSSRadialExtent = {}));
2835    var image = {
2836        name: 'image',
2837        parse: function (value) {
2838            if (value.type === TokenType.URL_TOKEN) {
2839                var image_1 = { url: value.value, type: CSSImageType.URL };
2840                CacheStorage.getInstance().addImage(value.value);
2841                return image_1;
2842            }
2843            if (value.type === TokenType.FUNCTION) {
2844                var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];
2845                if (typeof imageFunction === 'undefined') {
2846                    throw new Error("Attempting to parse an unsupported image function \"" + value.name + "\"");
2847                }
2848                return imageFunction(value.values);
2849            }
2850            throw new Error("Unsupported image type");
2851        }
2852    };
2853    function isSupportedImage(value) {
2854        return value.type !== TokenType.FUNCTION || SUPPORTED_IMAGE_FUNCTIONS[value.name];
2855    }
2856    var SUPPORTED_IMAGE_FUNCTIONS = {
2857        'linear-gradient': linearGradient,
2858        '-moz-linear-gradient': prefixLinearGradient,
2859        '-ms-linear-gradient': prefixLinearGradient,
2860        '-o-linear-gradient': prefixLinearGradient,
2861        '-webkit-linear-gradient': prefixLinearGradient,
2862        'radial-gradient': radialGradient,
2863        '-moz-radial-gradient': prefixRadialGradient,
2864        '-ms-radial-gradient': prefixRadialGradient,
2865        '-o-radial-gradient': prefixRadialGradient,
2866        '-webkit-radial-gradient': prefixRadialGradient,
2867        '-webkit-gradient': webkitGradient
2868    };
2869
2870    var backgroundImage = {
2871        name: 'background-image',
2872        initialValue: 'none',
2873        type: PropertyDescriptorParsingType.LIST,
2874        prefix: false,
2875        parse: function (tokens) {
2876            if (tokens.length === 0) {
2877                return [];
2878            }
2879            var first = tokens[0];
2880            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
2881                return [];
2882            }
2883            return tokens.filter(function (value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); }).map(image.parse);
2884        }
2885    };
2886
2887    var backgroundOrigin = {
2888        name: 'background-origin',
2889        initialValue: 'border-box',
2890        prefix: false,
2891        type: PropertyDescriptorParsingType.LIST,
2892        parse: function (tokens) {
2893            return tokens.map(function (token) {
2894                if (isIdentToken(token)) {
2895                    switch (token.value) {
2896                        case 'padding-box':
2897                            return 1 /* PADDING_BOX */;
2898                        case 'content-box':
2899                            return 2 /* CONTENT_BOX */;
2900                    }
2901                }
2902                return 0 /* BORDER_BOX */;
2903            });
2904        }
2905    };
2906
2907    var backgroundPosition = {
2908        name: 'background-position',
2909        initialValue: '0% 0%',
2910        type: PropertyDescriptorParsingType.LIST,
2911        prefix: false,
2912        parse: function (tokens) {
2913            return parseFunctionArgs(tokens)
2914                .map(function (values) { return values.filter(isLengthPercentage); })
2915                .map(parseLengthPercentageTuple);
2916        }
2917    };
2918
2919    var BACKGROUND_REPEAT;
2920    (function (BACKGROUND_REPEAT) {
2921        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT"] = 0] = "REPEAT";
2922        BACKGROUND_REPEAT[BACKGROUND_REPEAT["NO_REPEAT"] = 1] = "NO_REPEAT";
2923        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_X"] = 2] = "REPEAT_X";
2924        BACKGROUND_REPEAT[BACKGROUND_REPEAT["REPEAT_Y"] = 3] = "REPEAT_Y";
2925    })(BACKGROUND_REPEAT || (BACKGROUND_REPEAT = {}));
2926    var backgroundRepeat = {
2927        name: 'background-repeat',
2928        initialValue: 'repeat',
2929        prefix: false,
2930        type: PropertyDescriptorParsingType.LIST,
2931        parse: function (tokens) {
2932            return parseFunctionArgs(tokens)
2933                .map(function (values) {
2934                return values
2935                    .filter(isIdentToken)
2936                    .map(function (token) { return token.value; })
2937                    .join(' ');
2938            })
2939                .map(parseBackgroundRepeat);
2940        }
2941    };
2942    var parseBackgroundRepeat = function (value) {
2943        switch (value) {
2944            case 'no-repeat':
2945                return BACKGROUND_REPEAT.NO_REPEAT;
2946            case 'repeat-x':
2947            case 'repeat no-repeat':
2948                return BACKGROUND_REPEAT.REPEAT_X;
2949            case 'repeat-y':
2950            case 'no-repeat repeat':
2951                return BACKGROUND_REPEAT.REPEAT_Y;
2952            case 'repeat':
2953            default:
2954                return BACKGROUND_REPEAT.REPEAT;
2955        }
2956    };
2957
2958    var BACKGROUND_SIZE;
2959    (function (BACKGROUND_SIZE) {
2960        BACKGROUND_SIZE["AUTO"] = "auto";
2961        BACKGROUND_SIZE["CONTAIN"] = "contain";
2962        BACKGROUND_SIZE["COVER"] = "cover";
2963    })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {}));
2964    var backgroundSize = {
2965        name: 'background-size',
2966        initialValue: '0',
2967        prefix: false,
2968        type: PropertyDescriptorParsingType.LIST,
2969        parse: function (tokens) {
2970            return parseFunctionArgs(tokens).map(function (values) { return values.filter(isBackgroun
2970dSizeInfoToken); });
2971        }
2972    };
2973    var isBackgroundSizeInfoToken = function (value) {
2974        return isIdentToken(value) || isLengthPercentage(value);
2975    };
2976
2977    var borderColorForSide = function (side) { return ({
2978        name: "border-" + side + "-color",
2979        initialValue: 'transparent',
2980        prefix: false,
2981        type: PropertyDescriptorParsingType.TYPE_VALUE,
2982        format: 'color'
2983    }); };
2984    var borderTopColor = borderColorForSide('top');
2985    var borderRightColor = borderColorForSide('right');
2986    var borderBottomColor = borderColorForSide('bottom');
2987    var borderLeftColor = borderColorForSide('left');
2988
2989    var borderRadiusForSide = function (side) { return ({
2990        name: "border-radius-" + side,
2991        initialValue: '0 0',
2992        prefix: false,
2993        type: PropertyDescriptorParsingType.LIST,
2994        parse: function (tokens) { return parseLengthPercentageTuple(tokens.filter(isLengthPercentage)); }
2995    }); };
2996    var borderTopLeftRadius = borderRadiusForSide('top-left');
2997    var borderTopRightRadius = borderRadiusForSide('top-right');
2998    var borderBottomRightRadius = borderRadiusForSide('bottom-right');
2999    var borderBottomLeftRadius = borderRadiusForSide('bottom-left');
3000
3001    var BORDER_STYLE;
3002    (function (BORDER_STYLE) {
3003        BORDER_STYLE[BORDER_STYLE["NONE"] = 0] = "NONE";
3004        BORDER_STYLE[BORDER_STYLE["SOLID"] = 1] = "SOLID";
3005    })(BORDER_STYLE || (BORDER_STYLE = {}));
3006    var borderStyleForSide = function (side) { return ({
3007        name: "border-" + side + "-style",
3008        initialValue: 'solid',
3009        prefix: false,
3010        type: PropertyDescriptorParsingType.IDENT_VALUE,
3011        parse: function (style) {
3012            switch (style) {
3013                case 'none':
3014                    return BORDER_STYLE.NONE;
3015            }
3016            return BORDER_STYLE.SOLID;
3017        }
3018    }); };
3019    var borderTopStyle = borderStyleForSide('top');
3020    var borderRightStyle = borderStyleForSide('right');
3021    var borderBottomStyle = borderStyleForSide('bottom');
3022    var borderLeftStyle = borderStyleForSide('left');
3023
3024    var borderWidthForSide = function (side) { return ({
3025        name: "border-" + side + "-width",
3026        initialValue: '0',
3027        type: PropertyDescriptorParsingType.VALUE,
3028        prefix: false,
3029        parse: function (token) {
3030            if (isDimensionToken(token)) {
3031                return token.number;
3032            }
3033            return 0;
3034        }
3035    }); };
3036    var borderTopWidth = borderWidthForSide('top');
3037    var borderRightWidth = borderWidthForSide('right');
3038    var borderBottomWidth = borderWidthForSide('bottom');
3039    var borderLeftWidth = borderWidthForSide('left');
3040
3041    var color$1 = {
3042        name: "color",
3043        initialValue: 'transparent',
3044        prefix: false,
3045        type: PropertyDescriptorParsingType.TYPE_VALUE,
3046        format: 'color'
3047    };
3048
3049    var display = {
3050        name: 'display',
3051        initialValue: 'inline-block',
3052        prefix: false,
3053        type: PropertyDescriptorParsingType.LIST,
3054        parse: function (tokens) {
3055            return tokens.filter(isIdentToken).reduce(function (bit, token) {
3056                return bit | parseDisplayValue(token.value);
3057            }, 0 /* NONE */);
3058        }
3059    };
3060    var parseDisplayValue = function (display) {
3061        switch (display) {
3062            case 'block':
3063                return 2 /* BLOCK */;
3064            case 'inline':
3065                return 4 /* INLINE */;
3066            case 'run-in':
3067                return 8 /* RUN_IN */;
3068            case 'flow':
3069                return 16 /* FLOW */;
3070            case 'flow-root':
3071                return 32 /* FLOW_ROOT */;
3072            case 'table':
3073                return 64 /* TABLE */;
3074            case 'flex':
3075            case '-webkit-flex':
3076                return 128 /* FLEX */;
3077            case 'grid':
3078                return 256 /* GRID */;
3079            case 'ruby':
3080                return 512 /* RUBY */;
3081            case 'subgrid':
3082                return 1024 /* SUBGRID */;
3083            case 'list-item':
3084                return 2048 /* LIST_ITEM */;
3085            case 'table-row-group':
3086                return 4096 /* TABLE_ROW_GROUP */;
3087            case 'table-header-group':
3088                return 8192 /* TABLE_HEADER_GROUP */;
3089            case 'table-footer-group':
3090                return 16384 /* TABLE_FOOTER_GROUP */;
3091            case 'table-row':
3092                return 32768 /* TABLE_ROW */;
3093            case 'table-cell':
3094                return 65536 /* TABLE_CELL */;
3095            case 'table-column-group':
3096                return 131072 /* TABLE_COLUMN_GROUP */;
3097            case 'table-column':
3098                return 262144 /* TABLE_COLUMN */;
3099            case 'table-caption':
3100                return 524288 /* TABLE_CAPTION */;
3101            case 'ruby-base':
3102                return 1048576 /* RUBY_BASE */;
3103            case 'ruby-text':
3104                return 2097152 /* RUBY_TEXT */;
3105            case 'ruby-base-container':
3106                return 4194304 /* RUBY_BASE_CONTAINER */;
3107            case 'ruby-text-container':
3108                return 8388608 /* RUBY_TEXT_CONTAINER */;
3109            case 'contents':
3110                return 16777216 /* CONTENTS */;
3111            case 'inline-block':
3112                return 33554432 /* INLINE_BLOCK */;
3113            case 'inline-list-item':
3114                return 67108864 /* INLINE_LIST_ITEM */;
3115            case 'inline-table':
3116                return 134217728 /* INLINE_TABLE */;
3117            case 'inline-flex':
3118                return 268435456 /* INLINE_FLEX */;
3119            case 'inline-grid':
3120                return 536870912 /* INLINE_GRID */;
3121        }
3122        return 0 /* NONE */;
3123    };
3124
3125    var FLOAT;
3126    (function (FLOAT) {
3127        FLOAT[FLOAT["NONE"] = 0] = "NONE";
3128        FLOAT[FLOAT["LEFT"] = 1] = "LEFT";
3129        FLOAT[FLOAT["RIGHT"] = 2] = "RIGHT";
3130        FLOAT[FLOAT["INLINE_START"] = 3] = "INLINE_START";
3131        FLOAT[FLOAT["INLINE_END"] = 4] = "INLINE_END";
3132    })(FLOAT || (FLOAT = {}));
3133    var float = {
3134        name: 'float',
3135        initialValue: 'none',
3136        prefix: false,
3137        type: PropertyDescriptorParsingType.IDENT_VALUE,
3138        parse: function (float) {
3139            switch (float) {
3140                case 'left':
3141                    return FLOAT.LEFT;
3142                case 'right':
3143                    return FLOAT.RIGHT;
3144                case 'inline-start':
3145                    return FLOAT.INLINE_START;
3146                case 'inline-end':
3147                    return FLOAT.INLINE_END;
3148            }
3149            return FLOAT.NONE;
3150        }
3151    };
3152
3153    var letterSpacing = {
3154        name: 'letter-spacing',
3155        initialValue: '0',
3156        prefix: false,
3157        type: PropertyDescriptorParsingType.VALUE,
3158        parse: function (token) {
3159            if (token.type === TokenType.IDENT_TOKEN && token.value === 'normal') {
3160                return 0;
3161            }
3162            if (token.type === TokenType.NUMBER_TOKEN) {
3163                return token.number;
3164            }
3165            if (token.type === TokenType.DIMENSION_TOKEN) {
3166                return token.number;
3167            }
3168            return 0;
3169        }
3170    };
3171
3172    var LINE_BREAK;
3173    (function (LINE_BREAK) {
3174        LINE_BREAK["NORMAL"] = "normal";
3175        LINE_BREAK["STRICT"] = "strict";
3176    })(LINE_BREAK || (LINE_BREAK = {}));
3177    var lineBreak = {
3178        name: 'line-break',
3179        initialValue: 'normal',
3180        prefix: false,
3181        type: PropertyDescriptorParsingType.IDENT_VALUE,
3182        parse: function (lineBreak) {
3183            switch (lineBreak) {
3184                case 'strict':
3185                    return LINE_BREAK.STRICT;
3186                case 'normal':
3187                default:
3188                    return LINE_BREAK.NORMAL;
3189            }
3190        }
3191    };
3192
3193    var lineHeight = {
3194        name: 'line-height',
3195        initialValue: 'normal',
3196        prefix: false,
3197        type: PropertyDescriptorParsingType.TOKEN_VALUE
3198    };
3199    var computeLineHeight = function (token, fontSize) {
3200        if (isIdentToken(token) && token.value === 'normal') {
3201            return 1.2 * fontSize;
3202        }
3203        else if (token.type === TokenType.NUMBER_TOKEN) {
3204            return fontSize * token.number;
3205        }
3206        else if (isLengthPercentage(token)) {
3207            return getAbsoluteValue(token, fontSize);
3208        }
3209        return fontSize;
3210    };
3211
3212    var listStyleImage = {
3213        name: 'list-style-image',
3214        initialValue: 'none',
3215        type: PropertyDescriptorParsingType.VALUE,
3216        prefix: false,
3217        parse: function (token) {
3218            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
3219                return null;
3220            }
3221            return image.parse(token);
3222        }
3223    };
3224
3225    var LIST_STYLE_POSITION;
3226    (function (LIST_STYLE_POSITION) {
3227        LIST_STYLE_POSITION[LIST_STYLE_POSITION["INSIDE"] = 0] = "INSI
3227DE";
3228        LIST_STYLE_POSITION[LIST_STYLE_POSITION["OUTSIDE"] = 1] = "OUTSIDE";
3229    })(LIST_STYLE_POSITION || (LIST_STYLE_POSITION = {}));
3230    var listStylePosition = {
3231        name: 'list-style-position',
3232        initialValue: 'outside',
3233        prefix: false,
3234        type: PropertyDescriptorParsingType.IDENT_VALUE,
3235        parse: function (position) {
3236            switch (position) {
3237                case 'inside':
3238                    return LIST_STYLE_POSITION.INSIDE;
3239                case 'outside':
3240                default:
3241                    return LIST_STYLE_POSITION.OUTSIDE;
3242            }
3243        }
3244    };
3245
3246    var LIST_STYLE_TYPE;
3247    (function (LIST_STYLE_TYPE) {
3248        LIST_STYLE_TYPE[LIST_STYLE_TYPE["NONE"] = -1] = "NONE";
3249        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISC"] = 0] = "DISC";
3250        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CIRCLE"] = 1] = "CIRCLE";
3251        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SQUARE"] = 2] = "SQUARE";
3252        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL"] = 3] = "DECIMAL";
3253        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_DECIMAL"] = 4] = "CJK_DECIMAL";
3254        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DECIMAL_LEADING_ZERO"] = 5] = "DECIMAL_LEADING_ZERO";
3255        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ROMAN"] = 6] = "LOWER_ROMAN";
3256        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ROMAN"] = 7] = "UPPER_ROMAN";
3257        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_GREEK"] = 8] = "LOWER_GREEK";
3258        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ALPHA"] = 9] = "LOWER_ALPHA";
3259        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ALPHA"] = 10] = "UPPER_ALPHA";
3260        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARABIC_INDIC"] = 11] = "ARABIC_INDIC";
3261        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ARMENIAN"] = 12] = "ARMENIAN";
3262        LIST_STYLE_TYPE[LIST_STYLE_TYPE["BENGALI"] = 13] = "BENGALI";
3263        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CAMBODIAN"] = 14] = "CAMBODIAN";
3264        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_EARTHLY_BRANCH"] = 15] = "CJK_EARTHLY_BRANCH";
3265        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_HEAVENLY_STEM"] = 16] = "CJK_HEAVENLY_STEM";
3266        LIST_STYLE_TYPE[LIST_STYLE_TYPE["CJK_IDEOGRAPHIC"] = 17] = "CJK_IDEOGRAPHIC";
3267        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DEVANAGARI"] = 18] = "DEVANAGARI";
3268        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ETHIOPIC_NUMERIC"] = 19] = "ETHIOPIC_NUMERIC";
3269        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GEORGIAN"] = 20] = "GEORGIAN";
3270        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GUJARATI"] = 21] = "GUJARATI";
3271        LIST_STYLE_TYPE[LIST_STYLE_TYPE["GURMUKHI"] = 22] = "GURMUKHI";
3272        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HEBREW"] = 22] = "HEBREW";
3273        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA"] = 23] = "HIRAGANA";
3274        LIST_STYLE_TYPE[LIST_STYLE_TYPE["HIRAGANA_IROHA"] = 24] = "HIRAGANA_IROHA";
3275        LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_FORMAL"] = 25] = "JAPANESE_FORMAL";
3276        LIST_STYLE_TYPE[LIST_STYLE_TYPE["JAPANESE_INFORMAL"] = 26] = "JAPANESE_INFORMAL";
3277        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KANNADA"] = 27] = "KANNADA";
3278        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA"] = 28] = "KATAKANA";
3279        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KATAKANA_IROHA"] = 29] = "KATAKANA_IROHA";
3280        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KHMER"] = 30] = "KHMER";
3281        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANGUL_FORMAL"] = 31] = "KOREAN_HANGUL_FORMAL";
3282        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_FORMAL"] = 32] = "KOREAN_HANJA_FORMAL";
3283        LIST_STYLE_TYPE[LIST_STYLE_TYPE["KOREAN_HANJA_INFORMAL"] = 33] = "KOREAN_HANJA_INFORMAL";
3284        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LAO"] = 34] = "LAO";
3285        LIST_STYLE_TYPE[LIST_STYLE_TYPE["LOWER_ARMENIAN"] = 35] = "LOWER_ARMENIAN";
3286        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MALAYALAM"] = 36] = "MALAYALAM";
3287        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MONGOLIAN"] = 37] = "MONGOLIAN";
3288        LIST_STYLE_TYPE[LIST_STYLE_TYPE["MYANMAR"] = 38] = "MYANMAR";
3289        LIST_STYLE_TYPE[LIST_STYLE_TYPE["ORIYA"] = 39] = "ORIYA";
3290        LIST_STYLE_TYPE[LIST_STYLE_TYPE["PERSIAN"] = 40] = "PERSIAN";
3291        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_FORMAL"] = 41] = "SIMP_CHINESE_FORMAL";
3292        LIST_STYLE_TYPE[LIST_STYLE_TYPE["SIMP_CHINESE_INFORMAL"] = 42] = "SIMP_CHINESE_INFORMAL";
3293        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TAMIL"] = 43] = "TAMIL";
3294        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TELUGU"] = 44] = "TELUGU";
3295        LIST_STYLE_TYPE[LIST_STYLE_TYPE["THAI"] = 45] = "THAI";
3296        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TIBETAN"] = 46] = "TIBETAN";
3297        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_FORMAL"] = 47] = "TRAD_CHINESE_FORMAL";
3298        LIST_STYLE_TYPE[LIST_STYLE_TYPE["TRAD_CHINESE_INFORMAL"] = 48] = "TRAD_CHINESE_INFORMAL";
3299        LIST_STYLE_TYPE[LIST_STYLE_TYPE["UPPER_ARMENIAN"] = 49] = "UPPER_ARMENIAN";
3300        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_OPEN"] = 50] = "DISCLOSURE_OPEN";
3301        LIST_STYLE_TYPE[LIST_STYLE_TYPE["DISCLOSURE_CLOSED"] = 51] = "DISCLOSURE_CLOSED";
3302    })(LIST_STYLE_TYPE || (LIST_STYLE_TYPE = {}));
3303    var listStyleType = {
3304        name: 'list-style-type',
3305        initialValue: 'none',
3306        prefix: false,
3307        type: PropertyDescriptorParsingType.IDENT_VALUE,
3308        parse: function (type) {
3309            switch (type) {
3310                case 'disc':
3311                    return LIST_STYLE_TYPE.DISC;
3312                case 'circle':
3313                    return LIST_STYLE_TYPE.CIRCLE;
3314                case 'square':
3315                    return LIST_STYLE_TYPE.SQUARE;
3316                case 'decimal':
3317                    return LIST_STYLE_TYPE.DECIMAL;
3318                case 'cjk-decimal':
3319                    return LIST_STYLE_TYPE.CJK_DECIMAL;
3320                case 'decimal-leading-zero':
3321                    return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO;
3322                case 'lower-roman':
3323                    return LIST_STYLE_TYPE.LOWER_ROMAN;
3324                case 'upper-roman':
3325                    return LIST_STYLE_TYPE.UPPER_ROMAN;
3326                case 'lower-greek':
3327                    return LIST_STYLE_TYPE.LOWER_GREEK;
3328                case 'lower-alpha':
3329                    return LIST_STYLE_TYPE.LOWER_ALPHA;
3330                case 'upper-alpha':
3331                    return LIST_STYLE_TYPE.UPPER_ALPHA;
3332                case 'arabic-indic':
3333                    return LIST_STYLE_TYPE.ARABIC_INDIC;
3334                case 'armenian':
3335                    return LIST_STYLE_TYPE.ARMENIAN;
3336                case 'bengali':
3337                    return LIST_STYLE_TYPE.BENGALI;
3338                case 'cambodian':
3339                    return LIST_STYLE_TYPE.CAMBODIAN;
3340                case 'cjk-earthly-branch':
3341                    return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH;
3342                case 'cjk-heavenly-stem':
3343                    return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM;
3344                case 'cjk-ideographic':
3345                    return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC;
3346                case 'devanagari':
3347                    return LIST_STYLE_TYPE.DEVANAGARI;
3348                case 'ethiopic-numeric':
3349                    return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC;
3350                case 'georgian':
3351                    return LIST_STYLE_TYPE.GEORGIAN;
3352                case 'gujarati':
3353                    return LIST_STYLE_TYPE.GUJARATI;
3354                case 'gurmukhi':
3355                    return LIST_STYLE_TYPE.GURMUKHI;
3356                case 'hebrew':
3357                    return LIST_STYLE_TYPE.HEBREW;
3358                case 'hiragana':
3359                    return LIST_STYLE_TYPE.HIRAGANA;
3360                case 'hiragana-iroha':
3361                    return LIST_STYLE_TYPE.HIRAGANA_IROHA;
3362                case 'japanese-formal':
3363                    return LIST_STYLE_TYPE.JAPANESE_FORMAL;
3364                case 'japanese-informal':
3365                    return LIST_STYLE_TYPE.JAPANESE_INFORMAL;
3366                case 'kannada':
3367                    return LIST_STYLE_TYPE.KANNADA;
3368                case 'katakana':
3369                    return LIST_STYLE_TYPE.KATAKANA;
3370                case 'katakana-iroha':
3371                    return LIST_STYLE_TYPE.KATAKANA_IROHA;
3372                case 'khmer':
3373                    return LIST_STYLE_TYPE.KHMER;
3374                case 'korean-hangul-formal':
3375                    return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL;
3376                case 'korean-hanja-formal':
3377                    return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL;
3378                case 'korean-hanja-informal':
3379                    return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL;
3380                case 'lao':
3381                    return LIST_STYLE_TYPE.LAO;
3382                case 'lower-armenian':
3383                    return LIST_STYLE_TYPE.LOWER_ARMENIAN;
3384                case 'malayalam':
3385                    return LIST_STYLE_TYPE.MALAYALAM;
3386                case 'mongolian':
3387                    return LIST_STYLE_TYPE.MONGOLIAN;
3388                case 'myanmar':
3389                    return LIST_STYLE_TYPE.MYANMAR;
3390                case 'oriya':
3391                    return LIST_STYLE_TYPE.ORIYA;
3392                case 'persian':
3393                    return LIST_STYLE_TYPE.PERSIAN;
3394                case 'simp-chinese-formal':
3395                    return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL;
3396                case 'simp-chinese-informal':
3397                    return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL;
3398                case 'tamil':
3399                    return LIST_STYLE_TYPE.TAMIL;
3400                case 'telugu':
3401                    return LIST_STYLE_TYPE.TELUGU;
3402                case 'thai':
3403                    return LIST_STYLE_TYPE.THAI;
3404                case 'tibetan':
3405                    return LIST_STYLE_TYPE.TIBETAN;
3406                case 'trad-chinese-formal':
3407                    return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL;
3408                case 'trad-chinese-informal':
3409                    return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL;
3410                case 'upper-armenian':
3411                    return LIST_STYLE_TYPE.UPPER_ARMENIAN;
3412                case 'disclosure-open':
3413                    return LIST_STYLE_TYPE.DISCLOSURE_OPEN;
3414                case 'disclosure-closed':
3415                    return LIST_STYLE_TYPE.DISCLOSURE_CLOSED;
3416                case 'none':
3417                default:
3418                    return LIST_STYLE_TYPE.NONE;
3419            }
3420        }
3421    };
3422
3423    var marginForSide = function (side) { return ({
3424        name: "margin-" + side,
3425        initialValue: '0',
3426        prefix: false,
3427        type: PropertyDescriptorParsingType.TOKEN_VALUE
3428    }); };
3429    var marginTop = marginForSide('top');
3430    var marginRight = marginForSide('right');
3431    var marginBottom = marginForSide('bottom');
3432    var marginLeft = marginForSide('left');
3433
3434    var OVERFLOW;
3435    (function (OVERFLOW) {
3436        OVERFLOW[OVERFLOW["VISIBLE"] = 0] = "VISIBLE";
3437        OVERFLOW[OVERFLOW["HIDDEN"] = 1] = "HIDDEN";
3438        OVERFLOW[OVERFLOW["SCROLL"] = 2] = "SCROLL";
3439        OVERFLOW[OVERFLOW["AUTO"] = 3] = "AUTO";
3440    })(OVERFLOW || (OVERFLOW = {}));
3441    var overflow = {
3442        name: 'overflow',
3443        initialValue: 'visible',
3444        prefix: false,
3445        type: PropertyDescriptorParsingType.LIST,
3446        parse: function (tokens) {
3447            return tokens.filter(isIdentToken).map(function (overflow) {
3448                switch (overflow.value) {
3449                    case 'hidden':
3450                        return OVERFLOW.HIDDEN;
3451                    case 'scroll':
3452                        return OVERFLOW.SCROLL;
3453                    case 'auto':
3454                        return OVERFLOW.AUTO;
3455                    case 'visible':
3456                    default:
3457                        return OVERFLOW.VISIBLE;
3458                }
3459            });
3460        }
3461    };
3462
3463    var OVERFLOW_WRAP;
3464    (function (OVERFLOW_WRAP) {
3465        OVERFLOW_WRAP["NORMAL"] = "normal";
3466        OVERFLOW_WRAP["BREAK_WORD"] = "break-word";
3467    })(OVERFLOW_WRAP || (OVERFLOW_WRAP = {}));
3468    var overflowWrap = {
3469        name: 'overflow-wrap',
3470        initialValue: 'normal',
3471        prefix: false,
3472        type: PropertyDescriptorParsingType.IDENT_VALUE,
3473        parse: function (overflow) {
3474            switch (overflow) {
3475                case 'break-word':
3476                    return OVERFLOW_WRAP.BREAK_WORD;
3477                case 'normal':
3478                default:
3479                    return OVERFLOW_WRAP.NORMAL;
3480            }
3481        }
3482    };
3483
3484    var paddingForSide = function (side) { return ({
3485        name: "padding-" + side,
3486        initialValue: '0',
3487        prefix: false,
3488        type: PropertyDescriptorParsingType.TYPE_VALUE,
3489        format: 'length-percentage'
3490    }); };
3491    var paddingTop = paddingForSide('top');
3492    var paddingRight = paddingForSide('right');
3493    var paddingBottom = paddingForSide('bottom');
3494    var paddingLeft = paddingForSide('left');
3495
3496    var TEXT_ALIGN;
3497    (function (TEXT_ALIGN) {
3498        TEXT_ALIGN[TEXT_ALIGN["LEFT"] = 0] = "LEFT";
vendor: 6,945 bytes, lines 3499-3686
3499        TEXT_ALIGN[TEXT_ALIGN["CENTER"] = 1] = "CENTER";
3500        TEXT_ALIGN[TEXT_ALIGN["RIGHT"] = 2] = "RIGHT";
3501    })(TEXT_ALIGN || (TEXT_ALIGN = {}));
3502    var textAlign = {
3503        name: 'text-align',
3504        initialValue: 'left',
3505        prefix: false,
3506        type: PropertyDescriptorParsingType.IDENT_VALUE,
3507        parse: function (textAlign) {
3508            switch (textAlign) {
3509                case 'right':
3510                    return TEXT_ALIGN.RIGHT;
3511                case 'center':
3512                case 'justify':
3513                    return TEXT_ALIGN.CENTER;
3514                case 'left':
3515                default:
3516                    return TEXT_ALIGN.LEFT;
3517            }
3518        }
3519    };
3520
3521    var POSITION;
3522    (function (POSITION) {
3523        POSITION[POSITION["STATIC"] = 0] = "STATIC";
3524        POSITION[POSITION["RELATIVE"] = 1] = "RELATIVE";
3525        POSITION[POSITION["ABSOLUTE"] = 2] = "ABSOLUTE";
3526        POSITION[POSITION["FIXED"] = 3] = "FIXED";
3527        POSITION[POSITION["STICKY"] = 4] = "STICKY";
3528    })(POSITION || (POSITION = {}));
3529    var position = {
3530        name: 'position',
3531        initialValue: 'static',
3532        prefix: false,
3533        type: PropertyDescriptorParsingType.IDENT_VALUE,
3534        parse: function (position) {
3535            switch (position) {
3536                case 'relative':
3537                    return POSITION.RELATIVE;
3538                case 'absolute':
3539                    return POSITION.ABSOLUTE;
3540                case 'fixed':
3541                    return POSITION.FIXED;
3542                case 'sticky':
3543                    return POSITION.STICKY;
3544            }
3545            return POSITION.STATIC;
3546        }
3547    };
3548
3549    var textShadow = {
3550        name: 'text-shadow',
3551        initialValue: 'none',
3552        type: PropertyDescriptorParsingType.LIST,
3553        prefix: false,
3554        parse: function (tokens) {
3555            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
3556                return [];
3557            }
3558            return parseFunctionArgs(tokens).map(function (values) {
3559                var shadow = {
3560                    color: COLORS.TRANSPARENT,
3561                    offsetX: ZERO_LENGTH,
3562                    offsetY: ZERO_LENGTH,
3563                    blur: ZERO_LENGTH
3564                };
3565                var c = 0;
3566                for (var i = 0; i < values.length; i++) {
3567                    var token = values[i];
3568                    if (isLength(token)) {
3569                        if (c === 0) {
3570                            shadow.offsetX = token;
3571                        }
3572                        else if (c === 1) {
3573                            shadow.offsetY = token;
3574                        }
3575                        else {
3576                            shadow.blur = token;
3577                        }
3578                        c++;
3579                    }
3580                    else {
3581                        shadow.color = color.parse(token);
3582                    }
3583                }
3584                return shadow;
3585            });
3586        }
3587    };
3588
3589    var TEXT_TRANSFORM;
3590    (function (TEXT_TRANSFORM) {
3591        TEXT_TRANSFORM[TEXT_TRANSFORM["NONE"] = 0] = "NONE";
3592        TEXT_TRANSFORM[TEXT_TRANSFORM["LOWERCASE"] = 1] = "LOWERCASE";
3593        TEXT_TRANSFORM[TEXT_TRANSFORM["UPPERCASE"] = 2] = "UPPERCASE";
3594        TEXT_TRANSFORM[TEXT_TRANSFORM["CAPITALIZE"] = 3] = "CAPITALIZE";
3595    })(TEXT_TRANSFORM || (TEXT_TRANSFORM = {}));
3596    var textTransform = {
3597        name: 'text-transform',
3598        initialValue: 'none',
3599        prefix: false,
3600        type: PropertyDescriptorParsingType.IDENT_VALUE,
3601        parse: function (textTransform) {
3602            switch (textTransform) {
3603                case 'uppercase':
3604                    return TEXT_TRANSFORM.UPPERCASE;
3605                case 'lowercase':
3606                    return TEXT_TRANSFORM.LOWERCASE;
3607                case 'capitalize':
3608                    return TEXT_TRANSFORM.CAPITALIZE;
3609            }
3610            return TEXT_TRANSFORM.NONE;
3611        }
3612    };
3613
3614    var transform = {
3615        name: 'transform',
3616        initialValue: 'none',
3617        prefix: true,
3618        type: PropertyDescriptorParsingType.VALUE,
3619        parse: function (token) {
3620            if (token.type === TokenType.IDENT_TOKEN && token.value === 'none') {
3621                return null;
3622            }
3623            if (token.type === TokenType.FUNCTION) {
3624                var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];
3625                if (typeof transformFunction === 'undefined') {
3626                    throw new Error("Attempting to parse an unsupported transform function \"" + token.name + "\"");
3627                }
3628                return transformFunction(token.values);
3629            }
3630            return null;
3631        }
3632    };
3633    var matrix = function (args) {
3634        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });
3635        return values.length === 6 ? values : null;
3636    };
3637    // doesn't support 3D transforms at the moment
3638    var matrix3d = function (args) {
3639        var values = args.filter(function (arg) { return arg.type === TokenType.NUMBER_TOKEN; }).map(function (arg) { return arg.number; });
3640        var a1 = values[0], b1 = values[1], _a = values[2], _b = values[3], a2 = values[4], b2 = values[5], _c = values[6], _d = values[7], _e = values[8], _f = values[9], _g = values[10], _h = values[11], a4 = values[12], b4 = values[13], _j = values[14], _k = values[15];
3641        return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;
3642    };
3643    var SUPPORTED_TRANSFORM_FUNCTIONS = {
3644        matrix: matrix,
3645        matrix3d: matrix3d
3646    };
3647
3648    var DEFAULT_VALUE = {
3649        type: TokenType.PERCENTAGE_TOKEN,
3650        number: 50,
3651        flags: FLAG_INTEGER
3652    };
3653    var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE];
3654    var transformOrigin = {
3655        name: 'transform-origin',
3656        initialValue: '50% 50%',
3657        prefix: true,
3658        type: PropertyDescriptorParsingType.LIST,
3659        parse: function (tokens) {
3660            var origins = tokens.filter(isLengthPercentage);
3661            if (origins.length !== 2) {
3662                return DEFAULT;
3663            }
3664            return [origins[0], origins[1]];
3665        }
3666    };
3667
3668    var VISIBILITY;
3669    (function (VISIBILITY) {
3670        VISIBILITY[VISIBILITY["VISIBLE"] = 0] = "VISIBLE";
3671        VISIBILITY[VISIBILITY["HIDDEN"] = 1] = "HIDDEN";
3672        VISIBILITY[VISIBILITY["COLLAPSE"] = 2] = "COLLAPSE";
3673    })(VISIBILITY || (VISIBILITY = {}));
3674    var visibility = {
3675        name: 'visible',
3676        initialValue: 'none',
3677        prefix: false,
3678        type: PropertyDescriptorParsingType.IDENT_VALUE,
3679        parse: function (visibility) {
3680            switch (visibility) {
3681                case 'hidden':
3682                    return VISIBILITY.HIDDEN;
3683                case 'collapse':
3684                    return VISIBILITY.COLLAPSE;
3685                case 'visible':
3686                default:
vendor: 8,494 bytes, lines 3687-3960
3687                    return VISIBILITY.VISIBLE;
3688            }
3689        }
3690    };
3691
3692    var WORD_BREAK;
3693    (function (WORD_BREAK) {
3694        WORD_BREAK["NORMAL"] = "normal";
3695        WORD_BREAK["BREAK_ALL"] = "break-all";
3696        WORD_BREAK["KEEP_ALL"] = "keep-all";
3697    })(WORD_BREAK || (WORD_BREAK = {}));
3698    var wordBreak = {
3699        name: 'word-break',
3700        initialValue: 'normal',
3701        prefix: false,
3702        type: PropertyDescriptorParsingType.IDENT_VALUE,
3703        parse: function (wordBreak) {
3704            switch (wordBreak) {
3705                case 'break-all':
3706                    return WORD_BREAK.BREAK_ALL;
3707                case 'keep-all':
3708                    return WORD_BREAK.KEEP_ALL;
3709                case 'normal':
3710                default:
3711                    return WORD_BREAK.NORMAL;
3712            }
3713        }
3714    };
3715
3716    var zIndex = {
3717        name: 'z-index',
3718        initialValue: 'auto',
3719        prefix: false,
3720        type: PropertyDescriptorParsingType.VALUE,
3721        parse: function (token) {
3722            if (token.type === TokenType.IDENT_TOKEN) {
3723                return { auto: true, order: 0 };
3724            }
3725            if (isNumberToken(token)) {
3726                return { auto: false, order: token.number };
3727            }
3728            throw new Error("Invalid z-index number parsed");
3729        }
3730    };
3731
3732    var opacity = {
3733        name: 'opacity',
3734        initialValue: '1',
3735        type: PropertyDescriptorParsingType.VALUE,
3736        prefix: false,
3737        parse: function (token) {
3738            if (isNumberToken(token)) {
3739                return token.number;
3740            }
3741            return 1;
3742        }
3743    };
3744
3745    var textDecorationColor = {
3746        name: "text-decoration-color",
3747        initialValue: 'transparent',
3748        prefix: false,
3749        type: PropertyDescriptorParsingType.TYPE_VALUE,
3750        format: 'color'
3751    };
3752
3753    var textDecorationLine = {
3754        name: 'text-decoration-line',
3755        initialValue: 'none',
3756        prefix: false,
3757        type: PropertyDescriptorParsingType.LIST,
3758        parse: function (tokens) {
3759            return tokens
3760                .filter(isIdentToken)
3761                .map(function (token) {
3762                switch (token.value) {
3763                    case 'underline':
3764                        return 1 /* UNDERLINE */;
3765                    case 'overline':
3766                        return 2 /* OVERLINE */;
3767                    case 'line-through':
3768                        return 3 /* LINE_THROUGH */;
3769                    case 'none':
3770                        return 4 /* BLINK */;
3771                }
3772                return 0 /* NONE */;
3773            })
3774                .filter(function (line) { return line !== 0 /* NONE */; });
3775        }
3776    };
3777
3778    var fontFamily = {
3779        name: "font-family",
3780        initialValue: '',
3781        prefix: false,
3782        type: PropertyDescriptorParsingType.LIST,
3783        parse: function (tokens) {
3784            return tokens.filter(isStringToken$1).map(function (token) { return token.value; });
3785        }
3786    };
3787    var isStringToken$1 = function (token) {
3788        return token.type === TokenType.STRING_TOKEN || token.type === TokenType.IDENT_TOKEN;
3789    };
3790
3791    var fontSize = {
3792        name: "font-size",
3793        initialValue: '0',
3794        prefix: false,
3795        type: PropertyDescriptorParsingType.TYPE_VALUE,
3796        format: 'length'
3797    };
3798
3799    var fontWeight = {
3800        name: 'font-weight',
3801        initialValue: 'normal',
3802        type: PropertyDescriptorParsingType.VALUE,
3803        prefix: false,
3804        parse: function (token) {
3805            if (isNumberToken(token)) {
3806                return token.number;
3807            }
3808            if (isIdentToken(token)) {
3809                switch (token.value) {
3810                    case 'bold':
3811                        return 700;
3812                    case 'normal':
3813                    default:
3814                        return 400;
3815                }
3816            }
3817            return 400;
3818        }
3819    };
3820
3821    var fontVariant = {
3822        name: 'font-variant',
3823        initialValue: 'none',
3824        type: PropertyDescriptorParsingType.LIST,
3825        prefix: false,
3826        parse: function (tokens) {
3827            return tokens.filter(isIdentToken).map(function (token) { return token.value; });
3828        }
3829    };
3830
3831    var FONT_STYLE;
3832    (function (FONT_STYLE) {
3833        FONT_STYLE["NORMAL"] = "normal";
3834        FONT_STYLE["ITALIC"] = "italic";
3835        FONT_STYLE["OBLIQUE"] = "oblique";
3836    })(FONT_STYLE || (FONT_STYLE = {}));
3837    var fontStyle = {
3838        name: 'font-style',
3839        initialValue: 'normal',
3840        prefix: false,
3841        type: PropertyDescriptorParsingType.IDENT_VALUE,
3842        parse: function (overflow) {
3843            switch (overflow) {
3844                case 'oblique':
3845                    return FONT_STYLE.OBLIQUE;
3846                case 'italic':
3847                    return FONT_STYLE.ITALIC;
3848                case 'normal':
3849                default:
3850                    return FONT_STYLE.NORMAL;
3851            }
3852        }
3853    };
3854
3855    var contains = function (bit, value) { return (bit & value) !== 0; };
3856
3857    var content = {
3858        name: 'content',
3859        initialValue: 'none',
3860        type: PropertyDescriptorParsingType.LIST,
3861        prefix: false,
3862        parse: function (tokens) {
3863            if (tokens.length === 0) {
3864                return [];
3865            }
3866            var first = tokens[0];
3867            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
3868                return [];
3869            }
3870            return tokens;
3871        }
3872    };
3873
3874    var counterIncrement = {
3875        name: 'counter-increment',
3876        initialValue: 'none',
3877        prefix: true,
3878        type: PropertyDescriptorParsingType.LIST,
3879        parse: function (tokens) {
3880            if (tokens.length === 0) {
3881                return null;
3882            }
3883            var first = tokens[0];
3884            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
3885                return null;
3886            }
3887            var increments = [];
3888            var filtered = tokens.filter(nonWhiteSpace);
3889            for (var i = 0; i < filtered.length; i++) {
3890                var counter = filtered[i];
3891                var next = filtered[i + 1];
3892                if (counter.type === TokenType.IDENT_TOKEN) {
3893                    var increment = next && isNumberToken(next) ? next.number : 1;
3894                    increments.push({ counter: counter.value, increment: increment });
3895                }
3896            }
3897            return increments;
3898        }
3899    };
3900
3901    var counterReset = {
3902        name: 'counter-reset',
3903        initialValue: 'none',
3904        prefix: true,
3905        type: PropertyDescriptorParsingType.LIST,
3906        parse: function (tokens) {
3907            if (tokens.length === 0) {
3908                return [];
3909            }
3910            var resets = [];
3911            var filtered = tokens.filter(nonWhiteSpace);
3912            for (var i = 0; i < filtered.length; i++) {
3913                var counter = filtered[i];
3914                var next = filtered[i + 1];
3915                if (isIdentToken(counter) && counter.value !== 'none') {
3916                    var reset = next && isNumberToken(next) ? next.number : 0;
3917                    resets.push({ counter: counter.value, reset: reset });
3918                }
3919            }
3920            return resets;
3921        }
3922    };
3923
3924    var quotes = {
3925        name: 'quotes',
3926        initialValue: 'none',
3927        prefix: true,
3928        type: PropertyDescriptorParsingType.LIST,
3929        parse: function (tokens) {
3930            if (tokens.length === 0) {
3931                return null;
3932            }
3933            var first = tokens[0];
3934            if (first.type === TokenType.IDENT_TOKEN && first.value === 'none') {
3935                return null;
3936            }
3937            var quotes = [];
3938            var filtered = tokens.filter(isStringToken);
3939            if (filtered.length % 2 !== 0) {
3940                return null;
3941            }
3942            for (var i = 0; i < filtered.length; i += 2) {
3943                var open_1 = filtered[i].value;
3944                var close_1 = filtered[i + 1].value;
3945                quotes.push({ open: open_1, close: close_1 });
3946            }
3947            return quotes;
3948        }
3949    };
3950    var getQuote = function (quotes, depth, open) {
3951        if (!quotes) {
3952            return '';
3953        }
3954        var quote = quotes[Math.min(depth, quotes.length - 1)];
3955        if (!quote) {
3956            return '';
3957        }
3958        return open ? quote.open : quote.close;
3959    };
3960
vendor: 6,956 bytes, lines 3961-4075
3961    var boxShadow = {
3962        name: 'box-shadow',
3963        initialValue: 'none',
3964        type: PropertyDescriptorParsingType.LIST,
3965        prefix: false,
3966        parse: function (tokens) {
3967            if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {
3968                return [];
3969            }
3970            return parseFunctionArgs(tokens).map(function (values) {
3971                var shadow = {
3972                    color: 0x000000ff,
3973                    offsetX: ZERO_LENGTH,
3974                    offsetY: ZERO_LENGTH,
3975                    blur: ZERO_LENGTH,
3976                    spread: ZERO_LENGTH,
3977                    inset: false
3978                };
3979                var c = 0;
3980                for (var i = 0; i < values.length; i++) {
3981                    var token = values[i];
3982                    if (isIdentWithValue(token, 'inset')) {
3983                        shadow.inset = true;
3984                    }
3985                    else if (isLength(token)) {
3986                        if (c === 0) {
3987                            shadow.offsetX = token;
3988                        }
3989                        else if (c === 1) {
3990                            shadow.offsetY = token;
3991                        }
3992                        else if (c === 2) {
3993                            shadow.blur = token;
3994                        }
3995                        else {
3996                            shadow.spread = token;
3997                        }
3998                        c++;
3999                    }
4000                    else {
4001                        shadow.color = color.parse(token);
4002                    }
4003                }
4004                return shadow;
4005            });
4006        }
4007    };
4008
4009    var CSSParsedDeclaration = /** @class */ (function () {
4010        function CSSParsedDeclaration(declaration) {
4011            this.backgroundClip = parse(backgroundClip, declaration.backgroundClip);
4012            this.backgroundColor = parse(backgroundColor, declaration.backgroundColor);
4013            this.backgroundImage = parse(backgroundImage, declaration.backgroundImage);
4014            this.backgroundOrigin = parse(backgroundOrigin, declaration.backgroundOrigin);
4015            this.backgroundPosition = parse(backgroundPosition, declaration.backgroundPosition);
4016            this.backgroundRepeat = parse(backgroundRepeat, declaration.backgroundRepeat);
4017            this.backgroundSize = parse(backgroundSize, declaration.backgroundSize);
4018            this.borderTopColor = parse(borderTopColor, declaration.borderTopColor);
4019            this.borderRightColor = parse(borderRightColor, declaration.borderRightColor);
4020            this.borderBottomColor = parse(borderBottomColor, declaration.borderBottomColor);
4021            this.borderLeftColor = parse(borderLeftColor, declaration.borderLeftColor);
4022            this.borderTopLeftRadius = parse(borderTopLeftRadius, declaration.borderTopLeftRadius);
4023            this.borderTopRightRadius = parse(borderTopRightRadius, declaration.borderTopRightRadius);
4024            this.borderBottomRightRadius = parse(borderBottomRightRadius, declaration.borderBottomRightRadius);
4025            this.borderBottomLeftRadius = parse(borderBottomLeftRadius, declaration.borderBottomLeftRadius);
4026            this.borderTopStyle = parse(borderTopStyle, declaration.borderTopStyle);
4027            this.borderRightStyle = parse(borderRightStyle, declaration.borderRightStyle);
4028            this.borderBottomStyle = parse(borderBottomStyle, declaration.borderBottomStyle);
4029            this.borderLeftStyle = parse(borderLeftStyle, declaration.borderLeftStyle);
4030            this.borderTopWidth = parse(borderTopWidth, declaration.borderTopWidth);
4031            this.borderRightWidth = parse(borderRightWidth, declaration.borderRightWidth);
4032            this.borderBottomWidth = parse(borderBottomWidth, declaration.borderBottomWidth);
4033            this.borderLeftWidth = parse(borderLeftWidth, declaration.borderLeftWidth);
4034            this.boxShadow = parse(boxShadow, declaration.boxShadow);
4035            this.color = parse(color$1, declaration.color);
4036            this.display = parse(display, declaration.display);
4037            this.float = parse(float, declaration.cssFloat);
4038            this.fontFamily = parse(fontFamily, declaration.fontFamily);
4039            this.fontSize = parse(fontSize, declaration.fontSize);
4040            this.fontStyle = parse(fontStyle, declaration.fontStyle);
4041            this.fontVariant = parse(fontVariant, declaration.fontVariant);
4042            this.fontWeight = parse(fontWeight, declaration.fontWeight);
4043            this.letterSpacing = parse(letterSpacing, declaration.letterSpacing);
4044            this.lineBreak = parse(lineBreak, declaration.lineBreak);
4045            this.lineHeight = parse(lineHeight, declaration.lineHeight);
4046            this.listStyleImage = parse(listStyleImage, declaration.listStyleImage);
4047            this.listStylePosition = parse(listStylePosition, declaration.listStylePosition);
4048            this.listStyleType = parse(listStyleType, declaration.listStyleType);
4049            this.marginTop = parse(marginTop, declaration.marginTop);
4050            this.marginRight = parse(marginRight, declaration.marginRight);
4051            this.marginBottom = parse(marginBottom, declaration.marginBottom);
4052            this.marginLeft = parse(marginLeft, declaration.marginLeft);
4053            this.opacity = parse(opacity, declaration.opacity);
4054            var overflowTuple = parse(overflow, declaration.overflow);
4055            this.overflowX = overflowTuple[0];
4056            this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];
4057            this.overflowWrap = parse(overflowWrap, declaration.overflowWrap);
4058            this.paddingTop = parse(paddingTop, declaration.paddingTop);
4059            this.paddingRight = parse(paddingRight, declaration.paddingRight);
4060            this.paddingBottom = parse(paddingBottom, declaration.paddingBottom);
4061            this.paddingLeft = parse(paddingLeft, declaration.paddingLeft);
4062            this.position = parse(position, declaration.position);
4063            this.textAlign = parse(textAlign, declaration.textAlign);
4064            this.textDecorationColor = parse(textDecorationColor, declaration.textDecorationColor || declaration.color);
4065            this.textDecorationLine = parse(textDecorationLine, declaration.textDecorationLine);
4066            this.textShadow = parse(textShadow, declaration.textShadow);
4067            this.textTransform = parse(textTransform, declaration.textTransform);
4068            this.transform = parse(transform, declaration.transform);
4069            this.transformOrigin = parse(transformOrigin, declaration.transformOrigin);
4070            this.visibility = parse(visibility, declaration.visibility);
4071            this.wordBreak = parse(wordBreak, declaration.wordBreak);
4072            this.zIndex = parse(zIndex, declaration.zIndex);
4073        }
4074        CSSParsedDeclaration.prototype.isVisible = function () {
4075            return this.display > 0 && this.opacity >
4075 0 && this.visibility === VISIBILITY.VISIBLE;
4076        };
4077        CSSParsedDeclaration.prototype.isTransparent = function () {
4078            return isTransparent(this.backgroundColor);
4079        };
4080        CSSParsedDeclaration.prototype.isTransformed = function () {
4081            return this.transform !== null;
4082        };
4083        CSSParsedDeclaration.prototype.isPositioned = function () {
4084            return this.position !== POSITION.STATIC;
4085        };
4086        CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () {
4087            return this.isPositioned() && !this.zIndex.auto;
4088        };
4089        CSSParsedDeclaration.prototype.isFloating = function () {
4090            return this.float !== FLOAT.NONE;
4091        };
4092        CSSParsedDeclaration.prototype.isInlineLevel = function () {
4093            return (contains(this.display, 4 /* INLINE */) ||
4094                contains(this.display, 33554432 /* INLINE_BLOCK */) ||
4095                contains(this.display, 268435456 /* INLINE_FLEX */) ||
4096                contains(this.display, 536870912 /* INLINE_GRID */) ||
4097                contains(this.display, 67108864 /* INLINE_LIST_ITEM */) ||
4098                contains(this.display, 134217728 /* INLINE_TABLE */));
4099        };
4100        return CSSParsedDeclaration;
4101    }());
4102    var CSSParsedPseudoDeclaration = /** @class */ (function () {
4103        function CSSParsedPseudoDeclaration(declaration) {
4104            this.content = parse(content, declaration.content);
4105            this.quotes = parse(quotes, declaration.quotes);
4106        }
4107        return CSSParsedPseudoDeclaration;
4108    }());
4109    var CSSParsedCounterDeclaration = /** @class */ (function () {
4110        function CSSParsedCounterDeclaration(declaration) {
4111            this.counterIncrement = parse(counterIncrement, declaration.counterIncrement);
4112            this.counterReset = parse(counterReset, declaration.counterReset);
4113        }
4114        return CSSParsedCounterDeclaration;
4115    }());
4116    // eslint-disable-next-line @typescript-eslint/no-explicit-any
4117    var parse = function (descriptor, style) {
4118        var tokenizer = new Tokenizer();
4119        var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;
4120        tokenizer.write(value);
4121        var parser = new Parser(tokenizer.read());
4122        switch (descriptor.type) {
4123            case PropertyDescriptorParsingType.IDENT_VALUE:
4124                var token = parser.parseComponentValue();
4125                return descriptor.parse(isIdentToken(token) ? token.value : descriptor.initialValue);
4126            case PropertyDescriptorParsingType.VALUE:
4127                return descriptor.parse(parser.parseComponentValue());
4128            case PropertyDescriptorParsingType.LIST:
4129                return descriptor.parse(parser.parseComponentValues());
4130            case PropertyDescriptorParsingType.TOKEN_VALUE:
4131                return parser.parseComponentValue();
4132            case PropertyDescriptorParsingType.TYPE_VALUE:
4133                switch (descriptor.format) {
4134                    case 'angle':
4135                        return angle.parse(parser.parseComponentValue());
4136                    case 'color':
4137                        return color.parse(parser.parseComponentValue());
4138                    case 'image':
4139                        return image.parse(parser.parseComponentValue());
4140                    case 'length':
4141                        var length_1 = parser.parseComponentValue();
4142                        return isLength(length_1) ? length_1 : ZERO_LENGTH;
4143                    case 'length-percentage':
4144                        var value_1 = parser.parseComponentValue();
4145                        return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH;
4146                }
4147        }
4148        throw new Error("Attempting to parse unsupported css format type " + descriptor.format);
4149    };
4150
4151    var ElementContainer = /** @class */ (function () {
4152        function ElementContainer(element) {
4153            this.styles = new CSSParsedDeclaration(window.getComputedStyle(element, null));
4154            this.textNodes = [];
4155            this.elements = [];
4156            if (this.styles.transform !== null && isHTMLElementNode(element)) {
4157                // getBoundingClientRect takes transforms into account
4158                element.style.transform = 'none';
4159            }
4160            this.bounds = parseBounds(element);
4161            this.flags = 0;
4162        }
4163        return ElementContainer;
4164    }());
4165
4166    var TextBounds = /** @class */ (function () {
4167        function TextBounds(text, bounds) {
4168            this.text = text;
4169            this.bounds = bounds;
4170        }
4171        return TextBounds;
4172    }());
4173    var parseTextBounds = function (value, styles, node) {
4174        var textList = breakText(value, styles);
4175        var textBounds = [];
4176        var offset = 0;
4177        textList.forEach(function (text) {
4178            if (styles.textDecorationLine.length || text.trim().length > 0) {
4179                if (FEATURES.SUPPORT_RANGE_BOUNDS) {
4180                    textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length)));
4181                }
4182                else {
4183                    var replacementNode = node.splitText(text.length);
4184                    textBounds.push(new TextBounds(text, getWrapperBounds(node)));
4185                    node = replacementNode;
4186                }
4187            }
4188            else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {
4189                node = node.splitText(text.length);
4190            }
4191            offset += text.length;
4192        });
4193        return textBounds;
4194    };
4195    var getWrapperBounds = function (node) {
4196        var ownerDocument = node.ownerDocument;
4197        if (ownerDocument) {
4198            var wrapper = ownerDocument.createElement('html2canvaswrapper');
4199            wrapper.appendChild(node.cloneNode(true));
4200            var parentNode = node.parentNode;
4201            if (parentNode) {
4202                parentNode.replaceChild(wrapper, node);
4203                var bounds = parseBounds(wrapper);
4204                if (wrapper.firstChild) {
4205                    parentNode.replaceChild(wrapper.firstChild, wrapper);
4206                }
4207                return bounds;
4208            }
4209        }
4210        return new Bounds(0, 0, 0, 0);
4211    };
4212    var getRangeBounds = function (node, offset, length) {
4213        var ownerDocument = node.ownerDocument;
4214        if (!ownerDocument) {
4215            throw new Error('Node has no owner document');
4216        }
4217        var range = ownerDocument.createRange();
4218        range.setStart(node, offset);
4219        range.setEnd(node, offset + length);
4220        return Bounds.fromClientRect(range.getBoundingClientRect());
4221    };
4222    var breakText = function (value, styles) {
4223        return styles.letterSpacing !== 0 ? toCodePoints(value).map(function (i) { return fromCodePoint(i); }) : breakWords(value, styles);
4224    };
4225    var breakWords = function (str, styles) {
4226        var breaker = LineBreaker(str, {
4227            lineBreak: styles.lineBreak,
vendor: 12,290 bytes, lines 4228-4511
4228            wordBreak: styles.overflowWrap === OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : styles.wordBreak
4229        });
4230        var words = [];
4231        var bk;
4232        while (!(bk = breaker.next()).done) {
4233            if (bk.value) {
4234                words.push(bk.value.slice());
4235            }
4236        }
4237        return words;
4238    };
4239
4240    var TextContainer = /** @class */ (function () {
4241        function TextContainer(node, styles) {
4242            this.text = transform$1(node.data, styles.textTransform);
4243            this.textBounds = parseTextBounds(this.text, styles, node);
4244        }
4245        return TextContainer;
4246    }());
4247    var transform$1 = function (text, transform) {
4248        switch (transform) {
4249            case TEXT_TRANSFORM.LOWERCASE:
4250                return text.toLowerCase();
4251            case TEXT_TRANSFORM.CAPITALIZE:
4252                return text.replace(CAPITALIZE, capitalize);
4253            case TEXT_TRANSFORM.UPPERCASE:
4254                return text.toUpperCase();
4255            default:
4256                return text;
4257        }
4258    };
4259    var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g;
4260    var capitalize = function (m, p1, p2) {
4261        if (m.length > 0) {
4262            return p1 + p2.toUpperCase();
4263        }
4264        return m;
4265    };
4266
4267    var ImageElementContainer = /** @class */ (function (_super) {
4268        __extends(ImageElementContainer, _super);
4269        function ImageElementContainer(img) {
4270            var _this = _super.call(this, img) || this;
4271            _this.src = img.currentSrc || img.src;
4272            _this.intrinsicWidth = img.naturalWidth;
4273            _this.intrinsicHeight = img.naturalHeight;
4274            CacheStorage.getInstance().addImage(_this.src);
4275            return _this;
4276        }
4277        return ImageElementContainer;
4278    }(ElementContainer));
4279
4280    var CanvasElementContainer = /** @class */ (function (_super) {
4281        __extends(CanvasElementContainer, _super);
4282        function CanvasElementContainer(canvas) {
4283            var _this = _super.call(this, canvas) || this;
4284            _this.canvas = canvas;
4285            _this.intrinsicWidth = canvas.width;
4286            _this.intrinsicHeight = canvas.height;
4287            return _this;
4288        }
4289        return CanvasElementContainer;
4290    }(ElementContainer));
4291
4292    var SVGElementContainer = /** @class */ (function (_super) {
4293        __extends(SVGElementContainer, _super);
4294        function SVGElementContainer(img) {
4295            var _this = _super.call(this, img) || this;
4296            var s = new XMLSerializer();
4297            _this.svg = "data:image/svg+xml," + encodeURIComponent(s.serializeToString(img));
4298            _this.intrinsicWidth = img.width.baseVal.value;
4299            _this.intrinsicHeight = img.height.baseVal.value;
4300            CacheStorage.getInstance().addImage(_this.svg);
4301            return _this;
4302        }
4303        return SVGElementContainer;
4304    }(ElementContainer));
4305
4306    var LIElementContainer = /** @class */ (function (_super) {
4307        __extends(LIElementContainer, _super);
4308        function LIElementContainer(element) {
4309            var _this = _super.call(this, element) || this;
4310            _this.value = element.value;
4311            return _this;
4312        }
4313        return LIElementContainer;
4314    }(ElementContainer));
4315
4316    var OLElementContainer = /** @class */ (function (_super) {
4317        __extends(OLElementContainer, _super);
4318        function OLElementContainer(element) {
4319            var _this = _super.call(this, element) || this;
4320            _this.start = element.start;
4321            _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;
4322            return _this;
4323        }
4324        return OLElementContainer;
4325    }(ElementContainer));
4326
4327    var CHECKBOX_BORDER_RADIUS = [
4328        {
4329            type: TokenType.DIMENSION_TOKEN,
4330            flags: 0,
4331            unit: 'px',
4332            number: 3
4333        }
4334    ];
4335    var RADIO_BORDER_RADIUS = [
4336        {
4337            type: TokenType.PERCENTAGE_TOKEN,
4338            flags: 0,
4339            number: 50
4340        }
4341    ];
4342    var reformatInputBounds = function (bounds) {
4343        if (bounds.width > bounds.height) {
4344            return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);
4345        }
4346        else if (bounds.width < bounds.height) {
4347            return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);
4348        }
4349        return bounds;
4350    };
4351    var getInputValue = function (node) {
4352        var value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\u2022') : node.value;
4353        return value.length === 0 ? node.placeholder || '' : value;
4354    };
4355    var CHECKBOX = 'checkbox';
4356    var RADIO = 'radio';
4357    var PASSWORD = 'password';
4358    var INPUT_COLOR = 0x2a2a2aff;
4359    var InputElementContainer = /** @class */ (function (_super) {
4360        __extends(InputElementContainer, _super);
4361        function InputElementContainer(input) {
4362            var _this = _super.call(this, input) || this;
4363            _this.type = input.type.toLowerCase();
4364            _this.checked = input.checked;
4365            _this.value = getInputValue(input);
4366            if (_this.type === CHECKBOX || _this.type === RADIO) {
4367                _this.styles.backgroundColor = 0xdededeff;
4368                _this.styles.borderTopColor = _this.styles.borderRightColor = _this.styles.borderBottomColor = _this.styles.borderLeftColor = 0xa5a5a5ff;
4369                _this.styles.borderTopWidth = _this.styles.borderRightWidth = _this.styles.borderBottomWidth = _this.styles.borderLeftWidth = 1;
4370                _this.styles.borderTopStyle = _this.styles.borderRightStyle = _this.styles.borderBottomStyle = _this.styles.borderLeftStyle =
4371                    BORDER_STYLE.SOLID;
4372                _this.styles.backgroundClip = [BACKGROUND_CLIP.BORDER_BOX];
4373                _this.styles.backgroundOrigin = [0 /* BORDER_BOX */];
4374                _this.bounds = reformatInputBounds(_this.bounds);
4375            }
4376            switch (_this.type) {
4377                case CHECKBOX:
4378                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = CHECKBOX_BORDER_RADIUS;
4379                    break;
4380                case RADIO:
4381                    _this.styles.borderTopRightRadius = _this.styles.borderTopLeftRadius = _this.styles.borderBottomRightRadius = _this.styles.borderBottomLeftRadius = RADIO_BORDER_RADIUS;
4382                    break;
4383            }
4384            return _this;
4385        }
4386        return InputElementContainer;
4387    }(ElementContainer));
4388
4389    var SelectElementContainer = /** @class */ (function (_super) {
4390        __extends(SelectElementContainer, _super);
4391        function SelectElementContainer(element) {
4392            var _this = _super.call(this, element) || this;
4393            var option = element.options[element.selectedIndex || 0];
4394            _this.value = option ? option.text || '' : '';
4395            return _this;
4396        }
4397        return SelectElementContainer;
4398    }(ElementContainer));
4399
4400    var TextareaElementContainer = /** @class */ (function (_super) {
4401        __extends(TextareaElementContainer, _super);
4402        function TextareaElementContainer(element) {
4403            var _this = _super.call(this, element) || this;
4404            _this.value = element.value;
4405            return _this;
4406        }
4407        return TextareaElementContainer;
4408    }(ElementContainer));
4409
4410    var parseColor = function (value) { return color.parse(Parser.create(value).parseComponentValue()); };
4411    var IFrameElementContainer = /** @class */ (function (_super) {
4412        __extends(IFrameElementContainer, _super);
4413        function IFrameElementContainer(iframe) {
4414            var _this = _super.call(this, iframe) || this;
4415            _this.src = iframe.src;
4416            _this.width = parseInt(iframe.width, 10) || 0;
4417            _this.height = parseInt(iframe.height, 10) || 0;
4418            _this.backgroundColor = _this.styles.backgroundColor;
4419            try {
4420                if (iframe.contentWindow &&
4421                    iframe.contentWindow.document &&
4422                    iframe.contentWindow.document.documentElement) {
4423                    _this.tree = parseTree(iframe.contentWindow.document.documentElement);
4424                    // http://www.w3.org/TR/css3-background/#special-backgrounds
4425                    var documentBackgroundColor = iframe.contentWindow.document.documentElement
4426                        ? parseColor(getComputedStyle(iframe.contentWindow.document.documentElement)
4427                            .backgroundColor)
4428                        : COLORS.TRANSPARENT;
4429                    var bodyBackgroundColor = iframe.contentWindow.document.body
4430                        ? parseColor(getComputedStyle(iframe.contentWindow.document.body).backgroundColor)
4431                        : COLORS.TRANSPARENT;
4432                    _this.backgroundColor = isTransparent(documentBackgroundColor)
4433                        ? isTransparent(bodyBackgroundColor)
4434                            ? _this.styles.backgroundColor
4435                            : bodyBackgroundColor
4436                        : documentBackgroundColor;
4437                }
4438            }
4439            catch (e) { }
4440            return _this;
4441        }
4442        return IFrameElementContainer;
4443    }(ElementContainer));
4444
4445    var LIST_OWNERS = ['OL', 'UL', 'MENU'];
4446    var parseNodeTree = function (node, parent, root) {
4447        for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) {
4448            nextNode = childNode.nextSibling;
4449            if (isTextNode(childNode) && childNode.data.trim().length > 0) {
4450                parent.textNodes.push(new TextContainer(childNode, parent.styles));
4451            }
4452            else if (isElementNode(childNode)) {
4453                var container = createContainer(childNode);
4454                if (container.styles.isVisible()) {
4455                    if (createsRealStackingContext(childNode, container, root)) {
4456                        container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;
4457                    }
4458                    else if (createsStackingContext(container.styles)) {
4459                        container.flags |= 2 /* CREATES_STACKING_CONTEXT */;
4460                    }
4461                    if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {
4462                        container.flags |= 8 /* IS_LIST_OWNER */;
4463                    }
4464                    parent.elements.push(container);
4465                    if (!isTextareaElement(childNode) && !isSVGElement(childNode) && !isSelectElement(childNode)) {
4466                        parseNodeTree(childNode, container, root);
4467                    }
4468                }
4469            }
4470        }
4471    };
4472    var createContainer = function (element) {
4473        if (isImageElement(element)) {
4474            return new ImageElementContainer(element);
4475        }
4476        if (isCanvasElement(element)) {
4477            return new CanvasElementContainer(element);
4478        }
4479        if (isSVGElement(element)) {
4480            return new SVGElementContainer(element);
4481        }
4482        if (isLIElement(element)) {
4483            return new LIElementContainer(element);
4484        }
4485        if (isOLElement(element)) {
4486            return new OLElementContainer(element);
4487        }
4488        if (isInputElement(element)) {
4489            return new InputElementContainer(element);
4490        }
4491        if (isSelectElement(element)) {
4492            return new SelectElementContainer(element);
4493        }
4494        if (isTextareaElement(element)) {
4495            return new TextareaElementContainer(element);
4496        }
4497        if (isIFrameElement(element)) {
4498            return new IFrameElementContainer(element);
4499        }
4500        return new ElementContainer(element);
4501    };
4502    var parseTree = function (element) {
4503        var container = createContainer(element);
4504        container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;
4505        parseNodeTree(element, container, container);
4506        return container;
4507    };
4508    var createsRealStackingContext = function (node, container, root) {
4509        return (container.styles.isPositionedWithZIndex() ||
4510            container.styles.opacity < 1 ||
4511            container.styles.isTransformed() ||
vendor: 9,813 bytes, lines 4512-4866
4512            (isBodyElement(node) && root.styles.isTransparent()));
4513    };
4514    var createsStackingContext = function (styles) { return styles.isPositioned() || styles.isFloating(); };
4515    var isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };
4516    var isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };
4517    var isHTMLElementNode = function (node) {
4518        return typeof node.style !== 'undefined';
4519    };
4520    var isLIElement = function (node) { return node.tagName === 'LI'; };
4521    var isOLElement = function (node) { return node.tagName === 'OL'; };
4522    var isInputElement = function (node) { return node.tagName === 'INPUT'; };
4523    var isHTMLElement = function (node) { return node.tagName === 'HTML'; };
4524    var isSVGElement = function (node) { return node.tagName === 'svg'; };
4525    var isBodyElement = function (node) { return node.tagName === 'BODY'; };
4526    var isCanvasElement = function (node) { return node.tagName === 'CANVAS'; };
4527    var isImageElement = function (node) { return node.tagName === 'IMG'; };
4528    var isIFrameElement = function (node) { return node.tagName === 'IFRAME'; };
4529    var isStyleElement = function (node) { return node.tagName === 'STYLE'; };
4530    var isScriptElement = function (node) { return node.tagName === 'SCRIPT'; };
4531    var isTextareaElement = function (node) { return node.tagName === 'TEXTAREA'; };
4532    var isSelectElement = function (node) { return node.tagName === 'SELECT'; };
4533
4534    var CounterState = /** @class */ (function () {
4535        function CounterState() {
4536            this.counters = {};
4537        }
4538        CounterState.prototype.getCounterValue = function (name) {
4539            var counter = this.counters[name];
4540            if (counter && counter.length) {
4541                return counter[counter.length - 1];
4542            }
4543            return 1;
4544        };
4545        CounterState.prototype.getCounterValues = function (name) {
4546            var counter = this.counters[name];
4547            return counter ? counter : [];
4548        };
4549        CounterState.prototype.pop = function (counters) {
4550            var _this = this;
4551            counters.forEach(function (counter) { return _this.counters[counter].pop(); });
4552        };
4553        CounterState.prototype.parse = function (style) {
4554            var _this = this;
4555            var counterIncrement = style.counterIncrement;
4556            var counterReset = style.counterReset;
4557            if (counterIncrement !== null) {
4558                counterIncrement.forEach(function (entry) {
4559                    var counter = _this.counters[entry.counter];
4560                    if (counter) {
4561                        counter[Math.max(0, counter.length - 1)] += entry.increment;
4562                    }
4563                });
4564            }
4565            var counterNames = [];
4566            counterReset.forEach(function (entry) {
4567                var counter = _this.counters[entry.counter];
4568                counterNames.push(entry.counter);
4569                if (!counter) {
4570                    counter = _this.counters[entry.counter] = [];
4571                }
4572                counter.push(entry.reset);
4573            });
4574            return counterNames;
4575        };
4576        return CounterState;
4577    }());
4578    var ROMAN_UPPER = {
4579        integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],
4580        values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
4581    };
4582    var ARMENIAN = {
4583        integers: [
4584            9000,
4585            8000,
4586            7000,
4587            6000,
4588            5000,
4589            4000,
4590            3000,
4591            2000,
4592            1000,
4593            900,
4594            800,
4595            700,
4596            600,
4597            500,
4598            400,
4599            300,
4600            200,
4601            100,
4602            90,
4603            80,
4604            70,
4605            60,
4606            50,
4607            40,
4608            30,
4609            20,
4610            10,
4611            9,
4612            8,
4613            7,
4614            6,
4615            5,
4616            4,
4617            3,
4618            2,
4619            1
4620        ],
4621        values: [
4622            'Ք',
4623            'Փ',
4624            'Ւ',
4625            'Ց',
4626            'Ր',
4627            'Տ',
4628            'Վ',
4629            'Ս',
4630            'Ռ',
4631            'Ջ',
4632            'Պ',
4633            'Չ',
4634            'Ո',
4635            'Շ',
4636            'Ն',
4637            'Յ',
4638            'Մ',
4639            'Ճ',
4640            'Ղ',
4641            'Ձ',
4642            'Հ',
4643            'Ô¿',
4644            'Ô¾',
4645            'Ô½',
4646            'Ô¼',
4647            'Ô»',
4648            'Ôº',
4649            'Ô¹',
4650            'Ô¸',
4651            'Ô·',
4652            'Ô¶',
4653            'Ôµ',
4654            'Ô´',
4655            'Ô³',
4656            'Ô²',
4657            'Ô±'
4658        ]
4659    };
4660    var HEBREW = {
4661        integers: [
4662            10000,
4663            9000,
4664            8000,
4665            7000,
4666            6000,
4667            5000,
4668            4000,
4669            3000,
4670            2000,
4671            1000,
4672            400,
4673            300,
4674            200,
4675            100,
4676            90,
4677            80,
4678            70,
4679            60,
4680            50,
4681            40,
4682            30,
4683            20,
4684            19,
4685            18,
4686            17,
4687            16,
4688            15,
4689            10,
4690            9,
4691            8,
4692            7,
4693            6,
4694            5,
4695            4,
4696            3,
4697            2,
4698            1
4699        ],
4700        values: [
4701            'י׳',
4702            'ט׳',
4703            'ח׳',
4704            'ז׳',
4705            'ו׳',
4706            'ה׳',
4707            'ד׳',
4708            'ג׳',
4709            'ב׳',
4710            'א׳',
4711            'ת',
4712            'ש',
4713            'ר',
4714            '×§',
4715            'צ',
4716            'פ',
4717            '×¢',
4718            'ס',
4719            '× ',
4720            'מ',
4721            'ל',
4722            'כ',
4723            'יט',
4724            'יח',
4725            'יז',
4726            'טז',
4727            'טו',
4728            'י',
4729            'ט',
4730            'ח',
4731            'ז',
4732            'ו',
4733            'ה',
4734            'ד',
4735            'ג',
4736            'ב',
4737            'א'
4738        ]
4739    };
4740    var GEORGIAN = {
4741        integers: [
4742            10000,
4743            9000,
4744            8000,
4745            7000,
4746            6000,
4747            5000,
4748            4000,
4749            3000,
4750            2000,
4751            1000,
4752            900,
4753            800,
4754            700,
4755            600,
4756            500,
4757            400,
4758            300,
4759            200,
4760            100,
4761            90,
4762            80,
4763            70,
4764            60,
4765            50,
4766            40,
4767            30,
4768            20,
4769            10,
4770            9,
4771            8,
4772            7,
4773            6,
4774            5,
4775            4,
4776            3,
4777            2,
4778            1
4779        ],
4780        values: [
4781            'ჵ',
4782            'ჰ',
4783            'ჯ',
4784            'ჴ',
4785            'ხ',
4786            'ჭ',
4787            'წ',
4788            'ძ',
4789            'ც',
4790            'ჩ',
4791            'შ',
4792            'ყ',
4793            'ღ',
4794            'ქ',
4795            'ფ',
4796            'ჳ',
4797            'ტ',
4798            'ს',
4799            'რ',
4800            'ჟ',
4801            'პ',
4802            'ო',
4803            'ჲ',
4804            'ნ',
4805            'მ',
4806            'ლ',
4807            'კ',
4808            'ი',
4809            'თ',
4810            'ჱ',
4811            'ზ',
4812            'ვ',
4813            'ე',
4814            'დ',
4815            'გ',
4816            'ბ',
4817            'ა'
4818        ]
4819    };
4820    var createAdditiveCounter = function (value, min, max, symbols, fallback, suffix) {
4821        if (value < min || value > max) {
4822            return createCounterText(value, fallback, suffix.length > 0);
4823        }
4824        return (symbols.integers.reduce(function (string, integer, index) {
4825            while (value >= integer) {
4826                value -= integer;
4827                string += symbols.values[index];
4828            }
4829            return string;
4830        }, '') + suffix);
4831    };
4832    var createCounterStyleWithSymbolResolver = function (value, codePointRangeLength, isNumeric, resolver) {
4833        var string = '';
4834        do {
4835            if (!isNumeric) {
4836                value--;
4837            }
4838            string = resolver(value) + string;
4839            value /= codePointRangeLength;
4840        } while (value * codePointRangeLength >= codePointRangeLength);
4841        return string;
4842    };
4843    var createCounterStyleFromRange = function (value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) {
4844        var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;
4845        return ((value < 0 ? '-' : '') +
4846            (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) {
4847                return fromCodePoint(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart);
4848            }) +
4849                suffix));
4850    };
4851    var createCounterStyleFromSymbols = function (value, symbols, suffix) {
4852        if (suffix === void 0) { suffix = '. '; }
4853        var codePointRangeLength = symbols.length;
4854        return (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) { return symbols[Math.floor(codePoint % codePointRangeLength)]; }) + suffix);
4855    };
4856    var CJK_ZEROS = 1 << 0;
4857    var CJK_TEN_COEFFICIENTS = 1 << 1;
4858    var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;
4859    var CJK_HUNDRED_COEFFICIENTS = 1 << 3;
4860    var createCJKCounter = function (value, numbers, multipliers, negativeSign, suffix, flags) {
4861        if (value < -9999 || value > 9999) {
4862            return createCounterText(value, LIST_STYLE_TYPE.CJK_DECIMAL, suffix.length > 0);
4863        }
4864        var tmp = Math.abs(value);
4865        var string = suffix;
4866        if (tmp === 0) {
4867            return numbers[0] + string;
4868        }
4869        for (var digit = 0; tmp > 0 && digit <= 4; digit++) {
4870            var coefficient = tmp % 10;
4871            if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {
4872                string = numbers[coefficient] + string;
4873            }
4874            else if (coefficient > 1 ||
4875                (coefficient === 1 && digit === 0) ||
4876                (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) ||
4877                (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) ||
4878                (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))) {
4879                string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string;
4880            }
4881            else if (coefficient === 1 && digit > 0) {
4882                string = multipliers[digit - 1] + string;
4883            }
4884            tmp = Math.floor(tmp / 10);
4885        }
4886        return (value < 0 ? negativeSign : '') + string;
4887    };
4888    var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';
4889    var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';
4890    var JAPANESE_NEGATIVE = 'マイナス';
4891    var KOREAN_NEGATIVE = '마이너스';
4892    var createCounterText = function (value, type, appendSuffix) {
4893        var defaultSuffix = appendSuffix ? '. ' : '';
4894        var cjkSuffix = appendSuffix ? '、' : '';
4895        var koreanSuffix = appendSuffix ? ', ' : '';
4896        var spaceSuffix = appendSuffix ? ' ' : '';
4897        switch (type) {
4898            case LIST_STYLE_TYPE.DISC:
4899                return '•' + spaceSuffix;
4900            case LIST_STYLE_TYPE.CIRCLE:
4901                return '◦' + spaceSuffix;
4902            case LIST_STYLE_TYPE.SQUARE:
4903                return '◾' + spaceSuffix;
4904            case LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO:
4905                var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);
4906                return string.length < 4 ? "0" + string : string;
4907            case LIST_STYLE_TYPE.CJK_DECIMAL:
4908                return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);
4909            case LIST_STYLE_TYPE.LOWER_ROMAN:
4910                return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();
4911            case LIST_STYLE_TYPE.UPPER_ROMAN:
4912                return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
4913            case LIST_STYLE_TYPE.LOWER_GREEK:
4914                return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);
4915            case LIST_STYLE_TYPE.LOWER_ALPHA:
4916                return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);
4917            case LIST_STYLE_TYPE.UPPER_ALPHA:
4918                return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);
4919            case LIST_STYLE_TYPE.ARABIC_INDIC:
4920                return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);
4921            case LIST_STYLE_TYPE.ARMENIAN:
4922            case LIST_STYLE_TYPE.UPPER_ARMENIAN:
4923                return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
4924            case LIST_STYLE_TYPE.LOWER_ARMENIAN:
4925                return createAdditiveCounter(value, 1, 9999, ARMENIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase();
4926            case LIST_STYLE_TYPE.BENGALI:
4927                return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);
4928            case LIST_STYLE_TYPE.CAMBODIAN:
4929            case LIST_STYLE_TYPE.KHMER:
4930                return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);
4931            case LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH:
4932                return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);
4933            case LIST_STYLE_TYPE.CJK_HEAVENLY_STEM:
4934                return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);
4935            case LIST_STYLE_TYPE.CJK_IDEOGRAPHIC:
4936            case LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL:
4937                return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
4938            case LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL:
4939                return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
4940            case LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL:
4941                return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
4942            case LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL:
4943                return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);
4944            case LIST_STYLE_TYPE.JAPANESE_INFORMAL:
4945                return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);
4946            case LIST_STYLE_TYPE.JAPANESE_FORMAL:
4947                return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
4948            case LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL:
4949                return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
4950            case LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL:
4951                return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);
4952            case LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL:
4953                return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);
4954            case LIST_STYLE_TYPE.DEVANAGARI:
4955                return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);
4956            case LIST_STYLE_TYPE.GEORGIAN:
4957                return createAdditiveCounter(value, 1, 19999, GEORGIAN, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
4958            case LIST_STYLE_TYPE.GUJARATI:
4959                return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);
4960            case LIST_STYLE_TYPE.GURMUKHI:
4961                return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);
4962            case LIST_STYLE_TYPE.HEBREW:
4963                return createAdditiveCounter(value, 1, 10999, HEBREW, LIST_STYLE_TYPE.DECIMAL, defaultSuffix);
4964            case LIST_STYLE_TYPE.HIRAGANA:
4965                return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん');
4966            case LIST_STYLE_TYPE.HIRAGANA_IROHA:
4967                return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす');
4968            case LIST_STYLE_TYPE.KANNADA:
4969                return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);
vendor: 22,988 bytes, lines 4970-5414
4970            case LIST_STYLE_TYPE.KATAKANA:
4971                return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix);
4972            case LIST_STYLE_TYPE.KATAKANA_IROHA:
4973                return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix);
4974            case LIST_STYLE_TYPE.LAO:
4975                return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);
4976            case LIST_STYLE_TYPE.MONGOLIAN:
4977                return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);
4978            case LIST_STYLE_TYPE.MYANMAR:
4979                return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);
4980            case LIST_STYLE_TYPE.ORIYA:
4981                return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);
4982            case LIST_STYLE_TYPE.PERSIAN:
4983                return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);
4984            case LIST_STYLE_TYPE.TAMIL:
4985                return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);
4986            case LIST_STYLE_TYPE.TELUGU:
4987                return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);
4988            case LIST_STYLE_TYPE.THAI:
4989                return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);
4990            case LIST_STYLE_TYPE.TIBETAN:
4991                return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);
4992            case LIST_STYLE_TYPE.DECIMAL:
4993            default:
4994                return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);
4995        }
4996    };
4997
4998    var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';
4999    var DocumentCloner = /** @class */ (function () {
5000        function DocumentCloner(element, options) {
5001            this.options = options;
5002            this.scrolledElements = [];
5003            this.referenceElement = element;
5004            this.counters = new CounterState();
5005            this.quoteDepth = 0;
5006            if (!element.ownerDocument) {
5007                throw new Error('Cloned element does not have an owner document');
5008            }
5009            this.documentElement = this.cloneNode(element.ownerDocument.documentElement);
5010        }
5011        DocumentCloner.prototype.toIFrame = function (ownerDocument, windowSize) {
5012            var _this = this;
5013            var iframe = createIFrameContainer(ownerDocument, windowSize);
5014            if (!iframe.contentWindow) {
5015                return Promise.reject("Unable to find iframe window");
5016            }
5017            var scrollX = ownerDocument.defaultView.pageXOffset;
5018            var scrollY = ownerDocument.defaultView.pageYOffset;
5019            var cloneWindow = iframe.contentWindow;
5020            var documentClone = cloneWindow.document;
5021            /* Chrome doesn't detect relative background-images assigned in inline <style> sheets when fetched through getComputedStyle
5022             if window url is about:blank, we can assign the url to current by writing onto the document
5023             */
5024            var iframeLoad = iframeLoader(iframe).then(function () {
5025                _this.scrolledElements.forEach(restoreNodeScroll);
5026                if (cloneWindow) {
5027                    cloneWindow.scrollTo(windowSize.left, windowSize.top);
5028                    if (/(iPad|iPhone|iPod)/g.test(navigator.userAgent) &&
5029                        (cloneWindow.scrollY !== windowSize.top || cloneWindow.scrollX !== windowSize.left)) {
5030                        documentClone.documentElement.style.top = -windowSize.top + 'px';
5031                        documentClone.documentElement.style.left = -windowSize.left + 'px';
5032                        documentClone.documentElement.style.position = 'absolute';
5033                    }
5034                }
5035                var onclone = _this.options.onclone;
5036                if (typeof _this.clonedReferenceElement === 'undefined') {
5037                    return Promise.reject("Error finding the " + _this.referenceElement.nodeName + " in the cloned document");
5038                }
5039                if (typeof onclone === 'function') {
5040                    return Promise.resolve()
5041                        .then(function () { return onclone(documentClone); })
5042                        .then(function () { return iframe; });
5043                }
5044                return iframe;
5045            });
5046            documentClone.open();
5047            documentClone.write(serializeDoctype(document.doctype) + "<html></html>");
5048            // Chrome scrolls the parent document for some reason after the write to the cloned window???
5049            restoreOwnerScroll(this.referenceElement.ownerDocument, scrollX, scrollY);
5050            documentClone.replaceChild(documentClone.adoptNode(this.documentElement), documentClone.documentElement);
5051            documentClone.close();
5052            return iframeLoad;
5053        };
5054        DocumentCloner.prototype.createElementClone = function (node) {
5055            if (isCanvasElement(node)) {
5056                return this.createCanvasClone(node);
5057            }
5058            /*
5059            if (isIFrameElement(node)) {
5060                return this.createIFrameClone(node);
5061            }
5062    */
5063            if (isStyleElement(node)) {
5064                return this.createStyleClone(node);
5065            }
5066            return node.cloneNode(false);
5067        };
5068        DocumentCloner.prototype.createStyleClone = function (node) {
5069            try {
5070                var sheet = node.sheet;
5071                if (sheet && sheet.cssRules) {
5072                    var css = [].slice.call(sheet.cssRules, 0).reduce(function (css, rule) {
5073                        if (rule && typeof rule.cssText === 'string') {
5074                            return css + rule.cssText;
5075                        }
5076                        return css;
5077                    }, '');
5078                    var style = node.cloneNode(false);
5079                    style.textContent = css;
5080                    return style;
5081                }
5082            }
5083            catch (e) {
5084                // accessing node.sheet.cssRules throws a DOMException
5085                Logger.getInstance(this.options.id).error('Unable to access cssRules property', e);
5086                if (e.name !== 'SecurityError') {
5087                    throw e;
5088                }
5089            }
5090            return node.cloneNode(false);
5091        };
5092        DocumentCloner.prototype.createCanvasClone = function (canvas) {
5093            if (this.options.inlineImages && canvas.ownerDocument) {
5094                var img = canvas.ownerDocument.createElement('img');
5095                try {
5096                    img.src = canvas.toDataURL();
5097                    return img;
5098                }
5099                catch (e) {
5100                    Logger.getInstance(this.options.id).info("Unable to clone canvas contents, canvas is tainted");
5101                }
5102            }
5103            var clonedCanvas = canvas.cloneNode(false);
5104            try {
5105                clonedCanvas.width = canvas.width;
5106                clonedCanvas.height = canvas.height;
5107                var ctx = canvas.getContext('2d');
5108                var clonedCtx = clonedCanvas.getContext('2d');
5109                if (clonedCtx) {
5110                    if (ctx) {
5111                        clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0);
5112                    }
5113                    else {
5114                        clonedCtx.drawImage(canvas, 0, 0);
5115                    }
5116                }
5117                return clonedCanvas;
5118            }
5119            catch (e) { }
5120            return clonedCanvas;
5121        };
5122        /*
5123        createIFrameClone(iframe: HTMLIFrameElement) {
5124            const tempIframe = <HTMLIFrameElement>iframe.cloneNode(false);
5125            const iframeKey = generateIframeKey();
5126            tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey);
5127
5128            const {width, height} = parseBounds(iframe);
5129
5130            this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(iframe, this.options)
5131                .then(documentElement => {
5132                    return this.renderer(
5133                        documentElement,
5134                        {
5135                            allowTaint: this.options.allowTaint,
5136                            backgroundColor: '#ffffff',
5137                            canvas: null,
5138                            imageTimeout: this.options.imageTimeout,
5139                            logging: this.options.logging,
5140                            proxy: this.options.proxy,
5141                            removeContainer: this.options.removeContainer,
5142                            scale: this.options.scale,
5143                            foreignObjectRendering: this.options.foreignObjectRendering,
5144                            useCORS: this.options.useCORS,
5145                            target: new CanvasRenderer(),
5146                            width,
5147                            height,
5148                            x: 0,
5149                            y: 0,
5150                            windowWidth: documentElement.ownerDocument.defaultView.innerWidth,
5151                            windowHeight: documentElement.ownerDocument.defaultView.innerHeight,
5152                            scrollX: documentElement.ownerDocument.defaultView.pageXOffset,
5153                            scrollY: documentElement.ownerDocument.defaultView.pageYOffset
5154                        },
5155                    );
5156                })
5157                .then(
5158                    (canvas: HTMLCanvasElement) =>
5159                        new Promise((resolve, reject) => {
5160                            const iframeCanvas = document.createElement('img');
5161                            iframeCanvas.onload = () => resolve(canvas);
5162                            iframeCanvas.onerror = (event) => {
5163                                // Empty iframes may result in empty "data:," URLs, which are invalid from the <img>'s point of view
5164                                // and instead of `onload` cause `onerror` and unhandled rejection warnings
5165                                // https://github.com/niklasvh/html2canvas/issues/1502
5166                                iframeCanvas.src == 'data:,' ? resolve(canvas) : reject(event);
5167                            };
5168                            iframeCanvas.src = canvas.toDataURL();
5169                            if (tempIframe.parentNode && iframe.ownerDocument && iframe.ownerDocument.defaultView) {
5170                                tempIframe.parentNode.replaceChild(
5171                                    copyCSSStyles(
5172                                        iframe.ownerDocument.defaultView.getComputedStyle(iframe),
5173                                        iframeCanvas
5174                                    ),
5175                                    tempIframe
5176                                );
5177                            }
5178                        })
5179                );
5180            return tempIframe;
5181        }
5182    */
5183        DocumentCloner.prototype.cloneNode = function (node) {
5184            if (isTextNode(node)) {
5185                return document.createTextNode(node.data);
5186            }
5187            if (!node.ownerDocument) {
5188                return node.cloneNode(false);
5189            }
5190            var window = node.ownerDocument.defaultView;
5191            if (isHTMLElementNode(node) && window) {
5192                var clone = this.createElementClone(node);
5193                var style = window.getComputedStyle(node);
5194                var styleBefore = window.getComputedStyle(node, ':before');
5195                var styleAfter = window.getComputedStyle(node, ':after');
5196                if (this.referenceElement === node) {
5197                    this.clonedReferenceElement = clone;
5198                }
5199                if (isBodyElement(clone)) {
5200                    createPseudoHideStyles(clone);
5201                }
5202                var counters = this.counters.parse(new CSSParsedCounterDeclaration(style));
5203                var before_1 = this.resolvePseudoContent(node, clone, styleBefore, PseudoElementType.BEFORE);
5204                for (var child = node.firstChild; child; child = child.nextSibling) {
5205                    if (!isElementNode(child) ||
5206                        (!isScriptElement(child) &&
5207                            !child.hasAttribute(IGNORE_ATTRIBUTE) &&
5208                            (typeof this.options.ignoreElements !== 'function' || !this.options.ignoreElements(child)))) {
5209                        if (!this.options.copyStyles || !isElementNode(child) || !isStyleElement(child)) {
5210                            clone.appendChild(this.cloneNode(child));
5211                        }
5212                    }
5213                }
5214                if (before_1) {
5215                    clone.insertBefore(before_1, clone.firstChild);
5216                }
5217                var after_1 = this.resolvePseudoContent(node, clone, styleAfter, PseudoElementType.AFTER);
5218                if (after_1) {
5219                    clone.appendChild(after_1);
5220                }
5221                this.counters.pop(counters);
5222                if (style && this.options.copyStyles && !isIFrameElement(node)) {
5223                    copyCSSStyles(style, clone);
5224                }
5225                //this.inlineAllImages(clone);
5226                if (node.scrollTop !== 0 || node.scrollLeft !== 0) {
5227                    this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]);
5228                }
5229                if ((isTextareaElement(node) || isSelectElement(node)) &&
5230                    (isTextareaElement(clone) || isSelectElement(clone))) {
5231                    clone.value = node.value;
5232                }
5233                return clone;
5234            }
5235            return node.cloneNode(false);
5236        };
5237        DocumentCloner.prototype.resolvePseudoContent = function (node, clone, style, pseudoElt) {
5238            var _this = this;
5239            if (!style) {
5240                return;
5241            }
5242            var value = style.content;
5243            var document = clone.ownerDocument;
5244            if (!document || !value || value === 'none' || value === '-moz-alt-content' || style.display === 'none') {
5245                return;
5246            }
5247            this.counters.parse(new CSSParsedCounterDeclaration(style));
5248            var declaration = new CSSParsedPseudoDeclaration(style);
5249            var anonymousReplacedElement = document.createElement('html2canvaspseudoelement');
5250            copyCSSStyles(style, anonymousReplacedElement);
5251            declaration.content.forEach(function (token) {
5252                if (token.type === TokenType.STRING_TOKEN) {
5253                    anonymousReplacedElement.appendChild(document.createTextNode(token.value));
5254                }
5255                else if (token.type === TokenType.URL_TOKEN) {
5256                    var img = document.createElement('img');
5257                    img.src = token.value;
5258                    img.style.opacity = '1';
5259                    anonymousReplacedElement.appendChild(img);
5260                }
5261                else if (token.type === TokenType.FUNCTION) {
5262                    if (token.name === 'attr') {
5263                        var attr = token.values.filter(isIdentToken);
5264                        if (attr.length) {
5265                            anonymousReplacedElement.appendChild(document.createTextNode(node.getAttribute(attr[0].value) || ''));
5266                        }
5267                    }
5268                    else if (token.name === 'counter') {
5269                        var _a = token.values.filter(nonFunctionArgSeparator), counter = _a[0], counterStyle = _a[1];
5270                        if (counter && isIdentToken(counter)) {
5271                            var counterState = _this.counters.getCounterValue(counter.value);
5272                            var counterType = counterStyle && isIdentToken(counterStyle)
5273                                ? listStyleType.parse(counterStyle.value)
5274                                : LIST_STYLE_TYPE.DECIMAL;
5275                            anonymousReplacedElement.appendChild(document.createTextNode(createCounterText(counterState, counterType, false)));
5276                        }
5277                    }
5278                    else if (token.name === 'counters') {
5279                        var _b = token.values.filter(nonFunctionArgSeparator), counter = _b[0], delim = _b[1], counterStyle = _b[2];
5280                        if (counter && isIdentToken(counter)) {
5281                            var counterStates = _this.counters.getCounterValues(counter.value);
5282                            var counterType_1 = counterStyle && isIdentToken(counterStyle)
5283                                ? listStyleType.parse(counterStyle.value)
5284                                : LIST_STYLE_TYPE.DECIMAL;
5285                            var separator = delim && delim.type === TokenType.STRING_TOKEN ? delim.value : '';
5286                            var text = counterStates
5287                                .map(function (value) { return createCounterText(value, counterType_1, false); })
5288                                .join(separator);
5289                            anonymousReplacedElement.appendChild(document.createTextNode(text));
5290                        }
5291                    }
5292                }
5293                else if (token.type === TokenType.IDENT_TOKEN) {
5294                    switch (token.value) {
5295                        case 'open-quote':
5296                            anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, _this.quoteDepth++, true)));
5297                            break;
5298                        case 'close-quote':
5299                            anonymousReplacedElement.appendChild(document.createTextNode(getQuote(declaration.quotes, --_this.quoteDepth, false)));
5300                            break;
5301                        default:
5302                        //    console.log('ident', token, declaration);
5303                    }
5304                }
5305            });
5306            anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + " " + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
5307            clone.className +=
5308                pseudoElt === PseudoElementType.BEFORE
5309                    ? " " + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE
5310                    : " " + PSEUDO_HIDE_ELEMENT_CLASS_AFTER;
5311            return anonymousReplacedElement;
5312        };
5313        return DocumentCloner;
5314    }());
5315    var PseudoElementType;
5316    (function (PseudoElementType) {
5317        PseudoElementType[PseudoElementType["BEFORE"] = 0] = "BEFORE";
5318        PseudoElementType[PseudoElementType["AFTER"] = 1] = "AFTER";
5319    })(PseudoElementType || (PseudoElementType = {}));
5320    var createIFrameContainer = function (ownerDocument, bounds) {
5321        var cloneIframeContainer = ownerDocument.createElement('iframe');
5322        cloneIframeContainer.className = 'html2canvas-container';
5323        cloneIframeContainer.style.visibility = 'hidden';
5324        cloneIframeContainer.style.position = 'fixed';
5325        cloneIframeContainer.style.left = '-10000px';
5326        cloneIframeContainer.style.top = '0px';
5327        cloneIframeContainer.style.border = '0';
5328        cloneIframeContainer.width = bounds.width.toString();
5329        cloneIframeContainer.height = bounds.height.toString();
5330        cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it
5331        cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true');
5332        ownerDocument.body.appendChild(cloneIframeContainer);
5333        return cloneIframeContainer;
5334    };
5335    var iframeLoader = function (iframe) {
5336        return new Promise(function (resolve, reject) {
5337            var cloneWindow = iframe.contentWindow;
5338            if (!cloneWindow) {
5339                return reject("No window assigned for iframe");
5340            }
5341            var documentClone = cloneWindow.document;
5342            cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = function () {
5343                cloneWindow.onload = iframe.onload = documentClone.onreadystatechange = null;
5344                var interval = setInterval(function () {
5345                    if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') {
5346                        clearInterval(interval);
5347                        resolve(iframe);
5348                    }
5349                }, 50);
5350            };
5351        });
5352    };
5353    var copyCSSStyles = function (style, target) {
5354        // Edge does not provide value for cssText
5355        for (var i = style.length - 1; i >= 0; i--) {
5356            var property = style.item(i);
5357            // Safari shows pseudoelements if content is set
5358            if (property !== 'content') {
5359                target.style.setProperty(property, style.getPropertyValue(property));
5360            }
5361        }
5362        return target;
5363    };
5364    var serializeDoctype = function (doctype) {
5365        var str = '';
5366        if (doctype) {
5367            str += '<!DOCTYPE ';
5368            if (doctype.name) {
5369                str += doctype.name;
5370            }
5371            if (doctype.internalSubset) {
5372                str += doctype.internalSubset;
5373            }
5374            if (doctype.publicId) {
5375                str += "\"" + doctype.publicId + "\"";
5376            }
5377            if (doctype.systemId) {
5378                str += "\"" + doctype.systemId + "\"";
5379            }
5380            str += '>';
5381        }
5382        return str;
5383    };
5384    var restoreOwnerScroll = function (ownerDocument, x, y) {
5385        if (ownerDocument &&
5386            ownerDocument.defaultView &&
5387            (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) {
5388            ownerDocument.defaultView.scrollTo(x, y);
5389        }
5390    };
5391    var restoreNodeScroll = function (_a) {
5392        var element = _a[0], x = _a[1], y = _a[2];
5393        element.scrollLeft = x;
5394        element.scrollTop = y;
5395    };
5396    var PSEUDO_BEFORE = ':before';
5397    var PSEUDO_AFTER = ':after';
5398    var PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before';
5399    var PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after';
5400    var PSEUDO_HIDE_ELEMENT_STYLE = "{\n    content: \"\" !important;\n    display: none !important;\n}";
5401    var createPseudoHideStyles = function (body) {
5402        createStyles(body, "." + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + "\n         ." + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE);
5403    };
5404    var createStyles = function (body, styles) {
5405        var document = body.ownerDocument;
5406        if (document) {
5407            var style = document.createElement('style');
5408            style.textContent = styles;
5409            body.appendChild(style);
5410        }
5411    };
5412
5413    var PathType;
5414    (function (PathType) {
vendor: 11,536 bytes, lines 5415-5614
5415        PathType[PathType["VECTOR"] = 0] = "VECTOR";
5416        PathType[PathType["BEZIER_CURVE"] = 1] = "BEZIER_CURVE";
5417    })(PathType || (PathType = {}));
5418    var equalPath = function (a, b) {
5419        if (a.length === b.length) {
5420            return a.some(function (v, i) { return v === b[i]; });
5421        }
5422        return false;
5423    };
5424    var transformPath = function (path, deltaX, deltaY, deltaW, deltaH) {
5425        return path.map(function (point, index) {
5426            switch (index) {
5427                case 0:
5428                    return point.add(deltaX, deltaY);
5429                case 1:
5430                    return point.add(deltaX + deltaW, deltaY);
5431                case 2:
5432                    return point.add(deltaX + deltaW, deltaY + deltaH);
5433                case 3:
5434                    return point.add(deltaX, deltaY + deltaH);
5435            }
5436            return point;
5437        });
5438    };
5439
5440    var Vector = /** @class */ (function () {
5441        function Vector(x, y) {
5442            this.type = PathType.VECTOR;
5443            this.x = x;
5444            this.y = y;
5445        }
5446        Vector.prototype.add = function (deltaX, deltaY) {
5447            return new Vector(this.x + deltaX, this.y + deltaY);
5448        };
5449        return Vector;
5450    }());
5451
5452    var lerp = function (a, b, t) {
5453        return new Vector(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t);
5454    };
5455    var BezierCurve = /** @class */ (function () {
5456        function BezierCurve(start, startControl, endControl, end) {
5457            this.type = PathType.BEZIER_CURVE;
5458            this.start = start;
5459            this.startControl = startControl;
5460            this.endControl = endControl;
5461            this.end = end;
5462        }
5463        BezierCurve.prototype.subdivide = function (t, firstHalf) {
5464            var ab = lerp(this.start, this.startControl, t);
5465            var bc = lerp(this.startControl, this.endControl, t);
5466            var cd = lerp(this.endControl, this.end, t);
5467            var abbc = lerp(ab, bc, t);
5468            var bccd = lerp(bc, cd, t);
5469            var dest = lerp(abbc, bccd, t);
5470            return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end);
5471        };
5472        BezierCurve.prototype.add = function (deltaX, deltaY) {
5473            return new BezierCurve(this.start.add(deltaX, deltaY), this.startControl.add(deltaX, deltaY), this.endControl.add(deltaX, deltaY), this.end.add(deltaX, deltaY));
5474        };
5475        BezierCurve.prototype.reverse = function () {
5476            return new BezierCurve(this.end, this.endControl, this.startControl, this.start);
5477        };
5478        return BezierCurve;
5479    }());
5480    var isBezierCurve = function (path) { return path.type === PathType.BEZIER_CURVE; };
5481
5482    var BoundCurves = /** @class */ (function () {
5483        function BoundCurves(element) {
5484            var styles = element.styles;
5485            var bounds = element.bounds;
5486            var _a = getAbsoluteValueForTuple(styles.borderTopLeftRadius, bounds.width, bounds.height), tlh = _a[0], tlv = _a[1];
5487            var _b = getAbsoluteValueForTuple(styles.borderTopRightRadius, bounds.width, bounds.height), trh = _b[0], trv = _b[1];
5488            var _c = getAbsoluteValueForTuple(styles.borderBottomRightRadius, bounds.width, bounds.height), brh = _c[0], brv = _c[1];
5489            var _d = getAbsoluteValueForTuple(styles.borderBottomLeftRadius, bounds.width, bounds.height), blh = _d[0], blv = _d[1];
5490            var factors = [];
5491            factors.push((tlh + trh) / bounds.width);
5492            factors.push((blh + brh) / bounds.width);
5493            factors.push((tlv + blv) / bounds.height);
5494            factors.push((trv + brv) / bounds.height);
5495            var maxFactor = Math.max.apply(Math, factors);
5496            if (maxFactor > 1) {
5497                tlh /= maxFactor;
5498                tlv /= maxFactor;
5499                trh /= maxFactor;
5500                trv /= maxFactor;
5501                brh /= maxFactor;
5502                brv /= maxFactor;
5503                blh /= maxFactor;
5504                blv /= maxFactor;
5505            }
5506            var topWidth = bounds.width - trh;
5507            var rightHeight = bounds.height - brv;
5508            var bottomWidth = bounds.width - brh;
5509            var leftHeight = bounds.height - blv;
5510            var borderTopWidth = styles.borderTopWidth;
5511            var borderRightWidth = styles.borderRightWidth;
5512            var borderBottomWidth = styles.borderBottomWidth;
5513            var borderLeftWidth = styles.borderLeftWidth;
5514            var paddingTop = getAbsoluteValue(styles.paddingTop, element.bounds.width);
5515            var paddingRight = getAbsoluteValue(styles.paddingRight, element.bounds.width);
5516            var paddingBottom = getAbsoluteValue(styles.paddingBottom, element.bounds.width);
5517            var paddingLeft = getAbsoluteValue(styles.paddingLeft, element.bounds.width);
5518            this.topLeftBorderBox =
5519                tlh > 0 || tlv > 0
5520                    ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT)
5521                    : new Vector(bounds.left, bounds.top);
5522            this.topRightBorderBox =
5523                trh > 0 || trv > 0
5524                    ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT)
5525                    : new Vector(bounds.left + bounds.width, bounds.top);
5526            this.bottomRightBorderBox =
5527                brh > 0 || brv > 0
5528                    ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT)
5529                    : new Vector(bounds.left + bounds.width, bounds.top + bounds.height);
5530            this.bottomLeftBorderBox =
5531                blh > 0 || blv > 0
5532                    ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT)
5533                    : new Vector(bounds.left, bounds.top + bounds.height);
5534            this.topLeftPaddingBox =
5535                tlh > 0 || tlv > 0
5536                    ? getCurvePoints(bounds.left + borderLeftWidth, bounds.top + borderTopWidth, Math.max(0, tlh - borderLeftWidth), Math.max(0, tlv - borderTopWidth), CORNER.TOP_LEFT)
5537                    : new Vector(bounds.left + borderLeftWidth, bounds.top + borderTopWidth);
5538            this.topRightPaddingBox =
5539                trh > 0 || trv > 0
5540                    ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth), bounds.top + borderTopWidth, topWidth > bounds.width + borderLeftWidth ? 0 : trh - borderLeftWidth, trv - borderTopWidth, CORNER.TOP_RIGHT)
5541                    : new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + borderTopWidth);
5542            this.bottomRightPaddingBox =
5543                brh > 0 || brv > 0
5544                    ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borderLeftWidth), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth), Math.max(0, brh - borderRightWidth), brv - borderBottomWidth, CORNER.BOTTOM_RIGHT)
5545                    : new Vector(bounds.left + bounds.width - borderRightWidth, bounds.top + bounds.height - borderBottomWidth);
5546            this.bottomLeftPaddingBox =
5547                blh > 0 || blv > 0
5548                    ? getCurvePoints(bounds.left + borderLeftWidth, bounds.top + leftHeight, Math.max(0, blh - borderLeftWidth), blv - borderBottomWidth, CORNER.BOTTOM_LEFT)
5549                    : new Vector(bounds.left + borderLeftWidth, bounds.top + bounds.height - borderBottomWidth);
5550            this.topLeftContentBox =
5551                tlh > 0 || tlv > 0
5552                    ? getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop, Math.max(0, tlh - (borderLeftWidth + paddingLeft)), Math.max(0, tlv - (borderTopWidth + paddingTop)), CORNER.TOP_LEFT)
5553                    : new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + borderTopWidth + paddingTop);
5554            this.topRightContentBox =
5555                trh > 0 || trv > 0
5556                    ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borderLeftWidth + paddingLeft), bounds.top + borderTopWidth + paddingTop, topWidth > bounds.width + borderLeftWidth + paddingLeft ? 0 : trh - borderLeftWidth + paddingLeft, trv - (borderTopWidth + paddingTop), CORNER.TOP_RIGHT)
5557                    : new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + borderTopWidth + paddingTop);
5558            this.bottomRightContentBox =
5559                brh > 0 || brv > 0
5560                    ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - (borderLeftWidth + paddingLeft)), bounds.top + Math.min(rightHeight, bounds.height + borderTopWidth + paddingTop), Math.max(0, brh - (borderRightWidth + paddingRight)), brv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_RIGHT)
5561                    : new Vector(bounds.left + bounds.width - (borderRightWidth + paddingRight), bounds.top + bounds.height - (borderBottomWidth + paddingBottom));
5562            this.bottomLeftContentBox =
5563                blh > 0 || blv > 0
5564                    ? getCurvePoints(bounds.left + borderLeftWidth + paddingLeft, bounds.top + leftHeight, Math.max(0, blh - (borderLeftWidth + paddingLeft)), blv - (borderBottomWidth + paddingBottom), CORNER.BOTTOM_LEFT)
5565                    : new Vector(bounds.left + borderLeftWidth + paddingLeft, bounds.top + bounds.height - (borderBottomWidth + paddingBottom));
5566        }
5567        return BoundCurves;
5568    }());
5569    var CORNER;
5570    (function (CORNER) {
5571        CORNER[CORNER["TOP_LEFT"] = 0] = "TOP_LEFT";
5572        CORNER[CORNER["TOP_RIGHT"] = 1] = "TOP_RIGHT";
5573        CORNER[CORNER["BOTTOM_RIGHT"] = 2] = "BOTTOM_RIGHT";
5574        CORNER[CORNER["BOTTOM_LEFT"] = 3] = "BOTTOM_LEFT";
5575    })(CORNER || (CORNER = {}));
5576    var getCurvePoints = function (x, y, r1, r2, position) {
5577        var kappa = 4 * ((Math.sqrt(2) - 1) / 3);
5578        var ox = r1 * kappa; // control point offset horizontal
5579        var oy = r2 * kappa; // control point offset vertical
5580        var xm = x + r1; // x-middle
5581        var ym = y + r2; // y-middle
5582        switch (position) {
5583            case CORNER.TOP_LEFT:
5584                return new BezierCurve(new Vector(x, ym), new Vector(x, ym - oy), new Vector(xm - ox, y), new Vector(xm, y));
5585            case CORNER.TOP_RIGHT:
5586                return new BezierCurve(new Vector(x, y), new Vector(x + ox, y), new Vector(xm, ym - oy), new Vector(xm, ym));
5587            case CORNER.BOTTOM_RIGHT:
5588                return new BezierCurve(new Vector(xm, y), new Vector(xm, y + oy), new Vector(x + ox, ym), new Vector(x, ym));
5589            case CORNER.BOTTOM_LEFT:
5590            default:
5591                return new BezierCurve(new Vector(xm, ym), new Vector(xm - ox, ym), new Vector(x, y + oy), new Vector(x, y));
5592        }
5593    };
5594    var calculateBorderBoxPath = function (curves) {
5595        return [curves.topLeftBorderBox, curves.topRightBorderBox, curves.bottomRightBorderBox, curves.bottomLeftBorderBox];
5596    };
5597    var calculateContentBoxPath = function (curves) {
5598        return [
5599            curves.topLeftContentBox,
5600            curves.topRightContentBox,
5601            curves.bottomRightContentBox,
5602            curves.bottomLeftContentBox
5603        ];
5604    };
5605    var calculatePaddingBoxPath = function (curves) {
5606        return [
5607            curves.topLeftPaddingBox,
5608            curves.topRightPaddingBox,
5609            curves.bottomRightPaddingBox,
5610            curves.bottomLeftPaddingBox
5611        ];
5612    };
5613
5614    var TransformEffect = /** @class */ (function () {
vendor: 10,153 bytes, lines 5615-5829
5615        function TransformEffect(offsetX, offsetY, matrix) {
5616            this.type = 0 /* TRANSFORM */;
5617            this.offsetX = offsetX;
5618            this.offsetY = offsetY;
5619            this.matrix = matrix;
5620            this.target = 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */;
5621        }
5622        return TransformEffect;
5623    }());
5624    var ClipEffect = /** @class */ (function () {
5625        function ClipEffect(path, target) {
5626            this.type = 1 /* CLIP */;
5627            this.target = target;
5628            this.path = path;
5629        }
5630        return ClipEffect;
5631    }());
5632    var isTransformEffect = function (effect) {
5633        return effect.type === 0 /* TRANSFORM */;
5634    };
5635    var isClipEffect = function (effect) { return effect.type === 1 /* CLIP */; };
5636
5637    var StackingContext = /** @class */ (function () {
5638        function StackingContext(container) {
5639            this.element = container;
5640            this.inlineLevel = [];
5641            this.nonInlineLevel = [];
5642            this.negativeZIndex = [];
5643            this.zeroOrAutoZIndexOrTransformedOrOpacity = [];
5644            this.positiveZIndex = [];
5645            this.nonPositionedFloats = [];
5646            this.nonPositionedInlineLevel = [];
5647        }
5648        return StackingContext;
5649    }());
5650    var ElementPaint = /** @class */ (function () {
5651        function ElementPaint(element, parentStack) {
5652            this.container = element;
5653            this.effects = parentStack.slice(0);
5654            this.curves = new BoundCurves(element);
5655            if (element.styles.transform !== null) {
5656                var offsetX = element.bounds.left + element.styles.transformOrigin[0].number;
5657                var offsetY = element.bounds.top + element.styles.transformOrigin[1].number;
5658                var matrix = element.styles.transform;
5659                this.effects.push(new TransformEffect(offsetX, offsetY, matrix));
5660            }
5661            if (element.styles.overflowX !== OVERFLOW.VISIBLE) {
5662                var borderBox = calculateBorderBoxPath(this.curves);
5663                var paddingBox = calculatePaddingBoxPath(this.curves);
5664                if (equalPath(borderBox, paddingBox)) {
5665                    this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));
5666                }
5667                else {
5668                    this.effects.push(new ClipEffect(borderBox, 2 /* BACKGROUND_BORDERS */));
5669                    this.effects.push(new ClipEffect(paddingBox, 4 /* CONTENT */));
5670                }
5671            }
5672        }
5673        ElementPaint.prototype.getParentEffects = function () {
5674            var effects = this.effects.slice(0);
5675            if (this.container.styles.overflowX !== OVERFLOW.VISIBLE) {
5676                var borderBox = calculateBorderBoxPath(this.curves);
5677                var paddingBox = calculatePaddingBoxPath(this.curves);
5678                if (!equalPath(borderBox, paddingBox)) {
5679                    effects.push(new ClipEffect(paddingBox, 2 /* BACKGROUND_BORDERS */ | 4 /* CONTENT */));
5680                }
5681            }
5682            return effects;
5683        };
5684        return ElementPaint;
5685    }());
5686    var parseStackTree = function (parent, stackingContext, realStackingContext, listItems) {
5687        parent.container.elements.forEach(function (child) {
5688            var treatAsRealStackingContext = contains(child.flags, 4 /* CREATES_REAL_STACKING_CONTEXT */);
5689            var createsStackingContext = contains(child.flags, 2 /* CREATES_STACKING_CONTEXT */);
5690            var paintContainer = new ElementPaint(child, parent.getParentEffects());
5691            if (contains(child.styles.display, 2048 /* LIST_ITEM */)) {
5692                listItems.push(paintContainer);
5693            }
5694            var listOwnerItems = contains(child.flags, 8 /* IS_LIST_OWNER */) ? [] : listItems;
5695            if (treatAsRealStackingContext || createsStackingContext) {
5696                var parentStack = treatAsRealStackingContext || child.styles.isPositioned() ? realStackingContext : stackingContext;
5697                var stack = new StackingContext(paintContainer);
5698                if (child.styles.isPositioned() || child.styles.opacity < 1 || child.styles.isTransformed()) {
5699                    var order_1 = child.styles.zIndex.order;
5700                    if (order_1 < 0) {
5701                        var index_1 = 0;
5702                        parentStack.negativeZIndex.some(function (current, i) {
5703                            if (order_1 > current.element.container.styles.zIndex.order) {
5704                                index_1 = i;
5705                                return true;
5706                            }
5707                            return false;
5708                        });
5709                        parentStack.negativeZIndex.splice(index_1, 0, stack);
5710                    }
5711                    else if (order_1 > 0) {
5712                        var index_2 = 0;
5713                        parentStack.positiveZIndex.some(function (current, i) {
5714                            if (order_1 > current.element.container.styles.zIndex.order) {
5715                                index_2 = i + 1;
5716                                return true;
5717                            }
5718                            return false;
5719                        });
5720                        parentStack.positiveZIndex.splice(index_2, 0, stack);
5721                    }
5722                    else {
5723                        parentStack.zeroOrAutoZIndexOrTransformedOrOpacity.push(stack);
5724                    }
5725                }
5726                else {
5727                    if (child.styles.isFloating()) {
5728                        parentStack.nonPositionedFloats.push(stack);
5729                    }
5730                    else {
5731                        parentStack.nonPositionedInlineLevel.push(stack);
5732                    }
5733                }
5734                parseStackTree(paintContainer, stack, treatAsRealStackingContext ? stack : realStackingContext, listOwnerItems);
5735            }
5736            else {
5737                if (child.styles.isInlineLevel()) {
5738                    stackingContext.inlineLevel.push(paintContainer);
5739                }
5740                else {
5741                    stackingContext.nonInlineLevel.push(paintContainer);
5742                }
5743                parseStackTree(paintContainer, stackingContext, realStackingContext, listOwnerItems);
5744            }
5745            if (contains(child.flags, 8 /* IS_LIST_OWNER */)) {
5746                processListItems(child, listOwnerItems);
5747            }
5748        });
5749    };
5750    var processListItems = function (owner, elements) {
5751        var numbering = owner instanceof OLElementContainer ? owner.start : 1;
5752        var reversed = owner instanceof OLElementContainer ? owner.reversed : false;
5753        for (var i = 0; i < elements.length; i++) {
5754            var item = elements[i];
5755            if (item.container instanceof LIElementContainer &&
5756                typeof item.container.value === 'number' &&
5757                item.container.value !== 0) {
5758                numbering = item.container.value;
5759            }
5760            item.listValue = createCounterText(numbering, item.container.styles.listStyleType, true);
5761            numbering += reversed ? -1 : 1;
5762        }
5763    };
5764    var parseStackingContexts = function (container) {
5765        var paintContainer = new ElementPaint(container, []);
5766        var root = new StackingContext(paintContainer);
5767        var listItems = [];
5768        parseStackTree(paintContainer, root, root, listItems);
5769        processListItems(paintContainer.container, listItems);
5770        return root;
5771    };
5772
5773    var parsePathForBorder = function (curves, borderSide) {
5774        switch (borderSide) {
5775            case 0:
5776                return createPathFromCurves(curves.topLeftBorderBox, curves.topLeftPaddingBox, curves.topRightBorderBox, curves.topRightPaddingBox);
5777            case 1:
5778                return createPathFromCurves(curves.topRightBorderBox, curves.topRightPaddingBox, curves.bottomRightBorderBox, curves.bottomRightPaddingBox);
5779            case 2:
5780                return createPathFromCurves(curves.bottomRightBorderBox, curves.bottomRightPaddingBox, curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox);
5781            case 3:
5782            default:
5783                return createPathFromCurves(curves.bottomLeftBorderBox, curves.bottomLeftPaddingBox, curves.topLeftBorderBox, curves.topLeftPaddingBox);
5784        }
5785    };
5786    var createPathFromCurves = function (outer1, inner1, outer2, inner2) {
5787        var path = [];
5788        if (isBezierCurve(outer1)) {
5789            path.push(outer1.subdivide(0.5, false));
5790        }
5791        else {
5792            path.push(outer1);
5793        }
5794        if (isBezierCurve(outer2)) {
5795            path.push(outer2.subdivide(0.5, true));
5796        }
5797        else {
5798            path.push(outer2);
5799        }
5800        if (isBezierCurve(inner2)) {
5801            path.push(inner2.subdivide(0.5, true).reverse());
5802        }
5803        else {
5804            path.push(inner2);
5805        }
5806        if (isBezierCurve(inner1)) {
5807            path.push(inner1.subdivide(0.5, false).reverse());
5808        }
5809        else {
5810            path.push(inner1);
5811        }
5812        return path;
5813    };
5814
5815    var paddingBox = function (element) {
5816        var bounds = element.bounds;
5817        var styles = element.styles;
5818        return bounds.add(styles.borderLeftWidth, styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth), -(styles.borderTopWidth + styles.borderBottomWidth));
5819    };
5820    var contentBox = function (element) {
5821        var styles = element.styles;
5822        var bounds = element.bounds;
5823        var paddingLeft = getAbsoluteValue(styles.paddingLeft, bounds.width);
5824        var paddingRight = getAbsoluteValue(styles.paddingRight, bounds.width);
5825        var paddingTop = getAbsoluteValue(styles.paddingTop, bounds.width);
5826        var paddingBottom = getAbsoluteValue(styles.paddingBottom, bounds.width);
5827        return bounds.add(paddingLeft + styles.borderLeftWidth, paddingTop + styles.borderTopWidth, -(styles.borderRightWidth + styles.borderLeftWidth + paddingLeft + paddingRight), -(styles.borderTopWidth + styles.borderBottomWidth + paddingTop + paddingBottom));
5828    };
5829
vendor: 7,465 bytes, lines 5830-5956
5830    var calculateBackgroundPositioningArea = function (backgroundOrigin, element) {
5831        if (backgroundOrigin === 0 /* BORDER_BOX */) {
5832            return element.bounds;
5833        }
5834        if (backgroundOrigin === 2 /* CONTENT_BOX */) {
5835            return contentBox(element);
5836        }
5837        return paddingBox(element);
5838    };
5839    var calculateBackgroundPaintingArea = function (backgroundClip, element) {
5840        if (backgroundClip === BACKGROUND_CLIP.BORDER_BOX) {
5841            return element.bounds;
5842        }
5843        if (backgroundClip === BACKGROUND_CLIP.CONTENT_BOX) {
5844            return contentBox(element);
5845        }
5846        return paddingBox(element);
5847    };
5848    var calculateBackgroundRendering = function (container, index, intrinsicSize) {
5849        var backgroundPositioningArea = calculateBackgroundPositioningArea(getBackgroundValueForIndex(container.styles.backgroundOrigin, index), container);
5850        var backgroundPaintingArea = calculateBackgroundPaintingArea(getBackgroundValueForIndex(container.styles.backgroundClip, index), container);
5851        var backgroundImageSize = calculateBackgroundSize(getBackgroundValueForIndex(container.styles.backgroundSize, index), intrinsicSize, backgroundPositioningArea);
5852        var sizeWidth = backgroundImageSize[0], sizeHeight = backgroundImageSize[1];
5853        var position = getAbsoluteValueForTuple(getBackgroundValueForIndex(container.styles.backgroundPosition, index), backgroundPositioningArea.width - sizeWidth, backgroundPositioningArea.height - sizeHeight);
5854        var path = calculateBackgroundRepeatPath(getBackgroundValueForIndex(container.styles.backgroundRepeat, index), position, backgroundImageSize, backgroundPositioningArea, backgroundPaintingArea);
5855        var offsetX = Math.round(backgroundPositioningArea.left + position[0]);
5856        var offsetY = Math.round(backgroundPositioningArea.top + position[1]);
5857        return [path, offsetX, offsetY, sizeWidth, sizeHeight];
5858    };
5859    var isAuto = function (token) { return isIdentToken(token) && token.value === BACKGROUND_SIZE.AUTO; };
5860    var hasIntrinsicValue = function (value) { return typeof value === 'number'; };
5861    var calculateBackgroundSize = function (size, _a, bounds) {
5862        var intrinsicWidth = _a[0], intrinsicHeight = _a[1], intrinsicProportion = _a[2];
5863        var first = size[0], second = size[1];
5864        if (isLengthPercentage(first) && second && isLengthPercentage(second)) {
5865            return [getAbsoluteValue(first, bounds.width), getAbsoluteValue(second, bounds.height)];
5866        }
5867        var hasIntrinsicProportion = hasIntrinsicValue(intrinsicProportion);
5868        if (isIdentToken(first) && (first.value === BACKGROUND_SIZE.CONTAIN || first.value === BACKGROUND_SIZE.COVER)) {
5869            if (hasIntrinsicValue(intrinsicProportion)) {
5870                var targetRatio = bounds.width / bounds.height;
5871                return targetRatio < intrinsicProportion !== (first.value === BACKGROUND_SIZE.COVER)
5872                    ? [bounds.width, bounds.width / intrinsicProportion]
5873                    : [bounds.height * intrinsicProportion, bounds.height];
5874            }
5875            return [bounds.width, bounds.height];
5876        }
5877        var hasIntrinsicWidth = hasIntrinsicValue(intrinsicWidth);
5878        var hasIntrinsicHeight = hasIntrinsicValue(intrinsicHeight);
5879        var hasIntrinsicDimensions = hasIntrinsicWidth || hasIntrinsicHeight;
5880        // If the background-size is auto or auto auto:
5881        if (isAuto(first) && (!second || isAuto(second))) {
5882            // If the image has both horizontal and vertical intrinsic dimensions, it's rendered at that size.
5883            if (hasIntrinsicWidth && hasIntrinsicHeight) {
5884                return [intrinsicWidth, intrinsicHeight];
5885            }
5886            // If the image has no intrinsic dimensions and has no intrinsic proportions,
5887            // it's rendered at the size of the background positioning area.
5888            if (!hasIntrinsicProportion && !hasIntrinsicDimensions) {
5889                return [bounds.width, bounds.height];
5890            }
5891            // TODO If the image has no intrinsic dimensions but has intrinsic proportions, it's rendered as if contain had been specified instead.
5892            // If the image has only one intrinsic dimension and has intrinsic proportions, it's rendered at the size corresponding to that one dimension.
5893            // The other dimension is computed using the specified dimension and the intrinsic proportions.
5894            if (hasIntrinsicDimensions && hasIntrinsicProportion) {
5895                var width_1 = hasIntrinsicWidth
5896                    ? intrinsicWidth
5897                    : intrinsicHeight * intrinsicProportion;
5898                var height_1 = hasIntrinsicHeight
5899                    ? intrinsicHeight
5900                    : intrinsicWidth / intrinsicProportion;
5901                return [width_1, height_1];
5902            }
5903            // If the image has only one intrinsic dimension but has no intrinsic proportions,
5904            // it's rendered using the specified dimension and the other dimension of the background positioning area.
5905            var width_2 = hasIntrinsicWidth ? intrinsicWidth : bounds.width;
5906            var height_2 = hasIntrinsicHeight ? intrinsicHeight : bounds.height;
5907            return [width_2, height_2];
5908        }
5909        // If the image has intrinsic proportions, it's stretched to the specified dimension.
5910        // The unspecified dimension is computed using the specified dimension and the intrinsic proportions.
5911        if (hasIntrinsicProportion) {
5912            var width_3 = 0;
5913            var height_3 = 0;
5914            if (isLengthPercentage(first)) {
5915                width_3 = getAbsoluteValue(first, bounds.width);
5916            }
5917            else if (isLengthPercentage(second)) {
5918                height_3 = getAbsoluteValue(second, bounds.height);
5919            }
5920            if (isAuto(first)) {
5921                width_3 = height_3 * intrinsicProportion;
5922            }
5923            else if (!second || isAuto(second)) {
5924                height_3 = width_3 / intrinsicProportion;
5925            }
5926            return [width_3, height_3];
5927        }
5928        // If the image has no intrinsic proportions, it's stretched to the specified dimension.
5929        // The unspecified dimension is computed using the image's corresponding intrinsic dimension,
5930        // if there is one. If there is no such intrinsic dimension,
5931        // it becomes the corresponding dimension of the background positioning area.
5932        var width = null;
5933        var height = null;
5934        if (isLengthPercentage(first)) {
5935            width = getAbsoluteValue(first, bounds.width);
5936        }
5937        else if (second && isLengthPercentage(second)) {
5938            height = getAbsoluteValue(second, bounds.height);
5939        }
5940        if (width !== null && (!second || isAuto(second))) {
5941            height =
5942                hasIntrinsicWidth && hasIntrinsicHeight
5943                    ? (width / intrinsicWidth) * intrinsicHeight
5944                    : bounds.height;
5945        }
5946        if (height !== null && isAuto(first)) {
5947            width =
5948                hasIntrinsicWidth && hasIntrinsicHeight
5949                    ? (height / intrinsicHeight) * intrinsicWidth
5950                    : bounds.width;
5951        }
5952        if (width !== null && height !== null) {
5953            return [width, height];
5954        }
5955        throw new Error("Unable to calculate background-size for element");
5956    };
vendor: 14,786 bytes, lines 5957-6216
5957    var getBackgroundValueForIndex = function (values, index) {
5958        var value = values[index];
5959        if (typeof value === 'undefined') {
5960            return values[0];
5961        }
5962        return value;
5963    };
5964    var calculateBackgroundRepeatPath = function (repeat, _a, _b, backgroundPositioningArea, backgroundPaintingArea) {
5965        var x = _a[0], y = _a[1];
5966        var width = _b[0], height = _b[1];
5967        switch (repeat) {
5968            case BACKGROUND_REPEAT.REPEAT_X:
5969                return [
5970                    new Vector(Math.round(backgroundPositioningArea.left), Math.round(backgroundPositioningArea.top + y)),
5971                    new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(backgroundPositioningArea.top + y)),
5972                    new Vector(Math.round(backgroundPositioningArea.left + backgroundPositioningArea.width), Math.round(height + backgroundPositioningArea.top + y)),
5973                    new Vector(Math.round(backgroundPositioningArea.left), Math.round(height + backgroundPositioningArea.top + y))
5974                ];
5975            case BACKGROUND_REPEAT.REPEAT_Y:
5976                return [
5977                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top)),
5978                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top)),
5979                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top)),
5980                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.height + backgroundPositioningArea.top))
5981                ];
5982            case BACKGROUND_REPEAT.NO_REPEAT:
5983                return [
5984                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y)),
5985                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y)),
5986                    new Vector(Math.round(backgroundPositioningArea.left + x + width), Math.round(backgroundPositioningArea.top + y + height)),
5987                    new Vector(Math.round(backgroundPositioningArea.left + x), Math.round(backgroundPositioningArea.top + y + height))
5988                ];
5989            default:
5990                return [
5991                    new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.top)),
5992                    new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.top)),
5993                    new Vector(Math.round(backgroundPaintingArea.left + backgroundPaintingArea.width), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top)),
5994                    new Vector(Math.round(backgroundPaintingArea.left), Math.round(backgroundPaintingArea.height + backgroundPaintingArea.top))
5995                ];
5996        }
5997    };
5998
5999    var SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';
6000
6001    var SAMPLE_TEXT = 'Hidden Text';
6002    var FontMetrics = /** @class */ (function () {
6003        function FontMetrics(document) {
6004            this._data = {};
6005            this._document = document;
6006        }
6007        FontMetrics.prototype.parseMetrics = function (fontFamily, fontSize) {
6008            var container = this._document.createElement('div');
6009            var img = this._document.createElement('img');
6010            var span = this._document.createElement('span');
6011            var body = this._document.body;
6012            container.style.visibility = 'hidden';
6013            container.style.fontFamily = fontFamily;
6014            container.style.fontSize = fontSize;
6015            container.style.margin = '0';
6016            container.style.padding = '0';
6017            body.appendChild(container);
6018            img.src = SMALL_IMAGE;
6019            img.width = 1;
6020            img.height = 1;
6021            img.style.margin = '0';
6022            img.style.padding = '0';
6023            img.style.verticalAlign = 'baseline';
6024            span.style.fontFamily = fontFamily;
6025            span.style.fontSize = fontSize;
6026            span.style.margin = '0';
6027            span.style.padding = '0';
6028            span.appendChild(this._document.createTextNode(SAMPLE_TEXT));
6029            container.appendChild(span);
6030            container.appendChild(img);
6031            var baseline = img.offsetTop - span.offsetTop + 2;
6032            container.removeChild(span);
6033            container.appendChild(this._document.createTextNode(SAMPLE_TEXT));
6034            container.style.lineHeight = 'normal';
6035            img.style.verticalAlign = 'super';
6036            var middle = img.offsetTop - container.offsetTop + 2;
6037            body.removeChild(container);
6038            return { baseline: baseline, middle: middle };
6039        };
6040        FontMetrics.prototype.getMetrics = function (fontFamily, fontSize) {
6041            var key = fontFamily + " " + fontSize;
6042            if (typeof this._data[key] === 'undefined') {
6043                this._data[key] = this.parseMetrics(fontFamily, fontSize);
6044            }
6045            return this._data[key];
6046        };
6047        return FontMetrics;
6048    }());
6049
6050    var MASK_OFFSET = 10000;
6051    var CanvasRenderer = /** @class */ (function () {
6052        function CanvasRenderer(options) {
6053            this._activeEffects = [];
6054            this.canvas = options.canvas ? options.canvas : document.createElement('canvas');
6055            this.ctx = this.canvas.getContext('2d');
6056            this.options = options;
6057            this.canvas.width = Math.floor(options.width * options.scale);
6058            this.canvas.height = Math.floor(options.height * options.scale);
6059            this.canvas.style.width = options.width + "px";
6060            this.canvas.style.height = options.height + "px";
6061            this.fontMetrics = new FontMetrics(document);
6062            this.ctx.scale(this.options.scale, this.options.scale);
6063            this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);
6064            this.ctx.textBaseline = 'bottom';
6065            this._activeEffects = [];
6066            Logger.getInstance(options.id).debug("Canvas renderer initialized (" + options.width + "x" + options.height + " at " + options.x + "," + options.y + ") with scale " + options.scale);
6067        }
6068        CanvasRenderer.prototype.applyEffects = function (effects, target) {
6069            var _this = this;
6070            while (this._activeEffects.length) {
6071                this.popEffect();
6072            }
6073            effects.filter(function (effect) { return contains(effect.target, target); }).forEach(function (effect) { return _this.applyEffect(effect); });
6074        };
6075        CanvasRenderer.prototype.applyEffect = function (effect) {
6076            this.ctx.save();
6077            if (isTransformEffect(effect)) {
6078                this.ctx.translate(effect.offsetX, effect.offsetY);
6079                this.ctx.transform(effect.matrix[0], effect.matrix[1], effect.matrix[2], effect.matrix[3], effect.matrix[4], effect.matrix[5]);
6080                this.ctx.translate(-effect.offsetX, -effect.offsetY);
6081            }
6082            if (isClipEffect(effect)) {
6083                this.path(effect.path);
6084                this.ctx.clip();
6085            }
6086            this._activeEffects.push(effect);
6087        };
6088        CanvasRenderer.prototype.popEffect = function () {
6089            this._activeEffects.pop();
6090            this.ctx.restore();
6091        };
6092        CanvasRenderer.prototype.renderStack = function (stack) {
6093            return __awaiter(this, void 0, void 0, function () {
6094                var styles;
6095                return __generator(this, function (_a) {
6096                    switch (_a.label) {
6097                        case 0:
6098                            styles = stack.element.container.styles;
6099                            if (!styles.isVisible()) return [3 /*break*/, 2];
6100                            this.ctx.globalAlpha = styles.opacity;
6101                            return [4 /*yield*/, this.renderStackContent(stack)];
6102                        case 1:
6103                            _a.sent();
6104                            _a.label = 2;
6105                        case 2: return [2 /*return*/];
6106                    }
6107                });
6108            });
6109        };
6110        CanvasRenderer.prototype.renderNode = function (paint) {
6111            return __awaiter(this, void 0, void 0, function () {
6112                return __generator(this, function (_a) {
6113                    switch (_a.label) {
6114                        case 0:
6115                            if (!paint.container.styles.isVisible()) return [3 /*break*/, 3];
6116                            return [4 /*yield*/, this.renderNodeBackgroundAndBorders(paint)];
6117                        case 1:
6118                            _a.sent();
6119                            return [4 /*yield*/, this.renderNodeContent(paint)];
6120                        case 2:
6121                            _a.sent();
6122                            _a.label = 3;
6123                        case 3: return [2 /*return*/];
6124                    }
6125                });
6126            });
6127        };
6128        CanvasRenderer.prototype.renderTextWithLetterSpacing = function (text, letterSpacing) {
6129            var _this = this;
6130            if (letterSpacing === 0) {
6131                this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);
6132            }
6133            else {
6134                var letters = toCodePoints(text.text).map(function (i) { return fromCodePoint(i); });
6135                letters.reduce(function (left, letter) {
6136                    _this.ctx.fillText(letter, left, text.bounds.top + text.bounds.height);
6137                    return left + _this.ctx.measureText(letter).width;
6138                }, text.bounds.left);
6139            }
6140        };
6141        CanvasRenderer.prototype.createFontStyle = function (styles) {
6142            var fontVariant = styles.fontVariant
6143                .filter(function (variant) { return variant === 'normal' || variant === 'small-caps'; })
6144                .join('');
6145            var fontFamily = styles.fontFamily.join(', ');
6146            var fontSize = isDimensionToken(styles.fontSize)
6147                ? "" + styles.fontSize.number + styles.fontSize.unit
6148                : styles.fontSize.number + "px";
6149            return [
6150                [styles.fontStyle, fontVariant, styles.fontWeight, fontSize, fontFamily].join(' '),
6151                fontFamily,
6152                fontSize
6153            ];
6154        };
6155        CanvasRenderer.prototype.renderTextNode = function (text, styles) {
6156            return __awaiter(this, void 0, void 0, function () {
6157                var _a, font, fontFamily, fontSize;
6158                var _this = this;
6159                return __generator(this, function (_b) {
6160                    _a = this.createFontStyle(styles), font = _a[0], fontFamily = _a[1], fontSize = _a[2];
6161                    this.ctx.font = font;
6162                    text.textBounds.forEach(function (text) {
6163                        _this.ctx.fillStyle = asString(styles.color);
6164                        _this.renderTextWithLetterSpacing(text, styles.letterSpacing);
6165                        var textShadows = styles.textShadow;
6166                        if (textShadows.length && text.text.trim().length) {
6167                            textShadows
6168                                .slice(0)
6169                                .reverse()
6170                                .forEach(function (textShadow) {
6171                                _this.ctx.shadowColor = asString(textShadow.color);
6172                                _this.ctx.shadowOffsetX = textShadow.offsetX.number * _this.options.scale;
6173                                _this.ctx.shadowOffsetY = textShadow.offsetY.number * _this.options.scale;
6174                                _this.ctx.shadowBlur = textShadow.blur.number;
6175                                _this.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height);
6176                            });
6177                            _this.ctx.shadowColor = '';
6178                            _this.ctx.shadowOffsetX = 0;
6179                            _this.ctx.shadowOffsetY = 0;
6180                            _this.ctx.shadowBlur = 0;
6181                        }
6182                        if (styles.textDecorationLine.length) {
6183                            _this.ctx.fillStyle = asString(styles.textDecorationColor || styles.color);
6184                            styles.textDecorationLine.forEach(function (textDecorationLine) {
6185                                switch (textDecorationLine) {
6186                                    case 1 /* UNDERLINE */:
6187                                        // Draws a line at the baseline of the font
6188                                        // TODO As some browsers display the line as more than 1px if the font-size is big,
6189                                        // need to take that into account both in position and size
6190                                        var baseline = _this.fontMetrics.getMetrics(fontFamily, fontSize).baseline;
6191                                        _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1);
6192                                        break;
6193                                    case 2 /* OVERLINE */:
6194                                        _this.ctx.fillRect(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1);
6195                                        break;
6196                                    case 3 /* LINE_THROUGH */:
6197                                        // TODO try and find exact position for line-through
6198                                        var middle = _this.fontMetrics.getMetrics(fontFamily, fontSize).middle;
6199                                        _this.ctx.fillRect(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1);
6200                                        break;
6201                                }
6202                            });
6203                        }
6204                    });
6205                    return [2 /*return*/];
6206                });
6207            });
6208        };
6209        CanvasRenderer.prototype.renderReplacedElement = function (container, curves, image) {
6210            if (image && container.intrinsicWidth > 0 && container.intrinsicHeight > 0) {
6211                var box = contentBox(container);
6212                var path = calculatePaddingBoxPath(curves);
6213                this.path(path);
6214                this.ctx.save();
6215                this.ctx.clip();
6216                this.ctx.drawImage(image, 0, 0, container.intrinsicWidth, container.intrinsicHeight, box.left, box.top, box.width, box.height);
vendor: 6,133 bytes, lines 6217-6312
6217                this.ctx.restore();
6218            }
6219        };
6220        CanvasRenderer.prototype.renderNodeContent = function (paint) {
6221            return __awaiter(this, void 0, void 0, function () {
6222                var container, curves, styles, _i, _a, child, image, e_1, image, e_2, iframeRenderer, canvas, size, bounds, x, textBounds, img, image, url, e_3, bounds;
6223                return __generator(this, function (_b) {
6224                    switch (_b.label) {
6225                        case 0:
6226                            this.applyEffects(paint.effects, 4 /* CONTENT */);
6227                            container = paint.container;
6228                            curves = paint.curves;
6229                            styles = container.styles;
6230                            _i = 0, _a = container.textNodes;
6231                            _b.label = 1;
6232                        case 1:
6233                            if (!(_i < _a.length)) return [3 /*break*/, 4];
6234                            child = _a[_i];
6235                            return [4 /*yield*/, this.renderTextNode(child, styles)];
6236                        case 2:
6237                            _b.sent();
6238                            _b.label = 3;
6239                        case 3:
6240                            _i++;
6241                            return [3 /*break*/, 1];
6242                        case 4:
6243                            if (!(container instanceof ImageElementContainer)) return [3 /*break*/, 8];
6244                            _b.label = 5;
6245                        case 5:
6246                            _b.trys.push([5, 7, , 8]);
6247                            return [4 /*yield*/, this.options.cache.match(container.src)];
6248                        case 6:
6249                            image = _b.sent();
6250                            this.renderReplacedElement(container, curves, image);
6251                            return [3 /*break*/, 8];
6252                        case 7:
6253                            e_1 = _b.sent();
6254                            Logger.getInstance(this.options.id).error("Error loading image " + container.src);
6255                            return [3 /*break*/, 8];
6256                        case 8:
6257                            if (container instanceof CanvasElementContainer) {
6258                                this.renderReplacedElement(container, curves, container.canvas);
6259                            }
6260                            if (!(container instanceof SVGElementContainer)) return [3 /*break*/, 12];
6261                            _b.label = 9;
6262                        case 9:
6263                            _b.trys.push([9, 11, , 12]);
6264                            return [4 /*yield*/, this.options.cache.match(container.svg)];
6265                        case 10:
6266                            image = _b.sent();
6267                            this.renderReplacedElement(container, curves, image);
6268                            return [3 /*break*/, 12];
6269                        case 11:
6270                            e_2 = _b.sent();
6271                            Logger.getInstance(this.options.id).error("Error loading svg " + container.svg.substring(0, 255));
6272                            return [3 /*break*/, 12];
6273                        case 12:
6274                            if (!(container instanceof IFrameElementContainer && container.tree)) return [3 /*break*/, 14];
6275                            iframeRenderer = new CanvasRenderer({
6276                                id: this.options.id,
6277                                scale: this.options.scale,
6278                                backgroundColor: container.backgroundColor,
6279                                x: 0,
6280                                y: 0,
6281                                scrollX: 0,
6282                                scrollY: 0,
6283                                width: container.width,
6284                                height: container.height,
6285                                cache: this.options.cache,
6286                                windowWidth: container.width,
6287                                windowHeight: container.height
6288                            });
6289                            return [4 /*yield*/, iframeRenderer.render(container.tree)];
6290                        case 13:
6291                            canvas = _b.sent();
6292                            if (container.width && container.height) {
6293                                this.ctx.drawImage(canvas, 0, 0, container.width, container.height, container.bounds.left, container.bounds.top, container.bounds.width, container.bounds.height);
6294                            }
6295                            _b.label = 14;
6296                        case 14:
6297                            if (container instanceof InputElementContainer) {
6298                                size = Math.min(container.bounds.width, container.bounds.height);
6299                                if (container.type === CHECKBOX) {
6300                                    if (container.checked) {
6301                                        this.ctx.save();
6302                                        this.path([
6303                                            new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79),
6304                                            new Vector(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549),
6305                                            new Vector(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071),
6306                                            new Vector(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649),
6307                                            new Vector(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23),
6308                                            new Vector(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085),
6309                                            new Vector(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)
6310                                        ]);
6311                                        this.ctx.fillStyle = asString(INPUT_COLOR);
6312                                        this.ctx.fill();
vendor: 5,785 bytes, lines 6313-6400
6313                                        this.ctx.restore();
6314                                    }
6315                                }
6316                                else if (container.type === RADIO) {
6317                                    if (container.checked) {
6318                                        this.ctx.save();
6319                                        this.ctx.beginPath();
6320                                        this.ctx.arc(container.bounds.left + size / 2, container.bounds.top + size / 2, size / 4, 0, Math.PI * 2, true);
6321                                        this.ctx.fillStyle = asString(INPUT_COLOR);
6322                                        this.ctx.fill();
6323                                        this.ctx.restore();
6324                                    }
6325                                }
6326                            }
6327                            if (isTextInputElement(container) && container.value.length) {
6328                                this.ctx.font = this.createFontStyle(styles)[0];
6329                                this.ctx.fillStyle = asString(styles.color);
6330                                this.ctx.textBaseline = 'middle';
6331                                this.ctx.textAlign = canvasTextAlign(container.styles.textAlign);
6332                                bounds = contentBox(container);
6333                                x = 0;
6334                                switch (container.styles.textAlign) {
6335                                    case TEXT_ALIGN.CENTER:
6336                                        x += bounds.width / 2;
6337                                        break;
6338                                    case TEXT_ALIGN.RIGHT:
6339                                        x += bounds.width;
6340                                        break;
6341                                }
6342                                textBounds = bounds.add(x, 0, 0, -bounds.height / 2 + 1);
6343                                this.ctx.save();
6344                                this.path([
6345                                    new Vector(bounds.left, bounds.top),
6346                                    new Vector(bounds.left + bounds.width, bounds.top),
6347                                    new Vector(bounds.left + bounds.width, bounds.top + bounds.height),
6348                                    new Vector(bounds.left, bounds.top + bounds.height)
6349                                ]);
6350                                this.ctx.clip();
6351                                this.renderTextWithLetterSpacing(new TextBounds(container.value, textBounds), styles.letterSpacing);
6352                                this.ctx.restore();
6353                                this.ctx.textBaseline = 'bottom';
6354                                this.ctx.textAlign = 'left';
6355                            }
6356                            if (!contains(container.styles.display, 2048 /* LIST_ITEM */)) return [3 /*break*/, 20];
6357                            if (!(container.styles.listStyleImage !== null)) return [3 /*break*/, 19];
6358                            img = container.styles.listStyleImage;
6359                            if (!(img.type === CSSImageType.URL)) return [3 /*break*/, 18];
6360                            image = void 0;
6361                            url = img.url;
6362                            _b.label = 15;
6363                        case 15:
6364                            _b.trys.push([15, 17, , 18]);
6365                            return [4 /*yield*/, this.options.cache.match(url)];
6366                        case 16:
6367                            image = _b.sent();
6368                            this.ctx.drawImage(image, container.bounds.left - (image.width + 10), container.bounds.top);
6369                            return [3 /*break*/, 18];
6370                        case 17:
6371                            e_3 = _b.sent();
6372                            Logger.getInstance(this.options.id).error("Error loading list-style-image " + url);
6373                            return [3 /*break*/, 18];
6374                        case 18: return [3 /*break*/, 20];
6375                        case 19:
6376                            if (paint.listValue && container.styles.listStyleType !== LIST_STYLE_TYPE.NONE) {
6377                                this.ctx.font = this.createFontStyle(styles)[0];
6378                                this.ctx.fillStyle = asString(styles.color);
6379                                this.ctx.textBaseline = 'middle';
6380                                this.ctx.textAlign = 'right';
6381                                bounds = new Bounds(container.bounds.left, container.bounds.top + getAbsoluteValue(container.styles.paddingTop, container.bounds.width), container.bounds.width, computeLineHeight(styles.lineHeight, styles.fontSize.number) / 2 + 1);
6382                                this.renderTextWithLetterSpacing(new TextBounds(paint.listValue, bounds), styles.letterSpacing);
6383                                this.ctx.textBaseline = 'bottom';
6384                                this.ctx.textAlign = 'left';
6385                            }
6386                            _b.label = 20;
6387                        case 20: return [2 /*return*/];
6388                    }
6389                });
6390            });
6391        };
6392        CanvasRenderer.prototype.renderStackContent = function (stack) {
6393            return __awaiter(this, void 0, void 0, function () {
6394                var _i, _a, child, _b, _c, child, _d, _e, child, _f, _g, child, _h, _j, child, _k, _l, child, _m, _o, child;
6395                return __generator(this, function (_p) {
6396                    switch (_p.label) {
6397                        case 0: 
6398                        // https://www.w3.org/TR/css-position-3/#painting-order
6399                        // 1. the background and borders of the element forming the stacking context.
6400                        return [4 /*yield*/, this.renderNodeBackgroun
vendor: 20,471 bytes, lines 6400-6739
6400dAndBorders(stack.element)];
6401                        case 1:
6402                            // https://www.w3.org/TR/css-position-3/#painting-order
6403                            // 1. the background and borders of the element forming the stacking context.
6404                            _p.sent();
6405                            _i = 0, _a = stack.negativeZIndex;
6406                            _p.label = 2;
6407                        case 2:
6408                            if (!(_i < _a.length)) return [3 /*break*/, 5];
6409                            child = _a[_i];
6410                            return [4 /*yield*/, this.renderStack(child)];
6411                        case 3:
6412                            _p.sent();
6413                            _p.label = 4;
6414                        case 4:
6415                            _i++;
6416                            return [3 /*break*/, 2];
6417                        case 5: 
6418                        // 3. For all its in-flow, non-positioned, block-level descendants in tree order:
6419                        return [4 /*yield*/, this.renderNodeContent(stack.element)];
6420                        case 6:
6421                            // 3. For all its in-flow, non-positioned, block-level descendants in tree order:
6422                            _p.sent();
6423                            _b = 0, _c = stack.nonInlineLevel;
6424                            _p.label = 7;
6425                        case 7:
6426                            if (!(_b < _c.length)) return [3 /*break*/, 10];
6427                            child = _c[_b];
6428                            return [4 /*yield*/, this.renderNode(child)];
6429                        case 8:
6430                            _p.sent();
6431                            _p.label = 9;
6432                        case 9:
6433                            _b++;
6434                            return [3 /*break*/, 7];
6435                        case 10:
6436                            _d = 0, _e = stack.nonPositionedFloats;
6437                            _p.label = 11;
6438                        case 11:
6439                            if (!(_d < _e.length)) return [3 /*break*/, 14];
6440                            child = _e[_d];
6441                            return [4 /*yield*/, this.renderStack(child)];
6442                        case 12:
6443                            _p.sent();
6444                            _p.label = 13;
6445                        case 13:
6446                            _d++;
6447                            return [3 /*break*/, 11];
6448                        case 14:
6449                            _f = 0, _g = stack.nonPositionedInlineLevel;
6450                            _p.label = 15;
6451                        case 15:
6452                            if (!(_f < _g.length)) return [3 /*break*/, 18];
6453                            child = _g[_f];
6454                            return [4 /*yield*/, this.renderStack(child)];
6455                        case 16:
6456                            _p.sent();
6457                            _p.label = 17;
6458                        case 17:
6459                            _f++;
6460                            return [3 /*break*/, 15];
6461                        case 18:
6462                            _h = 0, _j = stack.inlineLevel;
6463                            _p.label = 19;
6464                        case 19:
6465                            if (!(_h < _j.length)) return [3 /*break*/, 22];
6466                            child = _j[_h];
6467                            return [4 /*yield*/, this.renderNode(child)];
6468                        case 20:
6469                            _p.sent();
6470                            _p.label = 21;
6471                        case 21:
6472                            _h++;
6473                            return [3 /*break*/, 19];
6474                        case 22:
6475                            _k = 0, _l = stack.zeroOrAutoZIndexOrTransformedOrOpacity;
6476                            _p.label = 23;
6477                        case 23:
6478                            if (!(_k < _l.length)) return [3 /*break*/, 26];
6479                            child = _l[_k];
6480                            return [4 /*yield*/, this.renderStack(child)];
6481                        case 24:
6482                            _p.sent();
6483                            _p.label = 25;
6484                        case 25:
6485                            _k++;
6486                            return [3 /*break*/, 23];
6487                        case 26:
6488                            _m = 0, _o = stack.positiveZIndex;
6489                            _p.label = 27;
6490                        case 27:
6491                            if (!(_m < _o.length)) return [3 /*break*/, 30];
6492                            child = _o[_m];
6493                            return [4 /*yield*/, this.renderStack(child)];
6494                        case 28:
6495                            _p.sent();
6496                            _p.label = 29;
6497                        case 29:
6498                            _m++;
6499                            return [3 /*break*/, 27];
6500                        case 30: return [2 /*return*/];
6501                    }
6502                });
6503            });
6504        };
6505        CanvasRenderer.prototype.mask = function (paths) {
6506            this.ctx.beginPath();
6507            this.ctx.moveTo(0, 0);
6508            this.ctx.lineTo(this.canvas.width, 0);
6509            this.ctx.lineTo(this.canvas.width, this.canvas.height);
6510            this.ctx.lineTo(0, this.canvas.height);
6511            this.ctx.lineTo(0, 0);
6512            this.formatPath(paths.slice(0).reverse());
6513            this.ctx.closePath();
6514        };
6515        CanvasRenderer.prototype.path = function (paths) {
6516            this.ctx.beginPath();
6517            this.formatPath(paths);
6518            this.ctx.closePath();
6519        };
6520        CanvasRenderer.prototype.formatPath = function (paths) {
6521            var _this = this;
6522            paths.forEach(function (point, index) {
6523                var start = isBezierCurve(point) ? point.start : point;
6524                if (index === 0) {
6525                    _this.ctx.moveTo(start.x, start.y);
6526                }
6527                else {
6528                    _this.ctx.lineTo(start.x, start.y);
6529                }
6530                if (isBezierCurve(point)) {
6531                    _this.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y);
6532                }
6533            });
6534        };
6535        CanvasRenderer.prototype.renderRepeat = function (path, pattern, offsetX, offsetY) {
6536            this.path(path);
6537            this.ctx.fillStyle = pattern;
6538            this.ctx.translate(offsetX, offsetY);
6539            this.ctx.fill();
6540            this.ctx.translate(-offsetX, -offsetY);
6541        };
6542        CanvasRenderer.prototype.resizeImage = function (image, width, height) {
6543            if (image.width === width && image.height === height) {
6544                return image;
6545            }
6546            var canvas = this.canvas.ownerDocument.createElement('canvas');
6547            canvas.width = width;
6548            canvas.height = height;
6549            var ctx = canvas.getContext('2d');
6550            ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, width, height);
6551            return canvas;
6552        };
6553        CanvasRenderer.prototype.renderBackgroundImage = function (container) {
6554            return __awaiter(this, void 0, void 0, function () {
6555                var index, _loop_1, this_1, _i, _a, backgroundImage;
6556                return __generator(this, function (_b) {
6557                    switch (_b.label) {
6558                        case 0:
6559                            index = container.styles.backgroundImage.length - 1;
6560                            _loop_1 = function (backgroundImage) {
6561                                var image, url, e_4, _a, path, x, y, width, height, pattern, _b, path, x, y, width, height, _c, lineLength, x0, x1, y0, y1, canvas, ctx, gradient_1, pattern, _d, path, left, top_1, width, height, position, x, y, _e, rx, ry, radialGradient_1, midX, midY, f, invF;
6562                                return __generator(this, function (_f) {
6563                                    switch (_f.label) {
6564                                        case 0:
6565                                            if (!(backgroundImage.type === CSSImageType.URL)) return [3 /*break*/, 5];
6566                                            image = void 0;
6567                                            url = backgroundImage.url;
6568                                            _f.label = 1;
6569                                        case 1:
6570                                            _f.trys.push([1, 3, , 4]);
6571                                            return [4 /*yield*/, this_1.options.cache.match(url)];
6572                                        case 2:
6573                                            image = _f.sent();
6574                                            return [3 /*break*/, 4];
6575                                        case 3:
6576                                            e_4 = _f.sent();
6577                                            Logger.getInstance(this_1.options.id).error("Error loading background-image " + url);
6578                                            return [3 /*break*/, 4];
6579                                        case 4:
6580                                            if (image) {
6581                                                _a = calculateBackgroundRendering(container, index, [
6582                                                    image.width,
6583                                                    image.height,
6584                                                    image.width / image.height
6585                                                ]), path = _a[0], x = _a[1], y = _a[2], width = _a[3], height = _a[4];
6586                                                pattern = this_1.ctx.createPattern(this_1.resizeImage(image, width, height), 'repeat');
6587                                                this_1.renderRepeat(path, pattern, x, y);
6588                                            }
6589                                            return [3 /*break*/, 6];
6590                                        case 5:
6591                                            if (isLinearGradient(backgroundImage)) {
6592                                                _b = calculateBackgroundRendering(container, index, [null, null, null]), path = _b[0], x = _b[1], y = _b[2], width = _b[3], height = _b[4];
6593                                                _c = calculateGradientDirection(backgroundImage.angle, width, height), lineLength = _c[0], x0 = _c[1], x1 = _c[2], y0 = _c[3], y1 = _c[4];
6594                                                canvas = document.createElement('canvas');
6595                                                canvas.width = width;
6596                                                canvas.height = height;
6597                                                ctx = canvas.getContext('2d');
6598                                                gradient_1 = ctx.createLinearGradient(x0, y0, x1, y1);
6599                                                processColorStops(backgroundImage.stops, lineLength).forEach(function (colorStop) {
6600                                                    return gradient_1.addColorStop(colorStop.stop, asString(colorStop.color));
6601                                                });
6602                                                ctx.fillStyle = gradient_1;
6603                                                ctx.fillRect(0, 0, width, height);
6604                                                pattern = this_1.ctx.createPattern(canvas, 'repeat');
6605                                                this_1.renderRepeat(path, pattern, x, y);
6606                                            }
6607                                            else if (isRadialGradient(backgroundImage)) {
6608                                                _d = calculateBackgroundRendering(container, index, [
6609                                                    null,
6610                                                    null,
6611                                                    null
6612                                                ]), path = _d[0], left = _d[1], top_1 = _d[2], width = _d[3], height = _d[4];
6613                                                position = backgroundImage.position.length === 0 ? [FIFTY_PERCENT] : backgroundImage.position;
6614                                                x = getAbsoluteValue(position[0], width);
6615                                                y = getAbsoluteValue(position[position.length - 1], height);
6616                                                _e = calculateRadius(backgroundImage, x, y, width, height), rx = _e[0], ry = _e[1];
6617                                                if (rx > 0 && rx > 0) {
6618                                                    radialGradient_1 = this_1.ctx.createRadialGradient(left + x, top_1 + y, 0, left + x, top_1 + y, rx);
6619                                                    processColorStops(backgroundImage.stops, rx * 2).forEach(function (colorStop) {
6620                                                        return radialGradient_1.addColorStop(colorStop.stop, asString(colorStop.color));
6621                                                    });
6622                                                    this_1.path(path);
6623                                                    this_1.ctx.fillStyle = radialGradient_1;
6624                                                    if (rx !== ry) {
6625                                                        midX = container.bounds.left + 0.5 * container.bounds.width;
6626                                                        midY = container.bounds.top + 0.5 * container.bounds.height;
6627                                                        f = ry / rx;
6628                                                        invF = 1 / f;
6629                                                        this_1.ctx.save();
6630                                                        this_1.ctx.translate(midX, midY);
6631                                                        this_1.ctx.transform(1, 0, 0, f, 0, 0);
6632                                                        this_1.ctx.translate(-midX, -midY);
6633                                                        this_1.ctx.fillRect(left, invF * (top_1 - midY) + midY, width, height * invF);
6634                                                        this_1.ctx.restore();
6635                                                    }
6636                                                    else {
6637                                                        this_1.ctx.fill();
6638                                                    }
6639                                                }
6640                                            }
6641                                            _f.label = 6;
6642                                        case 6:
6643                                            index--;
6644                                            return [2 /*return*/];
6645                                    }
6646                                });
6647                            };
6648                            this_1 = this;
6649                            _i = 0, _a = container.styles.backgroundImage.slice(0).reverse();
6650                            _b.label = 1;
6651                        case 1:
6652                            if (!(_i < _a.length)) return [3 /*break*/, 4];
6653                            backgroundImage = _a[_i];
6654                            return [5 /*yield**/, _loop_1(backgroundImage)];
6655                        case 2:
6656                            _b.sent();
6657                            _b.label = 3;
6658                        case 3:
6659                            _i++;
6660                            return [3 /*break*/, 1];
6661                        case 4: return [2 /*return*/];
6662                    }
6663                });
6664            });
6665        };
6666        CanvasRenderer.prototype.renderBorder = function (color, side, curvePoints) {
6667            return __awaiter(this, void 0, void 0, function () {
6668                return __generator(this, function (_a) {
6669                    this.path(parsePathForBorder(curvePoints, side));
6670                    this.ctx.fillStyle = asString(color);
6671                    this.ctx.fill();
6672                    return [2 /*return*/];
6673                });
6674            });
6675        };
6676        CanvasRenderer.prototype.renderNodeBackgroundAndBorders = function (paint) {
6677            return __awaiter(this, void 0, void 0, function () {
6678                var styles, hasBackground, borders, backgroundPaintingArea, side, _i, borders_1, border;
6679                var _this = this;
6680                return __generator(this, function (_a) {
6681                    switch (_a.label) {
6682                        case 0:
6683                            this.applyEffects(paint.effects, 2 /* BACKGROUND_BORDERS */);
6684                            styles = paint.container.styles;
6685                            hasBackground = !isTransparent(styles.backgroundColor) || styles.backgroundImage.length;
6686                            borders = [
6687                                { style: styles.borderTopStyle, color: styles.borderTopColor },
6688                                { style: styles.borderRightStyle, color: styles.borderRightColor },
6689                                { style: styles.borderBottomStyle, color: styles.borderBottomColor },
6690                                { style: styles.borderLeftStyle, color: styles.borderLeftColor }
6691                            ];
6692                            backgroundPaintingArea = calculateBackgroundCurvedPaintingArea(getBackgroundValueForIndex(styles.backgroundClip, 0), paint.curves);
6693                            if (!(hasBackground || styles.boxShadow.length)) return [3 /*break*/, 2];
6694                            this.ctx.save();
6695                            this.path(backgroundPaintingArea);
6696                            this.ctx.clip();
6697                            if (!isTransparent(styles.backgroundColor)) {
6698                                this.ctx.fillStyle = asString(styles.backgroundColor);
6699                                this.ctx.fill();
6700                            }
6701                            return [4 /*yield*/, this.renderBackgroundImage(paint.container)];
6702                        case 1:
6703                            _a.sent();
6704                            this.ctx.restore();
6705                            styles.boxShadow
6706                                .slice(0)
6707                                .reverse()
6708                                .forEach(function (shadow) {
6709                                _this.ctx.save();
6710                                var borderBoxArea = calculateBorderBoxPath(paint.curves);
6711                                var maskOffset = shadow.inset ? 0 : MASK_OFFSET;
6712                                var shadowPaintingArea = transformPath(borderBoxArea, -maskOffset + (shadow.inset ? 1 : -1) * shadow.spread.number, (shadow.inset ? 1 : -1) * shadow.spread.number, shadow.spread.number * (shadow.inset ? -2 : 2), shadow.spread.number * (shadow.inset ? -2 : 2));
6713                                if (shadow.inset) {
6714                                    _this.path(borderBoxArea);
6715                                    _this.ctx.clip();
6716                                    _this.mask(shadowPaintingArea);
6717                                }
6718                                else {
6719                                    _this.mask(borderBoxArea);
6720                                    _this.ctx.clip();
6721                                    _this.path(shadowPaintingArea);
6722                                }
6723                                _this.ctx.shadowOffsetX = shadow.offsetX.number + maskOffset;
6724                                _this.ctx.shadowOffsetY = shadow.offsetY.number;
6725                                _this.ctx.shadowColor = asString(shadow.color);
6726                                _this.ctx.shadowBlur = shadow.blur.number;
6727                                _this.ctx.fillStyle = shadow.inset ? asString(shadow.color) : 'rgba(0,0,0,1)';
6728                                _this.ctx.fill();
6729                                _this.ctx.restore();
6730                            });
6731                            _a.label = 2;
6732                        case 2:
6733                            side = 0;
6734                            _i = 0, borders_1 = borders;
6735                            _a.label = 3;
6736                        case 3:
6737                            if (!(_i < borders_1.length)) return [3 /*break*/, 6];
6738                            border = borders_1[_i];
6739                            if (!(border.style !== BORDER_STYLE.NONE && !isTransparent
6739(border.color))) return [3 /*break*/, 5];
6740                            return [4 /*yield*/, this.renderBorder(border.color, side++, paint.curves)];
6741                        case 4:
6742                            _a.sent();
6743                            _a.label = 5;
6744                        case 5:
6745                            _i++;
6746                            return [3 /*break*/, 3];
6747                        case 6: return [2 /*return*/];
6748                    }
6749                });
6750            });
6751        };
6752        CanvasRenderer.prototype.render = function (element) {
6753            return __awaiter(this, void 0, void 0, function () {
6754                var stack;
6755                return __generator(this, function (_a) {
6756                    switch (_a.label) {
6757                        case 0:
6758                            if (this.options.backgroundColor) {
6759                                this.ctx.fillStyle = asString(this.options.backgroundColor);
6760                                this.ctx.fillRect(this.options.x - this.options.scrollX, this.options.y - this.options.scrollY, this.options.width, this.options.height);
6761                            }
6762                            stack = parseStackingContexts(element);
6763                            return [4 /*yield*/, this.renderStack(stack)];
6764                        case 1:
6765                            _a.sent();
6766                            this.applyEffects([], 2 /* BACKGROUND_BORDERS */);
6767                            return [2 /*return*/, this.canvas];
6768                    }
6769                });
6770            });
6771        };
6772        return CanvasRenderer;
6773    }());
6774    var isTextInputElement = function (container) {
6775        if (container instanceof TextareaElementContainer) {
6776            return true;
6777        }
6778        else if (container instanceof SelectElementContainer) {
6779            return true;
6780        }
6781        else if (container instanceof InputElementContainer && container.type !== RADIO && container.type !== CHECKBOX) {
6782            return true;
6783        }
6784        return false;
6785    };
6786    var calculateBackgroundCurvedPaintingArea = function (clip, curves) {
6787        switch (clip) {
6788            case BACKGROUND_CLIP.BORDER_BOX:
6789                return calculateBorderBoxPath(curves);
6790            case BACKGROUND_CLIP.CONTENT_BOX:
6791                return calculateContentBoxPath(curves);
6792            case BACKGROUND_CLIP.PADDING_BOX:
6793            default:
6794                return calculatePaddingBoxPath(curves);
6795        }
6796    };
6797    var canvasTextAlign = function (textAlign) {
6798        switch (textAlign) {
6799            case TEXT_ALIGN.CENTER:
6800                return 'center';
6801            case TEXT_ALIGN.RIGHT:
6802                return 'right';
6803            case TEXT_ALIGN.LEFT:
6804            default:
6805                return 'left';
6806        }
6807    };
6808
6809    var ForeignObjectRenderer = /** @class */ (function () {
6810        function ForeignObjectRenderer(options) {
6811            this.canvas = options.canvas ? options.canvas : document.createElement('canvas');
6812            this.ctx = this.canvas.getContext('2d');
6813            this.options = options;
6814            this.canvas.width = Math.floor(options.width * options.scale);
6815            this.canvas.height = Math.floor(options.height * options.scale);
6816            this.canvas.style.width = options.width + "px";
6817            this.canvas.style.height = options.height + "px";
6818            this.ctx.scale(this.options.scale, this.options.scale);
6819            this.ctx.translate(-options.x + options.scrollX, -options.y + options.scrollY);
6820            Logger.getInstance(options.id).debug("EXPERIMENTAL ForeignObject renderer initialized (" + options.width + "x" + options.height + " at " + options.x + "," + options.y + ") with scale " + options.scale);
6821        }
6822        ForeignObjectRenderer.prototype.render = function (element) {
6823            return __awaiter(this, void 0, void 0, function () {
6824                var svg, img;
6825                return __generator(this, function (_a) {
6826                    switch (_a.label) {
6827                        case 0:
6828                            svg = createForeignObjectSVG(Math.max(this.options.windowWidth, this.options.width) * this.options.scale, Math.max(this.options.windowHeight, this.options.height) * this.options.scale, this.options.scrollX * this.options.scale, this.options.scrollY * this.options.scale, element);
6829                            return [4 /*yield*/, loadSerializedSVG$1(svg)];
6830                        case 1:
6831                            img = _a.sent();
6832                            if (this.options.backgroundColor) {
6833                                this.ctx.fillStyle = asString(this.options.backgroundColor);
6834                                this.ctx.fillRect(0, 0, this.options.width * this.options.scale, this.options.height * this.options.scale);
6835                            }
6836                            this.ctx.drawImage(img, -this.options.x * this.options.scale, -this.options.y * this.options.scale);
6837                            return [2 /*return*/, this.canvas];
6838                    }
6839                });
6840            });
6841        };
6842        return ForeignObjectRenderer;
6843    }());
6844    var loadSerializedSVG$1 = function (svg) {
6845        return new Promise(function (resolve, reject) {
6846            var img = new Image();
6847            img.onload = function () {
6848                resolve(img);
6849            };
6850            img.onerror = reject;
6851            img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg));
6852        });
6853    };
6854
6855    var _this = undefined;
6856    var parseColor$1 = function (value) { return color.parse(Parser.create(value).parseComponentValue()); };
6857    var html2canvas = function (element, options) {
6858        if (options === void 0) { options = {}; }
6859        return renderElement(element, options);
6860    };
6861    CacheStorage.setContext(window);
6862    var renderElement = function (element, opts) { return __awaiter(_this, void 0, void 0, function () {
6863        var ownerDocument, defaultView, instanceName, _a, width, height, left, top, defaultResourceOptions, resourceOptions, defaultOptions, options, windowBounds, documentCloner, clonedElement, container, documentBackgroun
6863dColor, bodyBackgroundColor, bgColor, defaultBackgroundColor, backgroundColor, renderOptions, canvas, renderer, root, renderer;
6864        return __generator(this, function (_b) {
6865            switch (_b.label) {
6866                case 0:
6867                    ownerDocument = element.ownerDocument;
6868                    if (!ownerDocument) {
6869                        throw new Error("Element is not attached to a Document");
6870                    }
6871                    defaultView = ownerDocument.defaultView;
6872                    if (!defaultView) {
6873                        throw new Error("Document is not attached to a Window");
6874                    }
6875                    instanceName = (Math.round(Math.random() * 1000) + Date.now()).toString(16);
6876                    _a = isBodyElement(element) || isHTMLElement(element) ? parseDocumentSize(ownerDocument) : parseBounds(element), width = _a.width, height = _a.height, left = _a.left, top = _a.top;
6877                    defaultResourceOptions = {
6878                        allowTaint: false,
6879                        imageTimeout: 15000,
6880                        proxy: undefined,
6881                        useCORS: false
6882                    };
6883                    resourceOptions = __assign({}, defaultResourceOptions, opts);
6884                    defaultOptions = {
6885                        backgroundColor: '#ffffff',
6886                        cache: opts.cache ? opts.cache : CacheStorage.create(instanceName, resourceOptions),
6887                        logging: true,
6888                        removeContainer: true,
6889                        foreignObjectRendering: false,
6890                        scale: defaultView.devicePixelRatio || 1,
6891                        windowWidth: defaultView.innerWidth,
6892                        windowHeight: defaultView.innerHeight,
6893                        scrollX: defaultView.pageXOffset,
6894                        scrollY: defaultView.pageYOffset,
6895                        x: left,
6896                        y: top,
6897                        width: Math.ceil(width),
6898                        height: Math.ceil(height),
6899                        id: instanceName
6900                    };
6901                    options = __assign({}, defaultOptions, resourceOptions, opts);
6902                    windowBounds = new Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight);
6903                    Logger.create(instanceName);
6904                    Logger.getInstance(instanceName).debug("Starting document clone");
6905                    documentCloner = new DocumentCloner(element, {
6906                        id: instanceName,
6907                        onclone: options.onclone,
6908                        ignoreElements: options.ignoreElements,
6909                        inlineImages: options.foreignObjectRendering,
6910                        copyStyles: options.foreignObjectRendering
6911                    });
6912                    clonedElement = documentCloner.clonedReferenceElement;
6913                    if (!clonedElement) {
6914                        return [2 /*return*/, Promise.reject("Unable to find element in cloned iframe")];
6915                    }
6916                    return [4 /*yield*/, documentCloner.toIFrame(ownerDocument, windowBounds)];
6917                case 1:
6918                    container = _b.sent();
6919                    documentBackgroundColor = ownerDocument.documentElement
6920                        ? parseColor$1(getComputedStyle(ownerDocument.documentElement).backgroundColor)
6921                        : COLORS.TRANSPARENT;
6922                    bodyBackgroundColor = ownerDocument.body
6923                        ? parseColor$1(getComputedStyle(ownerDocument.body).backgroundColor)
6924                        : COLORS.TRANSPARENT;
6925                    bgColor = opts.backgroundColor;
6926                    defaultBackgroundColor = typeof bgColor === 'string' ? parseColor$1(bgColor) : 0xffffffff;
6927                    backgroundColor = element === ownerDocument.documentElement
6928                        ? isTransparent(documentBackgroundColor)
6929                            ? isTransparent(bodyBackgroundColor)
6930                                ? defaultBackgroundColor
6931                                : bodyBackgroundColor
6932                            : documentBackgroundColor
6933                        : defaultBackgroundColor;
6934                    renderOptions = {
6935                        id: instanceName,
6936                        cache: options.cache,
6937                        backgroundColor: backgroundColor,
6938                        scale: options.scale,
6939                        x: options.x,
6940                        y: options.y,
6941                        scrollX: options.scrollX,
6942                        scrollY: options.scrollY,
6943                        width: options.width,
6944                        height: options.height,
6945                        windowWidth: options.windowWidth,
6946                        windowHeight: options.windowHeight
6947                    };
6948                    if (!options.foreignObjectRendering) return [3 /*break*/, 3];
6949                    Logger.getInstance(instanceName).debug("Document cloned, using foreign object rendering");
6950                    renderer = new ForeignObjectRenderer(renderOptions);
6951                    return [4 /*yield*/, renderer.render(clonedElement)];
6952                case 2:
6953                    canvas = _b.sent();
6954                    return [3 /*break*/, 5];
6955                case 3:
6956                    Logger.getInstance(instanceName).debug("Document cloned, using computed rendering");
6957                    CacheStorage.attachInstance(options.cache);
6958                    Logger.getInstance(instanceName).debug("Starting DOM parsing");
6959                    root = parseTree(clonedElement);
6960                    CacheStorage.detachInstance();
6961                    if (backgroundColor === root.styles.backgroundColor) {
6962                        root.styles.backgroundColor = COLORS.TRANSPARENT;
6963                    }
6964                    Logger.getInstance(instanceName).debug("Starting renderer");
6965                    renderer = new CanvasRenderer(renderOptions);
6966                    return [4 /*yield*/, renderer.render(root)];
6967                case 4:
6968                    canvas = _b.sent();
6969                    _b.label = 5;
6970                case 5:
6971                    if (options.removeContainer === true) {
6972                        if (!cleanContainer(container)) {
6973                            Logger.getInstance(instanceName).error("Cannot detach cloned iframe as it is not in the DOM anymore");
6974                        }
6975                    }
6976                    Logger.getInstance(instanceName).debug("Finished rendering");
6977                    Logger.destroy(instanceName);
6978                    CacheStorage.destroy(instanceName);
6979                    return [2 /*return*/, canvas];
6980            }
6981        });
6982    }); };
6983    var cleanContainer = function (container) {
6984        if (container.parentNode) {
6985            container.parentNode.removeChild(container);
6986            return true;
6987        }
6988        return false;
6989    };
6990
6991    return html2canvas;
6992
6993}));
6994//# sourceMappingURL=html2canvas.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.