ag-psd 15.0.1 → 15.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/TODO +0 -2
  2. package/clean.js +3 -0
  3. package/dist/abr.d.ts +132 -132
  4. package/dist/abr.js +270 -271
  5. package/dist/abr.js.map +1 -0
  6. package/dist/additionalInfo.d.ts +25 -25
  7. package/dist/additionalInfo.js +2026 -2045
  8. package/dist/additionalInfo.js.map +1 -0
  9. package/dist/bundle.js +9164 -8725
  10. package/dist/csh.d.ts +10 -10
  11. package/dist/csh.js +48 -49
  12. package/dist/csh.js.map +1 -0
  13. package/dist/descriptor.d.ts +411 -390
  14. package/dist/descriptor.js +1689 -1644
  15. package/dist/descriptor.js.map +1 -0
  16. package/dist/effectsHelpers.d.ts +5 -5
  17. package/dist/effectsHelpers.js +309 -310
  18. package/dist/effectsHelpers.js.map +1 -0
  19. package/dist/engineData.d.ts +2 -2
  20. package/dist/engineData.js +337 -338
  21. package/dist/engineData.js.map +1 -0
  22. package/dist/helpers.d.ts +93 -93
  23. package/dist/helpers.js +332 -333
  24. package/dist/helpers.js.map +1 -0
  25. package/dist/imageResources.d.ts +13 -13
  26. package/dist/imageResources.js +1007 -788
  27. package/dist/imageResources.js.map +1 -0
  28. package/dist/index.d.ts +20 -20
  29. package/dist/index.js +53 -54
  30. package/dist/index.js.map +1 -0
  31. package/dist/initializeCanvas.d.ts +1 -1
  32. package/dist/initializeCanvas.js +26 -27
  33. package/dist/initializeCanvas.js.map +1 -0
  34. package/dist/jpeg.d.ts +1 -1
  35. package/dist/jpeg.js +1019 -1020
  36. package/dist/jpeg.js.map +1 -0
  37. package/dist/psd.d.ts +1200 -1147
  38. package/dist/psd.js +22 -23
  39. package/dist/psd.js.map +1 -0
  40. package/dist/psdReader.d.ts +36 -36
  41. package/dist/psdReader.js +974 -959
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +709 -690
  45. package/dist/psdWriter.js.map +1 -0
  46. package/dist/text.d.ts +168 -168
  47. package/dist/text.js +557 -558
  48. package/dist/text.js.map +1 -0
  49. package/dist/utf8.d.ts +5 -5
  50. package/dist/utf8.js +152 -153
  51. package/dist/utf8.js.map +1 -0
  52. package/dist-es/abr.d.ts +132 -132
  53. package/dist-es/abr.js +266 -267
  54. package/dist-es/abr.js.map +1 -0
  55. package/dist-es/additionalInfo.d.ts +25 -25
  56. package/dist-es/additionalInfo.js +2020 -2039
  57. package/dist-es/additionalInfo.js.map +1 -0
  58. package/dist-es/csh.d.ts +10 -10
  59. package/dist-es/csh.js +44 -45
  60. package/dist-es/csh.js.map +1 -0
  61. package/dist-es/descriptor.d.ts +411 -390
  62. package/dist-es/descriptor.js +1661 -1616
  63. package/dist-es/descriptor.js.map +1 -0
  64. package/dist-es/effectsHelpers.d.ts +5 -5
  65. package/dist-es/effectsHelpers.js +304 -305
  66. package/dist-es/effectsHelpers.js.map +1 -0
  67. package/dist-es/engineData.d.ts +2 -2
  68. package/dist-es/engineData.js +332 -333
  69. package/dist-es/engineData.js.map +1 -0
  70. package/dist-es/helpers.d.ts +93 -93
  71. package/dist-es/helpers.js +315 -316
  72. package/dist-es/helpers.js.map +1 -0
  73. package/dist-es/imageResources.d.ts +13 -13
  74. package/dist-es/imageResources.js +1004 -785
  75. package/dist-es/imageResources.js.map +1 -0
  76. package/dist-es/index.d.ts +20 -20
  77. package/dist-es/index.js +31 -32
  78. package/dist-es/index.js.map +1 -0
  79. package/dist-es/initializeCanvas.d.ts +1 -1
  80. package/dist-es/initializeCanvas.js +22 -23
  81. package/dist-es/initializeCanvas.js.map +1 -0
  82. package/dist-es/jpeg.d.ts +1 -1
  83. package/dist-es/jpeg.js +1015 -1016
  84. package/dist-es/jpeg.js.map +1 -0
  85. package/dist-es/psd.d.ts +1200 -1147
  86. package/dist-es/psd.js +19 -20
  87. package/dist-es/psd.js.map +1 -0
  88. package/dist-es/psdReader.d.ts +36 -36
  89. package/dist-es/psdReader.js +944 -929
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +685 -666
  93. package/dist-es/psdWriter.js.map +1 -0
  94. package/dist-es/text.d.ts +168 -168
  95. package/dist-es/text.js +552 -553
  96. package/dist-es/text.js.map +1 -0
  97. package/dist-es/utf8.d.ts +5 -5
  98. package/dist-es/utf8.js +145 -146
  99. package/dist-es/utf8.js.map +1 -0
  100. package/package.json +11 -17
  101. package/tsconfig-es6.json +7 -0
  102. package/tsconfig.json +7 -1
@@ -1,338 +1,337 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.serializeEngineData = exports.parseEngineData = void 0;
4
- function isWhitespace(char) {
5
- // ' ', '\n', '\r', '\t'
6
- return char === 32 || char === 10 || char === 13 || char === 9;
7
- }
8
- function isNumber(char) {
9
- // 0123456789.-
10
- return (char >= 48 && char <= 57) || char === 46 || char === 45;
11
- }
12
- function parseEngineData(data) {
13
- var index = 0;
14
- function skipWhitespace() {
15
- while (index < data.length && isWhitespace(data[index])) {
16
- index++;
17
- }
18
- }
19
- function getTextByte() {
20
- var byte = data[index];
21
- index++;
22
- if (byte === 92) { // \
23
- byte = data[index];
24
- index++;
25
- }
26
- return byte;
27
- }
28
- function getText() {
29
- var result = '';
30
- if (data[index] === 41) { // )
31
- index++;
32
- return result;
33
- }
34
- // Strings start with utf-16 BOM
35
- if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {
36
- throw new Error('Invalid utf-16 BOM');
37
- }
38
- index += 2;
39
- // ), ( and \ characters are escaped in ascii manner, remove the escapes before interpreting
40
- // the bytes as utf-16
41
- while (index < data.length && data[index] !== 41) { // )
42
- var high = getTextByte();
43
- var low = getTextByte();
44
- var char = (high << 8) | low;
45
- result += String.fromCharCode(char);
46
- }
47
- index++;
48
- return result;
49
- }
50
- var root = null;
51
- var stack = [];
52
- function pushContainer(value) {
53
- if (!stack.length) {
54
- stack.push(value);
55
- root = value;
56
- }
57
- else {
58
- pushValue(value);
59
- stack.push(value);
60
- }
61
- }
62
- function pushValue(value) {
63
- if (!stack.length)
64
- throw new Error('Invalid data');
65
- var top = stack[stack.length - 1];
66
- if (typeof top === 'string') {
67
- stack[stack.length - 2][top] = value;
68
- pop();
69
- }
70
- else if (Array.isArray(top)) {
71
- top.push(value);
72
- }
73
- else {
74
- throw new Error('Invalid data');
75
- }
76
- }
77
- function pushProperty(name) {
78
- if (!stack.length)
79
- pushContainer({});
80
- var top = stack[stack.length - 1];
81
- if (top && typeof top === 'string') {
82
- if (name === 'nil') {
83
- pushValue(null);
84
- }
85
- else {
86
- pushValue("/".concat(name));
87
- }
88
- }
89
- else if (top && typeof top === 'object') {
90
- stack.push(name);
91
- }
92
- else {
93
- throw new Error('Invalid data');
94
- }
95
- }
96
- function pop() {
97
- if (!stack.length)
98
- throw new Error('Invalid data');
99
- stack.pop();
100
- }
101
- skipWhitespace();
102
- while (index < data.length) {
103
- var i = index;
104
- var char = data[i];
105
- if (char === 60 && data[i + 1] === 60) { // <<
106
- index += 2;
107
- pushContainer({});
108
- }
109
- else if (char === 62 && data[i + 1] === 62) { // >>
110
- index += 2;
111
- pop();
112
- }
113
- else if (char === 47) { // /
114
- index += 1;
115
- var start = index;
116
- while (index < data.length && !isWhitespace(data[index])) {
117
- index++;
118
- }
119
- var name_1 = '';
120
- for (var i_1 = start; i_1 < index; i_1++) {
121
- name_1 += String.fromCharCode(data[i_1]);
122
- }
123
- pushProperty(name_1);
124
- }
125
- else if (char === 40) { // (
126
- index += 1;
127
- pushValue(getText());
128
- }
129
- else if (char === 91) { // [
130
- index += 1;
131
- pushContainer([]);
132
- }
133
- else if (char === 93) { // ]
134
- index += 1;
135
- pop();
136
- }
137
- else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null
138
- index += 4;
139
- pushValue(null);
140
- }
141
- else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true
142
- index += 4;
143
- pushValue(true);
144
- }
145
- else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false
146
- index += 5;
147
- pushValue(false);
148
- }
149
- else if (isNumber(char)) {
150
- var value = '';
151
- while (index < data.length && isNumber(data[index])) {
152
- value += String.fromCharCode(data[index]);
153
- index++;
154
- }
155
- pushValue(parseFloat(value));
156
- }
157
- else {
158
- index += 1;
159
- console.log("Invalid token ".concat(String.fromCharCode(char), " at ").concat(index));
160
- // ` near ${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}` +
161
- // `data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`
162
- }
163
- skipWhitespace();
164
- }
165
- return root;
166
- }
167
- exports.parseEngineData = parseEngineData;
168
- var floatKeys = [
169
- 'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',
170
- 'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',
171
- 'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',
172
- 'OutlineWidth', 'AutoLeading',
173
- ];
174
- var intArrays = ['RunLengthArray'];
175
- // TODO: handle /nil
176
- function serializeEngineData(data, condensed) {
177
- if (condensed === void 0) { condensed = false; }
178
- var buffer = new Uint8Array(1024);
179
- var offset = 0;
180
- var indent = 0;
181
- function write(value) {
182
- if (offset >= buffer.length) {
183
- var newBuffer = new Uint8Array(buffer.length * 2);
184
- newBuffer.set(buffer);
185
- buffer = newBuffer;
186
- }
187
- buffer[offset] = value;
188
- offset++;
189
- }
190
- function writeString(value) {
191
- for (var i = 0; i < value.length; i++) {
192
- write(value.charCodeAt(i));
193
- }
194
- }
195
- function writeIndent() {
196
- if (condensed) {
197
- writeString(' ');
198
- }
199
- else {
200
- for (var i = 0; i < indent; i++) {
201
- writeString('\t');
202
- }
203
- }
204
- }
205
- function writeProperty(key, value) {
206
- writeIndent();
207
- writeString("/".concat(key));
208
- writeValue(value, key, true);
209
- if (!condensed)
210
- writeString('\n');
211
- }
212
- function serializeInt(value) {
213
- return value.toString();
214
- }
215
- function serializeFloat(value) {
216
- return value.toFixed(5)
217
- .replace(/(\d)0+$/g, '$1')
218
- .replace(/^0+\.([1-9])/g, '.$1')
219
- .replace(/^-0+\.0(\d)/g, '-.0$1');
220
- }
221
- function serializeNumber(value, key) {
222
- var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;
223
- return isFloat ? serializeFloat(value) : serializeInt(value);
224
- }
225
- function getKeys(value) {
226
- var keys = Object.keys(value);
227
- if (keys.indexOf('98') !== -1)
228
- keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
229
- if (keys.indexOf('99') !== -1)
230
- keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
231
- return keys;
232
- }
233
- function writeStringByte(value) {
234
- if (value === 40 || value === 41 || value === 92) { // ( ) \
235
- write(92); // \
236
- }
237
- write(value);
238
- }
239
- function writeValue(value, key, inProperty) {
240
- if (inProperty === void 0) { inProperty = false; }
241
- function writePrefix() {
242
- if (inProperty) {
243
- writeString(' ');
244
- }
245
- else {
246
- writeIndent();
247
- }
248
- }
249
- if (value === null) {
250
- writePrefix();
251
- writeString(condensed ? '/nil' : 'null');
252
- }
253
- else if (typeof value === 'number') {
254
- writePrefix();
255
- writeString(serializeNumber(value, key));
256
- }
257
- else if (typeof value === 'boolean') {
258
- writePrefix();
259
- writeString(value ? 'true' : 'false');
260
- }
261
- else if (typeof value === 'string') {
262
- writePrefix();
263
- if ((key === '99' || key === '98') && value.charAt(0) === '/') {
264
- writeString(value);
265
- }
266
- else {
267
- writeString('(');
268
- write(0xfe);
269
- write(0xff);
270
- for (var i = 0; i < value.length; i++) {
271
- var code = value.charCodeAt(i);
272
- writeStringByte((code >> 8) & 0xff);
273
- writeStringByte(code & 0xff);
274
- }
275
- writeString(')');
276
- }
277
- }
278
- else if (Array.isArray(value)) {
279
- writePrefix();
280
- if (value.every(function (x) { return typeof x === 'number'; })) {
281
- writeString('[');
282
- var intArray = intArrays.indexOf(key) !== -1;
283
- for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
284
- var x = value_1[_i];
285
- writeString(' ');
286
- writeString(intArray ? serializeNumber(x) : serializeFloat(x));
287
- }
288
- writeString(' ]');
289
- }
290
- else {
291
- writeString('[');
292
- if (!condensed)
293
- writeString('\n');
294
- for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {
295
- var x = value_2[_a];
296
- writeValue(x, key);
297
- if (!condensed)
298
- writeString('\n');
299
- }
300
- writeIndent();
301
- writeString(']');
302
- }
303
- }
304
- else if (typeof value === 'object') {
305
- if (inProperty && !condensed)
306
- writeString('\n');
307
- writeIndent();
308
- writeString('<<');
309
- if (!condensed)
310
- writeString('\n');
311
- indent++;
312
- for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {
313
- var key_1 = _c[_b];
314
- writeProperty(key_1, value[key_1]);
315
- }
316
- indent--;
317
- writeIndent();
318
- writeString('>>');
319
- }
320
- return undefined;
321
- }
322
- if (condensed) {
323
- if (typeof data === 'object') {
324
- for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {
325
- var key = _a[_i];
326
- writeProperty(key, data[key]);
327
- }
328
- }
329
- }
330
- else {
331
- writeString('\n\n');
332
- writeValue(data);
333
- }
334
- return buffer.slice(0, offset);
335
- }
336
- exports.serializeEngineData = serializeEngineData;
337
-
338
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQztZQUVsQixJQUFJLENBQUMsU0FBUztnQkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFbEMsTUFBTSxFQUFFLENBQUM7WUFFVCxLQUFrQixVQUFjLEVBQWQsS0FBQSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQWQsY0FBYyxFQUFkLElBQWMsRUFBRTtnQkFBN0IsSUFBTSxLQUFHLFNBQUE7Z0JBQ2IsYUFBYSxDQUFDLEtBQUcsRUFBRSxLQUFLLENBQUMsS0FBRyxDQUFDLENBQUMsQ0FBQzthQUMvQjtZQUVELE1BQU0sRUFBRSxDQUFDO1lBQ1QsV0FBVyxFQUFFLENBQUM7WUFDZCxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEI7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxTQUFTLEVBQUU7UUFDZCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM3QixLQUFrQixVQUFhLEVBQWIsS0FBQSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtnQkFBNUIsSUFBTSxHQUFHLFNBQUE7Z0JBQ2IsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5QjtTQUNEO0tBQ0Q7U0FBTTtRQUNOLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakI7SUFFRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUEzS0Qsa0RBMktDIiwiZmlsZSI6ImVuZ2luZURhdGEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBpc1doaXRlc3BhY2UoY2hhcjogbnVtYmVyKSB7XHJcblx0Ly8gJyAnLCAnXFxuJywgJ1xccicsICdcXHQnXHJcblx0cmV0dXJuIGNoYXIgPT09IDMyIHx8IGNoYXIgPT09IDEwIHx8IGNoYXIgPT09IDEzIHx8IGNoYXIgPT09IDk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzTnVtYmVyKGNoYXI6IG51bWJlcikge1xyXG5cdC8vIDAxMjM0NTY3ODkuLVxyXG5cdHJldHVybiAoY2hhciA+PSA0OCAmJiBjaGFyIDw9IDU3KSB8fCBjaGFyID09PSA0NiB8fCBjaGFyID09PSA0NTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW5naW5lRGF0YShkYXRhOiBudW1iZXJbXSB8IFVpbnQ4QXJyYXkpIHtcclxuXHRsZXQgaW5kZXggPSAwO1xyXG5cclxuXHRmdW5jdGlvbiBza2lwV2hpdGVzcGFjZSgpIHtcclxuXHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHRCeXRlKCkge1xyXG5cdFx0bGV0IGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdGluZGV4Kys7XHJcblxyXG5cdFx0aWYgKGJ5dGUgPT09IDkyKSB7IC8vIFxcXHJcblx0XHRcdGJ5dGUgPSBkYXRhW2luZGV4XTtcclxuXHRcdFx0aW5kZXgrKztcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYnl0ZTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHQoKSB7XHJcblx0XHRsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG5cdFx0aWYgKGRhdGFbaW5kZXhdID09PSA0MSkgeyAvLyApXHJcblx0XHRcdGluZGV4Kys7XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU3RyaW5ncyBzdGFydCB3aXRoIHV0Zi0xNiBCT01cclxuXHRcdGlmIChkYXRhW2luZGV4XSAhPT0gMHhGRSB8fCBkYXRhW2luZGV4ICsgMV0gIT09IDB4RkYpIHtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHV0Zi0xNiBCT00nKTtcclxuXHRcdH1cclxuXHJcblx0XHRpbmRleCArPSAyO1xyXG5cclxuXHRcdC8vICksICggYW5kIFxcIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgaW4gYXNjaWkgbWFubmVyLCByZW1vdmUgdGhlIGVzY2FwZXMgYmVmb3JlIGludGVycHJldGluZ1xyXG5cdFx0Ly8gdGhlIGJ5dGVzIGFzIHV0Zi0xNlxyXG5cdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgZGF0YVtpbmRleF0gIT09IDQxKSB7IC8vIClcclxuXHRcdFx0Y29uc3QgaGlnaCA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGxvdyA9IGdldFRleHRCeXRlKCk7XHJcblx0XHRcdGNvbnN0IGNoYXIgPSAoaGlnaCA8PCA4KSB8IGxvdztcclxuXHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcik7XHJcblx0XHR9XHJcblxyXG5cdFx0aW5kZXgrKztcclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG5cclxuXHRsZXQgcm9vdDogYW55ID0gbnVsbDtcclxuXHRjb25zdCBzdGFjazogYW55W10gPSBbXTtcclxuXHJcblx0ZnVuY3Rpb24gcHVzaENvbnRhaW5lcih2YWx1ZTogYW55KSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkge1xyXG5cdFx0XHRzdGFjay5wdXNoKHZhbHVlKTtcclxuXHRcdFx0cm9vdCA9IHZhbHVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHVzaFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0c3RhY2sucHVzaCh2YWx1ZSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwdXNoVmFsdWUodmFsdWU6IGFueSkge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblxyXG5cdFx0Y29uc3QgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB0b3AgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdHN0YWNrW3N0YWNrLmxlbmd0aCAtIDJdW3RvcF0gPSB2YWx1ZTtcclxuXHRcdFx0cG9wKCk7XHJcblx0XHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodG9wKSkge1xyXG5cdFx0XHR0b3AucHVzaCh2YWx1ZSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YScpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcHVzaFByb3BlcnR5KG5hbWU6IHN0cmluZykge1xyXG5cdFx0aWYgKCFzdGFjay5sZW5ndGgpIHB1c2hDb250YWluZXIoe30pO1xyXG5cclxuXHRcdGNvbnN0IHRvcCA9IHN0YWNrW3N0YWNrLmxlbmd0aCAtIDFdO1xyXG5cclxuXHRcdGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0aWYgKG5hbWUgPT09ICduaWwnKSB7XHJcblx0XHRcdFx0cHVzaFZhbHVlKG51bGwpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHB1c2hWYWx1ZShgLyR7bmFtZX1gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0b3AgJiYgdHlwZW9mIHRvcCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0c3RhY2sucHVzaChuYW1lKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRhJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBwb3AoKSB7XHJcblx0XHRpZiAoIXN0YWNrLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEnKTtcclxuXHRcdHN0YWNrLnBvcCgpO1xyXG5cdH1cclxuXHJcblx0c2tpcFdoaXRlc3BhY2UoKTtcclxuXHJcblx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGgpIHtcclxuXHRcdGNvbnN0IGkgPSBpbmRleDtcclxuXHRcdGNvbnN0IGNoYXIgPSBkYXRhW2ldO1xyXG5cclxuXHRcdGlmIChjaGFyID09PSA2MCAmJiBkYXRhW2kgKyAxXSA9PT0gNjApIHsgLy8gPDxcclxuXHRcdFx0aW5kZXggKz0gMjtcclxuXHRcdFx0cHVzaENvbnRhaW5lcih7fSk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDYyICYmIGRhdGFbaSArIDFdID09PSA2MikgeyAvLyA+PlxyXG5cdFx0XHRpbmRleCArPSAyO1xyXG5cdFx0XHRwb3AoKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gNDcpIHsgLy8gL1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zdCBzdGFydCA9IGluZGV4O1xyXG5cclxuXHRcdFx0d2hpbGUgKGluZGV4IDwgZGF0YS5sZW5ndGggJiYgIWlzV2hpdGVzcGFjZShkYXRhW2luZGV4XSkpIHtcclxuXHRcdFx0XHRpbmRleCsrO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRsZXQgbmFtZSA9ICcnO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgaW5kZXg7IGkrKykge1xyXG5cdFx0XHRcdG5hbWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cHVzaFByb3BlcnR5KG5hbWUpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA0MCkgeyAvLyAoXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hWYWx1ZShnZXRUZXh0KCkpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MSkgeyAvLyBbXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHB1c2hDb250YWluZXIoW10pO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSA5MykgeyAvLyBdXHJcblx0XHRcdGluZGV4ICs9IDE7XHJcblx0XHRcdHBvcCgpO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFyID09PSAxMTAgJiYgZGF0YVtpICsgMV0gPT09IDExNyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMDgpIHsgLy8gbnVsbFxyXG5cdFx0XHRpbmRleCArPSA0O1xyXG5cdFx0XHRwdXNoVmFsdWUobnVsbCk7XHJcblx0XHR9IGVsc2UgaWYgKGNoYXIgPT09IDExNiAmJiBkYXRhW2kgKyAxXSA9PT0gMTE0ICYmIGRhdGFbaSArIDJdID09PSAxMTcgJiYgZGF0YVtpICsgM10gPT09IDEwMSkgeyAvLyB0cnVlXHJcblx0XHRcdGluZGV4ICs9IDQ7XHJcblx0XHRcdHB1c2hWYWx1ZSh0cnVlKTtcclxuXHRcdH0gZWxzZSBpZiAoY2hhciA9PT0gMTAyICYmIGRhdGFbaSArIDFdID09PSA5NyAmJiBkYXRhW2kgKyAyXSA9PT0gMTA4ICYmIGRhdGFbaSArIDNdID09PSAxMTUgJiYgZGF0YVtpICsgNF0gPT09IDEwMSkgeyAvLyBmYWxzZVxyXG5cdFx0XHRpbmRleCArPSA1O1xyXG5cdFx0XHRwdXNoVmFsdWUoZmFsc2UpO1xyXG5cdFx0fSBlbHNlIGlmIChpc051bWJlcihjaGFyKSkge1xyXG5cdFx0XHRsZXQgdmFsdWUgPSAnJztcclxuXHJcblx0XHRcdHdoaWxlIChpbmRleCA8IGRhdGEubGVuZ3RoICYmIGlzTnVtYmVyKGRhdGFbaW5kZXhdKSkge1xyXG5cdFx0XHRcdHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGF0YVtpbmRleF0pO1xyXG5cdFx0XHRcdGluZGV4Kys7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHB1c2hWYWx1ZShwYXJzZUZsb2F0KHZhbHVlKSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpbmRleCArPSAxO1xyXG5cdFx0XHRjb25zb2xlLmxvZyhgSW52YWxpZCB0b2tlbiAke1N0cmluZy5mcm9tQ2hhckNvZGUoY2hhcil9IGF0ICR7aW5kZXh9YCk7XHJcblx0XHRcdC8vIGAgbmVhciAke1N0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZGF0YS5zbGljZShpbmRleCAtIDEwLCBpbmRleCArIDIwKSBhcyBhbnkpfWAgK1xyXG5cdFx0XHQvLyBgZGF0YSBbJHtBcnJheS5mcm9tKGRhdGEuc2xpY2UoaW5kZXggLSAxMCwgaW5kZXggKyAyMCkpLmpvaW4oJywgJyl9XWBcclxuXHRcdH1cclxuXHJcblx0XHRza2lwV2hpdGVzcGFjZSgpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJvb3Q7XHJcbn1cclxuXHJcbmNvbnN0IGZsb2F0S2V5cyA9IFtcclxuXHQnQXhpcycsICdYWScsICdab25lJywgJ1dvcmRTcGFjaW5nJywgJ0ZpcnN0TGluZUluZGVudCcsICdHbHlwaFNwYWNpbmcnLCAnU3RhcnRJbmRlbnQnLCAnRW5kSW5kZW50JywgJ1NwYWNlQmVmb3JlJyxcclxuXHQnU3BhY2VBZnRlcicsICdMZXR0ZXJTcGFjaW5nJywgJ1ZhbHVlcycsICdHcmlkU2l6ZScsICdHcmlkTGVhZGluZycsICdQb2ludEJhc2UnLCAnQm94Qm91bmRzJywgJ1RyYW5zZm9ybVBvaW50MCcsICdUcmFuc2Zvcm1Qb2ludDEnLFxyXG5cdCdUcmFuc2Zvcm1Qb2ludDInLCAnRm9udFNpemUnLCAnTGVhZGluZycsICdIb3Jpem9udGFsU2NhbGUnLCAnVmVydGljYWxTY2FsZScsICdCYXNlbGluZVNoaWZ0JywgJ1RzdW1lJyxcclxuXHQnT3V0bGluZVdpZHRoJywgJ0F1dG9MZWFkaW5nJyxcclxuXTtcclxuXHJcbmNvbnN0IGludEFycmF5cyA9IFsnUnVuTGVuZ3RoQXJyYXknXTtcclxuXHJcbi8vIFRPRE86IGhhbmRsZSAvbmlsXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVFbmdpbmVEYXRhKGRhdGE6IGFueSwgY29uZGVuc2VkID0gZmFsc2UpIHtcclxuXHRsZXQgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTAyNCk7XHJcblx0bGV0IG9mZnNldCA9IDA7XHJcblx0bGV0IGluZGVudCA9IDA7XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdGlmIChvZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xyXG5cdFx0XHRjb25zdCBuZXdCdWZmZXIgPSBuZXcgVWludDhBcnJheShidWZmZXIubGVuZ3RoICogMik7XHJcblx0XHRcdG5ld0J1ZmZlci5zZXQoYnVmZmVyKTtcclxuXHRcdFx0YnVmZmVyID0gbmV3QnVmZmVyO1xyXG5cdFx0fVxyXG5cclxuXHRcdGJ1ZmZlcltvZmZzZXRdID0gdmFsdWU7XHJcblx0XHRvZmZzZXQrKztcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHZhbHVlOiBzdHJpbmcpIHtcclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0d3JpdGUodmFsdWUuY2hhckNvZGVBdChpKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZUluZGVudCgpIHtcclxuXHRcdGlmIChjb25kZW5zZWQpIHtcclxuXHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnXFx0Jyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIHdyaXRlUHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuXHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHR3cml0ZVN0cmluZyhgLyR7a2V5fWApO1xyXG5cdFx0d3JpdGVWYWx1ZSh2YWx1ZSwga2V5LCB0cnVlKTtcclxuXHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVJbnQodmFsdWU6IG51bWJlcikge1xyXG5cdFx0cmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBzZXJpYWxpemVGbG9hdCh2YWx1ZTogbnVtYmVyKSB7XHJcblx0XHRyZXR1cm4gdmFsdWUudG9GaXhlZCg1KVxyXG5cdFx0XHQucmVwbGFjZSgvKFxcZCkwKyQvZywgJyQxJylcclxuXHRcdFx0LnJlcGxhY2UoL14wK1xcLihbMS05XSkvZywgJy4kMScpXHJcblx0XHRcdC5yZXBsYWNlKC9eLTArXFwuMChcXGQpL2csICctLjAkMScpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gc2VyaWFsaXplTnVtYmVyKHZhbHVlOiBudW1iZXIsIGtleT86IHN0cmluZykge1xyXG5cdFx0Y29uc3QgaXNGbG9hdCA9IChrZXkgJiYgZmxvYXRLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHx8ICh2YWx1ZSB8IDApICE9PSB2YWx1ZTtcclxuXHRcdHJldHVybiBpc0Zsb2F0ID8gc2VyaWFsaXplRmxvYXQodmFsdWUpIDogc2VyaWFsaXplSW50KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldEtleXModmFsdWU6IGFueSkge1xyXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcclxuXHJcblx0XHRpZiAoa2V5cy5pbmRleE9mKCc5OCcpICE9PSAtMSlcclxuXHRcdFx0a2V5cy51bnNoaWZ0KC4uLmtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignOTknKSwgMSkpO1xyXG5cclxuXHRcdGlmIChrZXlzLmluZGV4T2YoJzk5JykgIT09IC0xKVxyXG5cdFx0XHRrZXlzLnVuc2hpZnQoLi4ua2V5cy5zcGxpY2Uoa2V5cy5pbmRleE9mKCc5OScpLCAxKSk7XHJcblxyXG5cdFx0cmV0dXJuIGtleXM7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiB3cml0ZVN0cmluZ0J5dGUodmFsdWU6IG51bWJlcikge1xyXG5cdFx0aWYgKHZhbHVlID09PSA0MCB8fCB2YWx1ZSA9PT0gNDEgfHwgdmFsdWUgPT09IDkyKSB7IC8vICggKSBcXFxyXG5cdFx0XHR3cml0ZSg5Mik7IC8vIFxcXHJcblx0XHR9XHJcblxyXG5cdFx0d3JpdGUodmFsdWUpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gd3JpdGVWYWx1ZSh2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcsIGluUHJvcGVydHkgPSBmYWxzZSkge1xyXG5cdFx0ZnVuY3Rpb24gd3JpdGVQcmVmaXgoKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5KSB7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJyAnKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdHdyaXRlUHJlZml4KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKGNvbmRlbnNlZCA/ICcvbmlsJyA6ICdudWxsJyk7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcoc2VyaWFsaXplTnVtYmVyKHZhbHVlLCBrZXkpKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHRcdFx0d3JpdGVTdHJpbmcodmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnKTtcclxuXHRcdH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHR3cml0ZVByZWZpeCgpO1xyXG5cclxuXHRcdFx0aWYgKChrZXkgPT09ICc5OScgfHwga2V5ID09PSAnOTgnKSAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcvJykge1xyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKHZhbHVlKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnKCcpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmUpO1xyXG5cdFx0XHRcdHdyaXRlKDB4ZmYpO1xyXG5cclxuXHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRjb25zdCBjb2RlID0gdmFsdWUuY2hhckNvZGVBdChpKTtcclxuXHRcdFx0XHRcdHdyaXRlU3RyaW5nQnl0ZSgoY29kZSA+PiA4KSAmIDB4ZmYpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmdCeXRlKGNvZGUgJiAweGZmKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlU3RyaW5nKCcpJyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuXHRcdFx0d3JpdGVQcmVmaXgoKTtcclxuXHJcblx0XHRcdGlmICh2YWx1ZS5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSAnbnVtYmVyJykpIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cclxuXHRcdFx0XHRjb25zdCBpbnRBcnJheSA9IGludEFycmF5cy5pbmRleE9mKGtleSEpICE9PSAtMTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCB4IG9mIHZhbHVlKSB7XHJcblx0XHRcdFx0XHR3cml0ZVN0cmluZygnICcpO1xyXG5cdFx0XHRcdFx0d3JpdGVTdHJpbmcoaW50QXJyYXkgPyBzZXJpYWxpemVOdW1iZXIoeCkgOiBzZXJpYWxpemVGbG9hdCh4KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR3cml0ZVN0cmluZygnIF0nKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR3cml0ZVN0cmluZygnWycpO1xyXG5cdFx0XHRcdGlmICghY29uZGVuc2VkKSB3cml0ZVN0cmluZygnXFxuJyk7XHJcblxyXG5cdFx0XHRcdGZvciAoY29uc3QgeCBvZiB2YWx1ZSkge1xyXG5cdFx0XHRcdFx0d3JpdGVWYWx1ZSh4LCBrZXkpO1xyXG5cdFx0XHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdFx0d3JpdGVTdHJpbmcoJ10nKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdGlmIChpblByb3BlcnR5ICYmICFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdHdyaXRlSW5kZW50KCk7XHJcblx0XHRcdHdyaXRlU3RyaW5nKCc8PCcpO1xyXG5cclxuXHRcdFx0aWYgKCFjb25kZW5zZWQpIHdyaXRlU3RyaW5nKCdcXG4nKTtcclxuXHJcblx0XHRcdGluZGVudCsrO1xyXG5cclxuXHRcdFx0Zm9yIChjb25zdCBrZXkgb2YgZ2V0S2V5cyh2YWx1ZSkpIHtcclxuXHRcdFx0XHR3cml0ZVByb3BlcnR5KGtleSwgdmFsdWVba2V5XSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGluZGVudC0tO1xyXG5cdFx0XHR3cml0ZUluZGVudCgpO1xyXG5cdFx0XHR3cml0ZVN0cmluZygnPj4nKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0aWYgKGNvbmRlbnNlZCkge1xyXG5cdFx0aWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBvZiBnZXRLZXlzKGRhdGEpKSB7XHJcblx0XHRcdFx0d3JpdGVQcm9wZXJ0eShrZXksIGRhdGFba2V5XSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0d3JpdGVTdHJpbmcoJ1xcblxcbicpO1xyXG5cdFx0d3JpdGVWYWx1ZShkYXRhKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBidWZmZXIuc2xpY2UoMCwgb2Zmc2V0KTtcclxufVxyXG4iXSwic291cmNlUm9vdCI6IkM6XFxQcm9qZWN0c1xcZ2l0aHViXFxhZy1wc2RcXHNyYyJ9
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeEngineData = exports.parseEngineData = void 0;
4
+ function isWhitespace(char) {
5
+ // ' ', '\n', '\r', '\t'
6
+ return char === 32 || char === 10 || char === 13 || char === 9;
7
+ }
8
+ function isNumber(char) {
9
+ // 0123456789.-
10
+ return (char >= 48 && char <= 57) || char === 46 || char === 45;
11
+ }
12
+ function parseEngineData(data) {
13
+ var index = 0;
14
+ function skipWhitespace() {
15
+ while (index < data.length && isWhitespace(data[index])) {
16
+ index++;
17
+ }
18
+ }
19
+ function getTextByte() {
20
+ var byte = data[index];
21
+ index++;
22
+ if (byte === 92) { // \
23
+ byte = data[index];
24
+ index++;
25
+ }
26
+ return byte;
27
+ }
28
+ function getText() {
29
+ var result = '';
30
+ if (data[index] === 41) { // )
31
+ index++;
32
+ return result;
33
+ }
34
+ // Strings start with utf-16 BOM
35
+ if (data[index] !== 0xFE || data[index + 1] !== 0xFF) {
36
+ throw new Error('Invalid utf-16 BOM');
37
+ }
38
+ index += 2;
39
+ // ), ( and \ characters are escaped in ascii manner, remove the escapes before interpreting
40
+ // the bytes as utf-16
41
+ while (index < data.length && data[index] !== 41) { // )
42
+ var high = getTextByte();
43
+ var low = getTextByte();
44
+ var char = (high << 8) | low;
45
+ result += String.fromCharCode(char);
46
+ }
47
+ index++;
48
+ return result;
49
+ }
50
+ var root = null;
51
+ var stack = [];
52
+ function pushContainer(value) {
53
+ if (!stack.length) {
54
+ stack.push(value);
55
+ root = value;
56
+ }
57
+ else {
58
+ pushValue(value);
59
+ stack.push(value);
60
+ }
61
+ }
62
+ function pushValue(value) {
63
+ if (!stack.length)
64
+ throw new Error('Invalid data');
65
+ var top = stack[stack.length - 1];
66
+ if (typeof top === 'string') {
67
+ stack[stack.length - 2][top] = value;
68
+ pop();
69
+ }
70
+ else if (Array.isArray(top)) {
71
+ top.push(value);
72
+ }
73
+ else {
74
+ throw new Error('Invalid data');
75
+ }
76
+ }
77
+ function pushProperty(name) {
78
+ if (!stack.length)
79
+ pushContainer({});
80
+ var top = stack[stack.length - 1];
81
+ if (top && typeof top === 'string') {
82
+ if (name === 'nil') {
83
+ pushValue(null);
84
+ }
85
+ else {
86
+ pushValue("/".concat(name));
87
+ }
88
+ }
89
+ else if (top && typeof top === 'object') {
90
+ stack.push(name);
91
+ }
92
+ else {
93
+ throw new Error('Invalid data');
94
+ }
95
+ }
96
+ function pop() {
97
+ if (!stack.length)
98
+ throw new Error('Invalid data');
99
+ stack.pop();
100
+ }
101
+ skipWhitespace();
102
+ while (index < data.length) {
103
+ var i = index;
104
+ var char = data[i];
105
+ if (char === 60 && data[i + 1] === 60) { // <<
106
+ index += 2;
107
+ pushContainer({});
108
+ }
109
+ else if (char === 62 && data[i + 1] === 62) { // >>
110
+ index += 2;
111
+ pop();
112
+ }
113
+ else if (char === 47) { // /
114
+ index += 1;
115
+ var start = index;
116
+ while (index < data.length && !isWhitespace(data[index])) {
117
+ index++;
118
+ }
119
+ var name_1 = '';
120
+ for (var i_1 = start; i_1 < index; i_1++) {
121
+ name_1 += String.fromCharCode(data[i_1]);
122
+ }
123
+ pushProperty(name_1);
124
+ }
125
+ else if (char === 40) { // (
126
+ index += 1;
127
+ pushValue(getText());
128
+ }
129
+ else if (char === 91) { // [
130
+ index += 1;
131
+ pushContainer([]);
132
+ }
133
+ else if (char === 93) { // ]
134
+ index += 1;
135
+ pop();
136
+ }
137
+ else if (char === 110 && data[i + 1] === 117 && data[i + 2] === 108 && data[i + 3] === 108) { // null
138
+ index += 4;
139
+ pushValue(null);
140
+ }
141
+ else if (char === 116 && data[i + 1] === 114 && data[i + 2] === 117 && data[i + 3] === 101) { // true
142
+ index += 4;
143
+ pushValue(true);
144
+ }
145
+ else if (char === 102 && data[i + 1] === 97 && data[i + 2] === 108 && data[i + 3] === 115 && data[i + 4] === 101) { // false
146
+ index += 5;
147
+ pushValue(false);
148
+ }
149
+ else if (isNumber(char)) {
150
+ var value = '';
151
+ while (index < data.length && isNumber(data[index])) {
152
+ value += String.fromCharCode(data[index]);
153
+ index++;
154
+ }
155
+ pushValue(parseFloat(value));
156
+ }
157
+ else {
158
+ index += 1;
159
+ console.log("Invalid token ".concat(String.fromCharCode(char), " at ").concat(index));
160
+ // ` near ${String.fromCharCode.apply(null, data.slice(index - 10, index + 20) as any)}` +
161
+ // `data [${Array.from(data.slice(index - 10, index + 20)).join(', ')}]`
162
+ }
163
+ skipWhitespace();
164
+ }
165
+ return root;
166
+ }
167
+ exports.parseEngineData = parseEngineData;
168
+ var floatKeys = [
169
+ 'Axis', 'XY', 'Zone', 'WordSpacing', 'FirstLineIndent', 'GlyphSpacing', 'StartIndent', 'EndIndent', 'SpaceBefore',
170
+ 'SpaceAfter', 'LetterSpacing', 'Values', 'GridSize', 'GridLeading', 'PointBase', 'BoxBounds', 'TransformPoint0', 'TransformPoint1',
171
+ 'TransformPoint2', 'FontSize', 'Leading', 'HorizontalScale', 'VerticalScale', 'BaselineShift', 'Tsume',
172
+ 'OutlineWidth', 'AutoLeading',
173
+ ];
174
+ var intArrays = ['RunLengthArray'];
175
+ // TODO: handle /nil
176
+ function serializeEngineData(data, condensed) {
177
+ if (condensed === void 0) { condensed = false; }
178
+ var buffer = new Uint8Array(1024);
179
+ var offset = 0;
180
+ var indent = 0;
181
+ function write(value) {
182
+ if (offset >= buffer.length) {
183
+ var newBuffer = new Uint8Array(buffer.length * 2);
184
+ newBuffer.set(buffer);
185
+ buffer = newBuffer;
186
+ }
187
+ buffer[offset] = value;
188
+ offset++;
189
+ }
190
+ function writeString(value) {
191
+ for (var i = 0; i < value.length; i++) {
192
+ write(value.charCodeAt(i));
193
+ }
194
+ }
195
+ function writeIndent() {
196
+ if (condensed) {
197
+ writeString(' ');
198
+ }
199
+ else {
200
+ for (var i = 0; i < indent; i++) {
201
+ writeString('\t');
202
+ }
203
+ }
204
+ }
205
+ function writeProperty(key, value) {
206
+ writeIndent();
207
+ writeString("/".concat(key));
208
+ writeValue(value, key, true);
209
+ if (!condensed)
210
+ writeString('\n');
211
+ }
212
+ function serializeInt(value) {
213
+ return value.toString();
214
+ }
215
+ function serializeFloat(value) {
216
+ return value.toFixed(5)
217
+ .replace(/(\d)0+$/g, '$1')
218
+ .replace(/^0+\.([1-9])/g, '.$1')
219
+ .replace(/^-0+\.0(\d)/g, '-.0$1');
220
+ }
221
+ function serializeNumber(value, key) {
222
+ var isFloat = (key && floatKeys.indexOf(key) !== -1) || (value | 0) !== value;
223
+ return isFloat ? serializeFloat(value) : serializeInt(value);
224
+ }
225
+ function getKeys(value) {
226
+ var keys = Object.keys(value);
227
+ if (keys.indexOf('98') !== -1)
228
+ keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
229
+ if (keys.indexOf('99') !== -1)
230
+ keys.unshift.apply(keys, keys.splice(keys.indexOf('99'), 1));
231
+ return keys;
232
+ }
233
+ function writeStringByte(value) {
234
+ if (value === 40 || value === 41 || value === 92) { // ( ) \
235
+ write(92); // \
236
+ }
237
+ write(value);
238
+ }
239
+ function writeValue(value, key, inProperty) {
240
+ if (inProperty === void 0) { inProperty = false; }
241
+ function writePrefix() {
242
+ if (inProperty) {
243
+ writeString(' ');
244
+ }
245
+ else {
246
+ writeIndent();
247
+ }
248
+ }
249
+ if (value === null) {
250
+ writePrefix();
251
+ writeString(condensed ? '/nil' : 'null');
252
+ }
253
+ else if (typeof value === 'number') {
254
+ writePrefix();
255
+ writeString(serializeNumber(value, key));
256
+ }
257
+ else if (typeof value === 'boolean') {
258
+ writePrefix();
259
+ writeString(value ? 'true' : 'false');
260
+ }
261
+ else if (typeof value === 'string') {
262
+ writePrefix();
263
+ if ((key === '99' || key === '98') && value.charAt(0) === '/') {
264
+ writeString(value);
265
+ }
266
+ else {
267
+ writeString('(');
268
+ write(0xfe);
269
+ write(0xff);
270
+ for (var i = 0; i < value.length; i++) {
271
+ var code = value.charCodeAt(i);
272
+ writeStringByte((code >> 8) & 0xff);
273
+ writeStringByte(code & 0xff);
274
+ }
275
+ writeString(')');
276
+ }
277
+ }
278
+ else if (Array.isArray(value)) {
279
+ writePrefix();
280
+ if (value.every(function (x) { return typeof x === 'number'; })) {
281
+ writeString('[');
282
+ var intArray = intArrays.indexOf(key) !== -1;
283
+ for (var _i = 0, value_1 = value; _i < value_1.length; _i++) {
284
+ var x = value_1[_i];
285
+ writeString(' ');
286
+ writeString(intArray ? serializeNumber(x) : serializeFloat(x));
287
+ }
288
+ writeString(' ]');
289
+ }
290
+ else {
291
+ writeString('[');
292
+ if (!condensed)
293
+ writeString('\n');
294
+ for (var _a = 0, value_2 = value; _a < value_2.length; _a++) {
295
+ var x = value_2[_a];
296
+ writeValue(x, key);
297
+ if (!condensed)
298
+ writeString('\n');
299
+ }
300
+ writeIndent();
301
+ writeString(']');
302
+ }
303
+ }
304
+ else if (typeof value === 'object') {
305
+ if (inProperty && !condensed)
306
+ writeString('\n');
307
+ writeIndent();
308
+ writeString('<<');
309
+ if (!condensed)
310
+ writeString('\n');
311
+ indent++;
312
+ for (var _b = 0, _c = getKeys(value); _b < _c.length; _b++) {
313
+ var key_1 = _c[_b];
314
+ writeProperty(key_1, value[key_1]);
315
+ }
316
+ indent--;
317
+ writeIndent();
318
+ writeString('>>');
319
+ }
320
+ return undefined;
321
+ }
322
+ if (condensed) {
323
+ if (typeof data === 'object') {
324
+ for (var _i = 0, _a = getKeys(data); _i < _a.length; _i++) {
325
+ var key = _a[_i];
326
+ writeProperty(key, data[key]);
327
+ }
328
+ }
329
+ }
330
+ else {
331
+ writeString('\n\n');
332
+ writeValue(data);
333
+ }
334
+ return buffer.slice(0, offset);
335
+ }
336
+ exports.serializeEngineData = serializeEngineData;
337
+ //# sourceMappingURL=engineData.js.map