ag-psd 15.0.0 → 15.0.2

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 +9133 -8707
  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 -34
  41. package/dist/psdReader.js +958 -941
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +694 -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 -34
  89. package/dist-es/psdReader.js +928 -912
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +670 -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,2045 +1,2026 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.hasMultiEffects = exports.readVectorMask = exports.booleanOperations = exports.readBezierKnot = exports.infoHandlersMap = exports.infoHandlers = void 0;
15
- var base64_js_1 = require("base64-js");
16
- var effectsHelpers_1 = require("./effectsHelpers");
17
- var helpers_1 = require("./helpers");
18
- var psdReader_1 = require("./psdReader");
19
- var psdWriter_1 = require("./psdWriter");
20
- var descriptor_1 = require("./descriptor");
21
- var engineData_1 = require("./engineData");
22
- var text_1 = require("./text");
23
- exports.infoHandlers = [];
24
- exports.infoHandlersMap = {};
25
- function addHandler(key, has, read, write) {
26
- var handler = { key: key, has: has, read: read, write: write };
27
- exports.infoHandlers.push(handler);
28
- exports.infoHandlersMap[handler.key] = handler;
29
- }
30
- function addHandlerAlias(key, target) {
31
- exports.infoHandlersMap[key] = exports.infoHandlersMap[target];
32
- }
33
- function hasKey(key) {
34
- return function (target) { return target[key] !== undefined; };
35
- }
36
- function readLength64(reader) {
37
- if ((0, psdReader_1.readUint32)(reader))
38
- throw new Error("Resource size above 4 GB limit at ".concat(reader.offset.toString(16)));
39
- return (0, psdReader_1.readUint32)(reader);
40
- }
41
- function writeLength64(writer, length) {
42
- (0, psdWriter_1.writeUint32)(writer, 0);
43
- (0, psdWriter_1.writeUint32)(writer, length);
44
- }
45
- addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
46
- if ((0, psdReader_1.readInt16)(reader) !== 1)
47
- throw new Error("Invalid TySh version");
48
- var transform = [];
49
- for (var i = 0; i < 6; i++)
50
- transform.push((0, psdReader_1.readFloat64)(reader));
51
- if ((0, psdReader_1.readInt16)(reader) !== 50)
52
- throw new Error("Invalid TySh text version");
53
- var text = (0, descriptor_1.readVersionAndDescriptor)(reader);
54
- if ((0, psdReader_1.readInt16)(reader) !== 1)
55
- throw new Error("Invalid TySh warp version");
56
- var warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
57
- target.text = {
58
- transform: transform,
59
- left: (0, psdReader_1.readFloat32)(reader),
60
- top: (0, psdReader_1.readFloat32)(reader),
61
- right: (0, psdReader_1.readFloat32)(reader),
62
- bottom: (0, psdReader_1.readFloat32)(reader),
63
- text: text['Txt '].replace(/\r/g, '\n'),
64
- index: text.TextIndex || 0,
65
- gridding: descriptor_1.textGridding.decode(text.textGridding),
66
- antiAlias: descriptor_1.Annt.decode(text.AntA),
67
- orientation: descriptor_1.Ornt.decode(text.Ornt),
68
- warp: {
69
- style: descriptor_1.warpStyle.decode(warp.warpStyle),
70
- value: warp.warpValue || 0,
71
- perspective: warp.warpPerspective || 0,
72
- perspectiveOther: warp.warpPerspectiveOther || 0,
73
- rotate: descriptor_1.Ornt.decode(warp.warpRotate),
74
- },
75
- };
76
- if (text.EngineData) {
77
- var engineData = (0, text_1.decodeEngineData)((0, engineData_1.parseEngineData)(text.EngineData));
78
- // const before = parseEngineData(text.EngineData);
79
- // const after = encodeEngineData(engineData);
80
- // require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');
81
- // require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');
82
- // console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));
83
- target.text = __assign(__assign({}, target.text), engineData);
84
- // console.log(require('util').inspect(target.text, false, 99, true));
85
- }
86
- (0, psdReader_1.skipBytes)(reader, leftBytes());
87
- }, function (writer, target) {
88
- var text = target.text;
89
- var warp = text.warp || {};
90
- var transform = text.transform || [1, 0, 0, 1, 0, 0];
91
- var textDescriptor = {
92
- 'Txt ': (text.text || '').replace(/\r?\n/g, '\r'),
93
- textGridding: descriptor_1.textGridding.encode(text.gridding),
94
- Ornt: descriptor_1.Ornt.encode(text.orientation),
95
- AntA: descriptor_1.Annt.encode(text.antiAlias),
96
- TextIndex: text.index || 0,
97
- EngineData: (0, engineData_1.serializeEngineData)((0, text_1.encodeEngineData)(text)),
98
- };
99
- (0, psdWriter_1.writeInt16)(writer, 1); // version
100
- for (var i = 0; i < 6; i++) {
101
- (0, psdWriter_1.writeFloat64)(writer, transform[i]);
102
- }
103
- (0, psdWriter_1.writeInt16)(writer, 50); // text version
104
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'TxLr', textDescriptor);
105
- (0, psdWriter_1.writeInt16)(writer, 1); // warp version
106
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'warp', encodeWarp(warp));
107
- (0, psdWriter_1.writeFloat32)(writer, text.left);
108
- (0, psdWriter_1.writeFloat32)(writer, text.top);
109
- (0, psdWriter_1.writeFloat32)(writer, text.right);
110
- (0, psdWriter_1.writeFloat32)(writer, text.bottom);
111
- // writeZeros(writer, 2);
112
- });
113
- // vector fills
114
- addHandler('SoCo', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
115
- target.vectorFill.type === 'color'; }, function (reader, target) {
116
- var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
117
- target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
118
- }, function (writer, target) {
119
- var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
120
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
121
- });
122
- addHandler('GdFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
123
- (target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'); }, function (reader, target, left) {
124
- var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
125
- target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
126
- (0, psdReader_1.skipBytes)(reader, left());
127
- }, function (writer, target) {
128
- var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
129
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
130
- });
131
- addHandler('PtFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
132
- target.vectorFill.type === 'pattern'; }, function (reader, target) {
133
- var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
134
- target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
135
- }, function (writer, target) {
136
- var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
137
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
138
- });
139
- addHandler('vscg', function (target) { return target.vectorFill !== undefined && target.vectorStroke !== undefined; }, function (reader, target, left) {
140
- (0, psdReader_1.readSignature)(reader); // key
141
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
142
- target.vectorFill = (0, descriptor_1.parseVectorContent)(desc);
143
- (0, psdReader_1.skipBytes)(reader, left());
144
- }, function (writer, target) {
145
- var _a = (0, descriptor_1.serializeVectorContent)(target.vectorFill), descriptor = _a.descriptor, key = _a.key;
146
- (0, psdWriter_1.writeSignature)(writer, key);
147
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
148
- });
149
- function readBezierKnot(reader, width, height) {
150
- var y0 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
151
- var x0 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
152
- var y1 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
153
- var x1 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
154
- var y2 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
155
- var x2 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
156
- return [x0, y0, x1, y1, x2, y2];
157
- }
158
- exports.readBezierKnot = readBezierKnot;
159
- function writeBezierKnot(writer, points, width, height) {
160
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[1] / height); // y0
161
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[0] / width); // x0
162
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[3] / height); // y1
163
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[2] / width); // x1
164
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[5] / height); // y2
165
- (0, psdWriter_1.writeFixedPointPath32)(writer, points[4] / width); // x2
166
- }
167
- exports.booleanOperations = ['exclude', 'combine', 'subtract', 'intersect'];
168
- function readVectorMask(reader, vectorMask, width, height, size) {
169
- var end = reader.offset + size;
170
- var paths = vectorMask.paths;
171
- var path = undefined;
172
- while ((end - reader.offset) >= 26) {
173
- var selector = (0, psdReader_1.readUint16)(reader);
174
- switch (selector) {
175
- case 0: // Closed subpath length record
176
- case 3: { // Open subpath length record
177
- (0, psdReader_1.readUint16)(reader); // count
178
- var boolOp = (0, psdReader_1.readInt16)(reader);
179
- (0, psdReader_1.readUint16)(reader); // always 1 ?
180
- (0, psdReader_1.skipBytes)(reader, 18);
181
- // TODO: 'combine' here might be wrong
182
- path = { open: selector === 3, operation: boolOp === -1 ? 'combine' : exports.booleanOperations[boolOp], knots: [] };
183
- paths.push(path);
184
- break;
185
- }
186
- case 1: // Closed subpath Bezier knot, linked
187
- case 2: // Closed subpath Bezier knot, unlinked
188
- case 4: // Open subpath Bezier knot, linked
189
- case 5: // Open subpath Bezier knot, unlinked
190
- path.knots.push({ linked: (selector === 1 || selector === 4), points: readBezierKnot(reader, width, height) });
191
- break;
192
- case 6: // Path fill rule record
193
- (0, psdReader_1.skipBytes)(reader, 24);
194
- break;
195
- case 7: { // Clipboard record
196
- // TODO: check if these need to be multiplied by document size
197
- var top_1 = (0, psdReader_1.readFixedPointPath32)(reader);
198
- var left = (0, psdReader_1.readFixedPointPath32)(reader);
199
- var bottom = (0, psdReader_1.readFixedPointPath32)(reader);
200
- var right = (0, psdReader_1.readFixedPointPath32)(reader);
201
- var resolution = (0, psdReader_1.readFixedPointPath32)(reader);
202
- (0, psdReader_1.skipBytes)(reader, 4);
203
- vectorMask.clipboard = { top: top_1, left: left, bottom: bottom, right: right, resolution: resolution };
204
- break;
205
- }
206
- case 8: // Initial fill rule record
207
- vectorMask.fillStartsWithAllPixels = !!(0, psdReader_1.readUint16)(reader);
208
- (0, psdReader_1.skipBytes)(reader, 22);
209
- break;
210
- default: throw new Error('Invalid vmsk section');
211
- }
212
- }
213
- return paths;
214
- }
215
- exports.readVectorMask = readVectorMask;
216
- addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
217
- var width = _a.width, height = _a.height;
218
- if ((0, psdReader_1.readUint32)(reader) !== 3)
219
- throw new Error('Invalid vmsk version');
220
- target.vectorMask = { paths: [] };
221
- var vectorMask = target.vectorMask;
222
- var flags = (0, psdReader_1.readUint32)(reader);
223
- vectorMask.invert = (flags & 1) !== 0;
224
- vectorMask.notLink = (flags & 2) !== 0;
225
- vectorMask.disable = (flags & 4) !== 0;
226
- readVectorMask(reader, vectorMask, width, height, left());
227
- // drawBezierPaths(vectorMask.paths, width, height, 'out.png');
228
- (0, psdReader_1.skipBytes)(reader, left());
229
- }, function (writer, target, _a) {
230
- var width = _a.width, height = _a.height;
231
- var vectorMask = target.vectorMask;
232
- var flags = (vectorMask.invert ? 1 : 0) |
233
- (vectorMask.notLink ? 2 : 0) |
234
- (vectorMask.disable ? 4 : 0);
235
- (0, psdWriter_1.writeUint32)(writer, 3); // version
236
- (0, psdWriter_1.writeUint32)(writer, flags);
237
- // initial entry
238
- (0, psdWriter_1.writeUint16)(writer, 6);
239
- (0, psdWriter_1.writeZeros)(writer, 24);
240
- var clipboard = vectorMask.clipboard;
241
- if (clipboard) {
242
- (0, psdWriter_1.writeUint16)(writer, 7);
243
- (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.top);
244
- (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.left);
245
- (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.bottom);
246
- (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.right);
247
- (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.resolution);
248
- (0, psdWriter_1.writeZeros)(writer, 4);
249
- }
250
- if (vectorMask.fillStartsWithAllPixels !== undefined) {
251
- (0, psdWriter_1.writeUint16)(writer, 8);
252
- (0, psdWriter_1.writeUint16)(writer, vectorMask.fillStartsWithAllPixels ? 1 : 0);
253
- (0, psdWriter_1.writeZeros)(writer, 22);
254
- }
255
- for (var _i = 0, _b = vectorMask.paths; _i < _b.length; _i++) {
256
- var path = _b[_i];
257
- (0, psdWriter_1.writeUint16)(writer, path.open ? 3 : 0);
258
- (0, psdWriter_1.writeUint16)(writer, path.knots.length);
259
- (0, psdWriter_1.writeUint16)(writer, Math.abs(exports.booleanOperations.indexOf(path.operation))); // default to 1 if not found
260
- (0, psdWriter_1.writeUint16)(writer, 1);
261
- (0, psdWriter_1.writeZeros)(writer, 18); // TODO: these are sometimes non-zero
262
- var linkedKnot = path.open ? 4 : 1;
263
- var unlinkedKnot = path.open ? 5 : 2;
264
- for (var _c = 0, _d = path.knots; _c < _d.length; _c++) {
265
- var _e = _d[_c], linked = _e.linked, points = _e.points;
266
- (0, psdWriter_1.writeUint16)(writer, linked ? linkedKnot : unlinkedKnot);
267
- writeBezierKnot(writer, points, width, height);
268
- }
269
- }
270
- });
271
- // TODO: need to write vmsk if has outline ?
272
- addHandlerAlias('vsms', 'vmsk');
273
- addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {
274
- if ((0, psdReader_1.readInt32)(reader) !== 1)
275
- throw new Error("Invalid vogk version");
276
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
277
- // console.log(require('util').inspect(desc, false, 99, true));
278
- target.vectorOrigination = { keyDescriptorList: [] };
279
- for (var _i = 0, _a = desc.keyDescriptorList; _i < _a.length; _i++) {
280
- var i = _a[_i];
281
- var item = {};
282
- if (i.keyShapeInvalidated != null)
283
- item.keyShapeInvalidated = i.keyShapeInvalidated;
284
- if (i.keyOriginType != null)
285
- item.keyOriginType = i.keyOriginType;
286
- if (i.keyOriginResolution != null)
287
- item.keyOriginResolution = i.keyOriginResolution;
288
- if (i.keyOriginShapeBBox) {
289
- item.keyOriginShapeBoundingBox = {
290
- top: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox['Top ']),
291
- left: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Left),
292
- bottom: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Btom),
293
- right: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Rght),
294
- };
295
- }
296
- var rectRadii = i.keyOriginRRectRadii;
297
- if (rectRadii) {
298
- item.keyOriginRRectRadii = {
299
- topRight: (0, descriptor_1.parseUnits)(rectRadii.topRight),
300
- topLeft: (0, descriptor_1.parseUnits)(rectRadii.topLeft),
301
- bottomLeft: (0, descriptor_1.parseUnits)(rectRadii.bottomLeft),
302
- bottomRight: (0, descriptor_1.parseUnits)(rectRadii.bottomRight),
303
- };
304
- }
305
- var corners = i.keyOriginBoxCorners;
306
- if (corners) {
307
- item.keyOriginBoxCorners = [
308
- { x: corners.rectangleCornerA.Hrzn, y: corners.rectangleCornerA.Vrtc },
309
- { x: corners.rectangleCornerB.Hrzn, y: corners.rectangleCornerB.Vrtc },
310
- { x: corners.rectangleCornerC.Hrzn, y: corners.rectangleCornerC.Vrtc },
311
- { x: corners.rectangleCornerD.Hrzn, y: corners.rectangleCornerD.Vrtc },
312
- ];
313
- }
314
- var trnf = i.Trnf;
315
- if (trnf) {
316
- item.transform = [trnf.xx, trnf.xy, trnf.xy, trnf.yy, trnf.tx, trnf.ty];
317
- }
318
- target.vectorOrigination.keyDescriptorList.push(item);
319
- }
320
- (0, psdReader_1.skipBytes)(reader, left());
321
- }, function (writer, target) {
322
- target;
323
- var orig = target.vectorOrigination;
324
- var desc = { keyDescriptorList: [] };
325
- for (var i = 0; i < orig.keyDescriptorList.length; i++) {
326
- var item = orig.keyDescriptorList[i];
327
- if (item.keyShapeInvalidated) {
328
- desc.keyDescriptorList.push({ keyShapeInvalidated: true, keyOriginIndex: i });
329
- }
330
- else {
331
- desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
332
- var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
333
- if (item.keyOriginType != null)
334
- out.keyOriginType = item.keyOriginType;
335
- if (item.keyOriginResolution != null)
336
- out.keyOriginResolution = item.keyOriginResolution;
337
- var radii = item.keyOriginRRectRadii;
338
- if (radii) {
339
- out.keyOriginRRectRadii = {
340
- unitValueQuadVersion: 1,
341
- topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
342
- topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
343
- bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
344
- bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
345
- };
346
- }
347
- var box = item.keyOriginShapeBoundingBox;
348
- if (box) {
349
- out.keyOriginShapeBBox = {
350
- unitValueQuadVersion: 1,
351
- 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
352
- Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
353
- Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
354
- Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
355
- };
356
- }
357
- var corners = item.keyOriginBoxCorners;
358
- if (corners && corners.length === 4) {
359
- out.keyOriginBoxCorners = {
360
- rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
361
- rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
362
- rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
363
- rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
364
- };
365
- }
366
- var transform = item.transform;
367
- if (transform && transform.length === 6) {
368
- out.Trnf = {
369
- xx: transform[0],
370
- xy: transform[1],
371
- yx: transform[2],
372
- yy: transform[3],
373
- tx: transform[4],
374
- ty: transform[5],
375
- };
376
- }
377
- out.keyOriginIndex = i;
378
- }
379
- }
380
- (0, psdWriter_1.writeInt32)(writer, 1); // version
381
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
382
- });
383
- addHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
384
- var version = (0, psdReader_1.readUint32)(reader);
385
- if (version !== 0)
386
- throw new Error('Invalid lmfx version');
387
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
388
- // console.log(require('util').inspect(info, false, 99, true));
389
- // discard if read in 'lrFX' or 'lfx2' section
390
- target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
391
- (0, psdReader_1.skipBytes)(reader, left());
392
- }, function (writer, target, _, options) {
393
- var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
394
- (0, psdWriter_1.writeUint32)(writer, 0); // version
395
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
396
- });
397
- addHandler('lrFX', hasKey('effects'), function (reader, target, left) {
398
- if (!target.effects)
399
- target.effects = (0, effectsHelpers_1.readEffects)(reader);
400
- (0, psdReader_1.skipBytes)(reader, left());
401
- }, function (writer, target) {
402
- (0, effectsHelpers_1.writeEffects)(writer, target.effects);
403
- });
404
- addHandler('luni', hasKey('name'), function (reader, target, left) {
405
- target.name = (0, psdReader_1.readUnicodeString)(reader);
406
- (0, psdReader_1.skipBytes)(reader, left());
407
- }, function (writer, target) {
408
- (0, psdWriter_1.writeUnicodeString)(writer, target.name);
409
- // writeUint16(writer, 0); // padding (but not extending string length)
410
- });
411
- addHandler('lnsr', hasKey('nameSource'), function (reader, target) { return target.nameSource = (0, psdReader_1.readSignature)(reader); }, function (writer, target) { return (0, psdWriter_1.writeSignature)(writer, target.nameSource); });
412
- addHandler('lyid', hasKey('id'), function (reader, target) { return target.id = (0, psdReader_1.readUint32)(reader); }, function (writer, target, _psd, options) {
413
- var id = target.id;
414
- while (options.layerIds.has(id))
415
- id += 100; // make sure we don't have duplicate layer ids
416
- (0, psdWriter_1.writeUint32)(writer, id);
417
- options.layerIds.add(id);
418
- options.layerToId.set(target, id);
419
- });
420
- addHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {
421
- target.sectionDivider = { type: (0, psdReader_1.readUint32)(reader) };
422
- if (left()) {
423
- (0, psdReader_1.checkSignature)(reader, '8BIM');
424
- target.sectionDivider.key = (0, psdReader_1.readSignature)(reader);
425
- }
426
- if (left()) {
427
- target.sectionDivider.subType = (0, psdReader_1.readUint32)(reader);
428
- }
429
- }, function (writer, target) {
430
- (0, psdWriter_1.writeUint32)(writer, target.sectionDivider.type);
431
- if (target.sectionDivider.key) {
432
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
433
- (0, psdWriter_1.writeSignature)(writer, target.sectionDivider.key);
434
- if (target.sectionDivider.subType !== undefined) {
435
- (0, psdWriter_1.writeUint32)(writer, target.sectionDivider.subType);
436
- }
437
- }
438
- });
439
- // it seems lsdk is used when there's a layer is nested more than 6 levels, but I don't know why?
440
- // maybe some limitation of old version of PS?
441
- addHandlerAlias('lsdk', 'lsct');
442
- addHandler('clbl', hasKey('blendClippendElements'), function (reader, target) {
443
- target.blendClippendElements = !!(0, psdReader_1.readUint8)(reader);
444
- (0, psdReader_1.skipBytes)(reader, 3);
445
- }, function (writer, target) {
446
- (0, psdWriter_1.writeUint8)(writer, target.blendClippendElements ? 1 : 0);
447
- (0, psdWriter_1.writeZeros)(writer, 3);
448
- });
449
- addHandler('infx', hasKey('blendInteriorElements'), function (reader, target) {
450
- target.blendInteriorElements = !!(0, psdReader_1.readUint8)(reader);
451
- (0, psdReader_1.skipBytes)(reader, 3);
452
- }, function (writer, target) {
453
- (0, psdWriter_1.writeUint8)(writer, target.blendInteriorElements ? 1 : 0);
454
- (0, psdWriter_1.writeZeros)(writer, 3);
455
- });
456
- addHandler('knko', hasKey('knockout'), function (reader, target) {
457
- target.knockout = !!(0, psdReader_1.readUint8)(reader);
458
- (0, psdReader_1.skipBytes)(reader, 3);
459
- }, function (writer, target) {
460
- (0, psdWriter_1.writeUint8)(writer, target.knockout ? 1 : 0);
461
- (0, psdWriter_1.writeZeros)(writer, 3);
462
- });
463
- addHandler('lmgm', hasKey('layerMaskAsGlobalMask'), function (reader, target) {
464
- target.layerMaskAsGlobalMask = !!(0, psdReader_1.readUint8)(reader);
465
- (0, psdReader_1.skipBytes)(reader, 3);
466
- }, function (writer, target) {
467
- (0, psdWriter_1.writeUint8)(writer, target.layerMaskAsGlobalMask ? 1 : 0);
468
- (0, psdWriter_1.writeZeros)(writer, 3);
469
- });
470
- addHandler('lspf', hasKey('protected'), function (reader, target) {
471
- var flags = (0, psdReader_1.readUint32)(reader);
472
- target.protected = {
473
- transparency: (flags & 0x01) !== 0,
474
- composite: (flags & 0x02) !== 0,
475
- position: (flags & 0x04) !== 0,
476
- };
477
- if (flags & 0x08)
478
- target.protected.artboards = true;
479
- }, function (writer, target) {
480
- var flags = (target.protected.transparency ? 0x01 : 0) |
481
- (target.protected.composite ? 0x02 : 0) |
482
- (target.protected.position ? 0x04 : 0) |
483
- (target.protected.artboards ? 0x08 : 0);
484
- (0, psdWriter_1.writeUint32)(writer, flags);
485
- });
486
- addHandler('lclr', hasKey('layerColor'), function (reader, target) {
487
- var color = (0, psdReader_1.readUint16)(reader);
488
- (0, psdReader_1.skipBytes)(reader, 6);
489
- target.layerColor = helpers_1.layerColors[color];
490
- }, function (writer, target) {
491
- var index = helpers_1.layerColors.indexOf(target.layerColor);
492
- (0, psdWriter_1.writeUint16)(writer, index === -1 ? 0 : index);
493
- (0, psdWriter_1.writeZeros)(writer, 6);
494
- });
495
- addHandler('shmd', function (target) { return target.timestamp !== undefined || target.animationFrames !== undefined ||
496
- target.animationFrameFlags !== undefined || target.timeline !== undefined; }, function (reader, target, left, _, options) {
497
- var count = (0, psdReader_1.readUint32)(reader);
498
- var _loop_1 = function (i) {
499
- (0, psdReader_1.checkSignature)(reader, '8BIM');
500
- var key = (0, psdReader_1.readSignature)(reader);
501
- (0, psdReader_1.readUint8)(reader); // copy
502
- (0, psdReader_1.skipBytes)(reader, 3);
503
- (0, psdReader_1.readSection)(reader, 1, function (left) {
504
- if (key === 'cust') {
505
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
506
- // console.log('cust', target.name, require('util').inspect(desc, false, 99, true));
507
- if (desc.layerTime !== undefined)
508
- target.timestamp = desc.layerTime;
509
- }
510
- else if (key === 'mlst') {
511
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
512
- // console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));
513
- target.animationFrames = [];
514
- for (var i_1 = 0; i_1 < desc.LaSt.length; i_1++) {
515
- var f = desc.LaSt[i_1];
516
- var frame = { frames: f.FrLs };
517
- if (f.enab !== undefined)
518
- frame.enable = f.enab;
519
- if (f.Ofst)
520
- frame.offset = (0, descriptor_1.horzVrtcToXY)(f.Ofst);
521
- if (f.FXRf)
522
- frame.referencePoint = (0, descriptor_1.horzVrtcToXY)(f.FXRf);
523
- if (f.Lefx)
524
- frame.effects = (0, descriptor_1.parseEffects)(f.Lefx, !!options.logMissingFeatures);
525
- if (f.blendOptions && f.blendOptions.Opct)
526
- frame.opacity = (0, descriptor_1.parsePercent)(f.blendOptions.Opct);
527
- target.animationFrames.push(frame);
528
- }
529
- }
530
- else if (key === 'mdyn') {
531
- // frame flags
532
- (0, psdReader_1.readUint16)(reader); // unknown
533
- var propagate = (0, psdReader_1.readUint8)(reader);
534
- var flags = (0, psdReader_1.readUint8)(reader);
535
- target.animationFrameFlags = {
536
- propagateFrameOne: !propagate,
537
- unifyLayerPosition: (flags & 1) !== 0,
538
- unifyLayerStyle: (flags & 2) !== 0,
539
- unifyLayerVisibility: (flags & 4) !== 0,
540
- };
541
- }
542
- else if (key === 'tmln') {
543
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
544
- var timeScope = desc.timeScope;
545
- // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
546
- var timeline = {
547
- start: timeScope.Strt,
548
- duration: timeScope.duration,
549
- inTime: timeScope.inTime,
550
- outTime: timeScope.outTime,
551
- autoScope: desc.autoScope,
552
- audioLevel: desc.audioLevel,
553
- };
554
- if (desc.trackList) {
555
- timeline.tracks = (0, descriptor_1.parseTrackList)(desc.trackList, !!options.logMissingFeatures);
556
- }
557
- target.timeline = timeline;
558
- // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
559
- }
560
- else {
561
- options.logDevFeatures && console.log('Unhandled "shmd" section key', key);
562
- }
563
- (0, psdReader_1.skipBytes)(reader, left());
564
- });
565
- };
566
- for (var i = 0; i < count; i++) {
567
- _loop_1(i);
568
- }
569
- (0, psdReader_1.skipBytes)(reader, left());
570
- }, function (writer, target, _, options) {
571
- var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline;
572
- var count = 0;
573
- if (animationFrames)
574
- count++;
575
- if (animationFrameFlags)
576
- count++;
577
- if (timeline)
578
- count++;
579
- if (timestamp !== undefined)
580
- count++;
581
- (0, psdWriter_1.writeUint32)(writer, count);
582
- if (animationFrames) {
583
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
584
- (0, psdWriter_1.writeSignature)(writer, 'mlst');
585
- (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
586
- (0, psdWriter_1.writeZeros)(writer, 3);
587
- (0, psdWriter_1.writeSection)(writer, 2, function () {
588
- var _a;
589
- var desc = {
590
- LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,
591
- LaSt: [],
592
- };
593
- for (var i = 0; i < animationFrames.length; i++) {
594
- var f = animationFrames[i];
595
- var frame = {};
596
- if (f.enable !== undefined)
597
- frame.enab = f.enable;
598
- frame.FrLs = f.frames;
599
- if (f.offset)
600
- frame.Ofst = (0, descriptor_1.xyToHorzVrtc)(f.offset);
601
- if (f.referencePoint)
602
- frame.FXRf = (0, descriptor_1.xyToHorzVrtc)(f.referencePoint);
603
- if (f.effects)
604
- frame.Lefx = (0, descriptor_1.serializeEffects)(f.effects, false, false);
605
- if (f.opacity !== undefined)
606
- frame.blendOptions = { Opct: (0, descriptor_1.unitsPercent)(f.opacity) };
607
- desc.LaSt.push(frame);
608
- }
609
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
610
- }, true);
611
- }
612
- if (animationFrameFlags) {
613
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
614
- (0, psdWriter_1.writeSignature)(writer, 'mdyn');
615
- (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
616
- (0, psdWriter_1.writeZeros)(writer, 3);
617
- (0, psdWriter_1.writeSection)(writer, 2, function () {
618
- (0, psdWriter_1.writeUint16)(writer, 0); // unknown
619
- (0, psdWriter_1.writeUint8)(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);
620
- (0, psdWriter_1.writeUint8)(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |
621
- (animationFrameFlags.unifyLayerStyle ? 2 : 0) |
622
- (animationFrameFlags.unifyLayerVisibility ? 4 : 0));
623
- });
624
- }
625
- if (timeline) {
626
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
627
- (0, psdWriter_1.writeSignature)(writer, 'tmln');
628
- (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
629
- (0, psdWriter_1.writeZeros)(writer, 3);
630
- (0, psdWriter_1.writeSection)(writer, 2, function () {
631
- var desc = {
632
- Vrsn: 1,
633
- timeScope: {
634
- Vrsn: 1,
635
- Strt: timeline.start,
636
- duration: timeline.duration,
637
- inTime: timeline.inTime,
638
- outTime: timeline.outTime,
639
- },
640
- autoScope: timeline.autoScope,
641
- audioLevel: timeline.audioLevel,
642
- };
643
- if (timeline.tracks) {
644
- desc.trackList = (0, descriptor_1.serializeTrackList)(timeline.tracks);
645
- }
646
- var id = options.layerToId.get(target) || target.id || 0;
647
- if (!id)
648
- throw new Error('You need to provide layer.id value whan writing document with animations');
649
- desc.LyrI = id;
650
- // console.log('WRITE:tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
651
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
652
- }, true);
653
- }
654
- if (timestamp !== undefined) {
655
- (0, psdWriter_1.writeSignature)(writer, '8BIM');
656
- (0, psdWriter_1.writeSignature)(writer, 'cust');
657
- (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
658
- (0, psdWriter_1.writeZeros)(writer, 3);
659
- (0, psdWriter_1.writeSection)(writer, 2, function () {
660
- var desc = {
661
- layerTime: timestamp,
662
- };
663
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc);
664
- }, true);
665
- }
666
- });
667
- addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
668
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
669
- // console.log(require('util').inspect(desc, false, 99, true));
670
- target.vectorStroke = {
671
- strokeEnabled: desc.strokeEnabled,
672
- fillEnabled: desc.fillEnabled,
673
- lineWidth: (0, descriptor_1.parseUnits)(desc.strokeStyleLineWidth),
674
- lineDashOffset: (0, descriptor_1.parseUnits)(desc.strokeStyleLineDashOffset),
675
- miterLimit: desc.strokeStyleMiterLimit,
676
- lineCapType: descriptor_1.strokeStyleLineCapType.decode(desc.strokeStyleLineCapType),
677
- lineJoinType: descriptor_1.strokeStyleLineJoinType.decode(desc.strokeStyleLineJoinType),
678
- lineAlignment: descriptor_1.strokeStyleLineAlignment.decode(desc.strokeStyleLineAlignment),
679
- scaleLock: desc.strokeStyleScaleLock,
680
- strokeAdjust: desc.strokeStyleStrokeAdjust,
681
- lineDashSet: desc.strokeStyleLineDashSet.map(descriptor_1.parseUnits),
682
- blendMode: descriptor_1.BlnM.decode(desc.strokeStyleBlendMode),
683
- opacity: (0, descriptor_1.parsePercent)(desc.strokeStyleOpacity),
684
- content: (0, descriptor_1.parseVectorContent)(desc.strokeStyleContent),
685
- resolution: desc.strokeStyleResolution,
686
- };
687
- (0, psdReader_1.skipBytes)(reader, left());
688
- }, function (writer, target) {
689
- var _a, _b, _c;
690
- var stroke = target.vectorStroke;
691
- var descriptor = {
692
- strokeStyleVersion: 2,
693
- strokeEnabled: !!stroke.strokeEnabled,
694
- fillEnabled: !!stroke.fillEnabled,
695
- strokeStyleLineWidth: stroke.lineWidth || { value: 3, units: 'Points' },
696
- strokeStyleLineDashOffset: stroke.lineDashOffset || { value: 0, units: 'Points' },
697
- strokeStyleMiterLimit: (_a = stroke.miterLimit) !== null && _a !== void 0 ? _a : 100,
698
- strokeStyleLineCapType: descriptor_1.strokeStyleLineCapType.encode(stroke.lineCapType),
699
- strokeStyleLineJoinType: descriptor_1.strokeStyleLineJoinType.encode(stroke.lineJoinType),
700
- strokeStyleLineAlignment: descriptor_1.strokeStyleLineAlignment.encode(stroke.lineAlignment),
701
- strokeStyleScaleLock: !!stroke.scaleLock,
702
- strokeStyleStrokeAdjust: !!stroke.strokeAdjust,
703
- strokeStyleLineDashSet: stroke.lineDashSet || [],
704
- strokeStyleBlendMode: descriptor_1.BlnM.encode(stroke.blendMode),
705
- strokeStyleOpacity: (0, descriptor_1.unitsPercent)((_b = stroke.opacity) !== null && _b !== void 0 ? _b : 1),
706
- strokeStyleContent: (0, descriptor_1.serializeVectorContent)(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
707
- strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,
708
- };
709
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', descriptor);
710
- });
711
- addHandler('artb', // per-layer arboard info
712
- hasKey('artboard'), function (reader, target, left) {
713
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
714
- var rect = desc.artboardRect;
715
- target.artboard = {
716
- rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },
717
- guideIndices: desc.guideIndeces,
718
- presetName: desc.artboardPresetName,
719
- color: (0, descriptor_1.parseColor)(desc['Clr ']),
720
- backgroundType: desc.artboardBackgroundType,
721
- };
722
- (0, psdReader_1.skipBytes)(reader, left());
723
- }, function (writer, target) {
724
- var _a;
725
- var artboard = target.artboard;
726
- var rect = artboard.rect;
727
- var desc = {
728
- artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },
729
- guideIndeces: artboard.guideIndices || [],
730
- artboardPresetName: artboard.presetName || '',
731
- 'Clr ': (0, descriptor_1.serializeColor)(artboard.color),
732
- artboardBackgroundType: (_a = artboard.backgroundType) !== null && _a !== void 0 ? _a : 1,
733
- };
734
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'artboard', desc);
735
- });
736
- addHandler('sn2P', hasKey('usingAlignedRendering'), function (reader, target) { return target.usingAlignedRendering = !!(0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.usingAlignedRendering ? 1 : 0); });
737
- var placedLayerTypes = ['unknown', 'vector', 'raster', 'image stack'];
738
- function parseWarp(warp) {
739
- var _a, _b, _c, _d, _e, _f;
740
- var result = {
741
- style: descriptor_1.warpStyle.decode(warp.warpStyle),
742
- value: warp.warpValue || 0,
743
- perspective: warp.warpPerspective || 0,
744
- perspectiveOther: warp.warpPerspectiveOther || 0,
745
- rotate: descriptor_1.Ornt.decode(warp.warpRotate),
746
- bounds: warp.bounds && {
747
- top: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds['Top ']),
748
- left: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Left),
749
- bottom: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Btom),
750
- right: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Rght),
751
- },
752
- uOrder: warp.uOrder,
753
- vOrder: warp.vOrder,
754
- };
755
- if (warp.deformNumRows != null || warp.deformNumCols != null) {
756
- result.deformNumRows = warp.deformNumRows;
757
- result.deformNumCols = warp.deformNumCols;
758
- }
759
- var envelopeWarp = warp.customEnvelopeWarp;
760
- if (envelopeWarp) {
761
- result.customEnvelopeWarp = {
762
- meshPoints: [],
763
- };
764
- var xs = ((_a = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Hrzn'; })) === null || _a === void 0 ? void 0 : _a.values) || [];
765
- var ys = ((_b = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Vrtc'; })) === null || _b === void 0 ? void 0 : _b.values) || [];
766
- for (var i = 0; i < xs.length; i++) {
767
- result.customEnvelopeWarp.meshPoints.push({ x: xs[i], y: ys[i] });
768
- }
769
- if (envelopeWarp.quiltSliceX || envelopeWarp.quiltSliceY) {
770
- result.customEnvelopeWarp.quiltSliceX = ((_d = (_c = envelopeWarp.quiltSliceX) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.values) || [];
771
- result.customEnvelopeWarp.quiltSliceY = ((_f = (_e = envelopeWarp.quiltSliceY) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.values) || [];
772
- }
773
- }
774
- return result;
775
- }
776
- function isQuiltWarp(warp) {
777
- var _a, _b;
778
- return warp.deformNumCols != null || warp.deformNumRows != null ||
779
- ((_a = warp.customEnvelopeWarp) === null || _a === void 0 ? void 0 : _a.quiltSliceX) || ((_b = warp.customEnvelopeWarp) === null || _b === void 0 ? void 0 : _b.quiltSliceY);
780
- }
781
- function encodeWarp(warp) {
782
- var bounds = warp.bounds;
783
- var desc = {
784
- warpStyle: descriptor_1.warpStyle.encode(warp.style),
785
- warpValue: warp.value || 0,
786
- warpPerspective: warp.perspective || 0,
787
- warpPerspectiveOther: warp.perspectiveOther || 0,
788
- warpRotate: descriptor_1.Ornt.encode(warp.rotate),
789
- bounds: {
790
- 'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
791
- Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
792
- Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
793
- Rght: (0, descriptor_1.unitsValue)(bounds && bounds.right || { units: 'Pixels', value: 0 }, 'bounds.right'),
794
- },
795
- uOrder: warp.uOrder || 0,
796
- vOrder: warp.vOrder || 0,
797
- };
798
- var isQuilt = isQuiltWarp(warp);
799
- if (isQuilt) {
800
- var desc2 = desc;
801
- desc2.deformNumRows = warp.deformNumRows || 0;
802
- desc2.deformNumCols = warp.deformNumCols || 0;
803
- }
804
- var customEnvelopeWarp = warp.customEnvelopeWarp;
805
- if (customEnvelopeWarp) {
806
- var meshPoints = customEnvelopeWarp.meshPoints || [];
807
- if (isQuilt) {
808
- var desc2 = desc;
809
- desc2.customEnvelopeWarp = {
810
- quiltSliceX: [{
811
- type: 'quiltSliceX',
812
- values: customEnvelopeWarp.quiltSliceX || [],
813
- }],
814
- quiltSliceY: [{
815
- type: 'quiltSliceY',
816
- values: customEnvelopeWarp.quiltSliceY || [],
817
- }],
818
- meshPoints: [
819
- { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
820
- { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
821
- ],
822
- };
823
- }
824
- else {
825
- desc.customEnvelopeWarp = {
826
- meshPoints: [
827
- { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
828
- { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
829
- ],
830
- };
831
- }
832
- }
833
- return desc;
834
- }
835
- addHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {
836
- if ((0, psdReader_1.readSignature)(reader) !== 'plcL')
837
- throw new Error("Invalid PlLd signature");
838
- if ((0, psdReader_1.readInt32)(reader) !== 3)
839
- throw new Error("Invalid PlLd version");
840
- var id = (0, psdReader_1.readPascalString)(reader, 1);
841
- var pageNumber = (0, psdReader_1.readInt32)(reader);
842
- var totalPages = (0, psdReader_1.readInt32)(reader); // TODO: check how this works ?
843
- (0, psdReader_1.readInt32)(reader); // anitAliasPolicy 16
844
- var placedLayerType = (0, psdReader_1.readInt32)(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack
845
- if (!placedLayerTypes[placedLayerType])
846
- throw new Error('Invalid PlLd type');
847
- var transform = [];
848
- for (var i = 0; i < 8; i++)
849
- transform.push((0, psdReader_1.readFloat64)(reader)); // x, y of 4 corners of the transform
850
- var warpVersion = (0, psdReader_1.readInt32)(reader);
851
- if (warpVersion !== 0)
852
- throw new Error("Invalid Warp version ".concat(warpVersion));
853
- var warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
854
- target.placedLayer = target.placedLayer || {
855
- id: id,
856
- type: placedLayerTypes[placedLayerType],
857
- pageNumber: pageNumber,
858
- totalPages: totalPages,
859
- transform: transform,
860
- warp: parseWarp(warp),
861
- };
862
- // console.log('PlLd warp', require('util').inspect(warp, false, 99, true));
863
- // console.log('PlLd', require('util').inspect(target.placedLayer, false, 99, true));
864
- (0, psdReader_1.skipBytes)(reader, left());
865
- }, function (writer, target) {
866
- var placed = target.placedLayer;
867
- (0, psdWriter_1.writeSignature)(writer, 'plcL');
868
- (0, psdWriter_1.writeInt32)(writer, 3); // version
869
- (0, psdWriter_1.writePascalString)(writer, placed.id, 1);
870
- (0, psdWriter_1.writeInt32)(writer, 1); // pageNumber
871
- (0, psdWriter_1.writeInt32)(writer, 1); // totalPages
872
- (0, psdWriter_1.writeInt32)(writer, 16); // anitAliasPolicy
873
- if (placedLayerTypes.indexOf(placed.type) === -1)
874
- throw new Error('Invalid placedLayer type');
875
- (0, psdWriter_1.writeInt32)(writer, placedLayerTypes.indexOf(placed.type));
876
- for (var i = 0; i < 8; i++)
877
- (0, psdWriter_1.writeFloat64)(writer, placed.transform[i]);
878
- (0, psdWriter_1.writeInt32)(writer, 0); // warp version
879
- var isQuilt = placed.warp && isQuiltWarp(placed.warp);
880
- var type = isQuilt ? 'quiltWarp' : 'warp';
881
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', type, encodeWarp(placed.warp || {}), type);
882
- });
883
- addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
884
- if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
885
- throw new Error("Invalid SoLd type");
886
- if ((0, psdReader_1.readInt32)(reader) !== 4)
887
- throw new Error("Invalid SoLd version");
888
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
889
- // console.log('SoLd', require('util').inspect(desc, false, 99, true));
890
- // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
891
- // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
892
- target.placedLayer = {
893
- id: desc.Idnt,
894
- placed: desc.placed,
895
- type: placedLayerTypes[desc.Type],
896
- pageNumber: desc.PgNm,
897
- totalPages: desc.totalPages,
898
- frameStep: desc.frameStep,
899
- duration: desc.duration,
900
- frameCount: desc.frameCount,
901
- transform: desc.Trnf,
902
- width: desc['Sz '].Wdth,
903
- height: desc['Sz '].Hght,
904
- resolution: (0, descriptor_1.parseUnits)(desc.Rslt),
905
- warp: parseWarp((desc.quiltWarp || desc.warp)),
906
- };
907
- if (desc.nonAffineTransform && desc.nonAffineTransform.some(function (x, i) { return x !== desc.Trnf[i]; })) {
908
- target.placedLayer.nonAffineTransform = desc.nonAffineTransform;
909
- }
910
- if (desc.Crop)
911
- target.placedLayer.crop = desc.Crop;
912
- if (desc.comp)
913
- target.placedLayer.comp = desc.comp;
914
- if (desc.compInfo)
915
- target.placedLayer.compInfo = desc.compInfo;
916
- (0, psdReader_1.skipBytes)(reader, left()); // HACK
917
- }, function (writer, target) {
918
- var _a, _b;
919
- (0, psdWriter_1.writeSignature)(writer, 'soLD');
920
- (0, psdWriter_1.writeInt32)(writer, 4); // version
921
- var placed = target.placedLayer;
922
- var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, quiltWarp: {}, warp: encodeWarp(placed.warp || {}), 'Sz ': {
923
- Wdth: placed.width || 0,
924
- Hght: placed.height || 0, // TODO: find size ?
925
- }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
926
- if (placed.warp && isQuiltWarp(placed.warp)) {
927
- var quiltWarp = encodeWarp(placed.warp);
928
- desc.quiltWarp = quiltWarp;
929
- desc.warp = {
930
- warpStyle: 'warpStyle.warpNone',
931
- warpValue: quiltWarp.warpValue,
932
- warpPerspective: quiltWarp.warpPerspective,
933
- warpPerspectiveOther: quiltWarp.warpPerspectiveOther,
934
- warpRotate: quiltWarp.warpRotate,
935
- bounds: quiltWarp.bounds,
936
- uOrder: quiltWarp.uOrder,
937
- vOrder: quiltWarp.vOrder,
938
- };
939
- }
940
- else {
941
- delete desc.quiltWarp;
942
- }
943
- if (placed.comp)
944
- desc.comp = placed.comp;
945
- if (placed.compInfo)
946
- desc.compInfo = placed.compInfo;
947
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, desc.quiltWarp ? 'quiltWarp' : 'warp');
948
- });
949
- addHandler('fxrp', hasKey('referencePoint'), function (reader, target) {
950
- target.referencePoint = {
951
- x: (0, psdReader_1.readFloat64)(reader),
952
- y: (0, psdReader_1.readFloat64)(reader),
953
- };
954
- }, function (writer, target) {
955
- (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.x);
956
- (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.y);
957
- });
958
- if (helpers_1.MOCK_HANDLERS) {
959
- addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {
960
- // console.log('additional info: Patt');
961
- target._Patt = (0, psdReader_1.readBytes)(reader, left());
962
- }, function (writer, target) { return false && (0, psdWriter_1.writeBytes)(writer, target._Patt); });
963
- }
964
- else {
965
- addHandler('Patt', // TODO: handle also Pat2 & Pat3
966
- function (// TODO: handle also Pat2 & Pat3
967
- target) { return !target; }, function (reader, target, left) {
968
- if (!left())
969
- return;
970
- (0, psdReader_1.skipBytes)(reader, left());
971
- return; // not supported yet
972
- target;
973
- psdReader_1.readPattern;
974
- // if (!target.patterns) target.patterns = [];
975
- // target.patterns.push(readPattern(reader));
976
- // skipBytes(reader, left());
977
- }, function (_writer, _target) {
978
- });
979
- }
980
- function readRect(reader) {
981
- var top = (0, psdReader_1.readInt32)(reader);
982
- var left = (0, psdReader_1.readInt32)(reader);
983
- var bottom = (0, psdReader_1.readInt32)(reader);
984
- var right = (0, psdReader_1.readInt32)(reader);
985
- return { top: top, left: left, bottom: bottom, right: right };
986
- }
987
- function writeRect(writer, rect) {
988
- (0, psdWriter_1.writeInt32)(writer, rect.top);
989
- (0, psdWriter_1.writeInt32)(writer, rect.left);
990
- (0, psdWriter_1.writeInt32)(writer, rect.bottom);
991
- (0, psdWriter_1.writeInt32)(writer, rect.right);
992
- }
993
- addHandler('Anno', function (target) { return target.annotations !== undefined; }, function (reader, target, left) {
994
- var major = (0, psdReader_1.readUint16)(reader);
995
- var minor = (0, psdReader_1.readUint16)(reader);
996
- if (major !== 2 || minor !== 1)
997
- throw new Error('Invalid Anno version');
998
- var count = (0, psdReader_1.readUint32)(reader);
999
- var annotations = [];
1000
- for (var i = 0; i < count; i++) {
1001
- /*const length =*/ (0, psdReader_1.readUint32)(reader);
1002
- var type = (0, psdReader_1.readSignature)(reader);
1003
- var open_1 = !!(0, psdReader_1.readUint8)(reader);
1004
- /*const flags =*/ (0, psdReader_1.readUint8)(reader); // always 28
1005
- /*const optionalBlocks =*/ (0, psdReader_1.readUint16)(reader);
1006
- var iconLocation = readRect(reader);
1007
- var popupLocation = readRect(reader);
1008
- var color = (0, psdReader_1.readColor)(reader);
1009
- var author = (0, psdReader_1.readPascalString)(reader, 2);
1010
- var name_1 = (0, psdReader_1.readPascalString)(reader, 2);
1011
- var date = (0, psdReader_1.readPascalString)(reader, 2);
1012
- /*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
1013
- /*const dataType =*/ (0, psdReader_1.readSignature)(reader);
1014
- var dataLength = (0, psdReader_1.readUint32)(reader);
1015
- var data = void 0;
1016
- if (type === 'txtA') {
1017
- if (dataLength >= 2 && (0, psdReader_1.readUint16)(reader) === 0xfeff) {
1018
- data = (0, psdReader_1.readUnicodeStringWithLength)(reader, (dataLength - 2) / 2);
1019
- }
1020
- else {
1021
- reader.offset -= 2;
1022
- data = (0, psdReader_1.readAsciiString)(reader, dataLength);
1023
- }
1024
- data = data.replace(/\r/g, '\n');
1025
- }
1026
- else if (type === 'sndA') {
1027
- data = (0, psdReader_1.readBytes)(reader, dataLength);
1028
- }
1029
- else {
1030
- throw new Error('Unknown annotation type');
1031
- }
1032
- annotations.push({
1033
- type: type === 'txtA' ? 'text' : 'sound',
1034
- open: open_1,
1035
- iconLocation: iconLocation,
1036
- popupLocation: popupLocation,
1037
- color: color,
1038
- author: author,
1039
- name: name_1,
1040
- date: date,
1041
- data: data,
1042
- });
1043
- }
1044
- target.annotations = annotations;
1045
- (0, psdReader_1.skipBytes)(reader, left());
1046
- }, function (writer, target) {
1047
- var annotations = target.annotations;
1048
- (0, psdWriter_1.writeUint16)(writer, 2);
1049
- (0, psdWriter_1.writeUint16)(writer, 1);
1050
- (0, psdWriter_1.writeUint32)(writer, annotations.length);
1051
- for (var _i = 0, annotations_1 = annotations; _i < annotations_1.length; _i++) {
1052
- var annotation = annotations_1[_i];
1053
- var sound = annotation.type === 'sound';
1054
- if (sound && !(annotation.data instanceof Uint8Array))
1055
- throw new Error('Sound annotation data should be Uint8Array');
1056
- if (!sound && typeof annotation.data !== 'string')
1057
- throw new Error('Text annotation data should be string');
1058
- var lengthOffset = writer.offset;
1059
- (0, psdWriter_1.writeUint32)(writer, 0); // length
1060
- (0, psdWriter_1.writeSignature)(writer, sound ? 'sndA' : 'txtA');
1061
- (0, psdWriter_1.writeUint8)(writer, annotation.open ? 1 : 0);
1062
- (0, psdWriter_1.writeUint8)(writer, 28);
1063
- (0, psdWriter_1.writeUint16)(writer, 1);
1064
- writeRect(writer, annotation.iconLocation);
1065
- writeRect(writer, annotation.popupLocation);
1066
- (0, psdWriter_1.writeColor)(writer, annotation.color);
1067
- (0, psdWriter_1.writePascalString)(writer, annotation.author || '', 2);
1068
- (0, psdWriter_1.writePascalString)(writer, annotation.name || '', 2);
1069
- (0, psdWriter_1.writePascalString)(writer, annotation.date || '', 2);
1070
- var contentOffset = writer.offset;
1071
- (0, psdWriter_1.writeUint32)(writer, 0); // content length
1072
- (0, psdWriter_1.writeSignature)(writer, sound ? 'sndM' : 'txtC');
1073
- (0, psdWriter_1.writeUint32)(writer, 0); // data length
1074
- var dataOffset = writer.offset;
1075
- if (sound) {
1076
- (0, psdWriter_1.writeBytes)(writer, annotation.data);
1077
- }
1078
- else {
1079
- (0, psdWriter_1.writeUint16)(writer, 0xfeff); // unicode string indicator
1080
- var text = annotation.data.replace(/\n/g, '\r');
1081
- for (var i = 0; i < text.length; i++)
1082
- (0, psdWriter_1.writeUint16)(writer, text.charCodeAt(i));
1083
- }
1084
- writer.view.setUint32(lengthOffset, writer.offset - lengthOffset, false);
1085
- writer.view.setUint32(contentOffset, writer.offset - contentOffset, false);
1086
- writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);
1087
- }
1088
- });
1089
- addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left, _, options) {
1090
- var psd = target;
1091
- psd.linkedFiles = [];
1092
- while (left() > 8) {
1093
- var size = readLength64(reader); // size
1094
- var startOffset = reader.offset;
1095
- var type = (0, psdReader_1.readSignature)(reader);
1096
- var version = (0, psdReader_1.readInt32)(reader);
1097
- var id = (0, psdReader_1.readPascalString)(reader, 1);
1098
- var name_2 = (0, psdReader_1.readUnicodeString)(reader);
1099
- var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
1100
- var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
1101
- var dataSize = readLength64(reader);
1102
- var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
1103
- var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1104
- var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1105
- var file = { id: id, name: name_2, data: undefined };
1106
- if (fileType)
1107
- file.type = fileType;
1108
- if (fileCreator)
1109
- file.creator = fileCreator;
1110
- if (fileOpenDescriptor)
1111
- file.descriptor = fileOpenDescriptor;
1112
- if (type === 'liFE' && version > 3) {
1113
- var year = (0, psdReader_1.readInt32)(reader);
1114
- var month = (0, psdReader_1.readUint8)(reader);
1115
- var day = (0, psdReader_1.readUint8)(reader);
1116
- var hour = (0, psdReader_1.readUint8)(reader);
1117
- var minute = (0, psdReader_1.readUint8)(reader);
1118
- var seconds = (0, psdReader_1.readFloat64)(reader);
1119
- var wholeSeconds = Math.floor(seconds);
1120
- var ms = (seconds - wholeSeconds) * 1000;
1121
- file.time = new Date(year, month, day, hour, minute, wholeSeconds, ms);
1122
- }
1123
- var fileSize = type === 'liFE' ? readLength64(reader) : 0;
1124
- if (type === 'liFA')
1125
- (0, psdReader_1.skipBytes)(reader, 8);
1126
- if (type === 'liFD')
1127
- file.data = (0, psdReader_1.readBytes)(reader, dataSize);
1128
- if (version >= 5)
1129
- file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
1130
- if (version >= 6)
1131
- file.assetModTime = (0, psdReader_1.readFloat64)(reader);
1132
- if (version >= 7)
1133
- file.assetLockedState = (0, psdReader_1.readUint8)(reader);
1134
- if (type === 'liFE')
1135
- file.data = (0, psdReader_1.readBytes)(reader, fileSize);
1136
- if (options.skipLinkedFilesData)
1137
- file.data = undefined;
1138
- psd.linkedFiles.push(file);
1139
- linkedFileDescriptor;
1140
- while (size % 4)
1141
- size++;
1142
- reader.offset = startOffset + size;
1143
- }
1144
- (0, psdReader_1.skipBytes)(reader, left()); // ?
1145
- }, function (writer, target) {
1146
- var psd = target;
1147
- for (var _i = 0, _a = psd.linkedFiles; _i < _a.length; _i++) {
1148
- var file = _a[_i];
1149
- var version = 2;
1150
- if (file.assetLockedState != null)
1151
- version = 7;
1152
- else if (file.assetModTime != null)
1153
- version = 6;
1154
- else if (file.childDocumentID != null)
1155
- version = 5;
1156
- // TODO: else if (file.time != null) version = 3; (only for liFE)
1157
- (0, psdWriter_1.writeUint32)(writer, 0);
1158
- (0, psdWriter_1.writeUint32)(writer, 0); // size
1159
- var sizeOffset = writer.offset;
1160
- (0, psdWriter_1.writeSignature)(writer, file.data ? 'liFD' : 'liFA');
1161
- (0, psdWriter_1.writeInt32)(writer, version);
1162
- (0, psdWriter_1.writePascalString)(writer, file.id || '', 1);
1163
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
1164
- (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
1165
- (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
1166
- writeLength64(writer, file.data ? file.data.byteLength : 0);
1167
- if (file.descriptor && file.descriptor.compInfo) {
1168
- var desc = {
1169
- compInfo: file.descriptor.compInfo,
1170
- };
1171
- (0, psdWriter_1.writeUint8)(writer, 1);
1172
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1173
- }
1174
- else {
1175
- (0, psdWriter_1.writeUint8)(writer, 0);
1176
- }
1177
- if (file.data)
1178
- (0, psdWriter_1.writeBytes)(writer, file.data);
1179
- else
1180
- writeLength64(writer, 0);
1181
- if (version >= 5)
1182
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
1183
- if (version >= 6)
1184
- (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
1185
- if (version >= 7)
1186
- (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
1187
- var size = writer.offset - sizeOffset;
1188
- writer.view.setUint32(sizeOffset - 4, size, false); // write size
1189
- while (size % 4) {
1190
- size++;
1191
- (0, psdWriter_1.writeUint8)(writer, 0);
1192
- }
1193
- }
1194
- });
1195
- addHandlerAlias('lnkD', 'lnk2');
1196
- addHandlerAlias('lnk3', 'lnk2');
1197
- // this seems to just be zero size block, ignore it
1198
- addHandler('lnkE', function (target) { return target._lnkE !== undefined; }, function (reader, target, left, _psds, options) {
1199
- if (options.logMissingFeatures && left()) {
1200
- console.log("Non-empty lnkE layer info (".concat(left(), " bytes)"));
1201
- }
1202
- if (helpers_1.MOCK_HANDLERS) {
1203
- target._lnkE = (0, psdReader_1.readBytes)(reader, left());
1204
- }
1205
- }, function (writer, target) { return helpers_1.MOCK_HANDLERS && (0, psdWriter_1.writeBytes)(writer, target._lnkE); });
1206
- addHandler('pths', hasKey('pathList'), function (reader, target) {
1207
- var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
1208
- target.pathList = []; // TODO: read paths (find example with non-empty list)
1209
- descriptor;
1210
- // console.log('pths', descriptor); // TODO: remove this
1211
- }, function (writer, _target) {
1212
- var descriptor = {
1213
- pathList: [], // TODO: write paths
1214
- };
1215
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'pathsDataClass', descriptor);
1216
- });
1217
- addHandler('lyvr', hasKey('version'), function (reader, target) { return target.version = (0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.version); });
1218
- function adjustmentType(type) {
1219
- return function (target) { return !!target.adjustment && target.adjustment.type === type; };
1220
- }
1221
- addHandler('brit', adjustmentType('brightness/contrast'), function (reader, target, left) {
1222
- if (!target.adjustment) { // ignore if got one from CgEd block
1223
- target.adjustment = {
1224
- type: 'brightness/contrast',
1225
- brightness: (0, psdReader_1.readInt16)(reader),
1226
- contrast: (0, psdReader_1.readInt16)(reader),
1227
- meanValue: (0, psdReader_1.readInt16)(reader),
1228
- labColorOnly: !!(0, psdReader_1.readUint8)(reader),
1229
- useLegacy: true,
1230
- };
1231
- }
1232
- (0, psdReader_1.skipBytes)(reader, left());
1233
- }, function (writer, target) {
1234
- var _a;
1235
- var info = target.adjustment;
1236
- (0, psdWriter_1.writeInt16)(writer, info.brightness || 0);
1237
- (0, psdWriter_1.writeInt16)(writer, info.contrast || 0);
1238
- (0, psdWriter_1.writeInt16)(writer, (_a = info.meanValue) !== null && _a !== void 0 ? _a : 127);
1239
- (0, psdWriter_1.writeUint8)(writer, info.labColorOnly ? 1 : 0);
1240
- (0, psdWriter_1.writeZeros)(writer, 1);
1241
- });
1242
- function readLevelsChannel(reader) {
1243
- var shadowInput = (0, psdReader_1.readInt16)(reader);
1244
- var highlightInput = (0, psdReader_1.readInt16)(reader);
1245
- var shadowOutput = (0, psdReader_1.readInt16)(reader);
1246
- var highlightOutput = (0, psdReader_1.readInt16)(reader);
1247
- var midtoneInput = (0, psdReader_1.readInt16)(reader) / 100;
1248
- return { shadowInput: shadowInput, highlightInput: highlightInput, shadowOutput: shadowOutput, highlightOutput: highlightOutput, midtoneInput: midtoneInput };
1249
- }
1250
- function writeLevelsChannel(writer, channel) {
1251
- (0, psdWriter_1.writeInt16)(writer, channel.shadowInput);
1252
- (0, psdWriter_1.writeInt16)(writer, channel.highlightInput);
1253
- (0, psdWriter_1.writeInt16)(writer, channel.shadowOutput);
1254
- (0, psdWriter_1.writeInt16)(writer, channel.highlightOutput);
1255
- (0, psdWriter_1.writeInt16)(writer, Math.round(channel.midtoneInput * 100));
1256
- }
1257
- addHandler('levl', adjustmentType('levels'), function (reader, target, left) {
1258
- if ((0, psdReader_1.readUint16)(reader) !== 2)
1259
- throw new Error('Invalid levl version');
1260
- target.adjustment = __assign(__assign({}, target.adjustment), { type: 'levels', rgb: readLevelsChannel(reader), red: readLevelsChannel(reader), green: readLevelsChannel(reader), blue: readLevelsChannel(reader) });
1261
- (0, psdReader_1.skipBytes)(reader, left());
1262
- }, function (writer, target) {
1263
- var info = target.adjustment;
1264
- var defaultChannel = {
1265
- shadowInput: 0,
1266
- highlightInput: 255,
1267
- shadowOutput: 0,
1268
- highlightOutput: 255,
1269
- midtoneInput: 1,
1270
- };
1271
- (0, psdWriter_1.writeUint16)(writer, 2); // version
1272
- writeLevelsChannel(writer, info.rgb || defaultChannel);
1273
- writeLevelsChannel(writer, info.red || defaultChannel);
1274
- writeLevelsChannel(writer, info.blue || defaultChannel);
1275
- writeLevelsChannel(writer, info.green || defaultChannel);
1276
- for (var i = 0; i < 59; i++)
1277
- writeLevelsChannel(writer, defaultChannel);
1278
- });
1279
- function readCurveChannel(reader) {
1280
- var nodes = (0, psdReader_1.readUint16)(reader);
1281
- var channel = [];
1282
- for (var j = 0; j < nodes; j++) {
1283
- var output = (0, psdReader_1.readInt16)(reader);
1284
- var input = (0, psdReader_1.readInt16)(reader);
1285
- channel.push({ input: input, output: output });
1286
- }
1287
- return channel;
1288
- }
1289
- function writeCurveChannel(writer, channel) {
1290
- (0, psdWriter_1.writeUint16)(writer, channel.length);
1291
- for (var _i = 0, channel_1 = channel; _i < channel_1.length; _i++) {
1292
- var n = channel_1[_i];
1293
- (0, psdWriter_1.writeUint16)(writer, n.output);
1294
- (0, psdWriter_1.writeUint16)(writer, n.input);
1295
- }
1296
- }
1297
- addHandler('curv', adjustmentType('curves'), function (reader, target, left) {
1298
- (0, psdReader_1.readUint8)(reader);
1299
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1300
- throw new Error('Invalid curv version');
1301
- (0, psdReader_1.readUint16)(reader);
1302
- var channels = (0, psdReader_1.readUint16)(reader);
1303
- var info = { type: 'curves' };
1304
- if (channels & 1)
1305
- info.rgb = readCurveChannel(reader);
1306
- if (channels & 2)
1307
- info.red = readCurveChannel(reader);
1308
- if (channels & 4)
1309
- info.green = readCurveChannel(reader);
1310
- if (channels & 8)
1311
- info.blue = readCurveChannel(reader);
1312
- target.adjustment = __assign(__assign({}, target.adjustment), info);
1313
- // ignoring, duplicate information
1314
- // checkSignature(reader, 'Crv ');
1315
- // const cVersion = readUint16(reader);
1316
- // readUint16(reader);
1317
- // const channelCount = readUint16(reader);
1318
- // for (let i = 0; i < channelCount; i++) {
1319
- // const index = readUint16(reader);
1320
- // const nodes = readUint16(reader);
1321
- // for (let j = 0; j < nodes; j++) {
1322
- // const output = readInt16(reader);
1323
- // const input = readInt16(reader);
1324
- // }
1325
- // }
1326
- (0, psdReader_1.skipBytes)(reader, left());
1327
- }, function (writer, target) {
1328
- var info = target.adjustment;
1329
- var rgb = info.rgb, red = info.red, green = info.green, blue = info.blue;
1330
- var channels = 0;
1331
- var channelCount = 0;
1332
- if (rgb && rgb.length) {
1333
- channels |= 1;
1334
- channelCount++;
1335
- }
1336
- if (red && red.length) {
1337
- channels |= 2;
1338
- channelCount++;
1339
- }
1340
- if (green && green.length) {
1341
- channels |= 4;
1342
- channelCount++;
1343
- }
1344
- if (blue && blue.length) {
1345
- channels |= 8;
1346
- channelCount++;
1347
- }
1348
- (0, psdWriter_1.writeUint8)(writer, 0);
1349
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1350
- (0, psdWriter_1.writeUint16)(writer, 0);
1351
- (0, psdWriter_1.writeUint16)(writer, channels);
1352
- if (rgb && rgb.length)
1353
- writeCurveChannel(writer, rgb);
1354
- if (red && red.length)
1355
- writeCurveChannel(writer, red);
1356
- if (green && green.length)
1357
- writeCurveChannel(writer, green);
1358
- if (blue && blue.length)
1359
- writeCurveChannel(writer, blue);
1360
- (0, psdWriter_1.writeSignature)(writer, 'Crv ');
1361
- (0, psdWriter_1.writeUint16)(writer, 4); // version
1362
- (0, psdWriter_1.writeUint16)(writer, 0);
1363
- (0, psdWriter_1.writeUint16)(writer, channelCount);
1364
- if (rgb && rgb.length) {
1365
- (0, psdWriter_1.writeUint16)(writer, 0);
1366
- writeCurveChannel(writer, rgb);
1367
- }
1368
- if (red && red.length) {
1369
- (0, psdWriter_1.writeUint16)(writer, 1);
1370
- writeCurveChannel(writer, red);
1371
- }
1372
- if (green && green.length) {
1373
- (0, psdWriter_1.writeUint16)(writer, 2);
1374
- writeCurveChannel(writer, green);
1375
- }
1376
- if (blue && blue.length) {
1377
- (0, psdWriter_1.writeUint16)(writer, 3);
1378
- writeCurveChannel(writer, blue);
1379
- }
1380
- (0, psdWriter_1.writeZeros)(writer, 2);
1381
- });
1382
- addHandler('expA', adjustmentType('exposure'), function (reader, target, left) {
1383
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1384
- throw new Error('Invalid expA version');
1385
- target.adjustment = __assign(__assign({}, target.adjustment), { type: 'exposure', exposure: (0, psdReader_1.readFloat32)(reader), offset: (0, psdReader_1.readFloat32)(reader), gamma: (0, psdReader_1.readFloat32)(reader) });
1386
- (0, psdReader_1.skipBytes)(reader, left());
1387
- }, function (writer, target) {
1388
- var info = target.adjustment;
1389
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1390
- (0, psdWriter_1.writeFloat32)(writer, info.exposure);
1391
- (0, psdWriter_1.writeFloat32)(writer, info.offset);
1392
- (0, psdWriter_1.writeFloat32)(writer, info.gamma);
1393
- (0, psdWriter_1.writeZeros)(writer, 2);
1394
- });
1395
- addHandler('vibA', adjustmentType('vibrance'), function (reader, target, left) {
1396
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1397
- target.adjustment = { type: 'vibrance' };
1398
- if (desc.vibrance !== undefined)
1399
- target.adjustment.vibrance = desc.vibrance;
1400
- if (desc.Strt !== undefined)
1401
- target.adjustment.saturation = desc.Strt;
1402
- (0, psdReader_1.skipBytes)(reader, left());
1403
- }, function (writer, target) {
1404
- var info = target.adjustment;
1405
- var desc = {};
1406
- if (info.vibrance !== undefined)
1407
- desc.vibrance = info.vibrance;
1408
- if (info.saturation !== undefined)
1409
- desc.Strt = info.saturation;
1410
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1411
- });
1412
- function readHueChannel(reader) {
1413
- return {
1414
- a: (0, psdReader_1.readInt16)(reader),
1415
- b: (0, psdReader_1.readInt16)(reader),
1416
- c: (0, psdReader_1.readInt16)(reader),
1417
- d: (0, psdReader_1.readInt16)(reader),
1418
- hue: (0, psdReader_1.readInt16)(reader),
1419
- saturation: (0, psdReader_1.readInt16)(reader),
1420
- lightness: (0, psdReader_1.readInt16)(reader),
1421
- };
1422
- }
1423
- function writeHueChannel(writer, channel) {
1424
- var c = channel || {};
1425
- (0, psdWriter_1.writeInt16)(writer, c.a || 0);
1426
- (0, psdWriter_1.writeInt16)(writer, c.b || 0);
1427
- (0, psdWriter_1.writeInt16)(writer, c.c || 0);
1428
- (0, psdWriter_1.writeInt16)(writer, c.d || 0);
1429
- (0, psdWriter_1.writeInt16)(writer, c.hue || 0);
1430
- (0, psdWriter_1.writeInt16)(writer, c.saturation || 0);
1431
- (0, psdWriter_1.writeInt16)(writer, c.lightness || 0);
1432
- }
1433
- addHandler('hue2', adjustmentType('hue/saturation'), function (reader, target, left) {
1434
- if ((0, psdReader_1.readUint16)(reader) !== 2)
1435
- throw new Error('Invalid hue2 version');
1436
- target.adjustment = __assign(__assign({}, target.adjustment), { type: 'hue/saturation', master: readHueChannel(reader), reds: readHueChannel(reader), yellows: readHueChannel(reader), greens: readHueChannel(reader), cyans: readHueChannel(reader), blues: readHueChannel(reader), magentas: readHueChannel(reader) });
1437
- (0, psdReader_1.skipBytes)(reader, left());
1438
- }, function (writer, target) {
1439
- var info = target.adjustment;
1440
- (0, psdWriter_1.writeUint16)(writer, 2); // version
1441
- writeHueChannel(writer, info.master);
1442
- writeHueChannel(writer, info.reds);
1443
- writeHueChannel(writer, info.yellows);
1444
- writeHueChannel(writer, info.greens);
1445
- writeHueChannel(writer, info.cyans);
1446
- writeHueChannel(writer, info.blues);
1447
- writeHueChannel(writer, info.magentas);
1448
- });
1449
- function readColorBalance(reader) {
1450
- return {
1451
- cyanRed: (0, psdReader_1.readInt16)(reader),
1452
- magentaGreen: (0, psdReader_1.readInt16)(reader),
1453
- yellowBlue: (0, psdReader_1.readInt16)(reader),
1454
- };
1455
- }
1456
- function writeColorBalance(writer, value) {
1457
- (0, psdWriter_1.writeInt16)(writer, value.cyanRed || 0);
1458
- (0, psdWriter_1.writeInt16)(writer, value.magentaGreen || 0);
1459
- (0, psdWriter_1.writeInt16)(writer, value.yellowBlue || 0);
1460
- }
1461
- addHandler('blnc', adjustmentType('color balance'), function (reader, target, left) {
1462
- target.adjustment = {
1463
- type: 'color balance',
1464
- shadows: readColorBalance(reader),
1465
- midtones: readColorBalance(reader),
1466
- highlights: readColorBalance(reader),
1467
- preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
1468
- };
1469
- (0, psdReader_1.skipBytes)(reader, left());
1470
- }, function (writer, target) {
1471
- var info = target.adjustment;
1472
- writeColorBalance(writer, info.shadows || {});
1473
- writeColorBalance(writer, info.midtones || {});
1474
- writeColorBalance(writer, info.highlights || {});
1475
- (0, psdWriter_1.writeUint8)(writer, info.preserveLuminosity ? 1 : 0);
1476
- (0, psdWriter_1.writeZeros)(writer, 1);
1477
- });
1478
- addHandler('blwh', adjustmentType('black & white'), function (reader, target, left) {
1479
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1480
- target.adjustment = {
1481
- type: 'black & white',
1482
- reds: desc['Rd '],
1483
- yellows: desc.Yllw,
1484
- greens: desc['Grn '],
1485
- cyans: desc['Cyn '],
1486
- blues: desc['Bl '],
1487
- magentas: desc.Mgnt,
1488
- useTint: !!desc.useTint,
1489
- presetKind: desc.bwPresetKind,
1490
- presetFileName: desc.blackAndWhitePresetFileName,
1491
- };
1492
- if (desc.tintColor !== undefined)
1493
- target.adjustment.tintColor = (0, descriptor_1.parseColor)(desc.tintColor);
1494
- (0, psdReader_1.skipBytes)(reader, left());
1495
- }, function (writer, target) {
1496
- var info = target.adjustment;
1497
- var desc = {
1498
- 'Rd ': info.reds || 0,
1499
- Yllw: info.yellows || 0,
1500
- 'Grn ': info.greens || 0,
1501
- 'Cyn ': info.cyans || 0,
1502
- 'Bl ': info.blues || 0,
1503
- Mgnt: info.magentas || 0,
1504
- useTint: !!info.useTint,
1505
- tintColor: (0, descriptor_1.serializeColor)(info.tintColor),
1506
- bwPresetKind: info.presetKind || 0,
1507
- blackAndWhitePresetFileName: info.presetFileName || '',
1508
- };
1509
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1510
- });
1511
- addHandler('phfl', adjustmentType('photo filter'), function (reader, target, left) {
1512
- var version = (0, psdReader_1.readUint16)(reader);
1513
- if (version !== 2 && version !== 3)
1514
- throw new Error('Invalid phfl version');
1515
- var color;
1516
- if (version === 2) {
1517
- color = (0, psdReader_1.readColor)(reader);
1518
- }
1519
- else { // version 3
1520
- // TODO: test this, this is probably wrong
1521
- color = {
1522
- l: (0, psdReader_1.readInt32)(reader) / 100,
1523
- a: (0, psdReader_1.readInt32)(reader) / 100,
1524
- b: (0, psdReader_1.readInt32)(reader) / 100,
1525
- };
1526
- }
1527
- target.adjustment = {
1528
- type: 'photo filter',
1529
- color: color,
1530
- density: (0, psdReader_1.readUint32)(reader) / 100,
1531
- preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
1532
- };
1533
- (0, psdReader_1.skipBytes)(reader, left());
1534
- }, function (writer, target) {
1535
- var info = target.adjustment;
1536
- (0, psdWriter_1.writeUint16)(writer, 2); // version
1537
- (0, psdWriter_1.writeColor)(writer, info.color || { l: 0, a: 0, b: 0 });
1538
- (0, psdWriter_1.writeUint32)(writer, (info.density || 0) * 100);
1539
- (0, psdWriter_1.writeUint8)(writer, info.preserveLuminosity ? 1 : 0);
1540
- (0, psdWriter_1.writeZeros)(writer, 3);
1541
- });
1542
- function readMixrChannel(reader) {
1543
- var red = (0, psdReader_1.readInt16)(reader);
1544
- var green = (0, psdReader_1.readInt16)(reader);
1545
- var blue = (0, psdReader_1.readInt16)(reader);
1546
- (0, psdReader_1.skipBytes)(reader, 2);
1547
- var constant = (0, psdReader_1.readInt16)(reader);
1548
- return { red: red, green: green, blue: blue, constant: constant };
1549
- }
1550
- function writeMixrChannel(writer, channel) {
1551
- var c = channel || {};
1552
- (0, psdWriter_1.writeInt16)(writer, c.red);
1553
- (0, psdWriter_1.writeInt16)(writer, c.green);
1554
- (0, psdWriter_1.writeInt16)(writer, c.blue);
1555
- (0, psdWriter_1.writeZeros)(writer, 2);
1556
- (0, psdWriter_1.writeInt16)(writer, c.constant);
1557
- }
1558
- addHandler('mixr', adjustmentType('channel mixer'), function (reader, target, left) {
1559
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1560
- throw new Error('Invalid mixr version');
1561
- var adjustment = target.adjustment = __assign(__assign({}, target.adjustment), { type: 'channel mixer', monochrome: !!(0, psdReader_1.readUint16)(reader) });
1562
- if (!adjustment.monochrome) {
1563
- adjustment.red = readMixrChannel(reader);
1564
- adjustment.green = readMixrChannel(reader);
1565
- adjustment.blue = readMixrChannel(reader);
1566
- }
1567
- adjustment.gray = readMixrChannel(reader);
1568
- (0, psdReader_1.skipBytes)(reader, left());
1569
- }, function (writer, target) {
1570
- var info = target.adjustment;
1571
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1572
- (0, psdWriter_1.writeUint16)(writer, info.monochrome ? 1 : 0);
1573
- if (info.monochrome) {
1574
- writeMixrChannel(writer, info.gray);
1575
- (0, psdWriter_1.writeZeros)(writer, 3 * 5 * 2);
1576
- }
1577
- else {
1578
- writeMixrChannel(writer, info.red);
1579
- writeMixrChannel(writer, info.green);
1580
- writeMixrChannel(writer, info.blue);
1581
- writeMixrChannel(writer, info.gray);
1582
- }
1583
- });
1584
- var colorLookupType = (0, helpers_1.createEnum)('colorLookupType', '3DLUT', {
1585
- '3dlut': '3DLUT',
1586
- abstractProfile: 'abstractProfile',
1587
- deviceLinkProfile: 'deviceLinkProfile',
1588
- });
1589
- var LUTFormatType = (0, helpers_1.createEnum)('LUTFormatType', 'look', {
1590
- look: 'LUTFormatLOOK',
1591
- cube: 'LUTFormatCUBE',
1592
- '3dl': 'LUTFormat3DL',
1593
- });
1594
- var colorLookupOrder = (0, helpers_1.createEnum)('colorLookupOrder', 'rgb', {
1595
- rgb: 'rgbOrder',
1596
- bgr: 'bgrOrder',
1597
- });
1598
- addHandler('clrL', adjustmentType('color lookup'), function (reader, target, left) {
1599
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1600
- throw new Error('Invalid clrL version');
1601
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1602
- target.adjustment = { type: 'color lookup' };
1603
- var info = target.adjustment;
1604
- if (desc.lookupType !== undefined)
1605
- info.lookupType = colorLookupType.decode(desc.lookupType);
1606
- if (desc['Nm '] !== undefined)
1607
- info.name = desc['Nm '];
1608
- if (desc.Dthr !== undefined)
1609
- info.dither = desc.Dthr;
1610
- if (desc.profile !== undefined)
1611
- info.profile = desc.profile;
1612
- if (desc.LUTFormat !== undefined)
1613
- info.lutFormat = LUTFormatType.decode(desc.LUTFormat);
1614
- if (desc.dataOrder !== undefined)
1615
- info.dataOrder = colorLookupOrder.decode(desc.dataOrder);
1616
- if (desc.tableOrder !== undefined)
1617
- info.tableOrder = colorLookupOrder.decode(desc.tableOrder);
1618
- if (desc.LUT3DFileData !== undefined)
1619
- info.lut3DFileData = desc.LUT3DFileData;
1620
- if (desc.LUT3DFileName !== undefined)
1621
- info.lut3DFileName = desc.LUT3DFileName;
1622
- (0, psdReader_1.skipBytes)(reader, left());
1623
- }, function (writer, target) {
1624
- var info = target.adjustment;
1625
- var desc = {};
1626
- if (info.lookupType !== undefined)
1627
- desc.lookupType = colorLookupType.encode(info.lookupType);
1628
- if (info.name !== undefined)
1629
- desc['Nm '] = info.name;
1630
- if (info.dither !== undefined)
1631
- desc.Dthr = info.dither;
1632
- if (info.profile !== undefined)
1633
- desc.profile = info.profile;
1634
- if (info.lutFormat !== undefined)
1635
- desc.LUTFormat = LUTFormatType.encode(info.lutFormat);
1636
- if (info.dataOrder !== undefined)
1637
- desc.dataOrder = colorLookupOrder.encode(info.dataOrder);
1638
- if (info.tableOrder !== undefined)
1639
- desc.tableOrder = colorLookupOrder.encode(info.tableOrder);
1640
- if (info.lut3DFileData !== undefined)
1641
- desc.LUT3DFileData = info.lut3DFileData;
1642
- if (info.lut3DFileName !== undefined)
1643
- desc.LUT3DFileName = info.lut3DFileName;
1644
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1645
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1646
- });
1647
- addHandler('nvrt', adjustmentType('invert'), function (reader, target, left) {
1648
- target.adjustment = { type: 'invert' };
1649
- (0, psdReader_1.skipBytes)(reader, left());
1650
- }, function () {
1651
- // nothing to write here
1652
- });
1653
- addHandler('post', adjustmentType('posterize'), function (reader, target, left) {
1654
- target.adjustment = {
1655
- type: 'posterize',
1656
- levels: (0, psdReader_1.readUint16)(reader),
1657
- };
1658
- (0, psdReader_1.skipBytes)(reader, left());
1659
- }, function (writer, target) {
1660
- var _a;
1661
- var info = target.adjustment;
1662
- (0, psdWriter_1.writeUint16)(writer, (_a = info.levels) !== null && _a !== void 0 ? _a : 4);
1663
- (0, psdWriter_1.writeZeros)(writer, 2);
1664
- });
1665
- addHandler('thrs', adjustmentType('threshold'), function (reader, target, left) {
1666
- target.adjustment = {
1667
- type: 'threshold',
1668
- level: (0, psdReader_1.readUint16)(reader),
1669
- };
1670
- (0, psdReader_1.skipBytes)(reader, left());
1671
- }, function (writer, target) {
1672
- var _a;
1673
- var info = target.adjustment;
1674
- (0, psdWriter_1.writeUint16)(writer, (_a = info.level) !== null && _a !== void 0 ? _a : 128);
1675
- (0, psdWriter_1.writeZeros)(writer, 2);
1676
- });
1677
- var grdmColorModels = ['', '', '', 'rgb', 'hsb', '', 'lab'];
1678
- addHandler('grdm', adjustmentType('gradient map'), function (reader, target, left) {
1679
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1680
- throw new Error('Invalid grdm version');
1681
- var info = {
1682
- type: 'gradient map',
1683
- gradientType: 'solid',
1684
- };
1685
- info.reverse = !!(0, psdReader_1.readUint8)(reader);
1686
- info.dither = !!(0, psdReader_1.readUint8)(reader);
1687
- info.name = (0, psdReader_1.readUnicodeString)(reader);
1688
- info.colorStops = [];
1689
- info.opacityStops = [];
1690
- var stopsCount = (0, psdReader_1.readUint16)(reader);
1691
- for (var i = 0; i < stopsCount; i++) {
1692
- info.colorStops.push({
1693
- location: (0, psdReader_1.readUint32)(reader),
1694
- midpoint: (0, psdReader_1.readUint32)(reader) / 100,
1695
- color: (0, psdReader_1.readColor)(reader),
1696
- });
1697
- (0, psdReader_1.skipBytes)(reader, 2);
1698
- }
1699
- var opacityStopsCount = (0, psdReader_1.readUint16)(reader);
1700
- for (var i = 0; i < opacityStopsCount; i++) {
1701
- info.opacityStops.push({
1702
- location: (0, psdReader_1.readUint32)(reader),
1703
- midpoint: (0, psdReader_1.readUint32)(reader) / 100,
1704
- opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
1705
- });
1706
- }
1707
- var expansionCount = (0, psdReader_1.readUint16)(reader);
1708
- if (expansionCount !== 2)
1709
- throw new Error('Invalid grdm expansion count');
1710
- var interpolation = (0, psdReader_1.readUint16)(reader);
1711
- info.smoothness = interpolation / 4096;
1712
- var length = (0, psdReader_1.readUint16)(reader);
1713
- if (length !== 32)
1714
- throw new Error('Invalid grdm length');
1715
- info.gradientType = (0, psdReader_1.readUint16)(reader) ? 'noise' : 'solid';
1716
- info.randomSeed = (0, psdReader_1.readUint32)(reader);
1717
- info.addTransparency = !!(0, psdReader_1.readUint16)(reader);
1718
- info.restrictColors = !!(0, psdReader_1.readUint16)(reader);
1719
- info.roughness = (0, psdReader_1.readUint32)(reader) / 4096;
1720
- info.colorModel = (grdmColorModels[(0, psdReader_1.readUint16)(reader)] || 'rgb');
1721
- info.min = [
1722
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1723
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1724
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1725
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1726
- ];
1727
- info.max = [
1728
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1729
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1730
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1731
- (0, psdReader_1.readUint16)(reader) / 0x8000,
1732
- ];
1733
- (0, psdReader_1.skipBytes)(reader, left());
1734
- for (var _i = 0, _a = info.colorStops; _i < _a.length; _i++) {
1735
- var s = _a[_i];
1736
- s.location /= interpolation;
1737
- }
1738
- for (var _b = 0, _c = info.opacityStops; _b < _c.length; _b++) {
1739
- var s = _c[_b];
1740
- s.location /= interpolation;
1741
- }
1742
- target.adjustment = info;
1743
- }, function (writer, target) {
1744
- var _a, _b, _c;
1745
- var info = target.adjustment;
1746
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1747
- (0, psdWriter_1.writeUint8)(writer, info.reverse ? 1 : 0);
1748
- (0, psdWriter_1.writeUint8)(writer, info.dither ? 1 : 0);
1749
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, info.name || '');
1750
- (0, psdWriter_1.writeUint16)(writer, info.colorStops && info.colorStops.length || 0);
1751
- var interpolation = Math.round(((_a = info.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1752
- for (var _i = 0, _d = info.colorStops || []; _i < _d.length; _i++) {
1753
- var s = _d[_i];
1754
- (0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
1755
- (0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
1756
- (0, psdWriter_1.writeColor)(writer, s.color);
1757
- (0, psdWriter_1.writeZeros)(writer, 2);
1758
- }
1759
- (0, psdWriter_1.writeUint16)(writer, info.opacityStops && info.opacityStops.length || 0);
1760
- for (var _e = 0, _f = info.opacityStops || []; _e < _f.length; _e++) {
1761
- var s = _f[_e];
1762
- (0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
1763
- (0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
1764
- (0, psdWriter_1.writeUint16)(writer, Math.round(s.opacity * 0xff));
1765
- }
1766
- (0, psdWriter_1.writeUint16)(writer, 2); // expansion count
1767
- (0, psdWriter_1.writeUint16)(writer, interpolation);
1768
- (0, psdWriter_1.writeUint16)(writer, 32); // length
1769
- (0, psdWriter_1.writeUint16)(writer, info.gradientType === 'noise' ? 1 : 0);
1770
- (0, psdWriter_1.writeUint32)(writer, info.randomSeed || 0);
1771
- (0, psdWriter_1.writeUint16)(writer, info.addTransparency ? 1 : 0);
1772
- (0, psdWriter_1.writeUint16)(writer, info.restrictColors ? 1 : 0);
1773
- (0, psdWriter_1.writeUint32)(writer, Math.round(((_b = info.roughness) !== null && _b !== void 0 ? _b : 1) * 4096));
1774
- var colorModel = grdmColorModels.indexOf((_c = info.colorModel) !== null && _c !== void 0 ? _c : 'rgb');
1775
- (0, psdWriter_1.writeUint16)(writer, colorModel === -1 ? 3 : colorModel);
1776
- for (var i = 0; i < 4; i++)
1777
- (0, psdWriter_1.writeUint16)(writer, Math.round((info.min && info.min[i] || 0) * 0x8000));
1778
- for (var i = 0; i < 4; i++)
1779
- (0, psdWriter_1.writeUint16)(writer, Math.round((info.max && info.max[i] || 0) * 0x8000));
1780
- (0, psdWriter_1.writeZeros)(writer, 4);
1781
- });
1782
- function readSelectiveColors(reader) {
1783
- return {
1784
- c: (0, psdReader_1.readInt16)(reader),
1785
- m: (0, psdReader_1.readInt16)(reader),
1786
- y: (0, psdReader_1.readInt16)(reader),
1787
- k: (0, psdReader_1.readInt16)(reader),
1788
- };
1789
- }
1790
- function writeSelectiveColors(writer, cmyk) {
1791
- var c = cmyk || {};
1792
- (0, psdWriter_1.writeInt16)(writer, c.c);
1793
- (0, psdWriter_1.writeInt16)(writer, c.m);
1794
- (0, psdWriter_1.writeInt16)(writer, c.y);
1795
- (0, psdWriter_1.writeInt16)(writer, c.k);
1796
- }
1797
- addHandler('selc', adjustmentType('selective color'), function (reader, target) {
1798
- if ((0, psdReader_1.readUint16)(reader) !== 1)
1799
- throw new Error('Invalid selc version');
1800
- var mode = (0, psdReader_1.readUint16)(reader) ? 'absolute' : 'relative';
1801
- (0, psdReader_1.skipBytes)(reader, 8);
1802
- target.adjustment = {
1803
- type: 'selective color',
1804
- mode: mode,
1805
- reds: readSelectiveColors(reader),
1806
- yellows: readSelectiveColors(reader),
1807
- greens: readSelectiveColors(reader),
1808
- cyans: readSelectiveColors(reader),
1809
- blues: readSelectiveColors(reader),
1810
- magentas: readSelectiveColors(reader),
1811
- whites: readSelectiveColors(reader),
1812
- neutrals: readSelectiveColors(reader),
1813
- blacks: readSelectiveColors(reader),
1814
- };
1815
- }, function (writer, target) {
1816
- var info = target.adjustment;
1817
- (0, psdWriter_1.writeUint16)(writer, 1); // version
1818
- (0, psdWriter_1.writeUint16)(writer, info.mode === 'absolute' ? 1 : 0);
1819
- (0, psdWriter_1.writeZeros)(writer, 8);
1820
- writeSelectiveColors(writer, info.reds);
1821
- writeSelectiveColors(writer, info.yellows);
1822
- writeSelectiveColors(writer, info.greens);
1823
- writeSelectiveColors(writer, info.cyans);
1824
- writeSelectiveColors(writer, info.blues);
1825
- writeSelectiveColors(writer, info.magentas);
1826
- writeSelectiveColors(writer, info.whites);
1827
- writeSelectiveColors(writer, info.neutrals);
1828
- writeSelectiveColors(writer, info.blacks);
1829
- });
1830
- addHandler('CgEd', function (target) {
1831
- var a = target.adjustment;
1832
- if (!a)
1833
- return false;
1834
- return (a.type === 'brightness/contrast' && !a.useLegacy) ||
1835
- ((a.type === 'levels' || a.type === 'curves' || a.type === 'exposure' || a.type === 'channel mixer' ||
1836
- a.type === 'hue/saturation') && a.presetFileName !== undefined);
1837
- }, function (reader, target, left) {
1838
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1839
- if (desc.Vrsn !== 1)
1840
- throw new Error('Invalid CgEd version');
1841
- // this section can specify preset file name for other adjustment types
1842
- if ('presetFileName' in desc) {
1843
- target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.presetKind, presetFileName: desc.presetFileName });
1844
- }
1845
- else if ('curvesPresetFileName' in desc) {
1846
- target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.curvesPresetKind, presetFileName: desc.curvesPresetFileName });
1847
- }
1848
- else if ('mixerPresetFileName' in desc) {
1849
- target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.mixerPresetKind, presetFileName: desc.mixerPresetFileName });
1850
- }
1851
- else {
1852
- target.adjustment = {
1853
- type: 'brightness/contrast',
1854
- brightness: desc.Brgh,
1855
- contrast: desc.Cntr,
1856
- meanValue: desc.means,
1857
- useLegacy: !!desc.useLegacy,
1858
- labColorOnly: !!desc['Lab '],
1859
- auto: !!desc.Auto,
1860
- };
1861
- }
1862
- (0, psdReader_1.skipBytes)(reader, left());
1863
- }, function (writer, target) {
1864
- var _a, _b, _c, _d;
1865
- var info = target.adjustment;
1866
- if (info.type === 'levels' || info.type === 'exposure' || info.type === 'hue/saturation') {
1867
- var desc = {
1868
- Vrsn: 1,
1869
- presetKind: (_a = info.presetKind) !== null && _a !== void 0 ? _a : 1,
1870
- presetFileName: info.presetFileName || '',
1871
- };
1872
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1873
- }
1874
- else if (info.type === 'curves') {
1875
- var desc = {
1876
- Vrsn: 1,
1877
- curvesPresetKind: (_b = info.presetKind) !== null && _b !== void 0 ? _b : 1,
1878
- curvesPresetFileName: info.presetFileName || '',
1879
- };
1880
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1881
- }
1882
- else if (info.type === 'channel mixer') {
1883
- var desc = {
1884
- Vrsn: 1,
1885
- mixerPresetKind: (_c = info.presetKind) !== null && _c !== void 0 ? _c : 1,
1886
- mixerPresetFileName: info.presetFileName || '',
1887
- };
1888
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1889
- }
1890
- else if (info.type === 'brightness/contrast') {
1891
- var desc = {
1892
- Vrsn: 1,
1893
- Brgh: info.brightness || 0,
1894
- Cntr: info.contrast || 0,
1895
- means: (_d = info.meanValue) !== null && _d !== void 0 ? _d : 127,
1896
- 'Lab ': !!info.labColorOnly,
1897
- useLegacy: !!info.useLegacy,
1898
- Auto: !!info.auto,
1899
- };
1900
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1901
- }
1902
- else {
1903
- throw new Error('Unhandled CgEd case');
1904
- }
1905
- });
1906
- addHandler('Txt2', hasKey('engineData'), function (reader, target, left) {
1907
- var data = (0, psdReader_1.readBytes)(reader, left());
1908
- target.engineData = (0, base64_js_1.fromByteArray)(data);
1909
- // const engineData = parseEngineData(data);
1910
- // console.log(require('util').inspect(engineData, false, 99, true));
1911
- // require('fs').writeFileSync('resources/engineData2Simple.txt', require('util').inspect(engineData, false, 99, false), 'utf8');
1912
- // require('fs').writeFileSync('test_data.json', JSON.stringify(ed, null, 2), 'utf8');
1913
- }, function (writer, target) {
1914
- var buffer = (0, base64_js_1.toByteArray)(target.engineData);
1915
- (0, psdWriter_1.writeBytes)(writer, buffer);
1916
- });
1917
- addHandler('FMsk', hasKey('filterMask'), function (reader, target) {
1918
- target.filterMask = {
1919
- colorSpace: (0, psdReader_1.readColor)(reader),
1920
- opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
1921
- };
1922
- }, function (writer, target) {
1923
- var _a;
1924
- (0, psdWriter_1.writeColor)(writer, target.filterMask.colorSpace);
1925
- (0, psdWriter_1.writeUint16)(writer, (0, helpers_1.clamp)((_a = target.filterMask.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 0xff);
1926
- });
1927
- addHandler('artd', // document-wide artboard info
1928
- function (// document-wide artboard info
1929
- target) { return target.artboards !== undefined; }, function (reader, target, left) {
1930
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1931
- target.artboards = {
1932
- count: desc['Cnt '],
1933
- autoExpandOffset: { horizontal: desc.autoExpandOffset.Hrzn, vertical: desc.autoExpandOffset.Vrtc },
1934
- origin: { horizontal: desc.origin.Hrzn, vertical: desc.origin.Vrtc },
1935
- autoExpandEnabled: desc.autoExpandEnabled,
1936
- autoNestEnabled: desc.autoNestEnabled,
1937
- autoPositionEnabled: desc.autoPositionEnabled,
1938
- shrinkwrapOnSaveEnabled: desc.shrinkwrapOnSaveEnabled,
1939
- docDefaultNewArtboardBackgroundColor: (0, descriptor_1.parseColor)(desc.docDefaultNewArtboardBackgroundColor),
1940
- docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,
1941
- };
1942
- (0, psdReader_1.skipBytes)(reader, left());
1943
- }, function (writer, target) {
1944
- var _a, _b, _c, _d, _e;
1945
- var artb = target.artboards;
1946
- var desc = {
1947
- 'Cnt ': artb.count,
1948
- autoExpandOffset: artb.autoExpandOffset ? { Hrzn: artb.autoExpandOffset.horizontal, Vrtc: artb.autoExpandOffset.vertical } : { Hrzn: 0, Vrtc: 0 },
1949
- origin: artb.origin ? { Hrzn: artb.origin.horizontal, Vrtc: artb.origin.vertical } : { Hrzn: 0, Vrtc: 0 },
1950
- autoExpandEnabled: (_a = artb.autoExpandEnabled) !== null && _a !== void 0 ? _a : true,
1951
- autoNestEnabled: (_b = artb.autoNestEnabled) !== null && _b !== void 0 ? _b : true,
1952
- autoPositionEnabled: (_c = artb.autoPositionEnabled) !== null && _c !== void 0 ? _c : true,
1953
- shrinkwrapOnSaveEnabled: (_d = artb.shrinkwrapOnSaveEnabled) !== null && _d !== void 0 ? _d : true,
1954
- docDefaultNewArtboardBackgroundColor: (0, descriptor_1.serializeColor)(artb.docDefaultNewArtboardBackgroundColor),
1955
- docDefaultNewArtboardBackgroundType: (_e = artb.docDefaultNewArtboardBackgroundType) !== null && _e !== void 0 ? _e : 1,
1956
- };
1957
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'artd');
1958
- });
1959
- function hasMultiEffects(effects) {
1960
- return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });
1961
- }
1962
- exports.hasMultiEffects = hasMultiEffects;
1963
- addHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
1964
- var version = (0, psdReader_1.readUint32)(reader);
1965
- if (version !== 0)
1966
- throw new Error("Invalid lfx2 version");
1967
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1968
- // console.log(require('util').inspect(desc, false, 99, true));
1969
- // TODO: don't discard if we got it from lmfx
1970
- // discard if read in 'lrFX' section
1971
- target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
1972
- (0, psdReader_1.skipBytes)(reader, left());
1973
- }, function (writer, target, _, options) {
1974
- var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, false);
1975
- // console.log(require('util').inspect(desc, false, 99, true));
1976
- (0, psdWriter_1.writeUint32)(writer, 0); // version
1977
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1978
- });
1979
- addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
1980
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1981
- // console.log(require('util').inspect(desc, false, 99, true));
1982
- target.compositorUsed = {
1983
- description: desc.description,
1984
- reason: desc.reason,
1985
- engine: desc.Engn.split('.')[1],
1986
- enableCompCore: desc.enableCompCore.split('.')[1],
1987
- enableCompCoreGPU: desc.enableCompCoreGPU.split('.')[1],
1988
- compCoreSupport: desc.compCoreSupport.split('.')[1],
1989
- compCoreGPUSupport: desc.compCoreGPUSupport.split('.')[1],
1990
- };
1991
- (0, psdReader_1.skipBytes)(reader, left());
1992
- }, function (writer, target) {
1993
- var cinf = target.compositorUsed;
1994
- var desc = {
1995
- Vrsn: { major: 1, minor: 0, fix: 0 },
1996
- // psVersion: { major: 22, minor: 3, fix: 1 }, // TESTING
1997
- description: cinf.description,
1998
- reason: cinf.reason,
1999
- Engn: "Engn.".concat(cinf.engine),
2000
- enableCompCore: "enable.".concat(cinf.enableCompCore),
2001
- enableCompCoreGPU: "enable.".concat(cinf.enableCompCoreGPU),
2002
- // enableCompCoreThreads: `enable.feature`, // TESTING
2003
- compCoreSupport: "reason.".concat(cinf.compCoreSupport),
2004
- compCoreGPUSupport: "reason.".concat(cinf.compCoreGPUSupport),
2005
- };
2006
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
2007
- });
2008
- // extension settings ?, ignore it
2009
- addHandler('extn', function (target) { return target._extn !== undefined; }, function (reader, target) {
2010
- var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
2011
- // console.log(require('util').inspect(desc, false, 99, true));
2012
- if (helpers_1.MOCK_HANDLERS)
2013
- target._extn = desc;
2014
- }, function (writer, target) {
2015
- // TODO: need to add correct types for desc fields (resources/src.psd)
2016
- if (helpers_1.MOCK_HANDLERS)
2017
- (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', target._extn);
2018
- });
2019
- addHandler('iOpa', hasKey('fillOpacity'), function (reader, target) {
2020
- target.fillOpacity = (0, psdReader_1.readUint8)(reader) / 0xff;
2021
- (0, psdReader_1.skipBytes)(reader, 3);
2022
- }, function (writer, target) {
2023
- (0, psdWriter_1.writeUint8)(writer, target.fillOpacity * 0xff);
2024
- (0, psdWriter_1.writeZeros)(writer, 3);
2025
- });
2026
- addHandler('brst', hasKey('channelBlendingRestrictions'), function (reader, target, left) {
2027
- target.channelBlendingRestrictions = [];
2028
- while (left() > 4) {
2029
- target.channelBlendingRestrictions.push((0, psdReader_1.readInt32)(reader));
2030
- }
2031
- }, function (writer, target) {
2032
- for (var _i = 0, _a = target.channelBlendingRestrictions; _i < _a.length; _i++) {
2033
- var channel = _a[_i];
2034
- (0, psdWriter_1.writeInt32)(writer, channel);
2035
- }
2036
- });
2037
- addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target) {
2038
- target.transparencyShapesLayer = !!(0, psdReader_1.readUint8)(reader);
2039
- (0, psdReader_1.skipBytes)(reader, 3);
2040
- }, function (writer, target) {
2041
- (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2042
- (0, psdWriter_1.writeZeros)(writer, 3);
2043
- });
2044
-
2045
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FDRCxDQUFDO0FBRUYsVUFBVSxDQUNULE1BQU0sRUFDTixNQUFNLENBQUMsdUJBQXVCLENBQUMsRUFDL0IsVUFBQyxNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsSUFBQSxxQkFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELElBQUEscUJBQVMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxFQUNELFVBQUMsTUFBTSxFQUFFLE1BQU07SUFDZCxJQUFBLHNCQUFVLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFBLHNCQUFVLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FDRCxDQUFDO0FBRUYsVUFBVSxDQUNULE1BQU0sRUFDTixNQUFNLENBQUMsVUFBVSxDQUFDLEVBQ2xCLFVBQUMsTUFBTSxFQUFFLE1BQU07SUFDZCxNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFBLHFCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBQSxxQkFBUyxFQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDLEVBQ0QsVUFBQyxNQUFNLEVBQUUsTUFBTTtJQUNkLElBQUEsc0JBQVUsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxJQUFBLHNCQUFVLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FDRCxDQUFDO0FBRUYsVUFBVSxDQUNULE1BQU0sRUFDTixNQUFNLENBQUMsdUJBQXVCLENBQUMsRUFDL0IsVUFBQyxNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sQ0FBQyxxQkFBcUIs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dUJBQVcsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFBLHVCQUFXLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBQSx1QkFBVyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBQSxJQUFJLENBQUMsU0FBUyxtQ0FBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBQSxJQUFJLENBQUMsVUFBVSxtQ0FBSSxLQUFLLENBQUMsQ0FBQztJQUNyRSxJQUFBLHVCQUFXLEVBQUMsTUFBTSxFQUFFLFVBQVUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN6QixJQUFBLHVCQUFXLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUUxRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN6QixJQUFBLHVCQUFXLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFD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QUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxJQUFBLHFCQUFTLEVBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUMzRDtBQUNGLENBQUMsRUFDRCxVQUFDLE1BQU0sRUFBRSxNQUFNO0lBQ2QsS0FBc0IsVUFBbUMsRUFBbkMsS0FBQSxNQUFNLENBQUMsMkJBQTRCLEVBQW5DLGNBQW1DLEVBQW5DLElBQW1DLEVBQUU7UUFBdEQsSUFBTSxPQUFPLFNBQUE7UUFDakIsSUFBQSxzQkFBVSxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUM1QjtBQUNGLENBQUMsQ0FDRCxDQUFDO0FBRUYsVUFBVSxDQUNULE1BQU0sRUFDTixNQUFNLENBQUMseUJBQXlCLENBQUMsRUFDakMsVUFBQyxNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLENBQUMsSUFBQSxxQkFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELElBQUEscUJBQVMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxFQUNELFVBQUMsTUFBTSxFQUFFLE1BQU07SUFDZCxJQUFBLHNCQUFVLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFBLHNCQUFVLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FDRCxDQUFDIiwiZmlsZSI6ImFkZGl0aW9uYWxJbmZvLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZnJvbUJ5dGVBcnJheSwgdG9CeXRlQXJyYXkgfSBmcm9tICdiYXNlNjQtanMnO1xuaW1wb3J0IHsgcmVhZEVmZmVjdHMsIHdyaXRlRWZmZWN0cyB9IGZyb20gJy4vZWZmZWN0c0hlbHBlcnMnO1xuaW1wb3J0IHsgY2xhbXAsIGNyZWF0ZUVudW0sIGxheWVyQ29sb3JzLCBNT0NLX0hBTkRMRVJTIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7XG5cdExheWVyQWRkaXRpb25hbEluZm8sIEJlemllclBhdGgsIFBzZCwgUmVhZE9wdGlvbnMsIEJyaWdodG5lc3NBZGp1c3RtZW50LCBFeHBvc3VyZUFkanVzdG1lbnQsIFZpYnJhbmNlQWRqdXN0bWVudCxcblx0Q29sb3JCYWxhbmNlQWRqdXN0bWVudCwgQmxhY2tBbmRXaGl0ZUFkanVzdG1lbnQsIFBob3RvRmlsdGVyQWRqdXN0bWVudCwgQ2hhbm5lbE1peGVyQ2hhbm5lbCxcblx0Q2hhbm5lbE1peGVyQWRqdXN0bWVudCwgUG9zdGVyaXplQWRqdXN0bWVudCwgVGhyZXNob2xkQWRqdXN0bWVudCwgR3JhZGllbnRNYXBBZGp1c3RtZW50LCBDTVlLLFxuXHRTZWxlY3RpdmVDb2xvckFkanVzdG1lbnQsIENvbG9yTG9va3VwQWRqdXN0bWVudCwgTGV2ZWxzQWRqdXN0bWVudENoYW5uZWwsIExldmVsc0FkanVzdG1lbnQsXG5cdEN1cnZlc0FkanVzdG1lbnQsIEN1cnZlc0FkanVzdG1lbnRDaGFubmVsLCBIdWVTYXR1cmF0aW9uQWRqdXN0bWVudCwgSHVlU2F0dXJhdGlvbkFkanVzdG1lbnRDaGFubmVsLFxuXHRQcmVzZXRJbmZvLCBDb2xvciwgQ29sb3JCYWxhbmNlVmFsdWVzLCBXcml0ZU9wdGlvbnMsIExpbmtlZEZpbGUsIFBsYWNlZExheWVyVHlwZSwgV2FycCwgS2V5RGVzY3JpcHRvckl0ZW0sXG5cdEJvb2xlYW5PcGVyYXRpb24sIExheWVyRWZmZWN0c0luZm8sIEFubm90YXRpb24sIExheWVyVmVjdG9yTWFzaywgQW5pbWF0aW9uRnJhbWUsIFRpbWVsaW5lLFxufSBmcm9tICcuL3BzZCc7XG5pbXBvcnQge1xuXHRQc2RSZWFkZXIsIHJlYWRTaWduYXR1cmUsIHJlYWRVbmljb2RlU3RyaW5nLCBza2lwQnl0ZXMsIHJlYWRVaW50MzIsIHJlYWRVaW50OCwgcmVhZEZsb2F0NjQsIHJlYWRVaW50MTYsXG5cdHJlYWRCeXRlcywgcmVhZEludDE2LCBjaGVja1NpZ25hdHVyZSwgcmVhZEZsb2F0MzIsIHJlYWRGaXhlZFBvaW50UGF0aDMyLCByZWFkU2VjdGlvbiwgcmVhZENvbG9yLCByZWFkSW50MzIsXG5cdHJlYWRQYXNjYWxTdHJpbmcsIHJlYWRVbmljb2RlU3RyaW5nV2l0aExlbmd0aCwgcmVhZEFzY2lpU3RyaW5nLCByZWFkUGF0dGVybixcbn0gZnJvbSAnLi9wc2RSZWFkZXInO1xuaW1wb3J0IHtcblx0UHNkV3JpdGVyLCB3cml0ZVplcm9zLCB3cml0ZVNpZ25hdHVyZSwgd3JpdGVCeXRlcywgd3JpdGVVaW50MzIsIHdyaXRlVWludDE2LCB3cml0ZUZsb2F0NjQsIHdyaXRlVWludDgsXG5cdHdyaXRlSW50MTYsIHdyaXRlRmxvYXQzMiwgd3JpdGVGaXhlZFBvaW50UGF0aDMyLCB3cml0ZVVuaWNvZGVTdHJpbmcsIHdyaXRlU2VjdGlvbiwgd3JpdGVVbmljb2RlU3RyaW5nV2l0aFBhZGRpbmcsXG5cdHdyaXRlQ29sb3IsIHdyaXRlUGFzY2FsU3RyaW5nLCB3cml0ZUludDMyLFxufSBmcm9tICcuL3BzZFdyaXRlcic7XG5pbXBvcnQge1xuXHRBbm50LCBCbG5NLCBEZXNjcmlwdG9yQ29sb3IsIERlc2NyaXB0b3JVbml0c1ZhbHVlLCBwYXJzZVBlcmNlbnQsIHBhcnNlVW5pdHMsIHBhcnNlVW5pdHNPck51bWJlciwgUXVpbHRXYXJwRGVzY3JpcHRvcixcblx0c3Ryb2tlU3R5bGVMaW5lQWxpZ25tZW50LCBzdHJva2VTdHlsZUxpbmVDYXBUeXBlLCBzdHJva2VTdHlsZUxpbmVKb2luVHlwZSwgVGV4dERlc2NyaXB0b3IsIHRleHRHcmlkZGluZyxcblx0dW5pdHNQZXJjZW50LCB1bml0c1ZhbHVlLCBXYXJwRGVzY3JpcHRvciwgd2FycFN0eWxlLCB3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yLFxuXHRyZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IsIFN0cm9rZURlc2NyaXB0b3IsIE9ybnQsIGhvcnpWcnRjVG9YWSwgTG1meERlc2NyaXB0b3IsIExmeDJEZXNjcmlwdG9yLFxuXHRGcmFtZUxpc3REZXNjcmlwdG9yLCBUaW1lbGluZURlc2NyaXB0b3IsIEZyYW1lRGVzY3JpcHRvciwgeHlUb0hvcnpWcnRjLCBzZXJpYWxpemVFZmZlY3RzLFxuXHRwYXJzZUVmZmVjdHMsIHBhcnNlQ29sb3IsIHNlcmlhbGl6ZUNvbG9yLCBzZXJpYWxpemVWZWN0b3JDb250ZW50LCBwYXJzZVZlY3RvckNvbnRlbnQsIHBhcnNlVHJhY2tMaXN0LCBzZXJpYWxpemVUcmFja0xpc3QsIEZyYWN0aW9uRGVzY3JpcHRvcixcbn0gZnJvbSAnLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVuZ2luZURhdGEsIHBhcnNlRW5naW5lRGF0YSB9IGZyb20gJy4vZW5naW5lRGF0YSc7XG5pbXBvcnQgeyBlbmNvZGVFbmdpbmVEYXRhLCBkZWNvZGVFbmdpbmVEYXRhIH0gZnJvbSAnLi90ZXh0JztcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFdyaXRlT3B0aW9ucyBleHRlbmRzIFdyaXRlT3B0aW9ucyB7XG5cdGxheWVySWRzOiBTZXQ8bnVtYmVyPjtcblx0bGF5ZXJUb0lkOiBNYXA8YW55LCBudW1iZXI+O1xufVxuXG50eXBlIEhhc01ldGhvZCA9ICh0YXJnZXQ6IExheWVyQWRkaXRpb25hbEluZm8pID0+IGJvb2xlYW47XG50eXBlIFJlYWRNZXRob2QgPSAocmVhZGVyOiBQc2RSZWFkZXIsIHRhcmdldDogTGF5ZXJBZGRpdGlvbmFsSW5mbywgbGVmdDogKCkgPT4gbnVtYmVyLCBwc2Q6IFBzZCwgb3B0aW9uczogUmVhZE9wdGlvbnMpID0+IHZvaWQ7XG50eXBlIFdyaXRlTWV0aG9kID0gKHdyaXRlcjogUHNkV3JpdGVyLCB0YXJnZXQ6IExheWVyQWRkaXRpb25hbEluZm8sIHBzZDogUHNkLCBvcHRpb25zOiBFeHRlbmRlZFdyaXRlT3B0aW9ucykgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBJbmZvSGFuZGxlciB7XG5cdGtleTogc3RyaW5nO1xuXHRoYXM6IEhhc01ldGhvZDtcblx0cmVhZDogUmVhZE1ldGhvZDtcblx0d3JpdGU6IFdyaXRlTWV0aG9kO1xufVxuXG5leHBvcnQgY29uc3QgaW5mb0hhbmRsZXJzOiBJbmZvSGFuZGxlcltdID0gW107XG5leHBvcnQgY29uc3QgaW5mb0hhbmRsZXJzTWFwOiB7IFtrZXk6IHN0cmluZ106IEluZm9IYW5kbGVyOyB9ID0ge307XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXIoa2V5OiBzdHJpbmcsIGhhczogSGFzTWV0aG9kLCByZWFkOiBSZWFkTWV0aG9kLCB3cml0ZTogV3JpdGVNZXRob2QpIHtcblx0Y29uc3QgaGFuZGxlcjogSW5mb0hhbmRsZXIgPSB7IGtleSwgaGFzLCByZWFkLCB3cml0ZSB9O1xuXHRpbmZvSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcblx0aW5mb0hhbmRsZXJzTWFwW2hhbmRsZXIua2V5XSA9IGhhbmRsZXI7XG59XG5cbmZ1bmN0aW9uIGFkZEhhbmRsZXJBbGlhcyhrZXk6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpIHtcblx0aW5mb0hhbmRsZXJzTWFwW2tleV0gPSBpbmZvSGFuZGxlcnNNYXBbdGFyZ2V0XTtcbn1cblxuZnVuY3Rpb24gaGFzS2V5KGtleToga2V5b2YgTGF5ZXJBZGRpdGlvbmFsSW5mbykge1xuXHRyZXR1cm4gKHRhcmdldDogTGF5ZXJBZGRpdGlvbmFsSW5mbykgPT4gdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVhZExlbmd0aDY0KHJlYWRlcjogUHNkUmVhZGVyKSB7XG5cdGlmIChyZWFkVWludDMyKHJlYWRlcikpIHRocm93IG5ldyBFcnJvcihgUmVzb3VyY2Ugc2l6ZSBhYm92ZSA0IEdCIGxpbWl0IGF0ICR7cmVhZGVyLm9mZnNldC50b1N0cmluZygxNil9YCk7XG5cdHJldHVybiByZWFkVWludDMyKHJlYWRlcik7XG59XG5cbmZ1bmN0aW9uIHdyaXRlTGVuZ3RoNjQod3JpdGVyOiBQc2RXcml0ZXIsIGxlbmd0aDogbnVtYmVyKSB7XG5cdHdyaXRlVWludDMyKHdyaXRlciwgMCk7XG5cdHdyaXRlVWludDMyKHdyaXRlciwgbGVuZ3RoKTtcbn1cblxuYWRkSGFuZGxlcihcblx0J1R5U2gnLFxuXHRoYXNLZXkoJ3RleHQnKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0Qnl0ZXMpID0+IHtcblx0XHRpZiAocmVhZEludDE2KHJlYWRlcikgIT09IDEpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBUeVNoIHZlcnNpb25gKTtcblxuXHRcdGNvbnN0IHRyYW5zZm9ybTogbnVtYmVyW10gPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykgdHJhbnNmb3JtLnB1c2gocmVhZEZsb2F0NjQocmVhZGVyKSk7XG5cblx0XHRpZiAocmVhZEludDE2KHJlYWRlcikgIT09IDUwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVHlTaCB0ZXh0IHZlcnNpb25gKTtcblx0XHRjb25zdCB0ZXh0OiBUZXh0RGVzY3JpcHRvciA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpO1xuXG5cdFx0aWYgKHJlYWRJbnQxNihyZWFkZXIpICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVHlTaCB3YXJwIHZlcnNpb25gKTtcblx0XHRjb25zdCB3YXJwOiBXYXJwRGVzY3JpcHRvciA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpO1xuXG5cdFx0dGFyZ2V0LnRleHQgPSB7XG5cdFx0XHR0cmFuc2Zvcm0sXG5cdFx0XHRsZWZ0OiByZWFkRmxvYXQzMihyZWFkZXIpLFxuXHRcdFx0dG9wOiByZWFkRmxvYXQzMihyZWFkZXIpLFxuXHRcdFx0cmlnaHQ6IHJlYWRGbG9hdDMyKHJlYWRlciksXG5cdFx0XHRib3R0b206IHJlYWRGbG9hdDMyKHJlYWRlciksXG5cdFx0XHR0ZXh0OiB0ZXh0WydUeHQgJ10ucmVwbGFjZSgvXFxyL2csICdcXG4nKSxcblx0XHRcdGluZGV4OiB0ZXh0LlRleHRJbmRleCB8fCAwLFxuXHRcdFx0Z3JpZGRpbmc6IHRleHRHcmlkZGluZy5kZWNvZGUodGV4dC50ZXh0R3JpZGRpbmcpLFxuXHRcdFx0YW50aUFsaWFzOiBBbm50LmRlY29kZSh0ZXh0LkFudEEpLFxuXHRcdFx0b3JpZW50YXRpb246IE9ybnQuZGVjb2RlKHRleHQuT3JudCksXG5cdFx0XHR3YXJwOiB7XG5cdFx0XHRcdHN0eWxlOiB3YXJwU3R5bGUuZGVjb2RlKHdhcnAud2FycFN0eWxlKSxcblx0XHRcdFx0dmFsdWU6IHdhcnAud2FycFZhbHVlIHx8IDAsXG5cdFx0XHRcdHBlcnNwZWN0aXZlOiB3YXJwLndhcnBQZXJzcGVjdGl2ZSB8fCAwLFxuXHRcdFx0XHRwZXJzcGVjdGl2ZU90aGVyOiB3YXJwLndhcnBQZXJzcGVjdGl2ZU90aGVyIHx8IDAsXG5cdFx0XHRcdHJvdGF0ZTogT3JudC5kZWNvZGUod2FycC53YXJwUm90YXRlKSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGlmICh0ZXh0LkVuZ2luZURhdGEpIHtcblx0XHRcdGNvbnN0IGVuZ2luZURhdGEgPSBkZWNvZGVFbmdpbmVEYXRhKHBhcnNlRW5naW5lRGF0YSh0ZXh0LkVuZ2luZURhdGEpKTtcblxuXHRcdFx0Ly8gY29uc3QgYmVmb3JlID0gcGFyc2VFbmdpbmVEYXRhKHRleHQuRW5naW5lRGF0YSk7XG5cdFx0XHQvLyBjb25zdCBhZnRlciA9IGVuY29kZUVuZ2luZURhdGEoZW5naW5lRGF0YSk7XG5cdFx0XHQvLyByZXF1aXJlKCdmcycpLndyaXRlRmlsZVN5bmMoJ2JlZm9yZS50eHQnLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdChiZWZvcmUsIGZhbHNlLCA5OSwgZmFsc2UpLCAndXRmOCcpO1xuXHRcdFx0Ly8gcmVxdWlyZSgnZnMnKS53cml0ZUZpbGVTeW5jKCdhZnRlci50eHQnLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdChhZnRlciwgZmFsc2UsIDk5LCBmYWxzZSksICd1dGY4Jyk7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KHBhcnNlRW5naW5lRGF0YSh0ZXh0LkVuZ2luZURhdGEpLCBmYWxzZSwgOTksIHRydWUpKTtcblx0XHRcdHRhcmdldC50ZXh0ID0geyAuLi50YXJnZXQudGV4dCwgLi4uZW5naW5lRGF0YSB9O1xuXHRcdFx0Ly8gY29uc29sZS5sb2cocmVxdWlyZSgndXRpbCcpLmluc3BlY3QodGFyZ2V0LnRleHQsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXHRcdH1cblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnRCeXRlcygpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgdGV4dCA9IHRhcmdldC50ZXh0ITtcblx0XHRjb25zdCB3YXJwID0gdGV4dC53YXJwIHx8IHt9O1xuXHRcdGNvbnN0IHRyYW5zZm9ybSA9IHRleHQudHJhbnNmb3JtIHx8IFsxLCAwLCAwLCAxLCAwLCAwXTtcblxuXHRcdGNvbnN0IHRleHREZXNjcmlwdG9yOiBUZXh0RGVzY3JpcHRvciA9IHtcblx0XHRcdCdUeHQgJzogKHRleHQudGV4dCB8fCAnJykucmVwbGFjZSgvXFxyP1xcbi9nLCAnXFxyJyksXG5cdFx0XHR0ZXh0R3JpZGRpbmc6IHRleHRHcmlkZGluZy5lbmNvZGUodGV4dC5ncmlkZGluZyksXG5cdFx0XHRPcm50OiBPcm50LmVuY29kZSh0ZXh0Lm9yaWVudGF0aW9uKSxcblx0XHRcdEFudEE6IEFubnQuZW5jb2RlKHRleHQuYW50aUFsaWFzKSxcblx0XHRcdFRleHRJbmRleDogdGV4dC5pbmRleCB8fCAwLFxuXHRcdFx0RW5naW5lRGF0YTogc2VyaWFsaXplRW5naW5lRGF0YShlbmNvZGVFbmdpbmVEYXRhKHRleHQpKSxcblx0XHR9O1xuXG5cdFx0d3JpdGVJbnQxNih3cml0ZXIsIDEpOyAvLyB2ZXJzaW9uXG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuXHRcdFx0d3JpdGVGbG9hdDY0KHdyaXRlciwgdHJhbnNmb3JtW2ldKTtcblx0XHR9XG5cblx0XHR3cml0ZUludDE2KHdyaXRlciwgNTApOyAvLyB0ZXh0IHZlcnNpb25cblx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdUeExyJywgdGV4dERlc2NyaXB0b3IpO1xuXG5cdFx0d3JpdGVJbnQxNih3cml0ZXIsIDEpOyAvLyB3YXJwIHZlcnNpb25cblx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICd3YXJwJywgZW5jb2RlV2FycCh3YXJwKSk7XG5cblx0XHR3cml0ZUZsb2F0MzIod3JpdGVyLCB0ZXh0LmxlZnQhKTtcblx0XHR3cml0ZUZsb2F0MzIod3JpdGVyLCB0ZXh0LnRvcCEpO1xuXHRcdHdyaXRlRmxvYXQzMih3cml0ZXIsIHRleHQucmlnaHQhKTtcblx0XHR3cml0ZUZsb2F0MzIod3JpdGVyLCB0ZXh0LmJvdHRvbSEpO1xuXG5cdFx0Ly8gd3JpdGVaZXJvcyh3cml0ZXIsIDIpO1xuXHR9LFxuKTtcblxuLy8gdmVjdG9yIGZpbGxzXG5cbmFkZEhhbmRsZXIoXG5cdCdTb0NvJyxcblx0dGFyZ2V0ID0+IHRhcmdldC52ZWN0b3JGaWxsICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0LnZlY3RvclN0cm9rZSA9PT0gdW5kZWZpbmVkICYmXG5cdFx0dGFyZ2V0LnZlY3RvckZpbGwudHlwZSA9PT0gJ2NvbG9yJyxcblx0KHJlYWRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgZGVzY3JpcHRvciA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpO1xuXHRcdHRhcmdldC52ZWN0b3JGaWxsID0gcGFyc2VWZWN0b3JDb250ZW50KGRlc2NyaXB0b3IpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCB7IGRlc2NyaXB0b3IgfSA9IHNlcmlhbGl6ZVZlY3RvckNvbnRlbnQodGFyZ2V0LnZlY3RvckZpbGwhKTtcblx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdudWxsJywgZGVzY3JpcHRvcik7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnR2RGbCcsXG5cdHRhcmdldCA9PiB0YXJnZXQudmVjdG9yRmlsbCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldC52ZWN0b3JTdHJva2UgPT09IHVuZGVmaW5lZCAmJlxuXHRcdCh0YXJnZXQudmVjdG9yRmlsbC50eXBlID09PSAnc29saWQnIHx8IHRhcmdldC52ZWN0b3JGaWxsLnR5cGUgPT09ICdub2lzZScpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRjb25zdCBkZXNjcmlwdG9yID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcik7XG5cdFx0dGFyZ2V0LnZlY3RvckZpbGwgPSBwYXJzZVZlY3RvckNvbnRlbnQoZGVzY3JpcHRvcik7XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgeyBkZXNjcmlwdG9yIH0gPSBzZXJpYWxpemVWZWN0b3JDb250ZW50KHRhcmdldC52ZWN0b3JGaWxsISk7XG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2NyaXB0b3IpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J1B0RmwnLFxuXHR0YXJnZXQgPT4gdGFyZ2V0LnZlY3RvckZpbGwgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQudmVjdG9yU3Ryb2tlID09PSB1bmRlZmluZWQgJiZcblx0XHR0YXJnZXQudmVjdG9yRmlsbC50eXBlID09PSAncGF0dGVybicsXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblx0XHR0YXJnZXQudmVjdG9yRmlsbCA9IHBhcnNlVmVjdG9yQ29udGVudChkZXNjcmlwdG9yKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgeyBkZXNjcmlwdG9yIH0gPSBzZXJpYWxpemVWZWN0b3JDb250ZW50KHRhcmdldC52ZWN0b3JGaWxsISk7XG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2NyaXB0b3IpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J3ZzY2cnLFxuXHR0YXJnZXQgPT4gdGFyZ2V0LnZlY3RvckZpbGwgIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQudmVjdG9yU3Ryb2tlICE9PSB1bmRlZmluZWQsXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHJlYWRTaWduYXR1cmUocmVhZGVyKTsgLy8ga2V5XG5cdFx0Y29uc3QgZGVzYyA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpO1xuXHRcdHRhcmdldC52ZWN0b3JGaWxsID0gcGFyc2VWZWN0b3JDb250ZW50KGRlc2MpO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IHsgZGVzY3JpcHRvciwga2V5IH0gPSBzZXJpYWxpemVWZWN0b3JDb250ZW50KHRhcmdldC52ZWN0b3JGaWxsISk7XG5cdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCBrZXkpO1xuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCBkZXNjcmlwdG9yKTtcblx0fSxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkQmV6aWVyS25vdChyZWFkZXI6IFBzZFJlYWRlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcblx0Y29uc3QgeTAgPSByZWFkRml4ZWRQb2ludFBhdGgzMihyZWFkZXIpICogaGVpZ2h0O1xuXHRjb25zdCB4MCA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcikgKiB3aWR0aDtcblx0Y29uc3QgeTEgPSByZWFkRml4ZWRQb2ludFBhdGgzMihyZWFkZXIpICogaGVpZ2h0O1xuXHRjb25zdCB4MSA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcikgKiB3aWR0aDtcblx0Y29uc3QgeTIgPSByZWFkRml4ZWRQb2ludFBhdGgzMihyZWFkZXIpICogaGVpZ2h0O1xuXHRjb25zdCB4MiA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcikgKiB3aWR0aDtcblx0cmV0dXJuIFt4MCwgeTAsIHgxLCB5MSwgeDIsIHkyXTtcbn1cblxuZnVuY3Rpb24gd3JpdGVCZXppZXJLbm90KHdyaXRlcjogUHNkV3JpdGVyLCBwb2ludHM6IG51bWJlcltdLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuXHR3cml0ZUZpeGVkUG9pbnRQYXRoMzIod3JpdGVyLCBwb2ludHNbMV0gLyBoZWlnaHQpOyAvLyB5MFxuXHR3cml0ZUZpeGVkUG9pbnRQYXRoMzIod3JpdGVyLCBwb2ludHNbMF0gLyB3aWR0aCk7IC8vIHgwXG5cdHdyaXRlRml4ZWRQb2ludFBhdGgzMih3cml0ZXIsIHBvaW50c1szXSAvIGhlaWdodCk7IC8vIHkxXG5cdHdyaXRlRml4ZWRQb2ludFBhdGgzMih3cml0ZXIsIHBvaW50c1syXSAvIHdpZHRoKTsgLy8geDFcblx0d3JpdGVGaXhlZFBvaW50UGF0aDMyKHdyaXRlciwgcG9pbnRzWzVdIC8gaGVpZ2h0KTsgLy8geTJcblx0d3JpdGVGaXhlZFBvaW50UGF0aDMyKHdyaXRlciwgcG9pbnRzWzRdIC8gd2lkdGgpOyAvLyB4MlxufVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbk9wZXJhdGlvbnM6IEJvb2xlYW5PcGVyYXRpb25bXSA9IFsnZXhjbHVkZScsICdjb21iaW5lJywgJ3N1YnRyYWN0JywgJ2ludGVyc2VjdCddO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZFZlY3Rvck1hc2socmVhZGVyOiBQc2RSZWFkZXIsIHZlY3Rvck1hc2s6IExheWVyVmVjdG9yTWFzaywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHNpemU6IG51bWJlcikge1xuXHRjb25zdCBlbmQgPSByZWFkZXIub2Zmc2V0ICsgc2l6ZTtcblx0Y29uc3QgcGF0aHMgPSB2ZWN0b3JNYXNrLnBhdGhzO1xuXHRsZXQgcGF0aDogQmV6aWVyUGF0aCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoKGVuZCAtIHJlYWRlci5vZmZzZXQpID49IDI2KSB7XG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSByZWFkVWludDE2KHJlYWRlcik7XG5cblx0XHRzd2l0Y2ggKHNlbGVjdG9yKSB7XG5cdFx0XHRjYXNlIDA6IC8vIENsb3NlZCBzdWJwYXRoIGxlbmd0aCByZWNvcmRcblx0XHRcdGNhc2UgMzogeyAvLyBPcGVuIHN1YnBhdGggbGVuZ3RoIHJlY29yZFxuXHRcdFx0XHRyZWFkVWludDE2KHJlYWRlcik7IC8vIGNvdW50XG5cdFx0XHRcdGNvbnN0IGJvb2xPcCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRcdFx0XHRyZWFkVWludDE2KHJlYWRlcik7IC8vIGFsd2F5cyAxID9cblx0XHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgMTgpO1xuXHRcdFx0XHQvLyBUT0RPOiAnY29tYmluZScgaGVyZSBtaWdodCBiZSB3cm9uZ1xuXHRcdFx0XHRwYXRoID0geyBvcGVuOiBzZWxlY3RvciA9PT0gMywgb3BlcmF0aW9uOiBib29sT3AgPT09IC0xID8gJ2NvbWJpbmUnIDogYm9vbGVhbk9wZXJhdGlvbnNbYm9vbE9wXSwga25vdHM6IFtdIH07XG5cdFx0XHRcdHBhdGhzLnB1c2gocGF0aCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSAxOiAvLyBDbG9zZWQgc3VicGF0aCBCZXppZXIga25vdCwgbGlua2VkXG5cdFx0XHRjYXNlIDI6IC8vIENsb3NlZCBzdWJwYXRoIEJlemllciBrbm90LCB1bmxpbmtlZFxuXHRcdFx0Y2FzZSA0OiAvLyBPcGVuIHN1YnBhdGggQmV6aWVyIGtub3QsIGxpbmtlZFxuXHRcdFx0Y2FzZSA1OiAvLyBPcGVuIHN1YnBhdGggQmV6aWVyIGtub3QsIHVubGlua2VkXG5cdFx0XHRcdHBhdGghLmtub3RzLnB1c2goeyBsaW5rZWQ6IChzZWxlY3RvciA9PT0gMSB8fCBzZWxlY3RvciA9PT0gNCksIHBvaW50czogcmVhZEJlemllcktub3QocmVhZGVyLCB3aWR0aCwgaGVpZ2h0KSB9KTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDY6IC8vIFBhdGggZmlsbCBydWxlIHJlY29yZFxuXHRcdFx0XHRza2lwQnl0ZXMocmVhZGVyLCAyNCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSA3OiB7IC8vIENsaXBib2FyZCByZWNvcmRcblx0XHRcdFx0Ly8gVE9ETzogY2hlY2sgaWYgdGhlc2UgbmVlZCB0byBiZSBtdWx0aXBsaWVkIGJ5IGRvY3VtZW50IHNpemVcblx0XHRcdFx0Y29uc3QgdG9wID0gcmVhZEZpeGVkUG9pbnRQYXRoMzIocmVhZGVyKTtcblx0XHRcdFx0Y29uc3QgbGVmdCA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcik7XG5cdFx0XHRcdGNvbnN0IGJvdHRvbSA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcik7XG5cdFx0XHRcdGNvbnN0IHJpZ2h0ID0gcmVhZEZpeGVkUG9pbnRQYXRoMzIocmVhZGVyKTtcblx0XHRcdFx0Y29uc3QgcmVzb2x1dGlvbiA9IHJlYWRGaXhlZFBvaW50UGF0aDMyKHJlYWRlcik7XG5cdFx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIDQpO1xuXHRcdFx0XHR2ZWN0b3JNYXNrLmNsaXBib2FyZCA9IHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCByZXNvbHV0aW9uIH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSA4OiAvLyBJbml0aWFsIGZpbGwgcnVsZSByZWNvcmRcblx0XHRcdFx0dmVjdG9yTWFzay5maWxsU3RhcnRzV2l0aEFsbFBpeGVscyA9ICEhcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdFx0XHRza2lwQnl0ZXMocmVhZGVyLCAyMik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZtc2sgc2VjdGlvbicpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBwYXRocztcbn1cblxuYWRkSGFuZGxlcihcblx0J3Ztc2snLFxuXHRoYXNLZXkoJ3ZlY3Rvck1hc2snKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0LCB7IHdpZHRoLCBoZWlnaHQgfSkgPT4ge1xuXHRcdGlmIChyZWFkVWludDMyKHJlYWRlcikgIT09IDMpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2bXNrIHZlcnNpb24nKTtcblxuXHRcdHRhcmdldC52ZWN0b3JNYXNrID0geyBwYXRoczogW10gfTtcblx0XHRjb25zdCB2ZWN0b3JNYXNrID0gdGFyZ2V0LnZlY3Rvck1hc2s7XG5cblx0XHRjb25zdCBmbGFncyA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHR2ZWN0b3JNYXNrLmludmVydCA9IChmbGFncyAmIDEpICE9PSAwO1xuXHRcdHZlY3Rvck1hc2subm90TGluayA9IChmbGFncyAmIDIpICE9PSAwO1xuXHRcdHZlY3Rvck1hc2suZGlzYWJsZSA9IChmbGFncyAmIDQpICE9PSAwO1xuXG5cdFx0cmVhZFZlY3Rvck1hc2socmVhZGVyLCB2ZWN0b3JNYXNrLCB3aWR0aCwgaGVpZ2h0LCBsZWZ0KCkpO1xuXG5cdFx0Ly8gZHJhd0JlemllclBhdGhzKHZlY3Rvck1hc2sucGF0aHMsIHdpZHRoLCBoZWlnaHQsICdvdXQucG5nJyk7XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQsIHsgd2lkdGgsIGhlaWdodCB9KSA9PiB7XG5cdFx0Y29uc3QgdmVjdG9yTWFzayA9IHRhcmdldC52ZWN0b3JNYXNrITtcblx0XHRjb25zdCBmbGFncyA9XG5cdFx0XHQodmVjdG9yTWFzay5pbnZlcnQgPyAxIDogMCkgfFxuXHRcdFx0KHZlY3Rvck1hc2subm90TGluayA/IDIgOiAwKSB8XG5cdFx0XHQodmVjdG9yTWFzay5kaXNhYmxlID8gNCA6IDApO1xuXG5cdFx0d3JpdGVVaW50MzIod3JpdGVyLCAzKTsgLy8gdmVyc2lvblxuXHRcdHdyaXRlVWludDMyKHdyaXRlciwgZmxhZ3MpO1xuXG5cdFx0Ly8gaW5pdGlhbCBlbnRyeVxuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgNik7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDI0KTtcblxuXHRcdGNvbnN0IGNsaXBib2FyZCA9IHZlY3Rvck1hc2suY2xpcGJvYXJkO1xuXHRcdGlmIChjbGlwYm9hcmQpIHtcblx0XHRcdHdyaXRlVWludDE2KHdyaXRlciwgNyk7XG5cdFx0XHR3cml0ZUZpeGVkUG9pbnRQYXRoMzIod3JpdGVyLCBjbGlwYm9hcmQudG9wKTtcblx0XHRcdHdyaXRlRml4ZWRQb2ludFBhdGgzMih3cml0ZXIsIGNsaXBib2FyZC5sZWZ0KTtcblx0XHRcdHdyaXRlRml4ZWRQb2ludFBhdGgzMih3cml0ZXIsIGNsaXBib2FyZC5ib3R0b20pO1xuXHRcdFx0d3JpdGVGaXhlZFBvaW50UGF0aDMyKHdyaXRlciwgY2xpcGJvYXJkLnJpZ2h0KTtcblx0XHRcdHdyaXRlRml4ZWRQb2ludFBhdGgzMih3cml0ZXIsIGNsaXBib2FyZC5yZXNvbHV0aW9uKTtcblx0XHRcdHdyaXRlWmVyb3Mod3JpdGVyLCA0KTtcblx0XHR9XG5cblx0XHRpZiAodmVjdG9yTWFzay5maWxsU3RhcnRzV2l0aEFsbFBpeGVscyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDgpO1xuXHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCB2ZWN0b3JNYXNrLmZpbGxTdGFydHNXaXRoQWxsUGl4ZWxzID8gMSA6IDApO1xuXHRcdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDIyKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHBhdGggb2YgdmVjdG9yTWFzay5wYXRocykge1xuXHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCBwYXRoLm9wZW4gPyAzIDogMCk7XG5cdFx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIHBhdGgua25vdHMubGVuZ3RoKTtcblx0XHRcdHdyaXRlVWludDE2KHdyaXRlciwgTWF0aC5hYnMoYm9vbGVhbk9wZXJhdGlvbnMuaW5kZXhPZihwYXRoLm9wZXJhdGlvbikpKTsgLy8gZGVmYXVsdCB0byAxIGlmIG5vdCBmb3VuZFxuXHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCAxKTtcblx0XHRcdHdyaXRlWmVyb3Mod3JpdGVyLCAxOCk7IC8vIFRPRE86IHRoZXNlIGFyZSBzb21ldGltZXMgbm9uLXplcm9cblxuXHRcdFx0Y29uc3QgbGlua2VkS25vdCA9IHBhdGgub3BlbiA/IDQgOiAxO1xuXHRcdFx0Y29uc3QgdW5saW5rZWRLbm90ID0gcGF0aC5vcGVuID8gNSA6IDI7XG5cblx0XHRcdGZvciAoY29uc3QgeyBsaW5rZWQsIHBvaW50cyB9IG9mIHBhdGgua25vdHMpIHtcblx0XHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCBsaW5rZWQgPyBsaW5rZWRLbm90IDogdW5saW5rZWRLbm90KTtcblx0XHRcdFx0d3JpdGVCZXppZXJLbm90KHdyaXRlciwgcG9pbnRzLCB3aWR0aCwgaGVpZ2h0KTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG4pO1xuXG4vLyBUT0RPOiBuZWVkIHRvIHdyaXRlIHZtc2sgaWYgaGFzIG91dGxpbmUgP1xuYWRkSGFuZGxlckFsaWFzKCd2c21zJywgJ3Ztc2snKTtcbi8vIGFkZEhhbmRsZXJBbGlhcygndm1zaycsICd2c21zJyk7XG5cbmludGVyZmFjZSBWb2drRGVzY3JpcHRvciB7XG5cdGtleURlc2NyaXB0b3JMaXN0OiB7XG5cdFx0a2V5U2hhcGVJbnZhbGlkYXRlZD86IGJvb2xlYW47XG5cdFx0a2V5T3JpZ2luVHlwZT86IG51bWJlcjtcblx0XHRrZXlPcmlnaW5SZXNvbHV0aW9uPzogbnVtYmVyO1xuXHRcdGtleU9yaWdpblJSZWN0UmFkaWk/OiB7XG5cdFx0XHR1bml0VmFsdWVRdWFkVmVyc2lvbjogbnVtYmVyO1xuXHRcdFx0dG9wUmlnaHQ6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xuXHRcdFx0dG9wTGVmdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XG5cdFx0XHRib3R0b21MZWZ0OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcblx0XHRcdGJvdHRvbVJpZ2h0OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcblx0XHR9O1xuXHRcdGtleU9yaWdpblNoYXBlQkJveD86IHtcblx0XHRcdHVuaXRWYWx1ZVF1YWRWZXJzaW9uOiBudW1iZXI7XG5cdFx0XHQnVG9wICc6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xuXHRcdFx0TGVmdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XG5cdFx0XHRCdG9tOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcblx0XHRcdFJnaHQ6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xuXHRcdH07XG5cdFx0a2V5T3JpZ2luQm94Q29ybmVycz86IHtcblx0XHRcdHJlY3RhbmdsZUNvcm5lckE6IHsgSHJ6bjogbnVtYmVyOyBWcnRjOiBudW1iZXI7IH07XG5cdFx0XHRyZWN0YW5nbGVDb3JuZXJCOiB7IEhyem46IG51bWJlcjsgVnJ0YzogbnVtYmVyOyB9O1xuXHRcdFx0cmVjdGFuZ2xlQ29ybmVyQzogeyBIcnpuOiBudW1iZXI7IFZydGM6IG51bWJlcjsgfTtcblx0XHRcdHJlY3RhbmdsZUNvcm5lckQ6IHsgSHJ6bjogbnVtYmVyOyBWcnRjOiBudW1iZXI7IH07XG5cdFx0fTtcblx0XHRUcm5mPzogeyB4eDogbnVtYmVyOyB4eTogbnVtYmVyOyB5eDogbnVtYmVyOyB5eTogbnVtYmVyOyB0eDogbnVtYmVyOyB0eTogbnVtYmVyOyB9LFxuXHRcdGtleU9yaWdpbkluZGV4OiBudW1iZXI7XG5cdH1bXTtcbn1cblxuYWRkSGFuZGxlcihcblx0J3ZvZ2snLFxuXHRoYXNLZXkoJ3ZlY3Rvck9yaWdpbmF0aW9uJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmIChyZWFkSW50MzIocmVhZGVyKSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZvZ2sgdmVyc2lvbmApO1xuXHRcdGNvbnN0IGRlc2MgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKSBhcyBWb2drRGVzY3JpcHRvcjtcblx0XHQvLyBjb25zb2xlLmxvZyhyZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcblxuXHRcdHRhcmdldC52ZWN0b3JPcmlnaW5hdGlvbiA9IHsga2V5RGVzY3JpcHRvckxpc3Q6IFtdIH07XG5cblx0XHRmb3IgKGNvbnN0IGkgb2YgZGVzYy5rZXlEZXNjcmlwdG9yTGlzdCkge1xuXHRcdFx0Y29uc3QgaXRlbTogS2V5RGVzY3JpcHRvckl0ZW0gPSB7fTtcblxuXHRcdFx0aWYgKGkua2V5U2hhcGVJbnZhbGlkYXRlZCAhPSBudWxsKSBpdGVtLmtleVNoYXBlSW52YWxpZGF0ZWQgPSBpLmtleVNoYXBlSW52YWxpZGF0ZWQ7XG5cdFx0XHRpZiAoaS5rZXlPcmlnaW5UeXBlICE9IG51bGwpIGl0ZW0ua2V5T3JpZ2luVHlwZSA9IGkua2V5T3JpZ2luVHlwZTtcblx0XHRcdGlmIChpLmtleU9yaWdpblJlc29sdXRpb24gIT0gbnVsbCkgaXRlbS5rZXlPcmlnaW5SZXNvbHV0aW9uID0gaS5rZXlPcmlnaW5SZXNvbHV0aW9uO1xuXHRcdFx0aWYgKGkua2V5T3JpZ2luU2hhcGVCQm94KSB7XG5cdFx0XHRcdGl0ZW0ua2V5T3JpZ2luU2hhcGVCb3VuZGluZ0JveCA9IHtcblx0XHRcdFx0XHR0b3A6IHBhcnNlVW5pdHMoaS5rZXlPcmlnaW5TaGFwZUJCb3hbJ1RvcCAnXSksXG5cdFx0XHRcdFx0bGVmdDogcGFyc2VVbml0cyhpLmtleU9yaWdpblNoYXBlQkJveC5MZWZ0KSxcblx0XHRcdFx0XHRib3R0b206IHBhcnNlVW5pdHMoaS5rZXlPcmlnaW5TaGFwZUJCb3guQnRvbSksXG5cdFx0XHRcdFx0cmlnaHQ6IHBhcnNlVW5pdHMoaS5rZXlPcmlnaW5TaGFwZUJCb3guUmdodCksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRjb25zdCByZWN0UmFkaWkgPSBpLmtleU9yaWdpblJSZWN0UmFkaWk7XG5cdFx0XHRpZiAocmVjdFJhZGlpKSB7XG5cdFx0XHRcdGl0ZW0ua2V5T3JpZ2luUlJlY3RSYWRpaSA9IHtcblx0XHRcdFx0XHR0b3BSaWdodDogcGFyc2VVbml0cyhyZWN0UmFkaWkudG9wUmlnaHQpLFxuXHRcdFx0XHRcdHRvcExlZnQ6IHBhcnNlVW5pdHMocmVjdFJhZGlpLnRvcExlZnQpLFxuXHRcdFx0XHRcdGJvdHRvbUxlZnQ6IHBhcnNlVW5pdHMocmVjdFJhZGlpLmJvdHRvbUxlZnQpLFxuXHRcdFx0XHRcdGJvdHRvbVJpZ2h0OiBwYXJzZVVuaXRzKHJlY3RSYWRpaS5ib3R0b21SaWdodCksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjb3JuZXJzID0gaS5rZXlPcmlnaW5Cb3hDb3JuZXJzO1xuXHRcdFx0aWYgKGNvcm5lcnMpIHtcblx0XHRcdFx0aXRlbS5rZXlPcmlnaW5Cb3hDb3JuZXJzID0gW1xuXHRcdFx0XHRcdHsgeDogY29ybmVycy5yZWN0YW5nbGVDb3JuZXJBLkhyem4sIHk6IGNvcm5lcnMucmVjdGFuZ2xlQ29ybmVyQS5WcnRjIH0sXG5cdFx0XHRcdFx0eyB4OiBjb3JuZXJzLnJlY3RhbmdsZUNvcm5lckIuSHJ6biwgeTogY29ybmVycy5yZWN0YW5nbGVDb3JuZXJCLlZydGMgfSxcblx0XHRcdFx0XHR7IHg6IGNvcm5lcnMucmVjdGFuZ2xlQ29ybmVyQy5IcnpuLCB5OiBjb3JuZXJzLnJlY3RhbmdsZUNvcm5lckMuVnJ0YyB9LFxuXHRcdFx0XHRcdHsgeDogY29ybmVycy5yZWN0YW5nbGVDb3JuZXJELkhyem4sIHk6IGNvcm5lcnMucmVjdGFuZ2xlQ29ybmVyRC5WcnRjIH0sXG5cdFx0XHRcdF07XG5cdFx0XHR9XG5cdFx0XHRjb25zdCB0cm5mID0gaS5Ucm5mO1xuXHRcdFx0aWYgKHRybmYpIHtcblx0XHRcdFx0aXRlbS50cmFuc2Zvcm0gPSBbdHJuZi54eCwgdHJuZi54eSwgdHJuZi54eSwgdHJuZi55eSwgdHJuZi50eCwgdHJuZi50eV07XG5cdFx0XHR9XG5cblx0XHRcdHRhcmdldC52ZWN0b3JPcmlnaW5hdGlvbi5rZXlEZXNjcmlwdG9yTGlzdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldDtcblx0XHRjb25zdCBvcmlnID0gdGFyZ2V0LnZlY3Rvck9yaWdpbmF0aW9uITtcblx0XHRjb25zdCBkZXNjOiBWb2drRGVzY3JpcHRvciA9IHsga2V5RGVzY3JpcHRvckxpc3Q6IFtdIH07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG9yaWcua2V5RGVzY3JpcHRvckxpc3QubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGl0ZW0gPSBvcmlnLmtleURlc2NyaXB0b3JMaXN0W2ldO1xuXG5cdFx0XHRpZiAoaXRlbS5rZXlTaGFwZUludmFsaWRhdGVkKSB7XG5cdFx0XHRcdGRlc2Mua2V5RGVzY3JpcHRvckxpc3QucHVzaCh7IGtleVNoYXBlSW52YWxpZGF0ZWQ6IHRydWUsIGtleU9yaWdpbkluZGV4OiBpIH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVzYy5rZXlEZXNjcmlwdG9yTGlzdC5wdXNoKHt9IGFzIGFueSk7IC8vIHdlJ3JlIGFkZGluZyBrZXlPcmlnaW5JbmRleCBhdCB0aGUgZW5kXG5cblx0XHRcdFx0Y29uc3Qgb3V0ID0gZGVzYy5rZXlEZXNjcmlwdG9yTGlzdFtkZXNjLmtleURlc2NyaXB0b3JMaXN0Lmxlbmd0aCAtIDFdO1xuXG5cdFx0XHRcdGlmIChpdGVtLmtleU9yaWdpblR5cGUgIT0gbnVsbCkgb3V0LmtleU9yaWdpblR5cGUgPSBpdGVtLmtleU9yaWdpblR5cGU7XG5cdFx0XHRcdGlmIChpdGVtLmtleU9yaWdpblJlc29sdXRpb24gIT0gbnVsbCkgb3V0LmtleU9yaWdpblJlc29sdXRpb24gPSBpdGVtLmtleU9yaWdpblJlc29sdXRpb247XG5cblx0XHRcdFx0Y29uc3QgcmFkaWkgPSBpdGVtLmtleU9yaWdpblJSZWN0UmFkaWk7XG5cdFx0XHRcdGlmIChyYWRpaSkge1xuXHRcdFx0XHRcdG91dC5rZXlPcmlnaW5SUmVjdFJhZGlpID0ge1xuXHRcdFx0XHRcdFx0dW5pdFZhbHVlUXVhZFZlcnNpb246IDEsXG5cdFx0XHRcdFx0XHR0b3BSaWdodDogdW5pdHNWYWx1ZShyYWRpaS50b3BSaWdodCwgJ3RvcFJpZ2h0JyksXG5cdFx0XHRcdFx0XHR0b3BMZWZ0OiB1bml0c1ZhbHVlKHJhZGlpLnRvcExlZnQsICd0b3BMZWZ0JyksXG5cdFx0XHRcdFx0XHRib3R0b21MZWZ0OiB1bml0c1ZhbHVlKHJhZGlpLmJvdHRvbUxlZnQsICdib3R0b21MZWZ0JyksXG5cdFx0XHRcdFx0XHRib3R0b21SaWdodDogdW5pdHNWYWx1ZShyYWRpaS5ib3R0b21SaWdodCwgJ2JvdHRvbVJpZ2h0JyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGJveCA9IGl0ZW0ua2V5T3JpZ2luU2hhcGVCb3VuZGluZ0JveDtcblx0XHRcdFx0aWYgKGJveCkge1xuXHRcdFx0XHRcdG91dC5rZXlPcmlnaW5TaGFwZUJCb3ggPSB7XG5cdFx0XHRcdFx0XHR1bml0VmFsdWVRdWFkVmVyc2lvbjogMSxcblx0XHRcdFx0XHRcdCdUb3AgJzogdW5pdHNWYWx1ZShib3gudG9wLCAndG9wJyksXG5cdFx0XHRcdFx0XHRMZWZ0OiB1bml0c1ZhbHVlKGJveC5sZWZ0LCAnbGVmdCcpLFxuXHRcdFx0XHRcdFx0QnRvbTogdW5pdHNWYWx1ZShib3guYm90dG9tLCAnYm90dG9tJyksXG5cdFx0XHRcdFx0XHRSZ2h0OiB1bml0c1ZhbHVlKGJveC5yaWdodCwgJ3JpZ2h0JyksXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNvcm5lcnMgPSBpdGVtLmtleU9yaWdpbkJveENvcm5lcnM7XG5cdFx0XHRcdGlmIChjb3JuZXJzICYmIGNvcm5lcnMubGVuZ3RoID09PSA0KSB7XG5cdFx0XHRcdFx0b3V0LmtleU9yaWdpbkJveENvcm5lcnMgPSB7XG5cdFx0XHRcdFx0XHRyZWN0YW5nbGVDb3JuZXJBOiB7IEhyem46IGNvcm5lcnNbMF0ueCwgVnJ0YzogY29ybmVyc1swXS55IH0sXG5cdFx0XHRcdFx0XHRyZWN0YW5nbGVDb3JuZXJCOiB7IEhyem46IGNvcm5lcnNbMV0ueCwgVnJ0YzogY29ybmVyc1sxXS55IH0sXG5cdFx0XHRcdFx0XHRyZWN0YW5nbGVDb3JuZXJDOiB7IEhyem46IGNvcm5lcnNbMl0ueCwgVnJ0YzogY29ybmVyc1syXS55IH0sXG5cdFx0XHRcdFx0XHRyZWN0YW5nbGVDb3JuZXJEOiB7IEhyem46IGNvcm5lcnNbM10ueCwgVnJ0YzogY29ybmVyc1szXS55IH0sXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHRyYW5zZm9ybSA9IGl0ZW0udHJhbnNmb3JtO1xuXHRcdFx0XHRpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybS5sZW5ndGggPT09IDYpIHtcblx0XHRcdFx0XHRvdXQuVHJuZiA9IHtcblx0XHRcdFx0XHRcdHh4OiB0cmFuc2Zvcm1bMF0sXG5cdFx0XHRcdFx0XHR4eTogdHJhbnNmb3JtWzFdLFxuXHRcdFx0XHRcdFx0eXg6IHRyYW5zZm9ybVsyXSxcblx0XHRcdFx0XHRcdHl5OiB0cmFuc2Zvcm1bM10sXG5cdFx0XHRcdFx0XHR0eDogdHJhbnNmb3JtWzRdLFxuXHRcdFx0XHRcdFx0dHk6IHRyYW5zZm9ybVs1XSxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b3V0LmtleU9yaWdpbkluZGV4ID0gaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR3cml0ZUludDMyKHdyaXRlciwgMSk7IC8vIHZlcnNpb25cblx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdudWxsJywgZGVzYyk7XG5cdH1cbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdsbWZ4Jyxcblx0dGFyZ2V0ID0+IHRhcmdldC5lZmZlY3RzICE9PSB1bmRlZmluZWQgJiYgaGFzTXVsdGlFZmZlY3RzKHRhcmdldC5lZmZlY3RzKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0LCBfLCBvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRpZiAodmVyc2lvbiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxtZnggdmVyc2lvbicpO1xuXG5cdFx0Y29uc3QgZGVzYzogTG1meERlc2NyaXB0b3IgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblx0XHQvLyBjb25zb2xlLmxvZyhyZXF1aXJlKCd1dGlsJykuaW5zcGVjdChpbmZvLCBmYWxzZSwgOTksIHRydWUpKTtcblxuXHRcdC8vIGRpc2NhcmQgaWYgcmVhZCBpbiAnbHJGWCcgb3IgJ2xmeDInIHNlY3Rpb25cblx0XHR0YXJnZXQuZWZmZWN0cyA9IHBhcnNlRWZmZWN0cyhkZXNjLCAhIW9wdGlvbnMubG9nTWlzc2luZ0ZlYXR1cmVzKTtcblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCwgXywgb3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IGRlc2MgPSBzZXJpYWxpemVFZmZlY3RzKHRhcmdldC5lZmZlY3RzISwgISFvcHRpb25zLmxvZ01pc3NpbmdGZWF0dXJlcywgdHJ1ZSk7XG5cblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIDApOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J2xyRlgnLFxuXHRoYXNLZXkoJ2VmZmVjdHMnKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0aWYgKCF0YXJnZXQuZWZmZWN0cykgdGFyZ2V0LmVmZmVjdHMgPSByZWFkRWZmZWN0cyhyZWFkZXIpO1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0d3JpdGVFZmZlY3RzKHdyaXRlciwgdGFyZ2V0LmVmZmVjdHMhKTtcblx0fSxcbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdsdW5pJyxcblx0aGFzS2V5KCduYW1lJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5uYW1lID0gcmVhZFVuaWNvZGVTdHJpbmcocmVhZGVyKTtcblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZVVuaWNvZGVTdHJpbmcod3JpdGVyLCB0YXJnZXQubmFtZSEpO1xuXHRcdC8vIHdyaXRlVWludDE2KHdyaXRlciwgMCk7IC8vIHBhZGRpbmcgKGJ1dCBub3QgZXh0ZW5kaW5nIHN0cmluZyBsZW5ndGgpXG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnbG5zcicsXG5cdGhhc0tleSgnbmFtZVNvdXJjZScpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHRhcmdldC5uYW1lU291cmNlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpLFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgdGFyZ2V0Lm5hbWVTb3VyY2UhKSxcbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdseWlkJyxcblx0aGFzS2V5KCdpZCcpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHRhcmdldC5pZCA9IHJlYWRVaW50MzIocmVhZGVyKSxcblx0KHdyaXRlciwgdGFyZ2V0LCBfcHNkLCBvcHRpb25zKSA9PiB7XG5cdFx0bGV0IGlkID0gdGFyZ2V0LmlkITtcblx0XHR3aGlsZSAob3B0aW9ucy5sYXllcklkcy5oYXMoaWQpKSBpZCArPSAxMDA7IC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGR1cGxpY2F0ZSBsYXllciBpZHNcblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIGlkKTtcblx0XHRvcHRpb25zLmxheWVySWRzLmFkZChpZCk7XG5cdFx0b3B0aW9ucy5sYXllclRvSWQuc2V0KHRhcmdldCwgaWQpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J2xzY3QnLFxuXHRoYXNLZXkoJ3NlY3Rpb25EaXZpZGVyJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5zZWN0aW9uRGl2aWRlciA9IHsgdHlwZTogcmVhZFVpbnQzMihyZWFkZXIpIH07XG5cblx0XHRpZiAobGVmdCgpKSB7XG5cdFx0XHRjaGVja1NpZ25hdHVyZShyZWFkZXIsICc4QklNJyk7XG5cdFx0XHR0YXJnZXQuc2VjdGlvbkRpdmlkZXIua2V5ID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xuXHRcdH1cblxuXHRcdGlmIChsZWZ0KCkpIHtcblx0XHRcdHRhcmdldC5zZWN0aW9uRGl2aWRlci5zdWJUeXBlID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdH1cblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0d3JpdGVVaW50MzIod3JpdGVyLCB0YXJnZXQuc2VjdGlvbkRpdmlkZXIhLnR5cGUpO1xuXG5cdFx0aWYgKHRhcmdldC5zZWN0aW9uRGl2aWRlciEua2V5KSB7XG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsICc4QklNJyk7XG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHRhcmdldC5zZWN0aW9uRGl2aWRlciEua2V5KTtcblxuXHRcdFx0aWYgKHRhcmdldC5zZWN0aW9uRGl2aWRlciEuc3ViVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHdyaXRlVWludDMyKHdyaXRlciwgdGFyZ2V0LnNlY3Rpb25EaXZpZGVyIS5zdWJUeXBlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG4pO1xuXG4vLyBpdCBzZWVtcyBsc2RrIGlzIHVzZWQgd2hlbiB0aGVyZSdzIGEgbGF5ZXIgaXMgbmVzdGVkIG1vcmUgdGhhbiA2IGxldmVscywgYnV0IEkgZG9uJ3Qga25vdyB3aHk/XG4vLyBtYXliZSBzb21lIGxpbWl0YXRpb24gb2Ygb2xkIHZlcnNpb24gb2YgUFM/XG5hZGRIYW5kbGVyQWxpYXMoJ2xzZGsnLCAnbHNjdCcpO1xuXG5hZGRIYW5kbGVyKFxuXHQnY2xibCcsXG5cdGhhc0tleSgnYmxlbmRDbGlwcGVuZEVsZW1lbnRzJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC5ibGVuZENsaXBwZW5kRWxlbWVudHMgPSAhIXJlYWRVaW50OChyZWFkZXIpO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIDMpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgdGFyZ2V0LmJsZW5kQ2xpcHBlbmRFbGVtZW50cyA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnaW5meCcsXG5cdGhhc0tleSgnYmxlbmRJbnRlcmlvckVsZW1lbnRzJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC5ibGVuZEludGVyaW9yRWxlbWVudHMgPSAhIXJlYWRVaW50OChyZWFkZXIpO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIDMpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgdGFyZ2V0LmJsZW5kSW50ZXJpb3JFbGVtZW50cyA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQna25rbycsXG5cdGhhc0tleSgna25vY2tvdXQnKSxcblx0KHJlYWRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0dGFyZ2V0Lmtub2Nrb3V0ID0gISFyZWFkVWludDgocmVhZGVyKTtcblx0XHRza2lwQnl0ZXMocmVhZGVyLCAzKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0d3JpdGVVaW50OCh3cml0ZXIsIHRhcmdldC5rbm9ja291dCA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnbG1nbScsXG5cdGhhc0tleSgnbGF5ZXJNYXNrQXNHbG9iYWxNYXNrJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC5sYXllck1hc2tBc0dsb2JhbE1hc2sgPSAhIXJlYWRVaW50OChyZWFkZXIpO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIDMpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgdGFyZ2V0LmxheWVyTWFza0FzR2xvYmFsTWFzayA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnbHNwZicsXG5cdGhhc0tleSgncHJvdGVjdGVkJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGZsYWdzID0gcmVhZFVpbnQzMihyZWFkZXIpO1xuXHRcdHRhcmdldC5wcm90ZWN0ZWQgPSB7XG5cdFx0XHR0cmFuc3BhcmVuY3k6IChmbGFncyAmIDB4MDEpICE9PSAwLFxuXHRcdFx0Y29tcG9zaXRlOiAoZmxhZ3MgJiAweDAyKSAhPT0gMCxcblx0XHRcdHBvc2l0aW9uOiAoZmxhZ3MgJiAweDA0KSAhPT0gMCxcblx0XHR9O1xuXG5cdFx0aWYgKGZsYWdzICYgMHgwOCkgdGFyZ2V0LnByb3RlY3RlZC5hcnRib2FyZHMgPSB0cnVlO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBmbGFncyA9XG5cdFx0XHQodGFyZ2V0LnByb3RlY3RlZCEudHJhbnNwYXJlbmN5ID8gMHgwMSA6IDApIHxcblx0XHRcdCh0YXJnZXQucHJvdGVjdGVkIS5jb21wb3NpdGUgPyAweDAyIDogMCkgfFxuXHRcdFx0KHRhcmdldC5wcm90ZWN0ZWQhLnBvc2l0aW9uID8gMHgwNCA6IDApIHxcblx0XHRcdCh0YXJnZXQucHJvdGVjdGVkIS5hcnRib2FyZHMgPyAweDA4IDogMCk7XG5cblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIGZsYWdzKTtcblx0fSxcbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdsY2xyJyxcblx0aGFzS2V5KCdsYXllckNvbG9yJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGNvbG9yID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIDYpO1xuXHRcdHRhcmdldC5sYXllckNvbG9yID0gbGF5ZXJDb2xvcnNbY29sb3JdO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBpbmRleCA9IGxheWVyQ29sb3JzLmluZGV4T2YodGFyZ2V0LmxheWVyQ29sb3IhKTtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIGluZGV4ID09PSAtMSA/IDAgOiBpbmRleCk7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDYpO1xuXHR9LFxuKTtcblxuaW50ZXJmYWNlIEN1c3RvbURlc2NyaXB0b3Ige1xuXHRsYXllclRpbWU/OiBudW1iZXI7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdzaG1kJyxcblx0dGFyZ2V0ID0+IHRhcmdldC50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCB8fCB0YXJnZXQuYW5pbWF0aW9uRnJhbWVzICE9PSB1bmRlZmluZWQgfHxcblx0XHR0YXJnZXQuYW5pbWF0aW9uRnJhbWVGbGFncyAhPT0gdW5kZWZpbmVkIHx8IHRhcmdldC50aW1lbGluZSAhPT0gdW5kZWZpbmVkLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQsIF8sIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBjb3VudCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuXHRcdFx0Y2hlY2tTaWduYXR1cmUocmVhZGVyLCAnOEJJTScpO1xuXHRcdFx0Y29uc3Qga2V5ID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xuXHRcdFx0cmVhZFVpbnQ4KHJlYWRlcik7IC8vIGNvcHlcblx0XHRcdHNraXBCeXRlcyhyZWFkZXIsIDMpO1xuXG5cdFx0XHRyZWFkU2VjdGlvbihyZWFkZXIsIDEsIGxlZnQgPT4ge1xuXHRcdFx0XHRpZiAoa2V5ID09PSAnY3VzdCcpIHtcblx0XHRcdFx0XHRjb25zdCBkZXNjID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcikgYXMgQ3VzdG9tRGVzY3JpcHRvcjtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygnY3VzdCcsIHRhcmdldC5uYW1lLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcblx0XHRcdFx0XHRpZiAoZGVzYy5sYXllclRpbWUgIT09IHVuZGVmaW5lZCkgdGFyZ2V0LnRpbWVzdGFtcCA9IGRlc2MubGF5ZXJUaW1lO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ21sc3QnKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVzYyA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpIGFzIEZyYW1lTGlzdERlc2NyaXB0b3I7XG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ21sc3QnLCB0YXJnZXQubmFtZSwgcmVxdWlyZSgndXRpbCcpLmluc3BlY3QoZGVzYywgZmFsc2UsIDk5LCB0cnVlKSk7XG5cblx0XHRcdFx0XHR0YXJnZXQuYW5pbWF0aW9uRnJhbWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRlc2MuTGFTdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgZiA9IGRlc2MuTGFTdFtpXTtcblx0XHRcdFx0XHRcdGNvbnN0IGZyYW1lOiBBbmltYXRpb25GcmFtZSA9IHsgZnJhbWVzOiBmLkZyTHMgfTtcblx0XHRcdFx0XHRcdGlmIChmLmVuYWIgIT09IHVuZGVmaW5lZCkgZnJhbWUuZW5hYmxlID0gZi5lbmFiO1xuXHRcdFx0XHRcdFx0aWYgKGYuT2ZzdCkgZnJhbWUub2Zmc2V0ID0gaG9yelZydGNUb1hZKGYuT2ZzdCk7XG5cdFx0XHRcdFx0XHRpZiAoZi5GWFJmKSBmcmFtZS5yZWZlcmVuY2VQb2ludCA9IGhvcnpWcnRjVG9YWShmLkZYUmYpO1xuXHRcdFx0XHRcdFx0aWYgKGYuTGVmeCkgZnJhbWUuZWZmZWN0cyA9IHBhcnNlRWZmZWN0cyhmLkxlZngsICEhb3B0aW9ucy5sb2dNaXNzaW5nRmVhdHVyZXMpO1xuXHRcdFx0XHRcdFx0aWYgKGYuYmxlbmRPcHRpb25zICYmIGYuYmxlbmRPcHRpb25zLk9wY3QpIGZyYW1lLm9wYWNpdHkgPSBwYXJzZVBlcmNlbnQoZi5ibGVuZE9wdGlvbnMuT3BjdCk7XG5cdFx0XHRcdFx0XHR0YXJnZXQuYW5pbWF0aW9uRnJhbWVzLnB1c2goZnJhbWUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChrZXkgPT09ICdtZHluJykge1xuXHRcdFx0XHRcdC8vIGZyYW1lIGZsYWdzXG5cdFx0XHRcdFx0cmVhZFVpbnQxNihyZWFkZXIpOyAvLyB1bmtub3duXG5cdFx0XHRcdFx0Y29uc3QgcHJvcGFnYXRlID0gcmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0XHRcdFx0Y29uc3QgZmxhZ3MgPSByZWFkVWludDgocmVhZGVyKTtcblxuXHRcdFx0XHRcdHRhcmdldC5hbmltYXRpb25GcmFtZUZsYWdzID0ge1xuXHRcdFx0XHRcdFx0cHJvcGFnYXRlRnJhbWVPbmU6ICFwcm9wYWdhdGUsXG5cdFx0XHRcdFx0XHR1bmlmeUxheWVyUG9zaXRpb246IChmbGFncyAmIDEpICE9PSAwLFxuXHRcdFx0XHRcdFx0dW5pZnlMYXllclN0eWxlOiAoZmxhZ3MgJiAyKSAhPT0gMCxcblx0XHRcdFx0XHRcdHVuaWZ5TGF5ZXJWaXNpYmlsaXR5OiAoZmxhZ3MgJiA0KSAhPT0gMCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3RtbG4nKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGVzYyA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpIGFzIFRpbWVsaW5lRGVzY3JpcHRvcjtcblx0XHRcdFx0XHRjb25zdCB0aW1lU2NvcGUgPSBkZXNjLnRpbWVTY29wZTtcblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZygndG1sbicsIHRhcmdldC5uYW1lLCB0YXJnZXQuaWQsIHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGRlc2MsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXG5cdFx0XHRcdFx0Y29uc3QgdGltZWxpbmU6IFRpbWVsaW5lID0ge1xuXHRcdFx0XHRcdFx0c3RhcnQ6IHRpbWVTY29wZS5TdHJ0LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb246IHRpbWVTY29wZS5kdXJhdGlvbixcblx0XHRcdFx0XHRcdGluVGltZTogdGltZVNjb3BlLmluVGltZSxcblx0XHRcdFx0XHRcdG91dFRpbWU6IHRpbWVTY29wZS5vdXRUaW1lLFxuXHRcdFx0XHRcdFx0YXV0b1Njb3BlOiBkZXNjLmF1dG9TY29wZSxcblx0XHRcdFx0XHRcdGF1ZGlvTGV2ZWw6IGRlc2MuYXVkaW9MZXZlbCxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKGRlc2MudHJhY2tMaXN0KSB7XG5cdFx0XHRcdFx0XHR0aW1lbGluZS50cmFja3MgPSBwYXJzZVRyYWNrTGlzdChkZXNjLnRyYWNrTGlzdCwgISFvcHRpb25zLmxvZ01pc3NpbmdGZWF0dXJlcyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0LnRpbWVsaW5lID0gdGltZWxpbmU7XG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ3RtbG46cmVzdWx0JywgdGFyZ2V0Lm5hbWUsIHRhcmdldC5pZCwgcmVxdWlyZSgndXRpbCcpLmluc3BlY3QodGltZWxpbmUsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9wdGlvbnMubG9nRGV2RmVhdHVyZXMgJiYgY29uc29sZS5sb2coJ1VuaGFuZGxlZCBcInNobWRcIiBzZWN0aW9uIGtleScsIGtleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0LCBfLCBvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgeyBhbmltYXRpb25GcmFtZXMsIGFuaW1hdGlvbkZyYW1lRmxhZ3MsIHRpbWVzdGFtcCwgdGltZWxpbmUgfSA9IHRhcmdldDtcblxuXHRcdGxldCBjb3VudCA9IDA7XG5cdFx0aWYgKGFuaW1hdGlvbkZyYW1lcykgY291bnQrKztcblx0XHRpZiAoYW5pbWF0aW9uRnJhbWVGbGFncykgY291bnQrKztcblx0XHRpZiAodGltZWxpbmUpIGNvdW50Kys7XG5cdFx0aWYgKHRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSBjb3VudCsrO1xuXHRcdHdyaXRlVWludDMyKHdyaXRlciwgY291bnQpO1xuXG5cdFx0aWYgKGFuaW1hdGlvbkZyYW1lcykge1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnOEJJTScpO1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnbWxzdCcpO1xuXHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIDApOyAvLyBjb3B5IChhbHdheXMgZmFsc2UpXG5cdFx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdFx0XHR3cml0ZVNlY3Rpb24od3JpdGVyLCAyLCAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2M6IEZyYW1lTGlzdERlc2NyaXB0b3IgPSB7XG5cdFx0XHRcdFx0TGFJRDogdGFyZ2V0LmlkID8/IDAsXG5cdFx0XHRcdFx0TGFTdDogW10sXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhbmltYXRpb25GcmFtZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCBmID0gYW5pbWF0aW9uRnJhbWVzW2ldO1xuXHRcdFx0XHRcdGNvbnN0IGZyYW1lOiBGcmFtZURlc2NyaXB0b3IgPSB7fSBhcyBhbnk7XG5cdFx0XHRcdFx0aWYgKGYuZW5hYmxlICE9PSB1bmRlZmluZWQpIGZyYW1lLmVuYWIgPSBmLmVuYWJsZTtcblx0XHRcdFx0XHRmcmFtZS5GckxzID0gZi5mcmFtZXM7XG5cdFx0XHRcdFx0aWYgKGYub2Zmc2V0KSBmcmFtZS5PZnN0ID0geHlUb0hvcnpWcnRjKGYub2Zmc2V0KTtcblx0XHRcdFx0XHRpZiAoZi5yZWZlcmVuY2VQb2ludCkgZnJhbWUuRlhSZiA9IHh5VG9Ib3J6VnJ0YyhmLnJlZmVyZW5jZVBvaW50KTtcblx0XHRcdFx0XHRpZiAoZi5lZmZlY3RzKSBmcmFtZS5MZWZ4ID0gc2VyaWFsaXplRWZmZWN0cyhmLmVmZmVjdHMsIGZhbHNlLCBmYWxzZSk7XG5cdFx0XHRcdFx0aWYgKGYub3BhY2l0eSAhPT0gdW5kZWZpbmVkKSBmcmFtZS5ibGVuZE9wdGlvbnMgPSB7IE9wY3Q6IHVuaXRzUGVyY2VudChmLm9wYWNpdHkpIH07XG5cdFx0XHRcdFx0ZGVzYy5MYVN0LnB1c2goZnJhbWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHRcdFx0fSwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGFuaW1hdGlvbkZyYW1lRmxhZ3MpIHtcblx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgJzhCSU0nKTtcblx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgJ21keW4nKTtcblx0XHRcdHdyaXRlVWludDgod3JpdGVyLCAwKTsgLy8gY29weSAoYWx3YXlzIGZhbHNlKVxuXHRcdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDMpO1xuXHRcdFx0d3JpdGVTZWN0aW9uKHdyaXRlciwgMiwgKCkgPT4ge1xuXHRcdFx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDApOyAvLyB1bmtub3duXG5cdFx0XHRcdHdyaXRlVWludDgod3JpdGVyLCBhbmltYXRpb25GcmFtZUZsYWdzLnByb3BhZ2F0ZUZyYW1lT25lID8gMHgwIDogMHhmKTtcblx0XHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsXG5cdFx0XHRcdFx0KGFuaW1hdGlvbkZyYW1lRmxhZ3MudW5pZnlMYXllclBvc2l0aW9uID8gMSA6IDApIHxcblx0XHRcdFx0XHQoYW5pbWF0aW9uRnJhbWVGbGFncy51bmlmeUxheWVyU3R5bGUgPyAyIDogMCkgfFxuXHRcdFx0XHRcdChhbmltYXRpb25GcmFtZUZsYWdzLnVuaWZ5TGF5ZXJWaXNpYmlsaXR5ID8gNCA6IDApKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lbGluZSkge1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnOEJJTScpO1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAndG1sbicpO1xuXHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIDApOyAvLyBjb3B5IChhbHdheXMgZmFsc2UpXG5cdFx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdFx0XHR3cml0ZVNlY3Rpb24od3JpdGVyLCAyLCAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2M6IFRpbWVsaW5lRGVzY3JpcHRvciA9IHtcblx0XHRcdFx0XHRWcnNuOiAxLFxuXHRcdFx0XHRcdHRpbWVTY29wZToge1xuXHRcdFx0XHRcdFx0VnJzbjogMSxcblx0XHRcdFx0XHRcdFN0cnQ6IHRpbWVsaW5lLnN0YXJ0LFxuXHRcdFx0XHRcdFx0ZHVyYXRpb246IHRpbWVsaW5lLmR1cmF0aW9uLFxuXHRcdFx0XHRcdFx0aW5UaW1lOiB0aW1lbGluZS5pblRpbWUsXG5cdFx0XHRcdFx0XHRvdXRUaW1lOiB0aW1lbGluZS5vdXRUaW1lLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YXV0b1Njb3BlOiB0aW1lbGluZS5hdXRvU2NvcGUsXG5cdFx0XHRcdFx0YXVkaW9MZXZlbDogdGltZWxpbmUuYXVkaW9MZXZlbCxcblx0XHRcdFx0fSBhcyBhbnk7XG5cblx0XHRcdFx0aWYgKHRpbWVsaW5lLnRyYWNrcykge1xuXHRcdFx0XHRcdGRlc2MudHJhY2tMaXN0ID0gc2VyaWFsaXplVHJhY2tMaXN0KHRpbWVsaW5lLnRyYWNrcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpZCA9IG9wdGlvbnMubGF5ZXJUb0lkLmdldCh0YXJnZXQpIHx8IHRhcmdldC5pZCB8fCAwO1xuXHRcdFx0XHRpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgbGF5ZXIuaWQgdmFsdWUgd2hhbiB3cml0aW5nIGRvY3VtZW50IHdpdGggYW5pbWF0aW9ucycpO1xuXHRcdFx0XHRkZXNjLkx5ckkgPSBpZDtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnV1JJVEU6dG1sbicsIHRhcmdldC5uYW1lLCB0YXJnZXQuaWQsIHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGRlc2MsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXHRcdFx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdudWxsJywgZGVzYywgJ2FuaW0nKTtcblx0XHRcdH0sIHRydWUpO1xuXHRcdH1cblxuXHRcdGlmICh0aW1lc3RhbXAgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnOEJJTScpO1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnY3VzdCcpO1xuXHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIDApOyAvLyBjb3B5IChhbHdheXMgZmFsc2UpXG5cdFx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdFx0XHR3cml0ZVNlY3Rpb24od3JpdGVyLCAyLCAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IGRlc2M6IEN1c3RvbURlc2NyaXB0b3IgPSB7XG5cdFx0XHRcdFx0bGF5ZXJUaW1lOiB0aW1lc3RhbXAsXG5cdFx0XHRcdH07XG5cdFx0XHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ21ldGFkYXRhJywgZGVzYyk7XG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQndnN0aycsXG5cdGhhc0tleSgndmVjdG9yU3Ryb2tlJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGNvbnN0IGRlc2MgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKSBhcyBTdHJva2VEZXNjcmlwdG9yO1xuXHRcdC8vIGNvbnNvbGUubG9nKHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGRlc2MsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXG5cdFx0dGFyZ2V0LnZlY3RvclN0cm9rZSA9IHtcblx0XHRcdHN0cm9rZUVuYWJsZWQ6IGRlc2Muc3Ryb2tlRW5hYmxlZCxcblx0XHRcdGZpbGxFbmFibGVkOiBkZXNjLmZpbGxFbmFibGVkLFxuXHRcdFx0bGluZVdpZHRoOiBwYXJzZVVuaXRzKGRlc2Muc3Ryb2tlU3R5bGVMaW5lV2lkdGgpLFxuXHRcdFx0bGluZURhc2hPZmZzZXQ6IHBhcnNlVW5pdHMoZGVzYy5zdHJva2VTdHlsZUxpbmVEYXNoT2Zmc2V0KSxcblx0XHRcdG1pdGVyTGltaXQ6IGRlc2Muc3Ryb2tlU3R5bGVNaXRlckxpbWl0LFxuXHRcdFx0bGluZUNhcFR5cGU6IHN0cm9rZVN0eWxlTGluZUNhcFR5cGUuZGVjb2RlKGRlc2Muc3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZSksXG5cdFx0XHRsaW5lSm9pblR5cGU6IHN0cm9rZVN0eWxlTGluZUpvaW5UeXBlLmRlY29kZShkZXNjLnN0cm9rZVN0eWxlTGluZUpvaW5UeXBlKSxcblx0XHRcdGxpbmVBbGlnbm1lbnQ6IHN0cm9rZVN0eWxlTGluZUFsaWdubWVudC5kZWNvZGUoZGVzYy5zdHJva2VTdHlsZUxpbmVBbGlnbm1lbnQpLFxuXHRcdFx0c2NhbGVMb2NrOiBkZXNjLnN0cm9rZVN0eWxlU2NhbGVMb2NrLFxuXHRcdFx0c3Ryb2tlQWRqdXN0OiBkZXNjLnN0cm9rZVN0eWxlU3Ryb2tlQWRqdXN0LFxuXHRcdFx0bGluZURhc2hTZXQ6IGRlc2Muc3Ryb2tlU3R5bGVMaW5lRGFzaFNldC5tYXAocGFyc2VVbml0cyksXG5cdFx0XHRibGVuZE1vZGU6IEJsbk0uZGVjb2RlKGRlc2Muc3Ryb2tlU3R5bGVCbGVuZE1vZGUpLFxuXHRcdFx0b3BhY2l0eTogcGFyc2VQZXJjZW50KGRlc2Muc3Ryb2tlU3R5bGVPcGFjaXR5KSxcblx0XHRcdGNvbnRlbnQ6IHBhcnNlVmVjdG9yQ29udGVudChkZXNjLnN0cm9rZVN0eWxlQ29udGVudCksXG5cdFx0XHRyZXNvbHV0aW9uOiBkZXNjLnN0cm9rZVN0eWxlUmVzb2x1dGlvbixcblx0XHR9O1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3Qgc3Ryb2tlID0gdGFyZ2V0LnZlY3RvclN0cm9rZSE7XG5cdFx0Y29uc3QgZGVzY3JpcHRvcjogU3Ryb2tlRGVzY3JpcHRvciA9IHtcblx0XHRcdHN0cm9rZVN0eWxlVmVyc2lvbjogMixcblx0XHRcdHN0cm9rZUVuYWJsZWQ6ICEhc3Ryb2tlLnN0cm9rZUVuYWJsZWQsXG5cdFx0XHRmaWxsRW5hYmxlZDogISFzdHJva2UuZmlsbEVuYWJsZWQsXG5cdFx0XHRzdHJva2VTdHlsZUxpbmVXaWR0aDogc3Ryb2tlLmxpbmVXaWR0aCB8fCB7IHZhbHVlOiAzLCB1bml0czogJ1BvaW50cycgfSxcblx0XHRcdHN0cm9rZVN0eWxlTGluZURhc2hPZmZzZXQ6IHN0cm9rZS5saW5lRGFzaE9mZnNldCB8fCB7IHZhbHVlOiAwLCB1bml0czogJ1BvaW50cycgfSxcblx0XHRcdHN0cm9rZVN0eWxlTWl0ZXJMaW1pdDogc3Ryb2tlLm1pdGVyTGltaXQgPz8gMTAwLFxuXHRcdFx0c3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZTogc3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZS5lbmNvZGUoc3Ryb2tlLmxpbmVDYXBUeXBlKSxcblx0XHRcdHN0cm9rZVN0eWxlTGluZUpvaW5UeXBlOiBzdHJva2VTdHlsZUxpbmVKb2luVHlwZS5lbmNvZGUoc3Ryb2tlLmxpbmVKb2luVHlwZSksXG5cdFx0XHRzdHJva2VTdHlsZUxpbmVBbGlnbm1lbnQ6IHN0cm9rZVN0eWxlTGluZUFsaWdubWVudC5lbmNvZGUoc3Ryb2tlLmxpbmVBbGlnbm1lbnQpLFxuXHRcdFx0c3Ryb2tlU3R5bGVTY2FsZUxvY2s6ICEhc3Ryb2tlLnNjYWxlTG9jayxcblx0XHRcdHN0cm9rZVN0eWxlU3Ryb2tlQWRqdXN0OiAhIXN0cm9rZS5zdHJva2VBZGp1c3QsXG5cdFx0XHRzdHJva2VTdHlsZUxpbmVEYXNoU2V0OiBzdHJva2UubGluZURhc2hTZXQgfHwgW10sXG5cdFx0XHRzdHJva2VTdHlsZUJsZW5kTW9kZTogQmxuTS5lbmNvZGUoc3Ryb2tlLmJsZW5kTW9kZSksXG5cdFx0XHRzdHJva2VTdHlsZU9wYWNpdHk6IHVuaXRzUGVyY2VudChzdHJva2Uub3BhY2l0eSA/PyAxKSxcblx0XHRcdHN0cm9rZVN0eWxlQ29udGVudDogc2VyaWFsaXplVmVjdG9yQ29udGVudChcblx0XHRcdFx0c3Ryb2tlLmNvbnRlbnQgfHwgeyB0eXBlOiAnY29sb3InLCBjb2xvcjogeyByOiAwLCBnOiAwLCBiOiAwIH0gfSkuZGVzY3JpcHRvcixcblx0XHRcdHN0cm9rZVN0eWxlUmVzb2x1dGlvbjogc3Ryb2tlLnJlc29sdXRpb24gPz8gNzIsXG5cdFx0fTtcblxuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ3N0cm9rZVN0eWxlJywgZGVzY3JpcHRvcik7XG5cdH0sXG4pO1xuXG5pbnRlcmZhY2UgQXJ0YkRlc2NyaXB0b3Ige1xuXHRhcnRib2FyZFJlY3Q6IHsgJ1RvcCAnOiBudW1iZXI7IExlZnQ6IG51bWJlcjsgQnRvbTogbnVtYmVyOyBSZ2h0OiBudW1iZXI7IH07XG5cdGd1aWRlSW5kZWNlczogYW55W107XG5cdGFydGJvYXJkUHJlc2V0TmFtZTogc3RyaW5nO1xuXHQnQ2xyICc6IERlc2NyaXB0b3JDb2xvcjtcblx0YXJ0Ym9hcmRCYWNrZ3JvdW5kVHlwZTogbnVtYmVyO1xufVxuXG5hZGRIYW5kbGVyKFxuXHQnYXJ0YicsIC8vIHBlci1sYXllciBhcmJvYXJkIGluZm9cblx0aGFzS2V5KCdhcnRib2FyZCcpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRjb25zdCBkZXNjID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcikgYXMgQXJ0YkRlc2NyaXB0b3I7XG5cdFx0Y29uc3QgcmVjdCA9IGRlc2MuYXJ0Ym9hcmRSZWN0O1xuXHRcdHRhcmdldC5hcnRib2FyZCA9IHtcblx0XHRcdHJlY3Q6IHsgdG9wOiByZWN0WydUb3AgJ10sIGxlZnQ6IHJlY3QuTGVmdCwgYm90dG9tOiByZWN0LkJ0b20sIHJpZ2h0OiByZWN0LlJnaHQgfSxcblx0XHRcdGd1aWRlSW5kaWNlczogZGVzYy5ndWlkZUluZGVjZXMsXG5cdFx0XHRwcmVzZXROYW1lOiBkZXNjLmFydGJvYXJkUHJlc2V0TmFtZSxcblx0XHRcdGNvbG9yOiBwYXJzZUNvbG9yKGRlc2NbJ0NsciAnXSksXG5cdFx0XHRiYWNrZ3JvdW5kVHlwZTogZGVzYy5hcnRib2FyZEJhY2tncm91bmRUeXBlLFxuXHRcdH07XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBhcnRib2FyZCA9IHRhcmdldC5hcnRib2FyZCE7XG5cdFx0Y29uc3QgcmVjdCA9IGFydGJvYXJkLnJlY3Q7XG5cdFx0Y29uc3QgZGVzYzogQXJ0YkRlc2NyaXB0b3IgPSB7XG5cdFx0XHRhcnRib2FyZFJlY3Q6IHsgJ1RvcCAnOiByZWN0LnRvcCwgTGVmdDogcmVjdC5sZWZ0LCBCdG9tOiByZWN0LmJvdHRvbSwgUmdodDogcmVjdC5yaWdodCB9LFxuXHRcdFx0Z3VpZGVJbmRlY2VzOiBhcnRib2FyZC5ndWlkZUluZGljZXMgfHwgW10sXG5cdFx0XHRhcnRib2FyZFByZXNldE5hbWU6IGFydGJvYXJkLnByZXNldE5hbWUgfHwgJycsXG5cdFx0XHQnQ2xyICc6IHNlcmlhbGl6ZUNvbG9yKGFydGJvYXJkLmNvbG9yKSxcblx0XHRcdGFydGJvYXJkQmFja2dyb3VuZFR5cGU6IGFydGJvYXJkLmJhY2tncm91bmRUeXBlID8/IDEsXG5cdFx0fTtcblxuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ2FydGJvYXJkJywgZGVzYyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnc24yUCcsXG5cdGhhc0tleSgndXNpbmdBbGlnbmVkUmVuZGVyaW5nJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4gdGFyZ2V0LnVzaW5nQWxpZ25lZFJlbmRlcmluZyA9ICEhcmVhZFVpbnQzMihyZWFkZXIpLFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHdyaXRlVWludDMyKHdyaXRlciwgdGFyZ2V0LnVzaW5nQWxpZ25lZFJlbmRlcmluZyA/IDEgOiAwKSxcbik7XG5cbmNvbnN0IHBsYWNlZExheWVyVHlwZXM6IFBsYWNlZExheWVyVHlwZVtdID0gWyd1bmtub3duJywgJ3ZlY3RvcicsICdyYXN0ZXInLCAnaW1hZ2Ugc3RhY2snXTtcblxuZnVuY3Rpb24gcGFyc2VXYXJwKHdhcnA6IFdhcnBEZXNjcmlwdG9yICYgUXVpbHRXYXJwRGVzY3JpcHRvcik6IFdhcnAge1xuXHRjb25zdCByZXN1bHQ6IFdhcnAgPSB7XG5cdFx0c3R5bGU6IHdhcnBTdHlsZS5kZWNvZGUod2FycC53YXJwU3R5bGUpLFxuXHRcdHZhbHVlOiB3YXJwLndhcnBWYWx1ZSB8fCAwLFxuXHRcdHBlcnNwZWN0aXZlOiB3YXJwLndhcnBQZXJzcGVjdGl2ZSB8fCAwLFxuXHRcdHBlcnNwZWN0aXZlT3RoZXI6IHdhcnAud2FycFBlcnNwZWN0aXZlT3RoZXIgfHwgMCxcblx0XHRyb3RhdGU6IE9ybnQuZGVjb2RlKHdhcnAud2FycFJvdGF0ZSksXG5cdFx0Ym91bmRzOiB3YXJwLmJvdW5kcyAmJiB7XG5cdFx0XHR0b3A6IHBhcnNlVW5pdHNPck51bWJlcih3YXJwLmJvdW5kc1snVG9wICddKSxcblx0XHRcdGxlZnQ6IHBhcnNlVW5pdHNPck51bWJlcih3YXJwLmJvdW5kcy5MZWZ0KSxcblx0XHRcdGJvdHRvbTogcGFyc2VVbml0c09yTnVtYmVyKHdhcnAuYm91bmRzLkJ0b20pLFxuXHRcdFx0cmlnaHQ6IHBhcnNlVW5pdHNPck51bWJlcih3YXJwLmJvdW5kcy5SZ2h0KSxcblx0XHR9LFxuXHRcdHVPcmRlcjogd2FycC51T3JkZXIsXG5cdFx0dk9yZGVyOiB3YXJwLnZPcmRlcixcblx0fTtcblxuXHRpZiAod2FycC5kZWZvcm1OdW1Sb3dzICE9IG51bGwgfHwgd2FycC5kZWZvcm1OdW1Db2xzICE9IG51bGwpIHtcblx0XHRyZXN1bHQuZGVmb3JtTnVtUm93cyA9IHdhcnAuZGVmb3JtTnVtUm93cztcblx0XHRyZXN1bHQuZGVmb3JtTnVtQ29scyA9IHdhcnAuZGVmb3JtTnVtQ29scztcblx0fVxuXG5cdGNvbnN0IGVudmVsb3BlV2FycCA9IHdhcnAuY3VzdG9tRW52ZWxvcGVXYXJwO1xuXHRpZiAoZW52ZWxvcGVXYXJwKSB7XG5cdFx0cmVzdWx0LmN1c3RvbUVudmVsb3BlV2FycCA9IHtcblx0XHRcdG1lc2hQb2ludHM6IFtdLFxuXHRcdH07XG5cblx0XHRjb25zdCB4cyA9IGVudmVsb3BlV2FycC5tZXNoUG9pbnRzLmZpbmQoaSA9PiBpLnR5cGUgPT09ICdIcnpuJyk/LnZhbHVlcyB8fCBbXTtcblx0XHRjb25zdCB5cyA9IGVudmVsb3BlV2FycC5tZXNoUG9pbnRzLmZpbmQoaSA9PiBpLnR5cGUgPT09ICdWcnRjJyk/LnZhbHVlcyB8fCBbXTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHJlc3VsdC5jdXN0b21FbnZlbG9wZVdhcnAhLm1lc2hQb2ludHMucHVzaCh7IHg6IHhzW2ldLCB5OiB5c1tpXSB9KTtcblx0XHR9XG5cblx0XHRpZiAoZW52ZWxvcGVXYXJwLnF1aWx0U2xpY2VYIHx8IGVudmVsb3BlV2FycC5xdWlsdFNsaWNlWSkge1xuXHRcdFx0cmVzdWx0LmN1c3RvbUVudmVsb3BlV2FycC5xdWlsdFNsaWNlWCA9IGVudmVsb3BlV2FycC5xdWlsdFNsaWNlWD8uWzBdPy52YWx1ZXMgfHwgW107XG5cdFx0XHRyZXN1bHQuY3VzdG9tRW52ZWxvcGVXYXJwLnF1aWx0U2xpY2VZID0gZW52ZWxvcGVXYXJwLnF1aWx0U2xpY2VZPy5bMF0/LnZhbHVlcyB8fCBbXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc1F1aWx0V2FycCh3YXJwOiBXYXJwKSB7XG5cdHJldHVybiB3YXJwLmRlZm9ybU51bUNvbHMgIT0gbnVsbCB8fCB3YXJwLmRlZm9ybU51bVJvd3MgIT0gbnVsbCB8fFxuXHRcdHdhcnAuY3VzdG9tRW52ZWxvcGVXYXJwPy5xdWlsdFNsaWNlWCB8fCB3YXJwLmN1c3RvbUVudmVsb3BlV2FycD8ucXVpbHRTbGljZVk7XG59XG5cbmZ1bmN0aW9uIGVuY29kZVdhcnAod2FycDogV2FycCk6IFdhcnBEZXNjcmlwdG9yIHtcblx0Y29uc3QgYm91bmRzID0gd2FycC5ib3VuZHM7XG5cdGNvbnN0IGRlc2M6IFdhcnBEZXNjcmlwdG9yID0ge1xuXHRcdHdhcnBTdHlsZTogd2FycFN0eWxlLmVuY29kZSh3YXJwLnN0eWxlKSxcblx0XHR3YXJwVmFsdWU6IHdhcnAudmFsdWUgfHwgMCxcblx0XHR3YXJwUGVyc3BlY3RpdmU6IHdhcnAucGVyc3BlY3RpdmUgfHwgMCxcblx0XHR3YXJwUGVyc3BlY3RpdmVPdGhlcjogd2FycC5wZXJzcGVjdGl2ZU90aGVyIHx8IDAsXG5cdFx0d2FycFJvdGF0ZTogT3JudC5lbmNvZGUod2FycC5yb3RhdGUpLFxuXHRcdGJvdW5kczoge1xuXHRcdFx0J1RvcCAnOiB1bml0c1ZhbHVlKGJvdW5kcyAmJiBib3VuZHMudG9wIHx8IHsgdW5pdHM6ICdQaXhlbHMnLCB2YWx1ZTogMCB9LCAnYm91bmRzLnRvcCcpLFxuXHRcdFx0TGVmdDogdW5pdHNWYWx1ZShib3VuZHMgJiYgYm91bmRzLmxlZnQgfHwgeyB1bml0czogJ1BpeGVscycsIHZhbHVlOiAwIH0sICdib3VuZHMubGVmdCcpLFxuXHRcdFx0QnRvbTogdW5pdHNWYWx1ZShib3VuZHMgJiYgYm91bmRzLmJvdHRvbSB8fCB7IHVuaXRzOiAnUGl4ZWxzJywgdmFsdWU6IDAgfSwgJ2JvdW5kcy5ib3R0b20nKSxcblx0XHRcdFJnaHQ6IHVuaXRzVmFsdWUoYm91bmRzICYmIGJvdW5kcy5yaWdodCB8fCB7IHVuaXRzOiAnUGl4ZWxzJywgdmFsdWU6IDAgfSwgJ2JvdW5kcy5yaWdodCcpLFxuXHRcdH0sXG5cdFx0dU9yZGVyOiB3YXJwLnVPcmRlciB8fCAwLFxuXHRcdHZPcmRlcjogd2FycC52T3JkZXIgfHwgMCxcblx0fTtcblxuXHRjb25zdCBpc1F1aWx0ID0gaXNRdWlsdFdhcnAod2FycCk7XG5cblx0aWYgKGlzUXVpbHQpIHtcblx0XHRjb25zdCBkZXNjMiA9IGRlc2MgYXMgUXVpbHRXYXJwRGVzY3JpcHRvcjtcblx0XHRkZXNjMi5kZWZvcm1OdW1Sb3dzID0gd2FycC5kZWZvcm1OdW1Sb3dzIHx8IDA7XG5cdFx0ZGVzYzIuZGVmb3JtTnVtQ29scyA9IHdhcnAuZGVmb3JtTnVtQ29scyB8fCAwO1xuXHR9XG5cblx0Y29uc3QgY3VzdG9tRW52ZWxvcGVXYXJwID0gd2FycC5jdXN0b21FbnZlbG9wZVdhcnA7XG5cdGlmIChjdXN0b21FbnZlbG9wZVdhcnApIHtcblx0XHRjb25zdCBtZXNoUG9pbnRzID0gY3VzdG9tRW52ZWxvcGVXYXJwLm1lc2hQb2ludHMgfHwgW107XG5cblx0XHRpZiAoaXNRdWlsdCkge1xuXHRcdFx0Y29uc3QgZGVzYzIgPSBkZXNjIGFzIFF1aWx0V2FycERlc2NyaXB0b3I7XG5cdFx0XHRkZXNjMi5jdXN0b21FbnZlbG9wZVdhcnAgPSB7XG5cdFx0XHRcdHF1aWx0U2xpY2VYOiBbe1xuXHRcdFx0XHRcdHR5cGU6ICdxdWlsdFNsaWNlWCcsXG5cdFx0XHRcdFx0dmFsdWVzOiBjdXN0b21FbnZlbG9wZVdhcnAucXVpbHRTbGljZVggfHwgW10sXG5cdFx0XHRcdH1dLFxuXHRcdFx0XHRxdWlsdFNsaWNlWTogW3tcblx0XHRcdFx0XHR0eXBlOiAncXVpbHRTbGljZVknLFxuXHRcdFx0XHRcdHZhbHVlczogY3VzdG9tRW52ZWxvcGVXYXJwLnF1aWx0U2xpY2VZIHx8IFtdLFxuXHRcdFx0XHR9XSxcblx0XHRcdFx0bWVzaFBvaW50czogW1xuXHRcdFx0XHRcdHsgdHlwZTogJ0hyem4nLCB2YWx1ZXM6IG1lc2hQb2ludHMubWFwKHAgPT4gcC54KSB9LFxuXHRcdFx0XHRcdHsgdHlwZTogJ1ZydGMnLCB2YWx1ZXM6IG1lc2hQb2ludHMubWFwKHAgPT4gcC55KSB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzYy5jdXN0b21FbnZlbG9wZVdhcnAgPSB7XG5cdFx0XHRcdG1lc2hQb2ludHM6IFtcblx0XHRcdFx0XHR7IHR5cGU6ICdIcnpuJywgdmFsdWVzOiBtZXNoUG9pbnRzLm1hcChwID0+IHAueCkgfSxcblx0XHRcdFx0XHR7IHR5cGU6ICdWcnRjJywgdmFsdWVzOiBtZXNoUG9pbnRzLm1hcChwID0+IHAueSkgfSxcblx0XHRcdFx0XSxcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRlc2M7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdQbExkJyxcblx0aGFzS2V5KCdwbGFjZWRMYXllcicpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRpZiAocmVhZFNpZ25hdHVyZShyZWFkZXIpICE9PSAncGxjTCcpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBQbExkIHNpZ25hdHVyZWApO1xuXHRcdGlmIChyZWFkSW50MzIocmVhZGVyKSAhPT0gMykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFBsTGQgdmVyc2lvbmApO1xuXHRcdGNvbnN0IGlkID0gcmVhZFBhc2NhbFN0cmluZyhyZWFkZXIsIDEpO1xuXHRcdGNvbnN0IHBhZ2VOdW1iZXIgPSByZWFkSW50MzIocmVhZGVyKTtcblx0XHRjb25zdCB0b3RhbFBhZ2VzID0gcmVhZEludDMyKHJlYWRlcik7IC8vIFRPRE86IGNoZWNrIGhvdyB0aGlzIHdvcmtzID9cblx0XHRyZWFkSW50MzIocmVhZGVyKTsgLy8gYW5pdEFsaWFzUG9saWN5IDE2XG5cdFx0Y29uc3QgcGxhY2VkTGF5ZXJUeXBlID0gcmVhZEludDMyKHJlYWRlcik7IC8vIDAgPSB1bmtub3duLCAxID0gdmVjdG9yLCAyID0gcmFzdGVyLCAzID0gaW1hZ2Ugc3RhY2tcblx0XHRpZiAoIXBsYWNlZExheWVyVHlwZXNbcGxhY2VkTGF5ZXJUeXBlXSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBsTGQgdHlwZScpO1xuXHRcdGNvbnN0IHRyYW5zZm9ybTogbnVtYmVyW10gPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDg7IGkrKykgdHJhbnNmb3JtLnB1c2gocmVhZEZsb2F0NjQocmVhZGVyKSk7IC8vIHgsIHkgb2YgNCBjb3JuZXJzIG9mIHRoZSB0cmFuc2Zvcm1cblx0XHRjb25zdCB3YXJwVmVyc2lvbiA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdGlmICh3YXJwVmVyc2lvbiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFdhcnAgdmVyc2lvbiAke3dhcnBWZXJzaW9ufWApO1xuXHRcdGNvbnN0IHdhcnA6IFdhcnBEZXNjcmlwdG9yICYgUXVpbHRXYXJwRGVzY3JpcHRvciA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpO1xuXG5cdFx0dGFyZ2V0LnBsYWNlZExheWVyID0gdGFyZ2V0LnBsYWNlZExheWVyIHx8IHsgLy8gc2tpcCBpZiBTb0xkIGFscmVhZHkgc2V0IGl0XG5cdFx0XHRpZCxcblx0XHRcdHR5cGU6IHBsYWNlZExheWVyVHlwZXNbcGxhY2VkTGF5ZXJUeXBlXSxcblx0XHRcdHBhZ2VOdW1iZXIsXG5cdFx0XHR0b3RhbFBhZ2VzLFxuXHRcdFx0dHJhbnNmb3JtLFxuXHRcdFx0d2FycDogcGFyc2VXYXJwKHdhcnApLFxuXHRcdH07XG5cblx0XHQvLyBjb25zb2xlLmxvZygnUGxMZCB3YXJwJywgcmVxdWlyZSgndXRpbCcpLmluc3BlY3Qod2FycCwgZmFsc2UsIDk5LCB0cnVlKSk7XG5cdFx0Ly8gY29uc29sZS5sb2coJ1BsTGQnLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdCh0YXJnZXQucGxhY2VkTGF5ZXIsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgcGxhY2VkID0gdGFyZ2V0LnBsYWNlZExheWVyITtcblx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsICdwbGNMJyk7XG5cdFx0d3JpdGVJbnQzMih3cml0ZXIsIDMpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVQYXNjYWxTdHJpbmcod3JpdGVyLCBwbGFjZWQuaWQsIDEpO1xuXHRcdHdyaXRlSW50MzIod3JpdGVyLCAxKTsgLy8gcGFnZU51bWJlclxuXHRcdHdyaXRlSW50MzIod3JpdGVyLCAxKTsgLy8gdG90YWxQYWdlc1xuXHRcdHdyaXRlSW50MzIod3JpdGVyLCAxNik7IC8vIGFuaXRBbGlhc1BvbGljeVxuXHRcdGlmIChwbGFjZWRMYXllclR5cGVzLmluZGV4T2YocGxhY2VkLnR5cGUpID09PSAtMSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBsYWNlZExheWVyIHR5cGUnKTtcblx0XHR3cml0ZUludDMyKHdyaXRlciwgcGxhY2VkTGF5ZXJUeXBlcy5pbmRleE9mKHBsYWNlZC50eXBlKSk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCA4OyBpKyspIHdyaXRlRmxvYXQ2NCh3cml0ZXIsIHBsYWNlZC50cmFuc2Zvcm1baV0pO1xuXHRcdHdyaXRlSW50MzIod3JpdGVyLCAwKTsgLy8gd2FycCB2ZXJzaW9uXG5cdFx0Y29uc3QgaXNRdWlsdCA9IHBsYWNlZC53YXJwICYmIGlzUXVpbHRXYXJwKHBsYWNlZC53YXJwKTtcblx0XHRjb25zdCB0eXBlID0gaXNRdWlsdCA/ICdxdWlsdFdhcnAnIDogJ3dhcnAnO1xuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgdHlwZSwgZW5jb2RlV2FycChwbGFjZWQud2FycCB8fCB7fSksIHR5cGUpO1xuXHR9LFxuKTtcblxuaW50ZXJmYWNlIFNvTGREZXNjcmlwdG9yIHtcblx0SWRudDogc3RyaW5nO1xuXHRwbGFjZWQ6IHN0cmluZztcblx0UGdObTogbnVtYmVyO1xuXHR0b3RhbFBhZ2VzOiBudW1iZXI7XG5cdENyb3A/OiBudW1iZXI7XG5cdGZyYW1lU3RlcDogRnJhY3Rpb25EZXNjcmlwdG9yO1xuXHRkdXJhdGlvbjogRnJhY3Rpb25EZXNjcmlwdG9yO1xuXHRmcmFtZUNvdW50OiBudW1iZXI7XG5cdEFubnQ6IG51bWJlcjtcblx0VHlwZTogbnVtYmVyO1xuXHRUcm5mOiBudW1iZXJbXTtcblx0bm9uQWZmaW5lVHJhbnNmb3JtOiBudW1iZXJbXTtcblx0cXVpbHRXYXJwPzogUXVpbHRXYXJwRGVzY3JpcHRvcjtcblx0d2FycDogV2FycERlc2NyaXB0b3I7XG5cdCdTeiAgJzogeyBXZHRoOiBudW1iZXI7IEhnaHQ6IG51bWJlcjsgfTtcblx0UnNsdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XG5cdGNvbXA/OiBudW1iZXI7XG5cdGNvbXBJbmZvPzogeyBjb21wSUQ6IG51bWJlcjsgb3JpZ2luYWxDb21wSUQ6IG51bWJlcjsgfTtcbn1cblxuYWRkSGFuZGxlcihcblx0J1NvTGQnLFxuXHRoYXNLZXkoJ3BsYWNlZExheWVyJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmIChyZWFkU2lnbmF0dXJlKHJlYWRlcikgIT09ICdzb0xEJykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFNvTGQgdHlwZWApO1xuXHRcdGlmIChyZWFkSW50MzIocmVhZGVyKSAhPT0gNCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFNvTGQgdmVyc2lvbmApO1xuXHRcdGNvbnN0IGRlc2M6IFNvTGREZXNjcmlwdG9yID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcik7XG5cdFx0Ly8gY29uc29sZS5sb2coJ1NvTGQnLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcblx0XHQvLyBjb25zb2xlLmxvZygnU29MZC53YXJwJywgcmVxdWlyZSgndXRpbCcpLmluc3BlY3QoZGVzYy53YXJwLCBmYWxzZSwgOTksIHRydWUpKTtcblx0XHQvLyBjb25zb2xlLmxvZygnU29MZC5xdWlsdFdhcnAnLCByZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLnF1aWx0V2FycCwgZmFsc2UsIDk5LCB0cnVlKSk7XG5cblx0XHR0YXJnZXQucGxhY2VkTGF5ZXIgPSB7XG5cdFx0XHRpZDogZGVzYy5JZG50LFxuXHRcdFx0cGxhY2VkOiBkZXNjLnBsYWNlZCxcblx0XHRcdHR5cGU6IHBsYWNlZExheWVyVHlwZXNbZGVzYy5UeXBlXSxcblx0XHRcdHBhZ2VOdW1iZXI6IGRlc2MuUGdObSxcblx0XHRcdHRvdGFsUGFnZXM6IGRlc2MudG90YWxQYWdlcyxcblx0XHRcdGZyYW1lU3RlcDogZGVzYy5mcmFtZVN0ZXAsXG5cdFx0XHRkdXJhdGlvbjogZGVzYy5kdXJhdGlvbixcblx0XHRcdGZyYW1lQ291bnQ6IGRlc2MuZnJhbWVDb3VudCxcblx0XHRcdHRyYW5zZm9ybTogZGVzYy5Ucm5mLFxuXHRcdFx0d2lkdGg6IGRlc2NbJ1N6ICAnXS5XZHRoLFxuXHRcdFx0aGVpZ2h0OiBkZXNjWydTeiAgJ10uSGdodCxcblx0XHRcdHJlc29sdXRpb246IHBhcnNlVW5pdHMoZGVzYy5Sc2x0KSxcblx0XHRcdHdhcnA6IHBhcnNlV2FycCgoZGVzYy5xdWlsdFdhcnAgfHwgZGVzYy53YXJwKSBhcyBhbnkpLFxuXHRcdH07XG5cblx0XHRpZiAoZGVzYy5ub25BZmZpbmVUcmFuc2Zvcm0gJiYgZGVzYy5ub25BZmZpbmVUcmFuc2Zvcm0uc29tZSgoeCwgaSkgPT4geCAhPT0gZGVzYy5Ucm5mW2ldKSkge1xuXHRcdFx0dGFyZ2V0LnBsYWNlZExheWVyLm5vbkFmZmluZVRyYW5zZm9ybSA9IGRlc2Mubm9uQWZmaW5lVHJhbnNmb3JtO1xuXHRcdH1cblxuXHRcdGlmIChkZXNjLkNyb3ApIHRhcmdldC5wbGFjZWRMYXllci5jcm9wID0gZGVzYy5Dcm9wO1xuXHRcdGlmIChkZXNjLmNvbXApIHRhcmdldC5wbGFjZWRMYXllci5jb21wID0gZGVzYy5jb21wO1xuXHRcdGlmIChkZXNjLmNvbXBJbmZvKSB0YXJnZXQucGxhY2VkTGF5ZXIuY29tcEluZm8gPSBkZXNjLmNvbXBJbmZvO1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTsgLy8gSEFDS1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsICdzb0xEJyk7XG5cdFx0d3JpdGVJbnQzMih3cml0ZXIsIDQpOyAvLyB2ZXJzaW9uXG5cblx0XHRjb25zdCBwbGFjZWQgPSB0YXJnZXQucGxhY2VkTGF5ZXIhO1xuXHRcdGNvbnN0IGRlc2M6IFNvTGREZXNjcmlwdG9yID0ge1xuXHRcdFx0SWRudDogcGxhY2VkLmlkLFxuXHRcdFx0cGxhY2VkOiBwbGFjZWQucGxhY2VkID8/IHBsYWNlZC5pZCxcblx0XHRcdFBnTm06IHBsYWNlZC5wYWdlTnVtYmVyIHx8IDEsXG5cdFx0XHR0b3RhbFBhZ2VzOiBwbGFjZWQudG90YWxQYWdlcyB8fCAxLFxuXHRcdFx0Li4uKHBsYWNlZC5jcm9wID8geyBDcm9wOiBwbGFjZWQuY3JvcCB9IDoge30pLFxuXHRcdFx0ZnJhbWVTdGVwOiBwbGFjZWQuZnJhbWVTdGVwIHx8IHsgbnVtZXJhdG9yOiAwLCBkZW5vbWluYXRvcjogNjAwIH0sXG5cdFx0XHRkdXJhdGlvbjogcGxhY2VkLmR1cmF0aW9uIHx8IHsgbnVtZXJhdG9yOiAwLCBkZW5vbWluYXRvcjogNjAwIH0sXG5cdFx0XHRmcmFtZUNvdW50OiBwbGFjZWQuZnJhbWVDb3VudCB8fCAwLFxuXHRcdFx0QW5udDogMTYsXG5cdFx0XHRUeXBlOiBwbGFjZWRMYXllclR5cGVzLmluZGV4T2YocGxhY2VkLnR5cGUpLFxuXHRcdFx0VHJuZjogcGxhY2VkLnRyYW5zZm9ybSxcblx0XHRcdG5vbkFmZmluZVRyYW5zZm9ybTogcGxhY2VkLm5vbkFmZmluZVRyYW5zZm9ybSA/PyBwbGFjZWQudHJhbnNmb3JtLFxuXHRcdFx0cXVpbHRXYXJwOiB7fSBhcyBhbnksXG5cdFx0XHR3YXJwOiBlbmNvZGVXYXJwKHBsYWNlZC53YXJwIHx8IHt9KSxcblx0XHRcdCdTeiAgJzoge1xuXHRcdFx0XHRXZHRoOiBwbGFjZWQud2lkdGggfHwgMCwgLy8gVE9ETzogZmluZCBzaXplID9cblx0XHRcdFx0SGdodDogcGxhY2VkLmhlaWdodCB8fCAwLCAvLyBUT0RPOiBmaW5kIHNpemUgP1xuXHRcdFx0fSxcblx0XHRcdFJzbHQ6IHBsYWNlZC5yZXNvbHV0aW9uID8gdW5pdHNWYWx1ZShwbGFjZWQucmVzb2x1dGlvbiwgJ3Jlc29sdXRpb24nKSA6IHsgdW5pdHM6ICdEZW5zaXR5JywgdmFsdWU6IDcyIH0sXG5cdFx0fTtcblxuXHRcdGlmIChwbGFjZWQud2FycCAmJiBpc1F1aWx0V2FycChwbGFjZWQud2FycCkpIHtcblx0XHRcdGNvbnN0IHF1aWx0V2FycCA9IGVuY29kZVdhcnAocGxhY2VkLndhcnApIGFzIFF1aWx0V2FycERlc2NyaXB0b3I7XG5cdFx0XHRkZXNjLnF1aWx0V2FycCA9IHF1aWx0V2FycDtcblx0XHRcdGRlc2Mud2FycCA9IHtcblx0XHRcdFx0d2FycFN0eWxlOiAnd2FycFN0eWxlLndhcnBOb25lJyxcblx0XHRcdFx0d2FycFZhbHVlOiBxdWlsdFdhcnAud2FycFZhbHVlLFxuXHRcdFx0XHR3YXJwUGVyc3BlY3RpdmU6IHF1aWx0V2FycC53YXJwUGVyc3BlY3RpdmUsXG5cdFx0XHRcdHdhcnBQZXJzcGVjdGl2ZU90aGVyOiBxdWlsdFdhcnAud2FycFBlcnNwZWN0aXZlT3RoZXIsXG5cdFx0XHRcdHdhcnBSb3RhdGU6IHF1aWx0V2FycC53YXJwUm90YXRlLFxuXHRcdFx0XHRib3VuZHM6IHF1aWx0V2FycC5ib3VuZHMsXG5cdFx0XHRcdHVPcmRlcjogcXVpbHRXYXJwLnVPcmRlcixcblx0XHRcdFx0dk9yZGVyOiBxdWlsdFdhcnAudk9yZGVyLFxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVsZXRlIGRlc2MucXVpbHRXYXJwO1xuXHRcdH1cblxuXHRcdGlmIChwbGFjZWQuY29tcCkgZGVzYy5jb21wID0gcGxhY2VkLmNvbXA7XG5cdFx0aWYgKHBsYWNlZC5jb21wSW5mbykgZGVzYy5jb21wSW5mbyA9IHBsYWNlZC5jb21wSW5mbztcblxuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCBkZXNjLCBkZXNjLnF1aWx0V2FycCA/ICdxdWlsdFdhcnAnIDogJ3dhcnAnKTtcblx0fSxcbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdmeHJwJyxcblx0aGFzS2V5KCdyZWZlcmVuY2VQb2ludCcpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHtcblx0XHR0YXJnZXQucmVmZXJlbmNlUG9pbnQgPSB7XG5cdFx0XHR4OiByZWFkRmxvYXQ2NChyZWFkZXIpLFxuXHRcdFx0eTogcmVhZEZsb2F0NjQocmVhZGVyKSxcblx0XHR9O1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZUZsb2F0NjQod3JpdGVyLCB0YXJnZXQucmVmZXJlbmNlUG9pbnQhLngpO1xuXHRcdHdyaXRlRmxvYXQ2NCh3cml0ZXIsIHRhcmdldC5yZWZlcmVuY2VQb2ludCEueSk7XG5cdH0sXG4pO1xuXG5pZiAoTU9DS19IQU5ETEVSUykge1xuXHRhZGRIYW5kbGVyKFxuXHRcdCdQYXR0Jyxcblx0XHR0YXJnZXQgPT4gKHRhcmdldCBhcyBhbnkpLl9QYXR0ICE9PSB1bmRlZmluZWQsXG5cdFx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0XHQvLyBjb25zb2xlLmxvZygnYWRkaXRpb25hbCBpbmZvOiBQYXR0Jyk7XG5cdFx0XHQodGFyZ2V0IGFzIGFueSkuX1BhdHQgPSByZWFkQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdH0sXG5cdFx0KHdyaXRlciwgdGFyZ2V0KSA9PiBmYWxzZSAmJiB3cml0ZUJ5dGVzKHdyaXRlciwgKHRhcmdldCBhcyBhbnkpLl9QYXR0KSxcblx0KTtcbn0gZWxzZSB7XG5cdGFkZEhhbmRsZXIoXG5cdFx0J1BhdHQnLCAvLyBUT0RPOiBoYW5kbGUgYWxzbyBQYXQyICYgUGF0M1xuXHRcdHRhcmdldCA9PiAhdGFyZ2V0LFxuXHRcdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdFx0aWYgKCFsZWZ0KCkpIHJldHVybjtcblxuXHRcdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTsgcmV0dXJuOyAvLyBub3Qgc3VwcG9ydGVkIHlldFxuXHRcdFx0dGFyZ2V0OyByZWFkUGF0dGVybjtcblxuXHRcdFx0Ly8gaWYgKCF0YXJnZXQucGF0dGVybnMpIHRhcmdldC5wYXR0ZXJucyA9IFtdO1xuXHRcdFx0Ly8gdGFyZ2V0LnBhdHRlcm5zLnB1c2gocmVhZFBhdHRlcm4ocmVhZGVyKSk7XG5cdFx0XHQvLyBza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdH0sXG5cdFx0KF93cml0ZXIsIF90YXJnZXQpID0+IHtcblx0XHR9LFxuXHQpO1xufVxuXG5mdW5jdGlvbiByZWFkUmVjdChyZWFkZXI6IFBzZFJlYWRlcikge1xuXHRjb25zdCB0b3AgPSByZWFkSW50MzIocmVhZGVyKTtcblx0Y29uc3QgbGVmdCA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRjb25zdCBib3R0b20gPSByZWFkSW50MzIocmVhZGVyKTtcblx0Y29uc3QgcmlnaHQgPSByZWFkSW50MzIocmVhZGVyKTtcblx0cmV0dXJuIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH07XG59XG5cbmZ1bmN0aW9uIHdyaXRlUmVjdCh3cml0ZXI6IFBzZFdyaXRlciwgcmVjdDogeyBsZWZ0OiBudW1iZXI7IHRvcDogbnVtYmVyOyByaWdodDogbnVtYmVyOyBib3R0b206IG51bWJlciB9KSB7XG5cdHdyaXRlSW50MzIod3JpdGVyLCByZWN0LnRvcCk7XG5cdHdyaXRlSW50MzIod3JpdGVyLCByZWN0LmxlZnQpO1xuXHR3cml0ZUludDMyKHdyaXRlciwgcmVjdC5ib3R0b20pO1xuXHR3cml0ZUludDMyKHdyaXRlciwgcmVjdC5yaWdodCk7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdBbm5vJyxcblx0dGFyZ2V0ID0+ICh0YXJnZXQgYXMgUHNkKS5hbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRjb25zdCBtYWpvciA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBtaW5vciA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRpZiAobWFqb3IgIT09IDIgfHwgbWlub3IgIT09IDEpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBBbm5vIHZlcnNpb24nKTtcblx0XHRjb25zdCBjb3VudCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRjb25zdCBhbm5vdGF0aW9uczogQW5ub3RhdGlvbltdID0gW107XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcblx0XHRcdC8qY29uc3QgbGVuZ3RoID0qLyByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0XHRjb25zdCB0eXBlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xuXHRcdFx0Y29uc3Qgb3BlbiA9ICEhcmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0XHQvKmNvbnN0IGZsYWdzID0qLyByZWFkVWludDgocmVhZGVyKTsgLy8gYWx3YXlzIDI4XG5cdFx0XHQvKmNvbnN0IG9wdGlvbmFsQmxvY2tzID0qLyByZWFkVWludDE2KHJlYWRlcik7XG5cdFx0XHRjb25zdCBpY29uTG9jYXRpb24gPSByZWFkUmVjdChyZWFkZXIpO1xuXHRcdFx0Y29uc3QgcG9wdXBMb2NhdGlvbiA9IHJlYWRSZWN0KHJlYWRlcik7XG5cdFx0XHRjb25zdCBjb2xvciA9IHJlYWRDb2xvcihyZWFkZXIpO1xuXHRcdFx0Y29uc3QgYXV0aG9yID0gcmVhZFBhc2NhbFN0cmluZyhyZWFkZXIsIDIpO1xuXHRcdFx0Y29uc3QgbmFtZSA9IHJlYWRQYXNjYWxTdHJpbmcocmVhZGVyLCAyKTtcblx0XHRcdGNvbnN0IGRhdGUgPSByZWFkUGFzY2FsU3RyaW5nKHJlYWRlciwgMik7XG5cdFx0XHQvKmNvbnN0IGNvbnRlbnRMZW5ndGggPSovIHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRcdC8qY29uc3QgZGF0YVR5cGUgPSovIHJlYWRTaWduYXR1cmUocmVhZGVyKTtcblx0XHRcdGNvbnN0IGRhdGFMZW5ndGggPSByZWFkVWludDMyKHJlYWRlcik7XG5cdFx0XHRsZXQgZGF0YTogc3RyaW5nIHwgVWludDhBcnJheTtcblxuXHRcdFx0aWYgKHR5cGUgPT09ICd0eHRBJykge1xuXHRcdFx0XHRpZiAoZGF0YUxlbmd0aCA+PSAyICYmIHJlYWRVaW50MTYocmVhZGVyKSA9PT0gMHhmZWZmKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IHJlYWRVbmljb2RlU3RyaW5nV2l0aExlbmd0aChyZWFkZXIsIChkYXRhTGVuZ3RoIC0gMikgLyAyKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWFkZXIub2Zmc2V0IC09IDI7XG5cdFx0XHRcdFx0ZGF0YSA9IHJlYWRBc2NpaVN0cmluZyhyZWFkZXIsIGRhdGFMZW5ndGgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGF0YSA9IGRhdGEucmVwbGFjZSgvXFxyL2csICdcXG4nKTtcblx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NuZEEnKSB7XG5cdFx0XHRcdGRhdGEgPSByZWFkQnl0ZXMocmVhZGVyLCBkYXRhTGVuZ3RoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVW5rbm93biBhbm5vdGF0aW9uIHR5cGUnKTtcblx0XHRcdH1cblxuXHRcdFx0YW5ub3RhdGlvbnMucHVzaCh7XG5cdFx0XHRcdHR5cGU6IHR5cGUgPT09ICd0eHRBJyA/ICd0ZXh0JyA6ICdzb3VuZCcsIG9wZW4sIGljb25Mb2NhdGlvbiwgcG9wdXBMb2NhdGlvbiwgY29sb3IsIGF1dGhvciwgbmFtZSwgZGF0ZSwgZGF0YSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdCh0YXJnZXQgYXMgUHNkKS5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zO1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGFubm90YXRpb25zID0gKHRhcmdldCBhcyBQc2QpLmFubm90YXRpb25zITtcblxuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgMik7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCAxKTtcblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIGFubm90YXRpb25zLmxlbmd0aCk7XG5cblx0XHRmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcblx0XHRcdGNvbnN0IHNvdW5kID0gYW5ub3RhdGlvbi50eXBlID09PSAnc291bmQnO1xuXG5cdFx0XHRpZiAoc291bmQgJiYgIShhbm5vdGF0aW9uLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgdGhyb3cgbmV3IEVycm9yKCdTb3VuZCBhbm5vdGF0aW9uIGRhdGEgc2hvdWxkIGJlIFVpbnQ4QXJyYXknKTtcblx0XHRcdGlmICghc291bmQgJiYgdHlwZW9mIGFubm90YXRpb24uZGF0YSAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcignVGV4dCBhbm5vdGF0aW9uIGRhdGEgc2hvdWxkIGJlIHN0cmluZycpO1xuXG5cdFx0XHRjb25zdCBsZW5ndGhPZmZzZXQgPSB3cml0ZXIub2Zmc2V0O1xuXHRcdFx0d3JpdGVVaW50MzIod3JpdGVyLCAwKTsgLy8gbGVuZ3RoXG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHNvdW5kID8gJ3NuZEEnIDogJ3R4dEEnKTtcblx0XHRcdHdyaXRlVWludDgod3JpdGVyLCBhbm5vdGF0aW9uLm9wZW4gPyAxIDogMCk7XG5cdFx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgMjgpO1xuXHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCAxKTtcblx0XHRcdHdyaXRlUmVjdCh3cml0ZXIsIGFubm90YXRpb24uaWNvbkxvY2F0aW9uKTtcblx0XHRcdHdyaXRlUmVjdCh3cml0ZXIsIGFubm90YXRpb24ucG9wdXBMb2NhdGlvbik7XG5cdFx0XHR3cml0ZUNvbG9yKHdyaXRlciwgYW5ub3RhdGlvbi5jb2xvcik7XG5cdFx0XHR3cml0ZVBhc2NhbFN0cmluZyh3cml0ZXIsIGFubm90YXRpb24uYXV0aG9yIHx8ICcnLCAyKTtcblx0XHRcdHdyaXRlUGFzY2FsU3RyaW5nKHdyaXRlciwgYW5ub3RhdGlvbi5uYW1lIHx8ICcnLCAyKTtcblx0XHRcdHdyaXRlUGFzY2FsU3RyaW5nKHdyaXRlciwgYW5ub3RhdGlvbi5kYXRlIHx8ICcnLCAyKTtcblx0XHRcdGNvbnN0IGNvbnRlbnRPZmZzZXQgPSB3cml0ZXIub2Zmc2V0O1xuXHRcdFx0d3JpdGVVaW50MzIod3JpdGVyLCAwKTsgLy8gY29udGVudCBsZW5ndGhcblx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgc291bmQgPyAnc25kTScgOiAndHh0QycpO1xuXHRcdFx0d3JpdGVVaW50MzIod3JpdGVyLCAwKTsgLy8gZGF0YSBsZW5ndGhcblx0XHRcdGNvbnN0IGRhdGFPZmZzZXQgPSB3cml0ZXIub2Zmc2V0O1xuXG5cdFx0XHRpZiAoc291bmQpIHtcblx0XHRcdFx0d3JpdGVCeXRlcyh3cml0ZXIsIGFubm90YXRpb24uZGF0YSBhcyBVaW50OEFycmF5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdyaXRlVWludDE2KHdyaXRlciwgMHhmZWZmKTsgLy8gdW5pY29kZSBzdHJpbmcgaW5kaWNhdG9yXG5cdFx0XHRcdGNvbnN0IHRleHQgPSAoYW5ub3RhdGlvbi5kYXRhIGFzIHN0cmluZykucmVwbGFjZSgvXFxuL2csICdcXHInKTtcblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB3cml0ZVVpbnQxNih3cml0ZXIsIHRleHQuY2hhckNvZGVBdChpKSk7XG5cdFx0XHR9XG5cblx0XHRcdHdyaXRlci52aWV3LnNldFVpbnQzMihsZW5ndGhPZmZzZXQsIHdyaXRlci5vZmZzZXQgLSBsZW5ndGhPZmZzZXQsIGZhbHNlKTtcblx0XHRcdHdyaXRlci52aWV3LnNldFVpbnQzMihjb250ZW50T2Zmc2V0LCB3cml0ZXIub2Zmc2V0IC0gY29udGVudE9mZnNldCwgZmFsc2UpO1xuXHRcdFx0d3JpdGVyLnZpZXcuc2V0VWludDMyKGRhdGFPZmZzZXQgLSA0LCB3cml0ZXIub2Zmc2V0IC0gZGF0YU9mZnNldCwgZmFsc2UpO1xuXHRcdH1cblx0fVxuKTtcblxuaW50ZXJmYWNlIEZpbGVPcGVuRGVzY3JpcHRvciB7XG5cdGNvbXBJbmZvOiB7IGNvbXBJRDogbnVtYmVyOyBvcmlnaW5hbENvbXBJRDogbnVtYmVyOyB9O1xufVxuXG5hZGRIYW5kbGVyKFxuXHQnbG5rMicsXG5cdCh0YXJnZXQ6IGFueSkgPT4gISEodGFyZ2V0IGFzIFBzZCkubGlua2VkRmlsZXMgJiYgKHRhcmdldCBhcyBQc2QpLmxpbmtlZEZpbGVzIS5sZW5ndGggPiAwLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQsIF8sIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBwc2QgPSB0YXJnZXQgYXMgUHNkO1xuXHRcdHBzZC5saW5rZWRGaWxlcyA9IFtdO1xuXG5cdFx0d2hpbGUgKGxlZnQoKSA+IDgpIHtcblx0XHRcdGxldCBzaXplID0gcmVhZExlbmd0aDY0KHJlYWRlcik7IC8vIHNpemVcblx0XHRcdGNvbnN0IHN0YXJ0T2Zmc2V0ID0gcmVhZGVyLm9mZnNldDtcblx0XHRcdGNvbnN0IHR5cGUgPSByZWFkU2lnbmF0dXJlKHJlYWRlcikgYXMgJ2xpRkQnIHwgJ2xpRkUnIHwgJ2xpRkEnO1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdFx0Y29uc3QgaWQgPSByZWFkUGFzY2FsU3RyaW5nKHJlYWRlciwgMSk7XG5cdFx0XHRjb25zdCBuYW1lID0gcmVhZFVuaWNvZGVTdHJpbmcocmVhZGVyKTtcblx0XHRcdGNvbnN0IGZpbGVUeXBlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpLnRyaW0oKTsgLy8gJyAgICAnIGlmIGVtcHR5XG5cdFx0XHRjb25zdCBmaWxlQ3JlYXRvciA9IHJlYWRTaWduYXR1cmUocmVhZGVyKS50cmltKCk7IC8vICcgICAgJyBvciAnXFwwXFwwXFwwXFwwJyBpZiBlbXB0eVxuXHRcdFx0Y29uc3QgZGF0YVNpemUgPSByZWFkTGVuZ3RoNjQocmVhZGVyKTtcblx0XHRcdGNvbnN0IGhhc0ZpbGVPcGVuRGVzY3JpcHRvciA9IHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdFx0Y29uc3QgZmlsZU9wZW5EZXNjcmlwdG9yID0gaGFzRmlsZU9wZW5EZXNjcmlwdG9yID8gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcikgYXMgRmlsZU9wZW5EZXNjcmlwdG9yIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3QgbGlua2VkRmlsZURlc2NyaXB0b3IgPSB0eXBlID09PSAnbGlGRScgPyByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IGZpbGU6IExpbmtlZEZpbGUgPSB7IGlkLCBuYW1lLCBkYXRhOiB1bmRlZmluZWQgfTtcblxuXHRcdFx0aWYgKGZpbGVUeXBlKSBmaWxlLnR5cGUgPSBmaWxlVHlwZTtcblx0XHRcdGlmIChmaWxlQ3JlYXRvcikgZmlsZS5jcmVhdG9yID0gZmlsZUNyZWF0b3I7XG5cdFx0XHRpZiAoZmlsZU9wZW5EZXNjcmlwdG9yKSBmaWxlLmRlc2NyaXB0b3IgPSBmaWxlT3BlbkRlc2NyaXB0b3I7XG5cblx0XHRcdGlmICh0eXBlID09PSAnbGlGRScgJiYgdmVyc2lvbiA+IDMpIHtcblx0XHRcdFx0Y29uc3QgeWVhciA9IHJlYWRJbnQzMihyZWFkZXIpO1xuXHRcdFx0XHRjb25zdCBtb250aCA9IHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdFx0XHRjb25zdCBkYXkgPSByZWFkVWludDgocmVhZGVyKTtcblx0XHRcdFx0Y29uc3QgaG91ciA9IHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdFx0XHRjb25zdCBtaW51dGUgPSByZWFkVWludDgocmVhZGVyKTtcblx0XHRcdFx0Y29uc3Qgc2Vjb25kcyA9IHJlYWRGbG9hdDY0KHJlYWRlcik7XG5cdFx0XHRcdGNvbnN0IHdob2xlU2Vjb25kcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyk7XG5cdFx0XHRcdGNvbnN0IG1zID0gKHNlY29uZHMgLSB3aG9sZVNlY29uZHMpICogMTAwMDtcblx0XHRcdFx0ZmlsZS50aW1lID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCB3aG9sZVNlY29uZHMsIG1zKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZmlsZVNpemUgPSB0eXBlID09PSAnbGlGRScgPyByZWFkTGVuZ3RoNjQocmVhZGVyKSA6IDA7XG5cdFx0XHRpZiAodHlwZSA9PT0gJ2xpRkEnKSBza2lwQnl0ZXMocmVhZGVyLCA4KTtcblx0XHRcdGlmICh0eXBlID09PSAnbGlGRCcpIGZpbGUuZGF0YSA9IHJlYWRCeXRlcyhyZWFkZXIsIGRhdGFTaXplKTtcblx0XHRcdGlmICh2ZXJzaW9uID49IDUpIGZpbGUuY2hpbGREb2N1bWVudElEID0gcmVhZFVuaWNvZGVTdHJpbmcocmVhZGVyKTtcblx0XHRcdGlmICh2ZXJzaW9uID49IDYpIGZpbGUuYXNzZXRNb2RUaW1lID0gcmVhZEZsb2F0NjQocmVhZGVyKTtcblx0XHRcdGlmICh2ZXJzaW9uID49IDcpIGZpbGUuYXNzZXRMb2NrZWRTdGF0ZSA9IHJlYWRVaW50OChyZWFkZXIpO1xuXHRcdFx0aWYgKHR5cGUgPT09ICdsaUZFJykgZmlsZS5kYXRhID0gcmVhZEJ5dGVzKHJlYWRlciwgZmlsZVNpemUpO1xuXG5cdFx0XHRpZiAob3B0aW9ucy5za2lwTGlua2VkRmlsZXNEYXRhKSBmaWxlLmRhdGEgPSB1bmRlZmluZWQ7XG5cblx0XHRcdHBzZC5saW5rZWRGaWxlcy5wdXNoKGZpbGUpO1xuXHRcdFx0bGlua2VkRmlsZURlc2NyaXB0b3I7XG5cblx0XHRcdHdoaWxlIChzaXplICUgNCkgc2l6ZSsrO1xuXHRcdFx0cmVhZGVyLm9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgc2l6ZTtcblx0XHR9XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpOyAvLyA/XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IHBzZCA9IHRhcmdldCBhcyBQc2Q7XG5cblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgcHNkLmxpbmtlZEZpbGVzISkge1xuXHRcdFx0bGV0IHZlcnNpb24gPSAyO1xuXG5cdFx0XHRpZiAoZmlsZS5hc3NldExvY2tlZFN0YXRlICE9IG51bGwpIHZlcnNpb24gPSA3O1xuXHRcdFx0ZWxzZSBpZiAoZmlsZS5hc3NldE1vZFRpbWUgIT0gbnVsbCkgdmVyc2lvbiA9IDY7XG5cdFx0XHRlbHNlIGlmIChmaWxlLmNoaWxkRG9jdW1lbnRJRCAhPSBudWxsKSB2ZXJzaW9uID0gNTtcblx0XHRcdC8vIFRPRE86IGVsc2UgaWYgKGZpbGUudGltZSAhPSBudWxsKSB2ZXJzaW9uID0gMzsgKG9ubHkgZm9yIGxpRkUpXG5cblx0XHRcdHdyaXRlVWludDMyKHdyaXRlciwgMCk7XG5cdFx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIDApOyAvLyBzaXplXG5cdFx0XHRjb25zdCBzaXplT2Zmc2V0ID0gd3JpdGVyLm9mZnNldDtcblx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgZmlsZS5kYXRhID8gJ2xpRkQnIDogJ2xpRkEnKTtcblx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2ZXJzaW9uKTtcblx0XHRcdHdyaXRlUGFzY2FsU3RyaW5nKHdyaXRlciwgZmlsZS5pZCB8fCAnJywgMSk7XG5cdFx0XHR3cml0ZVVuaWNvZGVTdHJpbmdXaXRoUGFkZGluZyh3cml0ZXIsIGZpbGUubmFtZSB8fCAnJyk7XG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIGZpbGUudHlwZSA/IGAke2ZpbGUudHlwZX0gICAgYC5zdWJzdHJpbmcoMCwgNCkgOiAnICAgICcpO1xuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCBmaWxlLmNyZWF0b3IgPyBgJHtmaWxlLmNyZWF0b3J9ICAgIGAuc3Vic3RyaW5nKDAsIDQpIDogJ1xcMFxcMFxcMFxcMCcpO1xuXHRcdFx0d3JpdGVMZW5ndGg2NCh3cml0ZXIsIGZpbGUuZGF0YSA/IGZpbGUuZGF0YS5ieXRlTGVuZ3RoIDogMCk7XG5cblx0XHRcdGlmIChmaWxlLmRlc2NyaXB0b3IgJiYgZmlsZS5kZXNjcmlwdG9yLmNvbXBJbmZvKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2M6IEZpbGVPcGVuRGVzY3JpcHRvciA9IHtcblx0XHRcdFx0XHRjb21wSW5mbzogZmlsZS5kZXNjcmlwdG9yLmNvbXBJbmZvLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHdyaXRlVWludDgod3JpdGVyLCAxKTtcblx0XHRcdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIDApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmlsZS5kYXRhKSB3cml0ZUJ5dGVzKHdyaXRlciwgZmlsZS5kYXRhKTtcblx0XHRcdGVsc2Ugd3JpdGVMZW5ndGg2NCh3cml0ZXIsIDApO1xuXHRcdFx0aWYgKHZlcnNpb24gPj0gNSkgd3JpdGVVbmljb2RlU3RyaW5nV2l0aFBhZGRpbmcod3JpdGVyLCBmaWxlLmNoaWxkRG9jdW1lbnRJRCB8fCAnJyk7XG5cdFx0XHRpZiAodmVyc2lvbiA+PSA2KSB3cml0ZUZsb2F0NjQod3JpdGVyLCBmaWxlLmFzc2V0TW9kVGltZSB8fCAwKTtcblx0XHRcdGlmICh2ZXJzaW9uID49IDcpIHdyaXRlVWludDgod3JpdGVyLCBmaWxlLmFzc2V0TG9ja2VkU3RhdGUgfHwgMCk7XG5cblx0XHRcdGxldCBzaXplID0gd3JpdGVyLm9mZnNldCAtIHNpemVPZmZzZXQ7XG5cdFx0XHR3cml0ZXIudmlldy5zZXRVaW50MzIoc2l6ZU9mZnNldCAtIDQsIHNpemUsIGZhbHNlKTsgLy8gd3JpdGUgc2l6ZVxuXG5cdFx0XHR3aGlsZSAoc2l6ZSAlIDQpIHtcblx0XHRcdFx0c2l6ZSsrO1xuXHRcdFx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuKTtcbmFkZEhhbmRsZXJBbGlhcygnbG5rRCcsICdsbmsyJyk7XG5hZGRIYW5kbGVyQWxpYXMoJ2xuazMnLCAnbG5rMicpO1xuXG4vLyB0aGlzIHNlZW1zIHRvIGp1c3QgYmUgemVybyBzaXplIGJsb2NrLCBpZ25vcmUgaXRcbmFkZEhhbmRsZXIoXG5cdCdsbmtFJyxcblx0dGFyZ2V0ID0+ICh0YXJnZXQgYXMgYW55KS5fbG5rRSAhPT0gdW5kZWZpbmVkLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQsIF9wc2RzLCBvcHRpb25zKSA9PiB7XG5cdFx0aWYgKG9wdGlvbnMubG9nTWlzc2luZ0ZlYXR1cmVzICYmIGxlZnQoKSkge1xuXHRcdFx0Y29uc29sZS5sb2coYE5vbi1lbXB0eSBsbmtFIGxheWVyIGluZm8gKCR7bGVmdCgpfSBieXRlcylgKTtcblx0XHR9XG5cblx0XHRpZiAoTU9DS19IQU5ETEVSUykge1xuXHRcdFx0KHRhcmdldCBhcyBhbnkpLl9sbmtFID0gcmVhZEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0XHR9XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4gTU9DS19IQU5ETEVSUyAmJiB3cml0ZUJ5dGVzKHdyaXRlciwgKHRhcmdldCBhcyBhbnkpLl9sbmtFKSxcbik7XG5cbmludGVyZmFjZSBFeHRlbnNpb25EZXNjIHtcblx0Z2VuZXJhdG9yU2V0dGluZ3M6IHtcblx0XHRnZW5lcmF0b3JfNDVfYXNzZXRzOiB7IGpzb246IHN0cmluZzsgfTtcblx0XHRsYXllclRpbWU6IG51bWJlcjtcblx0fTtcbn1cblxuYWRkSGFuZGxlcihcblx0J3B0aHMnLFxuXHRoYXNLZXkoJ3BhdGhMaXN0JyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblxuXHRcdHRhcmdldC5wYXRoTGlzdCA9IFtdOyAvLyBUT0RPOiByZWFkIHBhdGhzIChmaW5kIGV4YW1wbGUgd2l0aCBub24tZW1wdHkgbGlzdClcblxuXHRcdGRlc2NyaXB0b3I7XG5cdFx0Ly8gY29uc29sZS5sb2coJ3B0aHMnLCBkZXNjcmlwdG9yKTsgLy8gVE9ETzogcmVtb3ZlIHRoaXNcblx0fSxcblx0KHdyaXRlciwgX3RhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGRlc2NyaXB0b3IgPSB7XG5cdFx0XHRwYXRoTGlzdDogW10sIC8vIFRPRE86IHdyaXRlIHBhdGhzXG5cdFx0fTtcblxuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ3BhdGhzRGF0YUNsYXNzJywgZGVzY3JpcHRvcik7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnbHl2cicsXG5cdGhhc0tleSgndmVyc2lvbicpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHRhcmdldC52ZXJzaW9uID0gcmVhZFVpbnQzMihyZWFkZXIpLFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHdyaXRlVWludDMyKHdyaXRlciwgdGFyZ2V0LnZlcnNpb24hKSxcbik7XG5cbmZ1bmN0aW9uIGFkanVzdG1lbnRUeXBlKHR5cGU6IHN0cmluZykge1xuXHRyZXR1cm4gKHRhcmdldDogTGF5ZXJBZGRpdGlvbmFsSW5mbykgPT4gISF0YXJnZXQuYWRqdXN0bWVudCAmJiB0YXJnZXQuYWRqdXN0bWVudC50eXBlID09PSB0eXBlO1xufVxuXG5hZGRIYW5kbGVyKFxuXHQnYnJpdCcsXG5cdGFkanVzdG1lbnRUeXBlKCdicmlnaHRuZXNzL2NvbnRyYXN0JyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmICghdGFyZ2V0LmFkanVzdG1lbnQpIHsgLy8gaWdub3JlIGlmIGdvdCBvbmUgZnJvbSBDZ0VkIGJsb2NrXG5cdFx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHtcblx0XHRcdFx0dHlwZTogJ2JyaWdodG5lc3MvY29udHJhc3QnLFxuXHRcdFx0XHRicmlnaHRuZXNzOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHRcdFx0Y29udHJhc3Q6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdFx0XHRtZWFuVmFsdWU6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdFx0XHRsYWJDb2xvck9ubHk6ICEhcmVhZFVpbnQ4KHJlYWRlciksXG5cdFx0XHRcdHVzZUxlZ2FjeTogdHJ1ZSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIEJyaWdodG5lc3NBZGp1c3RtZW50O1xuXHRcdHdyaXRlSW50MTYod3JpdGVyLCBpbmZvLmJyaWdodG5lc3MgfHwgMCk7XG5cdFx0d3JpdGVJbnQxNih3cml0ZXIsIGluZm8uY29udHJhc3QgfHwgMCk7XG5cdFx0d3JpdGVJbnQxNih3cml0ZXIsIGluZm8ubWVhblZhbHVlID8/IDEyNyk7XG5cdFx0d3JpdGVVaW50OCh3cml0ZXIsIGluZm8ubGFiQ29sb3JPbmx5ID8gMSA6IDApO1xuXHRcdHdyaXRlWmVyb3Mod3JpdGVyLCAxKTtcblx0fSxcbik7XG5cbmZ1bmN0aW9uIHJlYWRMZXZlbHNDaGFubmVsKHJlYWRlcjogUHNkUmVhZGVyKTogTGV2ZWxzQWRqdXN0bWVudENoYW5uZWwge1xuXHRjb25zdCBzaGFkb3dJbnB1dCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRjb25zdCBoaWdobGlnaHRJbnB1dCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRjb25zdCBzaGFkb3dPdXRwdXQgPSByZWFkSW50MTYocmVhZGVyKTtcblx0Y29uc3QgaGlnaGxpZ2h0T3V0cHV0ID0gcmVhZEludDE2KHJlYWRlcik7XG5cdGNvbnN0IG1pZHRvbmVJbnB1dCA9IHJlYWRJbnQxNihyZWFkZXIpIC8gMTAwO1xuXHRyZXR1cm4geyBzaGFkb3dJbnB1dCwgaGlnaGxpZ2h0SW5wdXQsIHNoYWRvd091dHB1dCwgaGlnaGxpZ2h0T3V0cHV0LCBtaWR0b25lSW5wdXQgfTtcbn1cblxuZnVuY3Rpb24gd3JpdGVMZXZlbHNDaGFubmVsKHdyaXRlcjogUHNkV3JpdGVyLCBjaGFubmVsOiBMZXZlbHNBZGp1c3RtZW50Q2hhbm5lbCkge1xuXHR3cml0ZUludDE2KHdyaXRlciwgY2hhbm5lbC5zaGFkb3dJbnB1dCk7XG5cdHdyaXRlSW50MTYod3JpdGVyLCBjaGFubmVsLmhpZ2hsaWdodElucHV0KTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGNoYW5uZWwuc2hhZG93T3V0cHV0KTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGNoYW5uZWwuaGlnaGxpZ2h0T3V0cHV0KTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIE1hdGgucm91bmQoY2hhbm5lbC5taWR0b25lSW5wdXQgKiAxMDApKTtcbn1cblxuYWRkSGFuZGxlcihcblx0J2xldmwnLFxuXHRhZGp1c3RtZW50VHlwZSgnbGV2ZWxzJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmIChyZWFkVWludDE2KHJlYWRlcikgIT09IDIpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsZXZsIHZlcnNpb24nKTtcblxuXHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0Li4udGFyZ2V0LmFkanVzdG1lbnQgYXMgUHJlc2V0SW5mbyxcblx0XHRcdHR5cGU6ICdsZXZlbHMnLFxuXHRcdFx0cmdiOiByZWFkTGV2ZWxzQ2hhbm5lbChyZWFkZXIpLFxuXHRcdFx0cmVkOiByZWFkTGV2ZWxzQ2hhbm5lbChyZWFkZXIpLFxuXHRcdFx0Z3JlZW46IHJlYWRMZXZlbHNDaGFubmVsKHJlYWRlciksXG5cdFx0XHRibHVlOiByZWFkTGV2ZWxzQ2hhbm5lbChyZWFkZXIpLFxuXHRcdH07XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBpbmZvID0gdGFyZ2V0LmFkanVzdG1lbnQgYXMgTGV2ZWxzQWRqdXN0bWVudDtcblx0XHRjb25zdCBkZWZhdWx0Q2hhbm5lbCA9IHtcblx0XHRcdHNoYWRvd0lucHV0OiAwLFxuXHRcdFx0aGlnaGxpZ2h0SW5wdXQ6IDI1NSxcblx0XHRcdHNoYWRvd091dHB1dDogMCxcblx0XHRcdGhpZ2hsaWdodE91dHB1dDogMjU1LFxuXHRcdFx0bWlkdG9uZUlucHV0OiAxLFxuXHRcdH07XG5cblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDIpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVMZXZlbHNDaGFubmVsKHdyaXRlciwgaW5mby5yZ2IgfHwgZGVmYXVsdENoYW5uZWwpO1xuXHRcdHdyaXRlTGV2ZWxzQ2hhbm5lbCh3cml0ZXIsIGluZm8ucmVkIHx8IGRlZmF1bHRDaGFubmVsKTtcblx0XHR3cml0ZUxldmVsc0NoYW5uZWwod3JpdGVyLCBpbmZvLmJsdWUgfHwgZGVmYXVsdENoYW5uZWwpO1xuXHRcdHdyaXRlTGV2ZWxzQ2hhbm5lbCh3cml0ZXIsIGluZm8uZ3JlZW4gfHwgZGVmYXVsdENoYW5uZWwpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNTk7IGkrKykgd3JpdGVMZXZlbHNDaGFubmVsKHdyaXRlciwgZGVmYXVsdENoYW5uZWwpO1xuXHR9LFxuKTtcblxuZnVuY3Rpb24gcmVhZEN1cnZlQ2hhbm5lbChyZWFkZXI6IFBzZFJlYWRlcikge1xuXHRjb25zdCBub2RlcyA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0Y29uc3QgY2hhbm5lbDogQ3VydmVzQWRqdXN0bWVudENoYW5uZWwgPSBbXTtcblxuXHRmb3IgKGxldCBqID0gMDsgaiA8IG5vZGVzOyBqKyspIHtcblx0XHRjb25zdCBvdXRwdXQgPSByZWFkSW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBpbnB1dCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRcdGNoYW5uZWwucHVzaCh7IGlucHV0LCBvdXRwdXQgfSk7XG5cdH1cblxuXHRyZXR1cm4gY2hhbm5lbDtcbn1cblxuZnVuY3Rpb24gd3JpdGVDdXJ2ZUNoYW5uZWwod3JpdGVyOiBQc2RXcml0ZXIsIGNoYW5uZWw6IEN1cnZlc0FkanVzdG1lbnRDaGFubmVsKSB7XG5cdHdyaXRlVWludDE2KHdyaXRlciwgY2hhbm5lbC5sZW5ndGgpO1xuXG5cdGZvciAoY29uc3QgbiBvZiBjaGFubmVsKSB7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBuLm91dHB1dCk7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBuLmlucHV0KTtcblx0fVxufVxuXG5hZGRIYW5kbGVyKFxuXHQnY3VydicsXG5cdGFkanVzdG1lbnRUeXBlKCdjdXJ2ZXMnKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0cmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0aWYgKHJlYWRVaW50MTYocmVhZGVyKSAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGN1cnYgdmVyc2lvbicpO1xuXHRcdHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBjaGFubmVscyA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRjb25zdCBpbmZvOiBDdXJ2ZXNBZGp1c3RtZW50ID0geyB0eXBlOiAnY3VydmVzJyB9O1xuXG5cdFx0aWYgKGNoYW5uZWxzICYgMSkgaW5mby5yZ2IgPSByZWFkQ3VydmVDaGFubmVsKHJlYWRlcik7XG5cdFx0aWYgKGNoYW5uZWxzICYgMikgaW5mby5yZWQgPSByZWFkQ3VydmVDaGFubmVsKHJlYWRlcik7XG5cdFx0aWYgKGNoYW5uZWxzICYgNCkgaW5mby5ncmVlbiA9IHJlYWRDdXJ2ZUNoYW5uZWwocmVhZGVyKTtcblx0XHRpZiAoY2hhbm5lbHMgJiA4KSBpbmZvLmJsdWUgPSByZWFkQ3VydmVDaGFubmVsKHJlYWRlcik7XG5cblx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHtcblx0XHRcdC4uLnRhcmdldC5hZGp1c3RtZW50IGFzIFByZXNldEluZm8sXG5cdFx0XHQuLi5pbmZvLFxuXHRcdH07XG5cblx0XHQvLyBpZ25vcmluZywgZHVwbGljYXRlIGluZm9ybWF0aW9uXG5cdFx0Ly8gY2hlY2tTaWduYXR1cmUocmVhZGVyLCAnQ3J2ICcpO1xuXG5cdFx0Ly8gY29uc3QgY1ZlcnNpb24gPSByZWFkVWludDE2KHJlYWRlcik7XG5cdFx0Ly8gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdC8vIGNvbnN0IGNoYW5uZWxDb3VudCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblxuXHRcdC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbm5lbENvdW50OyBpKyspIHtcblx0XHQvLyBcdGNvbnN0IGluZGV4ID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdC8vIFx0Y29uc3Qgbm9kZXMgPSByZWFkVWludDE2KHJlYWRlcik7XG5cblx0XHQvLyBcdGZvciAobGV0IGogPSAwOyBqIDwgbm9kZXM7IGorKykge1xuXHRcdC8vIFx0XHRjb25zdCBvdXRwdXQgPSByZWFkSW50MTYocmVhZGVyKTtcblx0XHQvLyBcdFx0Y29uc3QgaW5wdXQgPSByZWFkSW50MTYocmVhZGVyKTtcblx0XHQvLyBcdH1cblx0XHQvLyB9XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBpbmZvID0gdGFyZ2V0LmFkanVzdG1lbnQgYXMgQ3VydmVzQWRqdXN0bWVudDtcblx0XHRjb25zdCB7IHJnYiwgcmVkLCBncmVlbiwgYmx1ZSB9ID0gaW5mbztcblx0XHRsZXQgY2hhbm5lbHMgPSAwO1xuXHRcdGxldCBjaGFubmVsQ291bnQgPSAwO1xuXG5cdFx0aWYgKHJnYiAmJiByZ2IubGVuZ3RoKSB7IGNoYW5uZWxzIHw9IDE7IGNoYW5uZWxDb3VudCsrOyB9XG5cdFx0aWYgKHJlZCAmJiByZWQubGVuZ3RoKSB7IGNoYW5uZWxzIHw9IDI7IGNoYW5uZWxDb3VudCsrOyB9XG5cdFx0aWYgKGdyZWVuICYmIGdyZWVuLmxlbmd0aCkgeyBjaGFubmVscyB8PSA0OyBjaGFubmVsQ291bnQrKzsgfVxuXHRcdGlmIChibHVlICYmIGJsdWUubGVuZ3RoKSB7IGNoYW5uZWxzIHw9IDg7IGNoYW5uZWxDb3VudCsrOyB9XG5cblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgMCk7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCAxKTsgLy8gdmVyc2lvblxuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgMCk7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBjaGFubmVscyk7XG5cblx0XHRpZiAocmdiICYmIHJnYi5sZW5ndGgpIHdyaXRlQ3VydmVDaGFubmVsKHdyaXRlciwgcmdiKTtcblx0XHRpZiAocmVkICYmIHJlZC5sZW5ndGgpIHdyaXRlQ3VydmVDaGFubmVsKHdyaXRlciwgcmVkKTtcblx0XHRpZiAoZ3JlZW4gJiYgZ3JlZW4ubGVuZ3RoKSB3cml0ZUN1cnZlQ2hhbm5lbCh3cml0ZXIsIGdyZWVuKTtcblx0XHRpZiAoYmx1ZSAmJiBibHVlLmxlbmd0aCkgd3JpdGVDdXJ2ZUNoYW5uZWwod3JpdGVyLCBibHVlKTtcblxuXHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgJ0NydiAnKTtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDQpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCAwKTtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIGNoYW5uZWxDb3VudCk7XG5cblx0XHRpZiAocmdiICYmIHJnYi5sZW5ndGgpIHsgd3JpdGVVaW50MTYod3JpdGVyLCAwKTsgd3JpdGVDdXJ2ZUNoYW5uZWwod3JpdGVyLCByZ2IpOyB9XG5cdFx0aWYgKHJlZCAmJiByZWQubGVuZ3RoKSB7IHdyaXRlVWludDE2KHdyaXRlciwgMSk7IHdyaXRlQ3VydmVDaGFubmVsKHdyaXRlciwgcmVkKTsgfVxuXHRcdGlmIChncmVlbiAmJiBncmVlbi5sZW5ndGgpIHsgd3JpdGVVaW50MTYod3JpdGVyLCAyKTsgd3JpdGVDdXJ2ZUNoYW5uZWwod3JpdGVyLCBncmVlbik7IH1cblx0XHRpZiAoYmx1ZSAmJiBibHVlLmxlbmd0aCkgeyB3cml0ZVVpbnQxNih3cml0ZXIsIDMpOyB3cml0ZUN1cnZlQ2hhbm5lbCh3cml0ZXIsIGJsdWUpOyB9XG5cblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMik7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnZXhwQScsXG5cdGFkanVzdG1lbnRUeXBlKCdleHBvc3VyZScpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRpZiAocmVhZFVpbnQxNihyZWFkZXIpICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXhwQSB2ZXJzaW9uJyk7XG5cblx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHtcblx0XHRcdC4uLnRhcmdldC5hZGp1c3RtZW50IGFzIFByZXNldEluZm8sXG5cdFx0XHR0eXBlOiAnZXhwb3N1cmUnLFxuXHRcdFx0ZXhwb3N1cmU6IHJlYWRGbG9hdDMyKHJlYWRlciksXG5cdFx0XHRvZmZzZXQ6IHJlYWRGbG9hdDMyKHJlYWRlciksXG5cdFx0XHRnYW1tYTogcmVhZEZsb2F0MzIocmVhZGVyKSxcblx0XHR9O1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIEV4cG9zdXJlQWRqdXN0bWVudDtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDEpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVGbG9hdDMyKHdyaXRlciwgaW5mby5leHBvc3VyZSEpO1xuXHRcdHdyaXRlRmxvYXQzMih3cml0ZXIsIGluZm8ub2Zmc2V0ISk7XG5cdFx0d3JpdGVGbG9hdDMyKHdyaXRlciwgaW5mby5nYW1tYSEpO1xuXHRcdHdyaXRlWmVyb3Mod3JpdGVyLCAyKTtcblx0fSxcbik7XG5cbmludGVyZmFjZSBWaWJyYW5jZURlc2NyaXB0b3Ige1xuXHR2aWJyYW5jZT86IG51bWJlcjtcblx0U3RydD86IG51bWJlcjtcbn1cblxuYWRkSGFuZGxlcihcblx0J3ZpYkEnLFxuXHRhZGp1c3RtZW50VHlwZSgndmlicmFuY2UnKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0Y29uc3QgZGVzYzogVmlicmFuY2VEZXNjcmlwdG9yID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcik7XG5cdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7IHR5cGU6ICd2aWJyYW5jZScgfTtcblx0XHRpZiAoZGVzYy52aWJyYW5jZSAhPT0gdW5kZWZpbmVkKSB0YXJnZXQuYWRqdXN0bWVudC52aWJyYW5jZSA9IGRlc2MudmlicmFuY2U7XG5cdFx0aWYgKGRlc2MuU3RydCAhPT0gdW5kZWZpbmVkKSB0YXJnZXQuYWRqdXN0bWVudC5zYXR1cmF0aW9uID0gZGVzYy5TdHJ0O1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIFZpYnJhbmNlQWRqdXN0bWVudDtcblx0XHRjb25zdCBkZXNjOiBWaWJyYW5jZURlc2NyaXB0b3IgPSB7fTtcblx0XHRpZiAoaW5mby52aWJyYW5jZSAhPT0gdW5kZWZpbmVkKSBkZXNjLnZpYnJhbmNlID0gaW5mby52aWJyYW5jZTtcblx0XHRpZiAoaW5mby5zYXR1cmF0aW9uICE9PSB1bmRlZmluZWQpIGRlc2MuU3RydCA9IGluZm8uc2F0dXJhdGlvbjtcblxuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCBkZXNjKTtcblx0fSxcbik7XG5cbmZ1bmN0aW9uIHJlYWRIdWVDaGFubmVsKHJlYWRlcjogUHNkUmVhZGVyKTogSHVlU2F0dXJhdGlvbkFkanVzdG1lbnRDaGFubmVsIHtcblx0cmV0dXJuIHtcblx0XHRhOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHRiOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHRjOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHRkOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHRodWU6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdHNhdHVyYXRpb246IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdGxpZ2h0bmVzczogcmVhZEludDE2KHJlYWRlciksXG5cdH07XG59XG5cbmZ1bmN0aW9uIHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXI6IFBzZFdyaXRlciwgY2hhbm5lbDogSHVlU2F0dXJhdGlvbkFkanVzdG1lbnRDaGFubmVsIHwgdW5kZWZpbmVkKSB7XG5cdGNvbnN0IGMgPSBjaGFubmVsIHx8IHt9IGFzIFBhcnRpYWw8SHVlU2F0dXJhdGlvbkFkanVzdG1lbnRDaGFubmVsPjtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuYSB8fCAwKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuYiB8fCAwKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuYyB8fCAwKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuZCB8fCAwKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuaHVlIHx8IDApO1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5zYXR1cmF0aW9uIHx8IDApO1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5saWdodG5lc3MgfHwgMCk7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdodWUyJyxcblx0YWRqdXN0bWVudFR5cGUoJ2h1ZS9zYXR1cmF0aW9uJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmIChyZWFkVWludDE2KHJlYWRlcikgIT09IDIpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBodWUyIHZlcnNpb24nKTtcblxuXHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0Li4udGFyZ2V0LmFkanVzdG1lbnQgYXMgUHJlc2V0SW5mbyxcblx0XHRcdHR5cGU6ICdodWUvc2F0dXJhdGlvbicsXG5cdFx0XHRtYXN0ZXI6IHJlYWRIdWVDaGFubmVsKHJlYWRlciksXG5cdFx0XHRyZWRzOiByZWFkSHVlQ2hhbm5lbChyZWFkZXIpLFxuXHRcdFx0eWVsbG93czogcmVhZEh1ZUNoYW5uZWwocmVhZGVyKSxcblx0XHRcdGdyZWVuczogcmVhZEh1ZUNoYW5uZWwocmVhZGVyKSxcblx0XHRcdGN5YW5zOiByZWFkSHVlQ2hhbm5lbChyZWFkZXIpLFxuXHRcdFx0Ymx1ZXM6IHJlYWRIdWVDaGFubmVsKHJlYWRlciksXG5cdFx0XHRtYWdlbnRhczogcmVhZEh1ZUNoYW5uZWwocmVhZGVyKSxcblx0XHR9O1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIEh1ZVNhdHVyYXRpb25BZGp1c3RtZW50O1xuXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCAyKTsgLy8gdmVyc2lvblxuXHRcdHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXIsIGluZm8ubWFzdGVyKTtcblx0XHR3cml0ZUh1ZUNoYW5uZWwod3JpdGVyLCBpbmZvLnJlZHMpO1xuXHRcdHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXIsIGluZm8ueWVsbG93cyk7XG5cdFx0d3JpdGVIdWVDaGFubmVsKHdyaXRlciwgaW5mby5ncmVlbnMpO1xuXHRcdHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXIsIGluZm8uY3lhbnMpO1xuXHRcdHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXIsIGluZm8uYmx1ZXMpO1xuXHRcdHdyaXRlSHVlQ2hhbm5lbCh3cml0ZXIsIGluZm8ubWFnZW50YXMpO1xuXHR9LFxuKTtcblxuZnVuY3Rpb24gcmVhZENvbG9yQmFsYW5jZShyZWFkZXI6IFBzZFJlYWRlcik6IENvbG9yQmFsYW5jZVZhbHVlcyB7XG5cdHJldHVybiB7XG5cdFx0Y3lhblJlZDogcmVhZEludDE2KHJlYWRlciksXG5cdFx0bWFnZW50YUdyZWVuOiByZWFkSW50MTYocmVhZGVyKSxcblx0XHR5ZWxsb3dCbHVlOiByZWFkSW50MTYocmVhZGVyKSxcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JpdGVDb2xvckJhbGFuY2Uod3JpdGVyOiBQc2RXcml0ZXIsIHZhbHVlOiBQYXJ0aWFsPENvbG9yQmFsYW5jZVZhbHVlcz4pIHtcblx0d3JpdGVJbnQxNih3cml0ZXIsIHZhbHVlLmN5YW5SZWQgfHwgMCk7XG5cdHdyaXRlSW50MTYod3JpdGVyLCB2YWx1ZS5tYWdlbnRhR3JlZW4gfHwgMCk7XG5cdHdyaXRlSW50MTYod3JpdGVyLCB2YWx1ZS55ZWxsb3dCbHVlIHx8IDApO1xufVxuXG5hZGRIYW5kbGVyKFxuXHQnYmxuYycsXG5cdGFkanVzdG1lbnRUeXBlKCdjb2xvciBiYWxhbmNlJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0dHlwZTogJ2NvbG9yIGJhbGFuY2UnLFxuXHRcdFx0c2hhZG93czogcmVhZENvbG9yQmFsYW5jZShyZWFkZXIpLFxuXHRcdFx0bWlkdG9uZXM6IHJlYWRDb2xvckJhbGFuY2UocmVhZGVyKSxcblx0XHRcdGhpZ2hsaWdodHM6IHJlYWRDb2xvckJhbGFuY2UocmVhZGVyKSxcblx0XHRcdHByZXNlcnZlTHVtaW5vc2l0eTogISFyZWFkVWludDgocmVhZGVyKSxcblx0XHR9O1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIENvbG9yQmFsYW5jZUFkanVzdG1lbnQ7XG5cdFx0d3JpdGVDb2xvckJhbGFuY2Uod3JpdGVyLCBpbmZvLnNoYWRvd3MgfHwge30pO1xuXHRcdHdyaXRlQ29sb3JCYWxhbmNlKHdyaXRlciwgaW5mby5taWR0b25lcyB8fCB7fSk7XG5cdFx0d3JpdGVDb2xvckJhbGFuY2Uod3JpdGVyLCBpbmZvLmhpZ2hsaWdodHMgfHwge30pO1xuXHRcdHdyaXRlVWludDgod3JpdGVyLCBpbmZvLnByZXNlcnZlTHVtaW5vc2l0eSA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMSk7XG5cdH0sXG4pO1xuXG5pbnRlcmZhY2UgQmxhY2tBbmRXaGl0ZURlc2NyaXB0b3Ige1xuXHQnUmQgICc6IG51bWJlcjtcblx0WWxsdzogbnVtYmVyO1xuXHQnR3JuICc6IG51bWJlcjtcblx0J0N5biAnOiBudW1iZXI7XG5cdCdCbCAgJzogbnVtYmVyO1xuXHRNZ250OiBudW1iZXI7XG5cdHVzZVRpbnQ6IGJvb2xlYW47XG5cdHRpbnRDb2xvcj86IERlc2NyaXB0b3JDb2xvcjtcblx0YndQcmVzZXRLaW5kOiBudW1iZXI7XG5cdGJsYWNrQW5kV2hpdGVQcmVzZXRGaWxlTmFtZTogc3RyaW5nO1xufVxuXG5hZGRIYW5kbGVyKFxuXHQnYmx3aCcsXG5cdGFkanVzdG1lbnRUeXBlKCdibGFjayAmIHdoaXRlJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGNvbnN0IGRlc2M6IEJsYWNrQW5kV2hpdGVEZXNjcmlwdG9yID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcik7XG5cdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7XG5cdFx0XHR0eXBlOiAnYmxhY2sgJiB3aGl0ZScsXG5cdFx0XHRyZWRzOiBkZXNjWydSZCAgJ10sXG5cdFx0XHR5ZWxsb3dzOiBkZXNjLllsbHcsXG5cdFx0XHRncmVlbnM6IGRlc2NbJ0dybiAnXSxcblx0XHRcdGN5YW5zOiBkZXNjWydDeW4gJ10sXG5cdFx0XHRibHVlczogZGVzY1snQmwgICddLFxuXHRcdFx0bWFnZW50YXM6IGRlc2MuTWdudCxcblx0XHRcdHVzZVRpbnQ6ICEhZGVzYy51c2VUaW50LFxuXHRcdFx0cHJlc2V0S2luZDogZGVzYy5id1ByZXNldEtpbmQsXG5cdFx0XHRwcmVzZXRGaWxlTmFtZTogZGVzYy5ibGFja0FuZFdoaXRlUHJlc2V0RmlsZU5hbWUsXG5cdFx0fTtcblxuXHRcdGlmIChkZXNjLnRpbnRDb2xvciAhPT0gdW5kZWZpbmVkKSB0YXJnZXQuYWRqdXN0bWVudC50aW50Q29sb3IgPSBwYXJzZUNvbG9yKGRlc2MudGludENvbG9yKTtcblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGluZm8gPSB0YXJnZXQuYWRqdXN0bWVudCBhcyBCbGFja0FuZFdoaXRlQWRqdXN0bWVudDtcblx0XHRjb25zdCBkZXNjOiBCbGFja0FuZFdoaXRlRGVzY3JpcHRvciA9IHtcblx0XHRcdCdSZCAgJzogaW5mby5yZWRzIHx8IDAsXG5cdFx0XHRZbGx3OiBpbmZvLnllbGxvd3MgfHwgMCxcblx0XHRcdCdHcm4gJzogaW5mby5ncmVlbnMgfHwgMCxcblx0XHRcdCdDeW4gJzogaW5mby5jeWFucyB8fCAwLFxuXHRcdFx0J0JsICAnOiBpbmZvLmJsdWVzIHx8IDAsXG5cdFx0XHRNZ250OiBpbmZvLm1hZ2VudGFzIHx8IDAsXG5cdFx0XHR1c2VUaW50OiAhIWluZm8udXNlVGludCxcblx0XHRcdHRpbnRDb2xvcjogc2VyaWFsaXplQ29sb3IoaW5mby50aW50Q29sb3IpLFxuXHRcdFx0YndQcmVzZXRLaW5kOiBpbmZvLnByZXNldEtpbmQgfHwgMCxcblx0XHRcdGJsYWNrQW5kV2hpdGVQcmVzZXRGaWxlTmFtZTogaW5mby5wcmVzZXRGaWxlTmFtZSB8fCAnJyxcblx0XHR9O1xuXG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J3BoZmwnLFxuXHRhZGp1c3RtZW50VHlwZSgncGhvdG8gZmlsdGVyJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGNvbnN0IHZlcnNpb24gPSByZWFkVWludDE2KHJlYWRlcik7XG5cdFx0aWYgKHZlcnNpb24gIT09IDIgJiYgdmVyc2lvbiAhPT0gMykgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBoZmwgdmVyc2lvbicpO1xuXG5cdFx0bGV0IGNvbG9yOiBDb2xvcjtcblxuXHRcdGlmICh2ZXJzaW9uID09PSAyKSB7XG5cdFx0XHRjb2xvciA9IHJlYWRDb2xvcihyZWFkZXIpO1xuXHRcdH0gZWxzZSB7IC8vIHZlcnNpb24gM1xuXHRcdFx0Ly8gVE9ETzogdGVzdCB0aGlzLCB0aGlzIGlzIHByb2JhYmx5IHdyb25nXG5cdFx0XHRjb2xvciA9IHtcblx0XHRcdFx0bDogcmVhZEludDMyKHJlYWRlcikgLyAxMDAsXG5cdFx0XHRcdGE6IHJlYWRJbnQzMihyZWFkZXIpIC8gMTAwLFxuXHRcdFx0XHRiOiByZWFkSW50MzIocmVhZGVyKSAvIDEwMCxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7XG5cdFx0XHR0eXBlOiAncGhvdG8gZmlsdGVyJyxcblx0XHRcdGNvbG9yLFxuXHRcdFx0ZGVuc2l0eTogcmVhZFVpbnQzMihyZWFkZXIpIC8gMTAwLFxuXHRcdFx0cHJlc2VydmVMdW1pbm9zaXR5OiAhIXJlYWRVaW50OChyZWFkZXIpLFxuXHRcdH07XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBpbmZvID0gdGFyZ2V0LmFkanVzdG1lbnQgYXMgUGhvdG9GaWx0ZXJBZGp1c3RtZW50O1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgMik7IC8vIHZlcnNpb25cblx0XHR3cml0ZUNvbG9yKHdyaXRlciwgaW5mby5jb2xvciB8fCB7IGw6IDAsIGE6IDAsIGI6IDAgfSk7XG5cdFx0d3JpdGVVaW50MzIod3JpdGVyLCAoaW5mby5kZW5zaXR5IHx8IDApICogMTAwKTtcblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgaW5mby5wcmVzZXJ2ZUx1bWlub3NpdHkgPyAxIDogMCk7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDMpO1xuXHR9LFxuKTtcblxuZnVuY3Rpb24gcmVhZE1peHJDaGFubmVsKHJlYWRlcjogUHNkUmVhZGVyKTogQ2hhbm5lbE1peGVyQ2hhbm5lbCB7XG5cdGNvbnN0IHJlZCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRjb25zdCBncmVlbiA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRjb25zdCBibHVlID0gcmVhZEludDE2KHJlYWRlcik7XG5cdHNraXBCeXRlcyhyZWFkZXIsIDIpO1xuXHRjb25zdCBjb25zdGFudCA9IHJlYWRJbnQxNihyZWFkZXIpO1xuXHRyZXR1cm4geyByZWQsIGdyZWVuLCBibHVlLCBjb25zdGFudCB9O1xufVxuXG5mdW5jdGlvbiB3cml0ZU1peHJDaGFubmVsKHdyaXRlcjogUHNkV3JpdGVyLCBjaGFubmVsOiBDaGFubmVsTWl4ZXJDaGFubmVsIHwgdW5kZWZpbmVkKSB7XG5cdGNvbnN0IGMgPSBjaGFubmVsIHx8IHt9IGFzIFBhcnRpYWw8Q2hhbm5lbE1peGVyQ2hhbm5lbD47XG5cdHdyaXRlSW50MTYod3JpdGVyLCBjLnJlZCEpO1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5ncmVlbiEpO1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5ibHVlISk7XG5cdHdyaXRlWmVyb3Mod3JpdGVyLCAyKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMuY29uc3RhbnQhKTtcbn1cblxuYWRkSGFuZGxlcihcblx0J21peHInLFxuXHRhZGp1c3RtZW50VHlwZSgnY2hhbm5lbCBtaXhlcicpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRpZiAocmVhZFVpbnQxNihyZWFkZXIpICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWl4ciB2ZXJzaW9uJyk7XG5cblx0XHRjb25zdCBhZGp1c3RtZW50OiBDaGFubmVsTWl4ZXJBZGp1c3RtZW50ID0gdGFyZ2V0LmFkanVzdG1lbnQgPSB7XG5cdFx0XHQuLi50YXJnZXQuYWRqdXN0bWVudCBhcyBQcmVzZXRJbmZvLFxuXHRcdFx0dHlwZTogJ2NoYW5uZWwgbWl4ZXInLFxuXHRcdFx0bW9ub2Nocm9tZTogISFyZWFkVWludDE2KHJlYWRlciksXG5cdFx0fTtcblxuXHRcdGlmICghYWRqdXN0bWVudC5tb25vY2hyb21lKSB7XG5cdFx0XHRhZGp1c3RtZW50LnJlZCA9IHJlYWRNaXhyQ2hhbm5lbChyZWFkZXIpO1xuXHRcdFx0YWRqdXN0bWVudC5ncmVlbiA9IHJlYWRNaXhyQ2hhbm5lbChyZWFkZXIpO1xuXHRcdFx0YWRqdXN0bWVudC5ibHVlID0gcmVhZE1peHJDaGFubmVsKHJlYWRlcik7XG5cdFx0fVxuXG5cdFx0YWRqdXN0bWVudC5ncmF5ID0gcmVhZE1peHJDaGFubmVsKHJlYWRlcik7XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBpbmZvID0gdGFyZ2V0LmFkanVzdG1lbnQgYXMgQ2hhbm5lbE1peGVyQWRqdXN0bWVudDtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDEpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBpbmZvLm1vbm9jaHJvbWUgPyAxIDogMCk7XG5cblx0XHRpZiAoaW5mby5tb25vY2hyb21lKSB7XG5cdFx0XHR3cml0ZU1peHJDaGFubmVsKHdyaXRlciwgaW5mby5ncmF5KTtcblx0XHRcdHdyaXRlWmVyb3Mod3JpdGVyLCAzICogNSAqIDIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3cml0ZU1peHJDaGFubmVsKHdyaXRlciwgaW5mby5yZWQpO1xuXHRcdFx0d3JpdGVNaXhyQ2hhbm5lbCh3cml0ZXIsIGluZm8uZ3JlZW4pO1xuXHRcdFx0d3JpdGVNaXhyQ2hhbm5lbCh3cml0ZXIsIGluZm8uYmx1ZSk7XG5cdFx0XHR3cml0ZU1peHJDaGFubmVsKHdyaXRlciwgaW5mby5ncmF5KTtcblx0XHR9XG5cdH0sXG4pO1xuXG5jb25zdCBjb2xvckxvb2t1cFR5cGUgPSBjcmVhdGVFbnVtPCczZGx1dCcgfCAnYWJzdHJhY3RQcm9maWxlJyB8ICdkZXZpY2VMaW5rUHJvZmlsZSc+KCdjb2xvckxvb2t1cFR5cGUnLCAnM0RMVVQnLCB7XG5cdCczZGx1dCc6ICczRExVVCcsXG5cdGFic3RyYWN0UHJvZmlsZTogJ2Fic3RyYWN0UHJvZmlsZScsXG5cdGRldmljZUxpbmtQcm9maWxlOiAnZGV2aWNlTGlua1Byb2ZpbGUnLFxufSk7XG5cbmNvbnN0IExVVEZvcm1hdFR5cGUgPSBjcmVhdGVFbnVtPCdsb29rJyB8ICdjdWJlJyB8ICczZGwnPignTFVURm9ybWF0VHlwZScsICdsb29rJywge1xuXHRsb29rOiAnTFVURm9ybWF0TE9PSycsXG5cdGN1YmU6ICdMVVRGb3JtYXRDVUJFJyxcblx0JzNkbCc6ICdMVVRGb3JtYXQzREwnLFxufSk7XG5cbmNvbnN0IGNvbG9yTG9va3VwT3JkZXIgPSBjcmVhdGVFbnVtPCdyZ2InIHwgJ2Jncic+KCdjb2xvckxvb2t1cE9yZGVyJywgJ3JnYicsIHtcblx0cmdiOiAncmdiT3JkZXInLFxuXHRiZ3I6ICdiZ3JPcmRlcicsXG59KTtcblxuaW50ZXJmYWNlIENvbG9yTG9va3VwRGVzY3JpcHRvciB7XG5cdGxvb2t1cFR5cGU/OiBzdHJpbmc7XG5cdCdObSAgJz86IHN0cmluZztcblx0RHRocj86IGJvb2xlYW47XG5cdHByb2ZpbGU/OiBVaW50OEFycmF5O1xuXHRMVVRGb3JtYXQ/OiBzdHJpbmc7XG5cdGRhdGFPcmRlcj86IHN0cmluZztcblx0dGFibGVPcmRlcj86IHN0cmluZztcblx0TFVUM0RGaWxlRGF0YT86IFVpbnQ4QXJyYXk7XG5cdExVVDNERmlsZU5hbWU/OiBzdHJpbmc7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdjbHJMJyxcblx0YWRqdXN0bWVudFR5cGUoJ2NvbG9yIGxvb2t1cCcpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRpZiAocmVhZFVpbnQxNihyZWFkZXIpICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2xyTCB2ZXJzaW9uJyk7XG5cblx0XHRjb25zdCBkZXNjOiBDb2xvckxvb2t1cERlc2NyaXB0b3IgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHsgdHlwZTogJ2NvbG9yIGxvb2t1cCcgfTtcblx0XHRjb25zdCBpbmZvID0gdGFyZ2V0LmFkanVzdG1lbnQ7XG5cblx0XHRpZiAoZGVzYy5sb29rdXBUeXBlICE9PSB1bmRlZmluZWQpIGluZm8ubG9va3VwVHlwZSA9IGNvbG9yTG9va3VwVHlwZS5kZWNvZGUoZGVzYy5sb29rdXBUeXBlKTtcblx0XHRpZiAoZGVzY1snTm0gICddICE9PSB1bmRlZmluZWQpIGluZm8ubmFtZSA9IGRlc2NbJ05tICAnXTtcblx0XHRpZiAoZGVzYy5EdGhyICE9PSB1bmRlZmluZWQpIGluZm8uZGl0aGVyID0gZGVzYy5EdGhyO1xuXHRcdGlmIChkZXNjLnByb2ZpbGUgIT09IHVuZGVmaW5lZCkgaW5mby5wcm9maWxlID0gZGVzYy5wcm9maWxlO1xuXHRcdGlmIChkZXNjLkxVVEZvcm1hdCAhPT0gdW5kZWZpbmVkKSBpbmZvLmx1dEZvcm1hdCA9IExVVEZvcm1hdFR5cGUuZGVjb2RlKGRlc2MuTFVURm9ybWF0KTtcblx0XHRpZiAoZGVzYy5kYXRhT3JkZXIgIT09IHVuZGVmaW5lZCkgaW5mby5kYXRhT3JkZXIgPSBjb2xvckxvb2t1cE9yZGVyLmRlY29kZShkZXNjLmRhdGFPcmRlcik7XG5cdFx0aWYgKGRlc2MudGFibGVPcmRlciAhPT0gdW5kZWZpbmVkKSBpbmZvLnRhYmxlT3JkZXIgPSBjb2xvckxvb2t1cE9yZGVyLmRlY29kZShkZXNjLnRhYmxlT3JkZXIpO1xuXHRcdGlmIChkZXNjLkxVVDNERmlsZURhdGEgIT09IHVuZGVmaW5lZCkgaW5mby5sdXQzREZpbGVEYXRhID0gZGVzYy5MVVQzREZpbGVEYXRhO1xuXHRcdGlmIChkZXNjLkxVVDNERmlsZU5hbWUgIT09IHVuZGVmaW5lZCkgaW5mby5sdXQzREZpbGVOYW1lID0gZGVzYy5MVVQzREZpbGVOYW1lO1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIENvbG9yTG9va3VwQWRqdXN0bWVudDtcblx0XHRjb25zdCBkZXNjOiBDb2xvckxvb2t1cERlc2NyaXB0b3IgPSB7fTtcblxuXHRcdGlmIChpbmZvLmxvb2t1cFR5cGUgIT09IHVuZGVmaW5lZCkgZGVzYy5sb29rdXBUeXBlID0gY29sb3JMb29rdXBUeXBlLmVuY29kZShpbmZvLmxvb2t1cFR5cGUpO1xuXHRcdGlmIChpbmZvLm5hbWUgIT09IHVuZGVmaW5lZCkgZGVzY1snTm0gICddID0gaW5mby5uYW1lO1xuXHRcdGlmIChpbmZvLmRpdGhlciAhPT0gdW5kZWZpbmVkKSBkZXNjLkR0aHIgPSBpbmZvLmRpdGhlcjtcblx0XHRpZiAoaW5mby5wcm9maWxlICE9PSB1bmRlZmluZWQpIGRlc2MucHJvZmlsZSA9IGluZm8ucHJvZmlsZTtcblx0XHRpZiAoaW5mby5sdXRGb3JtYXQgIT09IHVuZGVmaW5lZCkgZGVzYy5MVVRGb3JtYXQgPSBMVVRGb3JtYXRUeXBlLmVuY29kZShpbmZvLmx1dEZvcm1hdCk7XG5cdFx0aWYgKGluZm8uZGF0YU9yZGVyICE9PSB1bmRlZmluZWQpIGRlc2MuZGF0YU9yZGVyID0gY29sb3JMb29rdXBPcmRlci5lbmNvZGUoaW5mby5kYXRhT3JkZXIpO1xuXHRcdGlmIChpbmZvLnRhYmxlT3JkZXIgIT09IHVuZGVmaW5lZCkgZGVzYy50YWJsZU9yZGVyID0gY29sb3JMb29rdXBPcmRlci5lbmNvZGUoaW5mby50YWJsZU9yZGVyKTtcblx0XHRpZiAoaW5mby5sdXQzREZpbGVEYXRhICE9PSB1bmRlZmluZWQpIGRlc2MuTFVUM0RGaWxlRGF0YSA9IGluZm8ubHV0M0RGaWxlRGF0YTtcblx0XHRpZiAoaW5mby5sdXQzREZpbGVOYW1lICE9PSB1bmRlZmluZWQpIGRlc2MuTFVUM0RGaWxlTmFtZSA9IGluZm8ubHV0M0RGaWxlTmFtZTtcblxuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgMSk7IC8vIHZlcnNpb25cblx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdudWxsJywgZGVzYyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnbnZydCcsXG5cdGFkanVzdG1lbnRUeXBlKCdpbnZlcnQnKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7IHR5cGU6ICdpbnZlcnQnIH07XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KCkgPT4ge1xuXHRcdC8vIG5vdGhpbmcgdG8gd3JpdGUgaGVyZVxuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J3Bvc3QnLFxuXHRhZGp1c3RtZW50VHlwZSgncG9zdGVyaXplJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0dHlwZTogJ3Bvc3Rlcml6ZScsXG5cdFx0XHRsZXZlbHM6IHJlYWRVaW50MTYocmVhZGVyKSxcblx0XHR9O1xuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGluZm8gPSB0YXJnZXQuYWRqdXN0bWVudCBhcyBQb3N0ZXJpemVBZGp1c3RtZW50O1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgaW5mby5sZXZlbHMgPz8gNCk7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDIpO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J3RocnMnLFxuXHRhZGp1c3RtZW50VHlwZSgndGhyZXNob2xkJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0dHlwZTogJ3RocmVzaG9sZCcsXG5cdFx0XHRsZXZlbDogcmVhZFVpbnQxNihyZWFkZXIpLFxuXHRcdH07XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIFRocmVzaG9sZEFkanVzdG1lbnQ7XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBpbmZvLmxldmVsID8/IDEyOCk7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDIpO1xuXHR9LFxuKTtcblxuY29uc3QgZ3JkbUNvbG9yTW9kZWxzID0gWycnLCAnJywgJycsICdyZ2InLCAnaHNiJywgJycsICdsYWInXTtcblxuYWRkSGFuZGxlcihcblx0J2dyZG0nLFxuXHRhZGp1c3RtZW50VHlwZSgnZ3JhZGllbnQgbWFwJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGlmIChyZWFkVWludDE2KHJlYWRlcikgIT09IDEpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBncmRtIHZlcnNpb24nKTtcblxuXHRcdGNvbnN0IGluZm86IEdyYWRpZW50TWFwQWRqdXN0bWVudCA9IHtcblx0XHRcdHR5cGU6ICdncmFkaWVudCBtYXAnLFxuXHRcdFx0Z3JhZGllbnRUeXBlOiAnc29saWQnLFxuXHRcdH07XG5cblx0XHRpbmZvLnJldmVyc2UgPSAhIXJlYWRVaW50OChyZWFkZXIpO1xuXHRcdGluZm8uZGl0aGVyID0gISFyZWFkVWludDgocmVhZGVyKTtcblx0XHRpbmZvLm5hbWUgPSByZWFkVW5pY29kZVN0cmluZyhyZWFkZXIpO1xuXHRcdGluZm8uY29sb3JTdG9wcyA9IFtdO1xuXHRcdGluZm8ub3BhY2l0eVN0b3BzID0gW107XG5cblx0XHRjb25zdCBzdG9wc0NvdW50ID0gcmVhZFVpbnQxNihyZWFkZXIpO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBzdG9wc0NvdW50OyBpKyspIHtcblx0XHRcdGluZm8uY29sb3JTdG9wcy5wdXNoKHtcblx0XHRcdFx0bG9jYXRpb246IHJlYWRVaW50MzIocmVhZGVyKSxcblx0XHRcdFx0bWlkcG9pbnQ6IHJlYWRVaW50MzIocmVhZGVyKSAvIDEwMCxcblx0XHRcdFx0Y29sb3I6IHJlYWRDb2xvcihyZWFkZXIpLFxuXHRcdFx0fSk7XG5cdFx0XHRza2lwQnl0ZXMocmVhZGVyLCAyKTtcblx0XHR9XG5cblx0XHRjb25zdCBvcGFjaXR5U3RvcHNDb3VudCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgb3BhY2l0eVN0b3BzQ291bnQ7IGkrKykge1xuXHRcdFx0aW5mby5vcGFjaXR5U3RvcHMucHVzaCh7XG5cdFx0XHRcdGxvY2F0aW9uOiByZWFkVWludDMyKHJlYWRlciksXG5cdFx0XHRcdG1pZHBvaW50OiByZWFkVWludDMyKHJlYWRlcikgLyAxMDAsXG5cdFx0XHRcdG9wYWNpdHk6IHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ZmYsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBleHBhbnNpb25Db3VudCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRpZiAoZXhwYW5zaW9uQ291bnQgIT09IDIpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBncmRtIGV4cGFuc2lvbiBjb3VudCcpO1xuXG5cdFx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRpbmZvLnNtb290aG5lc3MgPSBpbnRlcnBvbGF0aW9uIC8gNDA5NjtcblxuXHRcdGNvbnN0IGxlbmd0aCA9IHJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRpZiAobGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdyZG0gbGVuZ3RoJyk7XG5cblx0XHRpbmZvLmdyYWRpZW50VHlwZSA9IHJlYWRVaW50MTYocmVhZGVyKSA/ICdub2lzZScgOiAnc29saWQnO1xuXHRcdGluZm8ucmFuZG9tU2VlZCA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRpbmZvLmFkZFRyYW5zcGFyZW5jeSA9ICEhcmVhZFVpbnQxNihyZWFkZXIpO1xuXHRcdGluZm8ucmVzdHJpY3RDb2xvcnMgPSAhIXJlYWRVaW50MTYocmVhZGVyKTtcblx0XHRpbmZvLnJvdWdobmVzcyA9IHJlYWRVaW50MzIocmVhZGVyKSAvIDQwOTY7XG5cdFx0aW5mby5jb2xvck1vZGVsID0gKGdyZG1Db2xvck1vZGVsc1tyZWFkVWludDE2KHJlYWRlcildIHx8ICdyZ2InKSBhcyAncmdiJyB8ICdoc2InIHwgJ2xhYic7XG5cblx0XHRpbmZvLm1pbiA9IFtcblx0XHRcdHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ODAwMCxcblx0XHRcdHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ODAwMCxcblx0XHRcdHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ODAwMCxcblx0XHRcdHJlYWRVaW50MTYocmVhZGVyKSAvIDB4ODAwMCxcblx0XHRdO1xuXG5cdFx0aW5mby5tYXggPSBbXG5cdFx0XHRyZWFkVWludDE2KHJlYWRlcikgLyAweDgwMDAsXG5cdFx0XHRyZWFkVWludDE2KHJlYWRlcikgLyAweDgwMDAsXG5cdFx0XHRyZWFkVWludDE2KHJlYWRlcikgLyAweDgwMDAsXG5cdFx0XHRyZWFkVWludDE2KHJlYWRlcikgLyAweDgwMDAsXG5cdFx0XTtcblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cblx0XHRmb3IgKGNvbnN0IHMgb2YgaW5mby5jb2xvclN0b3BzKSBzLmxvY2F0aW9uIC89IGludGVycG9sYXRpb247XG5cdFx0Zm9yIChjb25zdCBzIG9mIGluZm8ub3BhY2l0eVN0b3BzKSBzLmxvY2F0aW9uIC89IGludGVycG9sYXRpb247XG5cblx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IGluZm87XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGluZm8gPSB0YXJnZXQuYWRqdXN0bWVudCBhcyBHcmFkaWVudE1hcEFkanVzdG1lbnQ7XG5cblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDEpOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVVaW50OCh3cml0ZXIsIGluZm8ucmV2ZXJzZSA/IDEgOiAwKTtcblx0XHR3cml0ZVVpbnQ4KHdyaXRlciwgaW5mby5kaXRoZXIgPyAxIDogMCk7XG5cdFx0d3JpdGVVbmljb2RlU3RyaW5nV2l0aFBhZGRpbmcod3JpdGVyLCBpbmZvLm5hbWUgfHwgJycpO1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgaW5mby5jb2xvclN0b3BzICYmIGluZm8uY29sb3JTdG9wcy5sZW5ndGggfHwgMCk7XG5cblx0XHRjb25zdCBpbnRlcnBvbGF0aW9uID0gTWF0aC5yb3VuZCgoaW5mby5zbW9vdGhuZXNzID8/IDEpICogNDA5Nik7XG5cblx0XHRmb3IgKGNvbnN0IHMgb2YgaW5mby5jb2xvclN0b3BzIHx8IFtdKSB7XG5cdFx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIE1hdGgucm91bmQocy5sb2NhdGlvbiAqIGludGVycG9sYXRpb24pKTtcblx0XHRcdHdyaXRlVWludDMyKHdyaXRlciwgTWF0aC5yb3VuZChzLm1pZHBvaW50ICogMTAwKSk7XG5cdFx0XHR3cml0ZUNvbG9yKHdyaXRlciwgcy5jb2xvcik7XG5cdFx0XHR3cml0ZVplcm9zKHdyaXRlciwgMik7XG5cdFx0fVxuXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBpbmZvLm9wYWNpdHlTdG9wcyAmJiBpbmZvLm9wYWNpdHlTdG9wcy5sZW5ndGggfHwgMCk7XG5cblx0XHRmb3IgKGNvbnN0IHMgb2YgaW5mby5vcGFjaXR5U3RvcHMgfHwgW10pIHtcblx0XHRcdHdyaXRlVWludDMyKHdyaXRlciwgTWF0aC5yb3VuZChzLmxvY2F0aW9uICogaW50ZXJwb2xhdGlvbikpO1xuXHRcdFx0d3JpdGVVaW50MzIod3JpdGVyLCBNYXRoLnJvdW5kKHMubWlkcG9pbnQgKiAxMDApKTtcblx0XHRcdHdyaXRlVWludDE2KHdyaXRlciwgTWF0aC5yb3VuZChzLm9wYWNpdHkgKiAweGZmKSk7XG5cdFx0fVxuXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCAyKTsgLy8gZXhwYW5zaW9uIGNvdW50XG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBpbnRlcnBvbGF0aW9uKTtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIDMyKTsgLy8gbGVuZ3RoXG5cdFx0d3JpdGVVaW50MTYod3JpdGVyLCBpbmZvLmdyYWRpZW50VHlwZSA9PT0gJ25vaXNlJyA/IDEgOiAwKTtcblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIGluZm8ucmFuZG9tU2VlZCB8fCAwKTtcblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIGluZm8uYWRkVHJhbnNwYXJlbmN5ID8gMSA6IDApO1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgaW5mby5yZXN0cmljdENvbG9ycyA/IDEgOiAwKTtcblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIE1hdGgucm91bmQoKGluZm8ucm91Z2huZXNzID8/IDEpICogNDA5NikpO1xuXHRcdGNvbnN0IGNvbG9yTW9kZWwgPSBncmRtQ29sb3JNb2RlbHMuaW5kZXhPZihpbmZvLmNvbG9yTW9kZWwgPz8gJ3JnYicpO1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgY29sb3JNb2RlbCA9PT0gLTEgPyAzIDogY29sb3JNb2RlbCk7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKylcblx0XHRcdHdyaXRlVWludDE2KHdyaXRlciwgTWF0aC5yb3VuZCgoaW5mby5taW4gJiYgaW5mby5taW5baV0gfHwgMCkgKiAweDgwMDApKTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKVxuXHRcdFx0d3JpdGVVaW50MTYod3JpdGVyLCBNYXRoLnJvdW5kKChpbmZvLm1heCAmJiBpbmZvLm1heFtpXSB8fCAwKSAqIDB4ODAwMCkpO1xuXG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDQpO1xuXHR9LFxuKTtcblxuZnVuY3Rpb24gcmVhZFNlbGVjdGl2ZUNvbG9ycyhyZWFkZXI6IFBzZFJlYWRlcik6IENNWUsge1xuXHRyZXR1cm4ge1xuXHRcdGM6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdG06IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdHk6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHRcdGs6IHJlYWRJbnQxNihyZWFkZXIpLFxuXHR9O1xufVxuXG5mdW5jdGlvbiB3cml0ZVNlbGVjdGl2ZUNvbG9ycyh3cml0ZXI6IFBzZFdyaXRlciwgY215azogQ01ZSyB8IHVuZGVmaW5lZCkge1xuXHRjb25zdCBjID0gY215ayB8fCB7fSBhcyBQYXJ0aWFsPENNWUs+O1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5jISk7XG5cdHdyaXRlSW50MTYod3JpdGVyLCBjLm0hKTtcblx0d3JpdGVJbnQxNih3cml0ZXIsIGMueSEpO1xuXHR3cml0ZUludDE2KHdyaXRlciwgYy5rISk7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdzZWxjJyxcblx0YWRqdXN0bWVudFR5cGUoJ3NlbGVjdGl2ZSBjb2xvcicpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHtcblx0XHRpZiAocmVhZFVpbnQxNihyZWFkZXIpICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2VsYyB2ZXJzaW9uJyk7XG5cblx0XHRjb25zdCBtb2RlID0gcmVhZFVpbnQxNihyZWFkZXIpID8gJ2Fic29sdXRlJyA6ICdyZWxhdGl2ZSc7XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgOCk7XG5cblx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHtcblx0XHRcdHR5cGU6ICdzZWxlY3RpdmUgY29sb3InLFxuXHRcdFx0bW9kZSxcblx0XHRcdHJlZHM6IHJlYWRTZWxlY3RpdmVDb2xvcnMocmVhZGVyKSxcblx0XHRcdHllbGxvd3M6IHJlYWRTZWxlY3RpdmVDb2xvcnMocmVhZGVyKSxcblx0XHRcdGdyZWVuczogcmVhZFNlbGVjdGl2ZUNvbG9ycyhyZWFkZXIpLFxuXHRcdFx0Y3lhbnM6IHJlYWRTZWxlY3RpdmVDb2xvcnMocmVhZGVyKSxcblx0XHRcdGJsdWVzOiByZWFkU2VsZWN0aXZlQ29sb3JzKHJlYWRlciksXG5cdFx0XHRtYWdlbnRhczogcmVhZFNlbGVjdGl2ZUNvbG9ycyhyZWFkZXIpLFxuXHRcdFx0d2hpdGVzOiByZWFkU2VsZWN0aXZlQ29sb3JzKHJlYWRlciksXG5cdFx0XHRuZXV0cmFsczogcmVhZFNlbGVjdGl2ZUNvbG9ycyhyZWFkZXIpLFxuXHRcdFx0YmxhY2tzOiByZWFkU2VsZWN0aXZlQ29sb3JzKHJlYWRlciksXG5cdFx0fTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Y29uc3QgaW5mbyA9IHRhcmdldC5hZGp1c3RtZW50IGFzIFNlbGVjdGl2ZUNvbG9yQWRqdXN0bWVudDtcblxuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgMSk7IC8vIHZlcnNpb25cblx0XHR3cml0ZVVpbnQxNih3cml0ZXIsIGluZm8ubW9kZSA9PT0gJ2Fic29sdXRlJyA/IDEgOiAwKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgOCk7XG5cdFx0d3JpdGVTZWxlY3RpdmVDb2xvcnMod3JpdGVyLCBpbmZvLnJlZHMpO1xuXHRcdHdyaXRlU2VsZWN0aXZlQ29sb3JzKHdyaXRlciwgaW5mby55ZWxsb3dzKTtcblx0XHR3cml0ZVNlbGVjdGl2ZUNvbG9ycyh3cml0ZXIsIGluZm8uZ3JlZW5zKTtcblx0XHR3cml0ZVNlbGVjdGl2ZUNvbG9ycyh3cml0ZXIsIGluZm8uY3lhbnMpO1xuXHRcdHdyaXRlU2VsZWN0aXZlQ29sb3JzKHdyaXRlciwgaW5mby5ibHVlcyk7XG5cdFx0d3JpdGVTZWxlY3RpdmVDb2xvcnMod3JpdGVyLCBpbmZvLm1hZ2VudGFzKTtcblx0XHR3cml0ZVNlbGVjdGl2ZUNvbG9ycyh3cml0ZXIsIGluZm8ud2hpdGVzKTtcblx0XHR3cml0ZVNlbGVjdGl2ZUNvbG9ycyh3cml0ZXIsIGluZm8ubmV1dHJhbHMpO1xuXHRcdHdyaXRlU2VsZWN0aXZlQ29sb3JzKHdyaXRlciwgaW5mby5ibGFja3MpO1xuXHR9LFxuKTtcblxuaW50ZXJmYWNlIEJyaWdodG5lc3NDb250cmFzdERlc2NyaXB0b3Ige1xuXHRWcnNuOiBudW1iZXI7XG5cdEJyZ2g6IG51bWJlcjtcblx0Q250cjogbnVtYmVyO1xuXHRtZWFuczogbnVtYmVyO1xuXHQnTGFiICc6IGJvb2xlYW47XG5cdHVzZUxlZ2FjeTogYm9vbGVhbjtcblx0QXV0bzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFByZXNldERlc2NyaXB0b3Ige1xuXHRWcnNuOiBudW1iZXI7XG5cdHByZXNldEtpbmQ6IG51bWJlcjtcblx0cHJlc2V0RmlsZU5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEN1cnZlc1ByZXNldERlc2NyaXB0b3Ige1xuXHRWcnNuOiBudW1iZXI7XG5cdGN1cnZlc1ByZXNldEtpbmQ6IG51bWJlcjtcblx0Y3VydmVzUHJlc2V0RmlsZU5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE1peGVyUHJlc2V0RGVzY3JpcHRvciB7XG5cdFZyc246IG51bWJlcjtcblx0bWl4ZXJQcmVzZXRLaW5kOiBudW1iZXI7XG5cdG1peGVyUHJlc2V0RmlsZU5hbWU6IHN0cmluZztcbn1cblxuYWRkSGFuZGxlcihcblx0J0NnRWQnLFxuXHR0YXJnZXQgPT4ge1xuXHRcdGNvbnN0IGEgPSB0YXJnZXQuYWRqdXN0bWVudDtcblxuXHRcdGlmICghYSkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIChhLnR5cGUgPT09ICdicmlnaHRuZXNzL2NvbnRyYXN0JyAmJiAhYS51c2VMZWdhY3kpIHx8XG5cdFx0XHQoKGEudHlwZSA9PT0gJ2xldmVscycgfHwgYS50eXBlID09PSAnY3VydmVzJyB8fCBhLnR5cGUgPT09ICdleHBvc3VyZScgfHwgYS50eXBlID09PSAnY2hhbm5lbCBtaXhlcicgfHxcblx0XHRcdFx0YS50eXBlID09PSAnaHVlL3NhdHVyYXRpb24nKSAmJiBhLnByZXNldEZpbGVOYW1lICE9PSB1bmRlZmluZWQpO1xuXHR9LFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRjb25zdCBkZXNjID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcikgYXNcblx0XHRcdEJyaWdodG5lc3NDb250cmFzdERlc2NyaXB0b3IgfCBQcmVzZXREZXNjcmlwdG9yIHwgQ3VydmVzUHJlc2V0RGVzY3JpcHRvciB8IE1peGVyUHJlc2V0RGVzY3JpcHRvcjtcblx0XHRpZiAoZGVzYy5WcnNuICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQ2dFZCB2ZXJzaW9uJyk7XG5cblx0XHQvLyB0aGlzIHNlY3Rpb24gY2FuIHNwZWNpZnkgcHJlc2V0IGZpbGUgbmFtZSBmb3Igb3RoZXIgYWRqdXN0bWVudCB0eXBlc1xuXHRcdGlmICgncHJlc2V0RmlsZU5hbWUnIGluIGRlc2MpIHtcblx0XHRcdHRhcmdldC5hZGp1c3RtZW50ID0ge1xuXHRcdFx0XHQuLi50YXJnZXQuYWRqdXN0bWVudCBhcyBMZXZlbHNBZGp1c3RtZW50IHwgRXhwb3N1cmVBZGp1c3RtZW50IHwgSHVlU2F0dXJhdGlvbkFkanVzdG1lbnQsXG5cdFx0XHRcdHByZXNldEtpbmQ6IGRlc2MucHJlc2V0S2luZCxcblx0XHRcdFx0cHJlc2V0RmlsZU5hbWU6IGRlc2MucHJlc2V0RmlsZU5hbWUsXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSBpZiAoJ2N1cnZlc1ByZXNldEZpbGVOYW1lJyBpbiBkZXNjKSB7XG5cdFx0XHR0YXJnZXQuYWRqdXN0bWVudCA9IHtcblx0XHRcdFx0Li4udGFyZ2V0LmFkanVzdG1lbnQgYXMgQ3VydmVzQWRqdXN0bWVudCxcblx0XHRcdFx0cHJlc2V0S2luZDogZGVzYy5jdXJ2ZXNQcmVzZXRLaW5kLFxuXHRcdFx0XHRwcmVzZXRGaWxlTmFtZTogZGVzYy5jdXJ2ZXNQcmVzZXRGaWxlTmFtZSxcblx0XHRcdH07XG5cdFx0fSBlbHNlIGlmICgnbWl4ZXJQcmVzZXRGaWxlTmFtZScgaW4gZGVzYykge1xuXHRcdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7XG5cdFx0XHRcdC4uLnRhcmdldC5hZGp1c3RtZW50IGFzIEN1cnZlc0FkanVzdG1lbnQsXG5cdFx0XHRcdHByZXNldEtpbmQ6IGRlc2MubWl4ZXJQcmVzZXRLaW5kLFxuXHRcdFx0XHRwcmVzZXRGaWxlTmFtZTogZGVzYy5taXhlclByZXNldEZpbGVOYW1lLFxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGFyZ2V0LmFkanVzdG1lbnQgPSB7XG5cdFx0XHRcdHR5cGU6ICdicmlnaHRuZXNzL2NvbnRyYXN0Jyxcblx0XHRcdFx0YnJpZ2h0bmVzczogZGVzYy5CcmdoLFxuXHRcdFx0XHRjb250cmFzdDogZGVzYy5DbnRyLFxuXHRcdFx0XHRtZWFuVmFsdWU6IGRlc2MubWVhbnMsXG5cdFx0XHRcdHVzZUxlZ2FjeTogISFkZXNjLnVzZUxlZ2FjeSxcblx0XHRcdFx0bGFiQ29sb3JPbmx5OiAhIWRlc2NbJ0xhYiAnXSxcblx0XHRcdFx0YXV0bzogISFkZXNjLkF1dG8sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGluZm8gPSB0YXJnZXQuYWRqdXN0bWVudCE7XG5cblx0XHRpZiAoaW5mby50eXBlID09PSAnbGV2ZWxzJyB8fCBpbmZvLnR5cGUgPT09ICdleHBvc3VyZScgfHwgaW5mby50eXBlID09PSAnaHVlL3NhdHVyYXRpb24nKSB7XG5cdFx0XHRjb25zdCBkZXNjOiBQcmVzZXREZXNjcmlwdG9yID0ge1xuXHRcdFx0XHRWcnNuOiAxLFxuXHRcdFx0XHRwcmVzZXRLaW5kOiBpbmZvLnByZXNldEtpbmQgPz8gMSxcblx0XHRcdFx0cHJlc2V0RmlsZU5hbWU6IGluZm8ucHJlc2V0RmlsZU5hbWUgfHwgJycsXG5cdFx0XHR9O1xuXHRcdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHRcdH0gZWxzZSBpZiAoaW5mby50eXBlID09PSAnY3VydmVzJykge1xuXHRcdFx0Y29uc3QgZGVzYzogQ3VydmVzUHJlc2V0RGVzY3JpcHRvciA9IHtcblx0XHRcdFx0VnJzbjogMSxcblx0XHRcdFx0Y3VydmVzUHJlc2V0S2luZDogaW5mby5wcmVzZXRLaW5kID8/IDEsXG5cdFx0XHRcdGN1cnZlc1ByZXNldEZpbGVOYW1lOiBpbmZvLnByZXNldEZpbGVOYW1lIHx8ICcnLFxuXHRcdFx0fTtcblx0XHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCBkZXNjKTtcblx0XHR9IGVsc2UgaWYgKGluZm8udHlwZSA9PT0gJ2NoYW5uZWwgbWl4ZXInKSB7XG5cdFx0XHRjb25zdCBkZXNjOiBNaXhlclByZXNldERlc2NyaXB0b3IgPSB7XG5cdFx0XHRcdFZyc246IDEsXG5cdFx0XHRcdG1peGVyUHJlc2V0S2luZDogaW5mby5wcmVzZXRLaW5kID8/IDEsXG5cdFx0XHRcdG1peGVyUHJlc2V0RmlsZU5hbWU6IGluZm8ucHJlc2V0RmlsZU5hbWUgfHwgJycsXG5cdFx0XHR9O1xuXHRcdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHRcdH0gZWxzZSBpZiAoaW5mby50eXBlID09PSAnYnJpZ2h0bmVzcy9jb250cmFzdCcpIHtcblx0XHRcdGNvbnN0IGRlc2M6IEJyaWdodG5lc3NDb250cmFzdERlc2NyaXB0b3IgPSB7XG5cdFx0XHRcdFZyc246IDEsXG5cdFx0XHRcdEJyZ2g6IGluZm8uYnJpZ2h0bmVzcyB8fCAwLFxuXHRcdFx0XHRDbnRyOiBpbmZvLmNvbnRyYXN0IHx8IDAsXG5cdFx0XHRcdG1lYW5zOiBpbmZvLm1lYW5WYWx1ZSA/PyAxMjcsXG5cdFx0XHRcdCdMYWIgJzogISFpbmZvLmxhYkNvbG9yT25seSxcblx0XHRcdFx0dXNlTGVnYWN5OiAhIWluZm8udXNlTGVnYWN5LFxuXHRcdFx0XHRBdXRvOiAhIWluZm8uYXV0byxcblx0XHRcdH07XG5cdFx0XHR3cml0ZVZlcnNpb25BbmREZXNjcmlwdG9yKHdyaXRlciwgJycsICdudWxsJywgZGVzYyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5oYW5kbGVkIENnRWQgY2FzZScpO1xuXHRcdH1cblx0fSxcbik7XG5cbmFkZEhhbmRsZXIoXG5cdCdUeHQyJyxcblx0aGFzS2V5KCdlbmdpbmVEYXRhJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdGNvbnN0IGRhdGEgPSByZWFkQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHRcdHRhcmdldC5lbmdpbmVEYXRhID0gZnJvbUJ5dGVBcnJheShkYXRhKTtcblx0XHQvLyBjb25zdCBlbmdpbmVEYXRhID0gcGFyc2VFbmdpbmVEYXRhKGRhdGEpO1xuXHRcdC8vIGNvbnNvbGUubG9nKHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGVuZ2luZURhdGEsIGZhbHNlLCA5OSwgdHJ1ZSkpO1xuXHRcdC8vIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygncmVzb3VyY2VzL2VuZ2luZURhdGEyU2ltcGxlLnR4dCcsIHJlcXVpcmUoJ3V0aWwnKS5pbnNwZWN0KGVuZ2luZURhdGEsIGZhbHNlLCA5OSwgZmFsc2UpLCAndXRmOCcpO1xuXHRcdC8vIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygndGVzdF9kYXRhLmpzb24nLCBKU09OLnN0cmluZ2lmeShlZCwgbnVsbCwgMiksICd1dGY4Jyk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IHRvQnl0ZUFycmF5KHRhcmdldC5lbmdpbmVEYXRhISk7XG5cdFx0d3JpdGVCeXRlcyh3cml0ZXIsIGJ1ZmZlcik7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnRk1zaycsXG5cdGhhc0tleSgnZmlsdGVyTWFzaycpLFxuXHQocmVhZGVyLCB0YXJnZXQpID0+IHtcblx0XHR0YXJnZXQuZmlsdGVyTWFzayA9IHtcblx0XHRcdGNvbG9yU3BhY2U6IHJlYWRDb2xvcihyZWFkZXIpLFxuXHRcdFx0b3BhY2l0eTogcmVhZFVpbnQxNihyZWFkZXIpIC8gMHhmZixcblx0XHR9O1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHR3cml0ZUNvbG9yKHdyaXRlciwgdGFyZ2V0LmZpbHRlck1hc2shLmNvbG9yU3BhY2UpO1xuXHRcdHdyaXRlVWludDE2KHdyaXRlciwgY2xhbXAodGFyZ2V0LmZpbHRlck1hc2shLm9wYWNpdHkgPz8gMSwgMCwgMSkgKiAweGZmKTtcblx0fSxcbik7XG5cbmludGVyZmFjZSBBcnRkRGVzY3JpcHRvciB7XG5cdCdDbnQgJzogbnVtYmVyO1xuXHRhdXRvRXhwYW5kT2Zmc2V0OiB7IEhyem46IG51bWJlcjsgVnJ0YzogbnVtYmVyOyB9O1xuXHRvcmlnaW46IHsgSHJ6bjogbnVtYmVyOyBWcnRjOiBudW1iZXI7IH07XG5cdGF1dG9FeHBhbmRFbmFibGVkOiBib29sZWFuO1xuXHRhdXRvTmVzdEVuYWJsZWQ6IGJvb2xlYW47XG5cdGF1dG9Qb3NpdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG5cdHNocmlua3dyYXBPblNhdmVFbmFibGVkOiBib29sZWFuO1xuXHRkb2NEZWZhdWx0TmV3QXJ0Ym9hcmRCYWNrZ3JvdW5kQ29sb3I6IERlc2NyaXB0b3JDb2xvcjtcblx0ZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZFR5cGU6IG51bWJlcjtcbn1cblxuYWRkSGFuZGxlcihcblx0J2FydGQnLCAvLyBkb2N1bWVudC13aWRlIGFydGJvYXJkIGluZm9cblx0dGFyZ2V0ID0+ICh0YXJnZXQgYXMgUHNkKS5hcnRib2FyZHMgIT09IHVuZGVmaW5lZCxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0KSA9PiB7XG5cdFx0Y29uc3QgZGVzYyA9IHJlYWRWZXJzaW9uQW5kRGVzY3JpcHRvcihyZWFkZXIpIGFzIEFydGREZXNjcmlwdG9yO1xuXHRcdCh0YXJnZXQgYXMgUHNkKS5hcnRib2FyZHMgPSB7XG5cdFx0XHRjb3VudDogZGVzY1snQ250ICddLFxuXHRcdFx0YXV0b0V4cGFuZE9mZnNldDogeyBob3Jpem9udGFsOiBkZXNjLmF1dG9FeHBhbmRPZmZzZXQuSHJ6biwgdmVydGljYWw6IGRlc2MuYXV0b0V4cGFuZE9mZnNldC5WcnRjIH0sXG5cdFx0XHRvcmlnaW46IHsgaG9yaXpvbnRhbDogZGVzYy5vcmlnaW4uSHJ6biwgdmVydGljYWw6IGRlc2Mub3JpZ2luLlZydGMgfSxcblx0XHRcdGF1dG9FeHBhbmRFbmFibGVkOiBkZXNjLmF1dG9FeHBhbmRFbmFibGVkLFxuXHRcdFx0YXV0b05lc3RFbmFibGVkOiBkZXNjLmF1dG9OZXN0RW5hYmxlZCxcblx0XHRcdGF1dG9Qb3NpdGlvbkVuYWJsZWQ6IGRlc2MuYXV0b1Bvc2l0aW9uRW5hYmxlZCxcblx0XHRcdHNocmlua3dyYXBPblNhdmVFbmFibGVkOiBkZXNjLnNocmlua3dyYXBPblNhdmVFbmFibGVkLFxuXHRcdFx0ZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZENvbG9yOiBwYXJzZUNvbG9yKGRlc2MuZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZENvbG9yKSxcblx0XHRcdGRvY0RlZmF1bHROZXdBcnRib2FyZEJhY2tncm91bmRUeXBlOiBkZXNjLmRvY0RlZmF1bHROZXdBcnRib2FyZEJhY2tncm91bmRUeXBlLFxuXHRcdH07XG5cblx0XHRza2lwQnl0ZXMocmVhZGVyLCBsZWZ0KCkpO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHRjb25zdCBhcnRiID0gKHRhcmdldCBhcyBQc2QpLmFydGJvYXJkcyE7XG5cdFx0Y29uc3QgZGVzYzogQXJ0ZERlc2NyaXB0b3IgPSB7XG5cdFx0XHQnQ250ICc6IGFydGIuY291bnQsXG5cdFx0XHRhdXRvRXhwYW5kT2Zmc2V0OiBhcnRiLmF1dG9FeHBhbmRPZmZzZXQgPyB7IEhyem46IGFydGIuYXV0b0V4cGFuZE9mZnNldC5ob3Jpem9udGFsLCBWcnRjOiBhcnRiLmF1dG9FeHBhbmRPZmZzZXQudmVydGljYWwgfSA6IHsgSHJ6bjogMCwgVnJ0YzogMCB9LFxuXHRcdFx0b3JpZ2luOiBhcnRiLm9yaWdpbiA/IHsgSHJ6bjogYXJ0Yi5vcmlnaW4uaG9yaXpvbnRhbCwgVnJ0YzogYXJ0Yi5vcmlnaW4udmVydGljYWwgfSA6IHsgSHJ6bjogMCwgVnJ0YzogMCB9LFxuXHRcdFx0YXV0b0V4cGFuZEVuYWJsZWQ6IGFydGIuYXV0b0V4cGFuZEVuYWJsZWQgPz8gdHJ1ZSxcblx0XHRcdGF1dG9OZXN0RW5hYmxlZDogYXJ0Yi5hdXRvTmVzdEVuYWJsZWQgPz8gdHJ1ZSxcblx0XHRcdGF1dG9Qb3NpdGlvbkVuYWJsZWQ6IGFydGIuYXV0b1Bvc2l0aW9uRW5hYmxlZCA/PyB0cnVlLFxuXHRcdFx0c2hyaW5rd3JhcE9uU2F2ZUVuYWJsZWQ6IGFydGIuc2hyaW5rd3JhcE9uU2F2ZUVuYWJsZWQgPz8gdHJ1ZSxcblx0XHRcdGRvY0RlZmF1bHROZXdBcnRib2FyZEJhY2tncm91bmRDb2xvcjogc2VyaWFsaXplQ29sb3IoYXJ0Yi5kb2NEZWZhdWx0TmV3QXJ0Ym9hcmRCYWNrZ3JvdW5kQ29sb3IpLFxuXHRcdFx0ZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZFR5cGU6IGFydGIuZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZFR5cGUgPz8gMSxcblx0XHR9O1xuXHRcdHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCBkZXNjLCAnYXJ0ZCcpO1xuXHR9LFxuKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGhhc011bHRpRWZmZWN0cyhlZmZlY3RzOiBMYXllckVmZmVjdHNJbmZvKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhlZmZlY3RzKS5tYXAoa2V5ID0+IChlZmZlY3RzIGFzIGFueSlba2V5XSkuc29tZSh2ID0+IEFycmF5LmlzQXJyYXkodikgJiYgdi5sZW5ndGggPiAxKTtcbn1cblxuYWRkSGFuZGxlcihcblx0J2xmeDInLFxuXHR0YXJnZXQgPT4gdGFyZ2V0LmVmZmVjdHMgIT09IHVuZGVmaW5lZCAmJiAhaGFzTXVsdGlFZmZlY3RzKHRhcmdldC5lZmZlY3RzKSxcblx0KHJlYWRlciwgdGFyZ2V0LCBsZWZ0LCBfLCBvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgdmVyc2lvbiA9IHJlYWRVaW50MzIocmVhZGVyKTtcblx0XHRpZiAodmVyc2lvbiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxmeDIgdmVyc2lvbmApO1xuXG5cdFx0Y29uc3QgZGVzYzogTGZ4MkRlc2NyaXB0b3IgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblx0XHQvLyBjb25zb2xlLmxvZyhyZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcblxuXHRcdC8vIFRPRE86IGRvbid0IGRpc2NhcmQgaWYgd2UgZ290IGl0IGZyb20gbG1meFxuXHRcdC8vIGRpc2NhcmQgaWYgcmVhZCBpbiAnbHJGWCcgc2VjdGlvblxuXHRcdHRhcmdldC5lZmZlY3RzID0gcGFyc2VFZmZlY3RzKGRlc2MsICEhb3B0aW9ucy5sb2dNaXNzaW5nRmVhdHVyZXMpO1xuXG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgbGVmdCgpKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0LCBfLCBvcHRpb25zKSA9PiB7XG5cdFx0Y29uc3QgZGVzYyA9IHNlcmlhbGl6ZUVmZmVjdHModGFyZ2V0LmVmZmVjdHMhLCAhIW9wdGlvbnMubG9nTWlzc2luZ0ZlYXR1cmVzLCBmYWxzZSk7XG5cdFx0Ly8gY29uc29sZS5sb2cocmVxdWlyZSgndXRpbCcpLmluc3BlY3QoZGVzYywgZmFsc2UsIDk5LCB0cnVlKSk7XG5cblx0XHR3cml0ZVVpbnQzMih3cml0ZXIsIDApOyAvLyB2ZXJzaW9uXG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHR9LFxuKTtcblxuaW50ZXJmYWNlIENpbmZEZXNjcmlwdG9yIHtcblx0VnJzbjogeyBtYWpvcjogbnVtYmVyOyBtaW5vcjogbnVtYmVyOyBmaXg6IG51bWJlcjsgfTtcblx0cHNWZXJzaW9uPzogeyBtYWpvcjogbnVtYmVyOyBtaW5vcjogbnVtYmVyOyBmaXg6IG51bWJlcjsgfTtcblx0ZGVzY3JpcHRpb246IHN0cmluZztcblx0cmVhc29uOiBzdHJpbmc7XG5cdEVuZ246IHN0cmluZzsgLy8gJ0VuZ24uY29tcENvcmUnO1xuXHRlbmFibGVDb21wQ29yZTogc3RyaW5nOyAvLyAnZW5hYmxlLmZlYXR1cmUnO1xuXHRlbmFibGVDb21wQ29yZUdQVTogc3RyaW5nOyAvLyAnZW5hYmxlLmZlYXR1cmUnO1xuXHRlbmFibGVDb21wQ29yZVRocmVhZHM/OiBzdHJpbmc7IC8vICdlbmFibGUuZmVhdHVyZSc7XG5cdGNvbXBDb3JlU3VwcG9ydDogc3RyaW5nOyAvLyAncmVhc29uLnN1cHBvcnRlZCc7XG5cdGNvbXBDb3JlR1BVU3VwcG9ydDogc3RyaW5nOyAvLyAncmVhc29uLmZlYXR1cmVEaXNhYmxlZCc7XG59XG5cbmFkZEhhbmRsZXIoXG5cdCdjaW5mJyxcblx0aGFzS2V5KCdjb21wb3NpdG9yVXNlZCcpLFxuXHQocmVhZGVyLCB0YXJnZXQsIGxlZnQpID0+IHtcblx0XHRjb25zdCBkZXNjID0gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcikgYXMgQ2luZkRlc2NyaXB0b3I7XG5cdFx0Ly8gY29uc29sZS5sb2cocmVxdWlyZSgndXRpbCcpLmluc3BlY3QoZGVzYywgZmFsc2UsIDk5LCB0cnVlKSk7XG5cblx0XHR0YXJnZXQuY29tcG9zaXRvclVzZWQgPSB7XG5cdFx0XHRkZXNjcmlwdGlvbjogZGVzYy5kZXNjcmlwdGlvbixcblx0XHRcdHJlYXNvbjogZGVzYy5yZWFzb24sXG5cdFx0XHRlbmdpbmU6IGRlc2MuRW5nbi5zcGxpdCgnLicpWzFdLFxuXHRcdFx0ZW5hYmxlQ29tcENvcmU6IGRlc2MuZW5hYmxlQ29tcENvcmUuc3BsaXQoJy4nKVsxXSxcblx0XHRcdGVuYWJsZUNvbXBDb3JlR1BVOiBkZXNjLmVuYWJsZUNvbXBDb3JlR1BVLnNwbGl0KCcuJylbMV0sXG5cdFx0XHRjb21wQ29yZVN1cHBvcnQ6IGRlc2MuY29tcENvcmVTdXBwb3J0LnNwbGl0KCcuJylbMV0sXG5cdFx0XHRjb21wQ29yZUdQVVN1cHBvcnQ6IGRlc2MuY29tcENvcmVHUFVTdXBwb3J0LnNwbGl0KCcuJylbMV0sXG5cdFx0fTtcblxuXHRcdHNraXBCeXRlcyhyZWFkZXIsIGxlZnQoKSk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGNpbmYgPSB0YXJnZXQuY29tcG9zaXRvclVzZWQhO1xuXHRcdGNvbnN0IGRlc2M6IENpbmZEZXNjcmlwdG9yID0ge1xuXHRcdFx0VnJzbjogeyBtYWpvcjogMSwgbWlub3I6IDAsIGZpeDogMCB9LCAvLyBURU1QXG5cdFx0XHQvLyBwc1ZlcnNpb246IHsgbWFqb3I6IDIyLCBtaW5vcjogMywgZml4OiAxIH0sIC8vIFRFU1RJTkdcblx0XHRcdGRlc2NyaXB0aW9uOiBjaW5mLmRlc2NyaXB0aW9uLFxuXHRcdFx0cmVhc29uOiBjaW5mLnJlYXNvbixcblx0XHRcdEVuZ246IGBFbmduLiR7Y2luZi5lbmdpbmV9YCxcblx0XHRcdGVuYWJsZUNvbXBDb3JlOiBgZW5hYmxlLiR7Y2luZi5lbmFibGVDb21wQ29yZX1gLFxuXHRcdFx0ZW5hYmxlQ29tcENvcmVHUFU6IGBlbmFibGUuJHtjaW5mLmVuYWJsZUNvbXBDb3JlR1BVfWAsXG5cdFx0XHQvLyBlbmFibGVDb21wQ29yZVRocmVhZHM6IGBlbmFibGUuZmVhdHVyZWAsIC8vIFRFU1RJTkdcblx0XHRcdGNvbXBDb3JlU3VwcG9ydDogYHJlYXNvbi4ke2NpbmYuY29tcENvcmVTdXBwb3J0fWAsXG5cdFx0XHRjb21wQ29yZUdQVVN1cHBvcnQ6IGByZWFzb24uJHtjaW5mLmNvbXBDb3JlR1BVU3VwcG9ydH1gLFxuXHRcdH07XG5cdFx0d3JpdGVWZXJzaW9uQW5kRGVzY3JpcHRvcih3cml0ZXIsICcnLCAnbnVsbCcsIGRlc2MpO1xuXHR9LFxuKTtcblxuLy8gZXh0ZW5zaW9uIHNldHRpbmdzID8sIGlnbm9yZSBpdFxuYWRkSGFuZGxlcihcblx0J2V4dG4nLFxuXHR0YXJnZXQgPT4gKHRhcmdldCBhcyBhbnkpLl9leHRuICE9PSB1bmRlZmluZWQsXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdGNvbnN0IGRlc2M6IEV4dGVuc2lvbkRlc2MgPSByZWFkVmVyc2lvbkFuZERlc2NyaXB0b3IocmVhZGVyKTtcblx0XHQvLyBjb25zb2xlLmxvZyhyZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcblxuXHRcdGlmIChNT0NLX0hBTkRMRVJTKSAodGFyZ2V0IGFzIGFueSkuX2V4dG4gPSBkZXNjO1xuXHR9LFxuXHQod3JpdGVyLCB0YXJnZXQpID0+IHtcblx0XHQvLyBUT0RPOiBuZWVkIHRvIGFkZCBjb3JyZWN0IHR5cGVzIGZvciBkZXNjIGZpZWxkcyAocmVzb3VyY2VzL3NyYy5wc2QpXG5cdFx0aWYgKE1PQ0tfSEFORExFUlMpIHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyLCAnJywgJ251bGwnLCAodGFyZ2V0IGFzIGFueSkuX2V4dG4pO1xuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J2lPcGEnLFxuXHRoYXNLZXkoJ2ZpbGxPcGFjaXR5JyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC5maWxsT3BhY2l0eSA9IHJlYWRVaW50OChyZWFkZXIpIC8gMHhmZjtcblx0XHRza2lwQnl0ZXMocmVhZGVyLCAzKTtcblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0d3JpdGVVaW50OCh3cml0ZXIsIHRhcmdldC5maWxsT3BhY2l0eSEgKiAweGZmKTtcblx0XHR3cml0ZVplcm9zKHdyaXRlciwgMyk7XG5cdH0sXG4pO1xuXG5hZGRIYW5kbGVyKFxuXHQnYnJzdCcsXG5cdGhhc0tleSgnY2hhbm5lbEJsZW5kaW5nUmVzdHJpY3Rpb25zJyksXG5cdChyZWFkZXIsIHRhcmdldCwgbGVmdCkgPT4ge1xuXHRcdHRhcmdldC5jaGFubmVsQmxlbmRpbmdSZXN0cmljdGlvbnMgPSBbXTtcblxuXHRcdHdoaWxlIChsZWZ0KCkgPiA0KSB7XG5cdFx0XHR0YXJnZXQuY2hhbm5lbEJsZW5kaW5nUmVzdHJpY3Rpb25zLnB1c2gocmVhZEludDMyKHJlYWRlcikpO1xuXHRcdH1cblx0fSxcblx0KHdyaXRlciwgdGFyZ2V0KSA9PiB7XG5cdFx0Zm9yIChjb25zdCBjaGFubmVsIG9mIHRhcmdldC5jaGFubmVsQmxlbmRpbmdSZXN0cmljdGlvbnMhKSB7XG5cdFx0XHR3cml0ZUludDMyKHdyaXRlciwgY2hhbm5lbCk7XG5cdFx0fVxuXHR9LFxuKTtcblxuYWRkSGFuZGxlcihcblx0J3RzbHknLFxuXHRoYXNLZXkoJ3RyYW5zcGFyZW5jeVNoYXBlc0xheWVyJyksXG5cdChyZWFkZXIsIHRhcmdldCkgPT4ge1xuXHRcdHRhcmdldC50cmFuc3BhcmVuY3lTaGFwZXNMYXllciA9ICEhcmVhZFVpbnQ4KHJlYWRlcik7XG5cdFx0c2tpcEJ5dGVzKHJlYWRlciwgMyk7XG5cdH0sXG5cdCh3cml0ZXIsIHRhcmdldCkgPT4ge1xuXHRcdHdyaXRlVWludDgod3JpdGVyLCB0YXJnZXQudHJhbnNwYXJlbmN5U2hhcGVzTGF5ZXIgPyAxIDogMCk7XG5cdFx0d3JpdGVaZXJvcyh3cml0ZXIsIDMpO1xuXHR9LFxuKTtcbiJdLCJzb3VyY2VSb290IjoiQzpcXFByb2plY3RzXFxnaXRodWJcXGFnLXBzZFxcc3JjIn0=
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.hasMultiEffects = exports.readVectorMask = exports.booleanOperations = exports.readBezierKnot = exports.infoHandlersMap = exports.infoHandlers = void 0;
15
+ var base64_js_1 = require("base64-js");
16
+ var effectsHelpers_1 = require("./effectsHelpers");
17
+ var helpers_1 = require("./helpers");
18
+ var psdReader_1 = require("./psdReader");
19
+ var psdWriter_1 = require("./psdWriter");
20
+ var descriptor_1 = require("./descriptor");
21
+ var engineData_1 = require("./engineData");
22
+ var text_1 = require("./text");
23
+ exports.infoHandlers = [];
24
+ exports.infoHandlersMap = {};
25
+ function addHandler(key, has, read, write) {
26
+ var handler = { key: key, has: has, read: read, write: write };
27
+ exports.infoHandlers.push(handler);
28
+ exports.infoHandlersMap[handler.key] = handler;
29
+ }
30
+ function addHandlerAlias(key, target) {
31
+ exports.infoHandlersMap[key] = exports.infoHandlersMap[target];
32
+ }
33
+ function hasKey(key) {
34
+ return function (target) { return target[key] !== undefined; };
35
+ }
36
+ function readLength64(reader) {
37
+ if ((0, psdReader_1.readUint32)(reader))
38
+ throw new Error("Resource size above 4 GB limit at ".concat(reader.offset.toString(16)));
39
+ return (0, psdReader_1.readUint32)(reader);
40
+ }
41
+ function writeLength64(writer, length) {
42
+ (0, psdWriter_1.writeUint32)(writer, 0);
43
+ (0, psdWriter_1.writeUint32)(writer, length);
44
+ }
45
+ addHandler('TySh', hasKey('text'), function (reader, target, leftBytes) {
46
+ if ((0, psdReader_1.readInt16)(reader) !== 1)
47
+ throw new Error("Invalid TySh version");
48
+ var transform = [];
49
+ for (var i = 0; i < 6; i++)
50
+ transform.push((0, psdReader_1.readFloat64)(reader));
51
+ if ((0, psdReader_1.readInt16)(reader) !== 50)
52
+ throw new Error("Invalid TySh text version");
53
+ var text = (0, descriptor_1.readVersionAndDescriptor)(reader);
54
+ if ((0, psdReader_1.readInt16)(reader) !== 1)
55
+ throw new Error("Invalid TySh warp version");
56
+ var warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
57
+ target.text = {
58
+ transform: transform,
59
+ left: (0, psdReader_1.readFloat32)(reader),
60
+ top: (0, psdReader_1.readFloat32)(reader),
61
+ right: (0, psdReader_1.readFloat32)(reader),
62
+ bottom: (0, psdReader_1.readFloat32)(reader),
63
+ text: text['Txt '].replace(/\r/g, '\n'),
64
+ index: text.TextIndex || 0,
65
+ gridding: descriptor_1.textGridding.decode(text.textGridding),
66
+ antiAlias: descriptor_1.Annt.decode(text.AntA),
67
+ orientation: descriptor_1.Ornt.decode(text.Ornt),
68
+ warp: {
69
+ style: descriptor_1.warpStyle.decode(warp.warpStyle),
70
+ value: warp.warpValue || 0,
71
+ perspective: warp.warpPerspective || 0,
72
+ perspectiveOther: warp.warpPerspectiveOther || 0,
73
+ rotate: descriptor_1.Ornt.decode(warp.warpRotate),
74
+ },
75
+ };
76
+ if (text.EngineData) {
77
+ var engineData = (0, text_1.decodeEngineData)((0, engineData_1.parseEngineData)(text.EngineData));
78
+ // const before = parseEngineData(text.EngineData);
79
+ // const after = encodeEngineData(engineData);
80
+ // require('fs').writeFileSync('before.txt', require('util').inspect(before, false, 99, false), 'utf8');
81
+ // require('fs').writeFileSync('after.txt', require('util').inspect(after, false, 99, false), 'utf8');
82
+ // console.log(require('util').inspect(parseEngineData(text.EngineData), false, 99, true));
83
+ target.text = __assign(__assign({}, target.text), engineData);
84
+ // console.log(require('util').inspect(target.text, false, 99, true));
85
+ }
86
+ (0, psdReader_1.skipBytes)(reader, leftBytes());
87
+ }, function (writer, target) {
88
+ var text = target.text;
89
+ var warp = text.warp || {};
90
+ var transform = text.transform || [1, 0, 0, 1, 0, 0];
91
+ var textDescriptor = {
92
+ 'Txt ': (text.text || '').replace(/\r?\n/g, '\r'),
93
+ textGridding: descriptor_1.textGridding.encode(text.gridding),
94
+ Ornt: descriptor_1.Ornt.encode(text.orientation),
95
+ AntA: descriptor_1.Annt.encode(text.antiAlias),
96
+ TextIndex: text.index || 0,
97
+ EngineData: (0, engineData_1.serializeEngineData)((0, text_1.encodeEngineData)(text)),
98
+ };
99
+ (0, psdWriter_1.writeInt16)(writer, 1); // version
100
+ for (var i = 0; i < 6; i++) {
101
+ (0, psdWriter_1.writeFloat64)(writer, transform[i]);
102
+ }
103
+ (0, psdWriter_1.writeInt16)(writer, 50); // text version
104
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'TxLr', textDescriptor);
105
+ (0, psdWriter_1.writeInt16)(writer, 1); // warp version
106
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'warp', encodeWarp(warp));
107
+ (0, psdWriter_1.writeFloat32)(writer, text.left);
108
+ (0, psdWriter_1.writeFloat32)(writer, text.top);
109
+ (0, psdWriter_1.writeFloat32)(writer, text.right);
110
+ (0, psdWriter_1.writeFloat32)(writer, text.bottom);
111
+ // writeZeros(writer, 2);
112
+ });
113
+ // vector fills
114
+ addHandler('SoCo', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
115
+ target.vectorFill.type === 'color'; }, function (reader, target) {
116
+ var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
117
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
118
+ }, function (writer, target) {
119
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
120
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
121
+ });
122
+ addHandler('GdFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
123
+ (target.vectorFill.type === 'solid' || target.vectorFill.type === 'noise'); }, function (reader, target, left) {
124
+ var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
125
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
126
+ (0, psdReader_1.skipBytes)(reader, left());
127
+ }, function (writer, target) {
128
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
129
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
130
+ });
131
+ addHandler('PtFl', function (target) { return target.vectorFill !== undefined && target.vectorStroke === undefined &&
132
+ target.vectorFill.type === 'pattern'; }, function (reader, target) {
133
+ var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
134
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(descriptor);
135
+ }, function (writer, target) {
136
+ var descriptor = (0, descriptor_1.serializeVectorContent)(target.vectorFill).descriptor;
137
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
138
+ });
139
+ addHandler('vscg', function (target) { return target.vectorFill !== undefined && target.vectorStroke !== undefined; }, function (reader, target, left) {
140
+ (0, psdReader_1.readSignature)(reader); // key
141
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
142
+ target.vectorFill = (0, descriptor_1.parseVectorContent)(desc);
143
+ (0, psdReader_1.skipBytes)(reader, left());
144
+ }, function (writer, target) {
145
+ var _a = (0, descriptor_1.serializeVectorContent)(target.vectorFill), descriptor = _a.descriptor, key = _a.key;
146
+ (0, psdWriter_1.writeSignature)(writer, key);
147
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', descriptor);
148
+ });
149
+ function readBezierKnot(reader, width, height) {
150
+ var y0 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
151
+ var x0 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
152
+ var y1 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
153
+ var x1 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
154
+ var y2 = (0, psdReader_1.readFixedPointPath32)(reader) * height;
155
+ var x2 = (0, psdReader_1.readFixedPointPath32)(reader) * width;
156
+ return [x0, y0, x1, y1, x2, y2];
157
+ }
158
+ exports.readBezierKnot = readBezierKnot;
159
+ function writeBezierKnot(writer, points, width, height) {
160
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[1] / height); // y0
161
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[0] / width); // x0
162
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[3] / height); // y1
163
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[2] / width); // x1
164
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[5] / height); // y2
165
+ (0, psdWriter_1.writeFixedPointPath32)(writer, points[4] / width); // x2
166
+ }
167
+ exports.booleanOperations = ['exclude', 'combine', 'subtract', 'intersect'];
168
+ function readVectorMask(reader, vectorMask, width, height, size) {
169
+ var end = reader.offset + size;
170
+ var paths = vectorMask.paths;
171
+ var path = undefined;
172
+ while ((end - reader.offset) >= 26) {
173
+ var selector = (0, psdReader_1.readUint16)(reader);
174
+ switch (selector) {
175
+ case 0: // Closed subpath length record
176
+ case 3: { // Open subpath length record
177
+ (0, psdReader_1.readUint16)(reader); // count
178
+ var boolOp = (0, psdReader_1.readInt16)(reader);
179
+ (0, psdReader_1.readUint16)(reader); // always 1 ?
180
+ (0, psdReader_1.skipBytes)(reader, 18);
181
+ // TODO: 'combine' here might be wrong
182
+ path = { open: selector === 3, operation: boolOp === -1 ? 'combine' : exports.booleanOperations[boolOp], knots: [] };
183
+ paths.push(path);
184
+ break;
185
+ }
186
+ case 1: // Closed subpath Bezier knot, linked
187
+ case 2: // Closed subpath Bezier knot, unlinked
188
+ case 4: // Open subpath Bezier knot, linked
189
+ case 5: // Open subpath Bezier knot, unlinked
190
+ path.knots.push({ linked: (selector === 1 || selector === 4), points: readBezierKnot(reader, width, height) });
191
+ break;
192
+ case 6: // Path fill rule record
193
+ (0, psdReader_1.skipBytes)(reader, 24);
194
+ break;
195
+ case 7: { // Clipboard record
196
+ // TODO: check if these need to be multiplied by document size
197
+ var top_1 = (0, psdReader_1.readFixedPointPath32)(reader);
198
+ var left = (0, psdReader_1.readFixedPointPath32)(reader);
199
+ var bottom = (0, psdReader_1.readFixedPointPath32)(reader);
200
+ var right = (0, psdReader_1.readFixedPointPath32)(reader);
201
+ var resolution = (0, psdReader_1.readFixedPointPath32)(reader);
202
+ (0, psdReader_1.skipBytes)(reader, 4);
203
+ vectorMask.clipboard = { top: top_1, left: left, bottom: bottom, right: right, resolution: resolution };
204
+ break;
205
+ }
206
+ case 8: // Initial fill rule record
207
+ vectorMask.fillStartsWithAllPixels = !!(0, psdReader_1.readUint16)(reader);
208
+ (0, psdReader_1.skipBytes)(reader, 22);
209
+ break;
210
+ default: throw new Error('Invalid vmsk section');
211
+ }
212
+ }
213
+ return paths;
214
+ }
215
+ exports.readVectorMask = readVectorMask;
216
+ addHandler('vmsk', hasKey('vectorMask'), function (reader, target, left, _a) {
217
+ var width = _a.width, height = _a.height;
218
+ if ((0, psdReader_1.readUint32)(reader) !== 3)
219
+ throw new Error('Invalid vmsk version');
220
+ target.vectorMask = { paths: [] };
221
+ var vectorMask = target.vectorMask;
222
+ var flags = (0, psdReader_1.readUint32)(reader);
223
+ vectorMask.invert = (flags & 1) !== 0;
224
+ vectorMask.notLink = (flags & 2) !== 0;
225
+ vectorMask.disable = (flags & 4) !== 0;
226
+ readVectorMask(reader, vectorMask, width, height, left());
227
+ // drawBezierPaths(vectorMask.paths, width, height, 'out.png');
228
+ (0, psdReader_1.skipBytes)(reader, left());
229
+ }, function (writer, target, _a) {
230
+ var width = _a.width, height = _a.height;
231
+ var vectorMask = target.vectorMask;
232
+ var flags = (vectorMask.invert ? 1 : 0) |
233
+ (vectorMask.notLink ? 2 : 0) |
234
+ (vectorMask.disable ? 4 : 0);
235
+ (0, psdWriter_1.writeUint32)(writer, 3); // version
236
+ (0, psdWriter_1.writeUint32)(writer, flags);
237
+ // initial entry
238
+ (0, psdWriter_1.writeUint16)(writer, 6);
239
+ (0, psdWriter_1.writeZeros)(writer, 24);
240
+ var clipboard = vectorMask.clipboard;
241
+ if (clipboard) {
242
+ (0, psdWriter_1.writeUint16)(writer, 7);
243
+ (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.top);
244
+ (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.left);
245
+ (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.bottom);
246
+ (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.right);
247
+ (0, psdWriter_1.writeFixedPointPath32)(writer, clipboard.resolution);
248
+ (0, psdWriter_1.writeZeros)(writer, 4);
249
+ }
250
+ if (vectorMask.fillStartsWithAllPixels !== undefined) {
251
+ (0, psdWriter_1.writeUint16)(writer, 8);
252
+ (0, psdWriter_1.writeUint16)(writer, vectorMask.fillStartsWithAllPixels ? 1 : 0);
253
+ (0, psdWriter_1.writeZeros)(writer, 22);
254
+ }
255
+ for (var _i = 0, _b = vectorMask.paths; _i < _b.length; _i++) {
256
+ var path = _b[_i];
257
+ (0, psdWriter_1.writeUint16)(writer, path.open ? 3 : 0);
258
+ (0, psdWriter_1.writeUint16)(writer, path.knots.length);
259
+ (0, psdWriter_1.writeUint16)(writer, Math.abs(exports.booleanOperations.indexOf(path.operation))); // default to 1 if not found
260
+ (0, psdWriter_1.writeUint16)(writer, 1);
261
+ (0, psdWriter_1.writeZeros)(writer, 18); // TODO: these are sometimes non-zero
262
+ var linkedKnot = path.open ? 4 : 1;
263
+ var unlinkedKnot = path.open ? 5 : 2;
264
+ for (var _c = 0, _d = path.knots; _c < _d.length; _c++) {
265
+ var _e = _d[_c], linked = _e.linked, points = _e.points;
266
+ (0, psdWriter_1.writeUint16)(writer, linked ? linkedKnot : unlinkedKnot);
267
+ writeBezierKnot(writer, points, width, height);
268
+ }
269
+ }
270
+ });
271
+ // TODO: need to write vmsk if has outline ?
272
+ addHandlerAlias('vsms', 'vmsk');
273
+ addHandler('vogk', hasKey('vectorOrigination'), function (reader, target, left) {
274
+ if ((0, psdReader_1.readInt32)(reader) !== 1)
275
+ throw new Error("Invalid vogk version");
276
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
277
+ // console.log(require('util').inspect(desc, false, 99, true));
278
+ target.vectorOrigination = { keyDescriptorList: [] };
279
+ for (var _i = 0, _a = desc.keyDescriptorList; _i < _a.length; _i++) {
280
+ var i = _a[_i];
281
+ var item = {};
282
+ if (i.keyShapeInvalidated != null)
283
+ item.keyShapeInvalidated = i.keyShapeInvalidated;
284
+ if (i.keyOriginType != null)
285
+ item.keyOriginType = i.keyOriginType;
286
+ if (i.keyOriginResolution != null)
287
+ item.keyOriginResolution = i.keyOriginResolution;
288
+ if (i.keyOriginShapeBBox) {
289
+ item.keyOriginShapeBoundingBox = {
290
+ top: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox['Top ']),
291
+ left: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Left),
292
+ bottom: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Btom),
293
+ right: (0, descriptor_1.parseUnits)(i.keyOriginShapeBBox.Rght),
294
+ };
295
+ }
296
+ var rectRadii = i.keyOriginRRectRadii;
297
+ if (rectRadii) {
298
+ item.keyOriginRRectRadii = {
299
+ topRight: (0, descriptor_1.parseUnits)(rectRadii.topRight),
300
+ topLeft: (0, descriptor_1.parseUnits)(rectRadii.topLeft),
301
+ bottomLeft: (0, descriptor_1.parseUnits)(rectRadii.bottomLeft),
302
+ bottomRight: (0, descriptor_1.parseUnits)(rectRadii.bottomRight),
303
+ };
304
+ }
305
+ var corners = i.keyOriginBoxCorners;
306
+ if (corners) {
307
+ item.keyOriginBoxCorners = [
308
+ { x: corners.rectangleCornerA.Hrzn, y: corners.rectangleCornerA.Vrtc },
309
+ { x: corners.rectangleCornerB.Hrzn, y: corners.rectangleCornerB.Vrtc },
310
+ { x: corners.rectangleCornerC.Hrzn, y: corners.rectangleCornerC.Vrtc },
311
+ { x: corners.rectangleCornerD.Hrzn, y: corners.rectangleCornerD.Vrtc },
312
+ ];
313
+ }
314
+ var trnf = i.Trnf;
315
+ if (trnf) {
316
+ item.transform = [trnf.xx, trnf.xy, trnf.xy, trnf.yy, trnf.tx, trnf.ty];
317
+ }
318
+ target.vectorOrigination.keyDescriptorList.push(item);
319
+ }
320
+ (0, psdReader_1.skipBytes)(reader, left());
321
+ }, function (writer, target) {
322
+ target;
323
+ var orig = target.vectorOrigination;
324
+ var desc = { keyDescriptorList: [] };
325
+ for (var i = 0; i < orig.keyDescriptorList.length; i++) {
326
+ var item = orig.keyDescriptorList[i];
327
+ if (item.keyShapeInvalidated) {
328
+ desc.keyDescriptorList.push({ keyShapeInvalidated: true, keyOriginIndex: i });
329
+ }
330
+ else {
331
+ desc.keyDescriptorList.push({}); // we're adding keyOriginIndex at the end
332
+ var out = desc.keyDescriptorList[desc.keyDescriptorList.length - 1];
333
+ if (item.keyOriginType != null)
334
+ out.keyOriginType = item.keyOriginType;
335
+ if (item.keyOriginResolution != null)
336
+ out.keyOriginResolution = item.keyOriginResolution;
337
+ var radii = item.keyOriginRRectRadii;
338
+ if (radii) {
339
+ out.keyOriginRRectRadii = {
340
+ unitValueQuadVersion: 1,
341
+ topRight: (0, descriptor_1.unitsValue)(radii.topRight, 'topRight'),
342
+ topLeft: (0, descriptor_1.unitsValue)(radii.topLeft, 'topLeft'),
343
+ bottomLeft: (0, descriptor_1.unitsValue)(radii.bottomLeft, 'bottomLeft'),
344
+ bottomRight: (0, descriptor_1.unitsValue)(radii.bottomRight, 'bottomRight'),
345
+ };
346
+ }
347
+ var box = item.keyOriginShapeBoundingBox;
348
+ if (box) {
349
+ out.keyOriginShapeBBox = {
350
+ unitValueQuadVersion: 1,
351
+ 'Top ': (0, descriptor_1.unitsValue)(box.top, 'top'),
352
+ Left: (0, descriptor_1.unitsValue)(box.left, 'left'),
353
+ Btom: (0, descriptor_1.unitsValue)(box.bottom, 'bottom'),
354
+ Rght: (0, descriptor_1.unitsValue)(box.right, 'right'),
355
+ };
356
+ }
357
+ var corners = item.keyOriginBoxCorners;
358
+ if (corners && corners.length === 4) {
359
+ out.keyOriginBoxCorners = {
360
+ rectangleCornerA: { Hrzn: corners[0].x, Vrtc: corners[0].y },
361
+ rectangleCornerB: { Hrzn: corners[1].x, Vrtc: corners[1].y },
362
+ rectangleCornerC: { Hrzn: corners[2].x, Vrtc: corners[2].y },
363
+ rectangleCornerD: { Hrzn: corners[3].x, Vrtc: corners[3].y },
364
+ };
365
+ }
366
+ var transform = item.transform;
367
+ if (transform && transform.length === 6) {
368
+ out.Trnf = {
369
+ xx: transform[0],
370
+ xy: transform[1],
371
+ yx: transform[2],
372
+ yy: transform[3],
373
+ tx: transform[4],
374
+ ty: transform[5],
375
+ };
376
+ }
377
+ out.keyOriginIndex = i;
378
+ }
379
+ }
380
+ (0, psdWriter_1.writeInt32)(writer, 1); // version
381
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
382
+ });
383
+ addHandler('lmfx', function (target) { return target.effects !== undefined && hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
384
+ var version = (0, psdReader_1.readUint32)(reader);
385
+ if (version !== 0)
386
+ throw new Error('Invalid lmfx version');
387
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
388
+ // console.log(require('util').inspect(info, false, 99, true));
389
+ // discard if read in 'lrFX' or 'lfx2' section
390
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
391
+ (0, psdReader_1.skipBytes)(reader, left());
392
+ }, function (writer, target, _, options) {
393
+ var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, true);
394
+ (0, psdWriter_1.writeUint32)(writer, 0); // version
395
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
396
+ });
397
+ addHandler('lrFX', hasKey('effects'), function (reader, target, left) {
398
+ if (!target.effects)
399
+ target.effects = (0, effectsHelpers_1.readEffects)(reader);
400
+ (0, psdReader_1.skipBytes)(reader, left());
401
+ }, function (writer, target) {
402
+ (0, effectsHelpers_1.writeEffects)(writer, target.effects);
403
+ });
404
+ addHandler('luni', hasKey('name'), function (reader, target, left) {
405
+ target.name = (0, psdReader_1.readUnicodeString)(reader);
406
+ (0, psdReader_1.skipBytes)(reader, left());
407
+ }, function (writer, target) {
408
+ (0, psdWriter_1.writeUnicodeString)(writer, target.name);
409
+ // writeUint16(writer, 0); // padding (but not extending string length)
410
+ });
411
+ addHandler('lnsr', hasKey('nameSource'), function (reader, target) { return target.nameSource = (0, psdReader_1.readSignature)(reader); }, function (writer, target) { return (0, psdWriter_1.writeSignature)(writer, target.nameSource); });
412
+ addHandler('lyid', hasKey('id'), function (reader, target) { return target.id = (0, psdReader_1.readUint32)(reader); }, function (writer, target, _psd, options) {
413
+ var id = target.id;
414
+ while (options.layerIds.has(id))
415
+ id += 100; // make sure we don't have duplicate layer ids
416
+ (0, psdWriter_1.writeUint32)(writer, id);
417
+ options.layerIds.add(id);
418
+ options.layerToId.set(target, id);
419
+ });
420
+ addHandler('lsct', hasKey('sectionDivider'), function (reader, target, left) {
421
+ target.sectionDivider = { type: (0, psdReader_1.readUint32)(reader) };
422
+ if (left()) {
423
+ (0, psdReader_1.checkSignature)(reader, '8BIM');
424
+ target.sectionDivider.key = (0, psdReader_1.readSignature)(reader);
425
+ }
426
+ if (left()) {
427
+ target.sectionDivider.subType = (0, psdReader_1.readUint32)(reader);
428
+ }
429
+ }, function (writer, target) {
430
+ (0, psdWriter_1.writeUint32)(writer, target.sectionDivider.type);
431
+ if (target.sectionDivider.key) {
432
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
433
+ (0, psdWriter_1.writeSignature)(writer, target.sectionDivider.key);
434
+ if (target.sectionDivider.subType !== undefined) {
435
+ (0, psdWriter_1.writeUint32)(writer, target.sectionDivider.subType);
436
+ }
437
+ }
438
+ });
439
+ // it seems lsdk is used when there's a layer is nested more than 6 levels, but I don't know why?
440
+ // maybe some limitation of old version of PS?
441
+ addHandlerAlias('lsdk', 'lsct');
442
+ addHandler('clbl', hasKey('blendClippendElements'), function (reader, target) {
443
+ target.blendClippendElements = !!(0, psdReader_1.readUint8)(reader);
444
+ (0, psdReader_1.skipBytes)(reader, 3);
445
+ }, function (writer, target) {
446
+ (0, psdWriter_1.writeUint8)(writer, target.blendClippendElements ? 1 : 0);
447
+ (0, psdWriter_1.writeZeros)(writer, 3);
448
+ });
449
+ addHandler('infx', hasKey('blendInteriorElements'), function (reader, target) {
450
+ target.blendInteriorElements = !!(0, psdReader_1.readUint8)(reader);
451
+ (0, psdReader_1.skipBytes)(reader, 3);
452
+ }, function (writer, target) {
453
+ (0, psdWriter_1.writeUint8)(writer, target.blendInteriorElements ? 1 : 0);
454
+ (0, psdWriter_1.writeZeros)(writer, 3);
455
+ });
456
+ addHandler('knko', hasKey('knockout'), function (reader, target) {
457
+ target.knockout = !!(0, psdReader_1.readUint8)(reader);
458
+ (0, psdReader_1.skipBytes)(reader, 3);
459
+ }, function (writer, target) {
460
+ (0, psdWriter_1.writeUint8)(writer, target.knockout ? 1 : 0);
461
+ (0, psdWriter_1.writeZeros)(writer, 3);
462
+ });
463
+ addHandler('lmgm', hasKey('layerMaskAsGlobalMask'), function (reader, target) {
464
+ target.layerMaskAsGlobalMask = !!(0, psdReader_1.readUint8)(reader);
465
+ (0, psdReader_1.skipBytes)(reader, 3);
466
+ }, function (writer, target) {
467
+ (0, psdWriter_1.writeUint8)(writer, target.layerMaskAsGlobalMask ? 1 : 0);
468
+ (0, psdWriter_1.writeZeros)(writer, 3);
469
+ });
470
+ addHandler('lspf', hasKey('protected'), function (reader, target) {
471
+ var flags = (0, psdReader_1.readUint32)(reader);
472
+ target.protected = {
473
+ transparency: (flags & 0x01) !== 0,
474
+ composite: (flags & 0x02) !== 0,
475
+ position: (flags & 0x04) !== 0,
476
+ };
477
+ if (flags & 0x08)
478
+ target.protected.artboards = true;
479
+ }, function (writer, target) {
480
+ var flags = (target.protected.transparency ? 0x01 : 0) |
481
+ (target.protected.composite ? 0x02 : 0) |
482
+ (target.protected.position ? 0x04 : 0) |
483
+ (target.protected.artboards ? 0x08 : 0);
484
+ (0, psdWriter_1.writeUint32)(writer, flags);
485
+ });
486
+ addHandler('lclr', hasKey('layerColor'), function (reader, target) {
487
+ var color = (0, psdReader_1.readUint16)(reader);
488
+ (0, psdReader_1.skipBytes)(reader, 6);
489
+ target.layerColor = helpers_1.layerColors[color];
490
+ }, function (writer, target) {
491
+ var index = helpers_1.layerColors.indexOf(target.layerColor);
492
+ (0, psdWriter_1.writeUint16)(writer, index === -1 ? 0 : index);
493
+ (0, psdWriter_1.writeZeros)(writer, 6);
494
+ });
495
+ addHandler('shmd', function (target) { return target.timestamp !== undefined || target.animationFrames !== undefined ||
496
+ target.animationFrameFlags !== undefined || target.timeline !== undefined; }, function (reader, target, left, _, options) {
497
+ var count = (0, psdReader_1.readUint32)(reader);
498
+ var _loop_1 = function (i) {
499
+ (0, psdReader_1.checkSignature)(reader, '8BIM');
500
+ var key = (0, psdReader_1.readSignature)(reader);
501
+ (0, psdReader_1.readUint8)(reader); // copy
502
+ (0, psdReader_1.skipBytes)(reader, 3);
503
+ (0, psdReader_1.readSection)(reader, 1, function (left) {
504
+ if (key === 'cust') {
505
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
506
+ // console.log('cust', target.name, require('util').inspect(desc, false, 99, true));
507
+ if (desc.layerTime !== undefined)
508
+ target.timestamp = desc.layerTime;
509
+ }
510
+ else if (key === 'mlst') {
511
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
512
+ // console.log('mlst', target.name, require('util').inspect(desc, false, 99, true));
513
+ target.animationFrames = [];
514
+ for (var i_1 = 0; i_1 < desc.LaSt.length; i_1++) {
515
+ var f = desc.LaSt[i_1];
516
+ var frame = { frames: f.FrLs };
517
+ if (f.enab !== undefined)
518
+ frame.enable = f.enab;
519
+ if (f.Ofst)
520
+ frame.offset = (0, descriptor_1.horzVrtcToXY)(f.Ofst);
521
+ if (f.FXRf)
522
+ frame.referencePoint = (0, descriptor_1.horzVrtcToXY)(f.FXRf);
523
+ if (f.Lefx)
524
+ frame.effects = (0, descriptor_1.parseEffects)(f.Lefx, !!options.logMissingFeatures);
525
+ if (f.blendOptions && f.blendOptions.Opct)
526
+ frame.opacity = (0, descriptor_1.parsePercent)(f.blendOptions.Opct);
527
+ target.animationFrames.push(frame);
528
+ }
529
+ }
530
+ else if (key === 'mdyn') {
531
+ // frame flags
532
+ (0, psdReader_1.readUint16)(reader); // unknown
533
+ var propagate = (0, psdReader_1.readUint8)(reader);
534
+ var flags = (0, psdReader_1.readUint8)(reader);
535
+ target.animationFrameFlags = {
536
+ propagateFrameOne: !propagate,
537
+ unifyLayerPosition: (flags & 1) !== 0,
538
+ unifyLayerStyle: (flags & 2) !== 0,
539
+ unifyLayerVisibility: (flags & 4) !== 0,
540
+ };
541
+ }
542
+ else if (key === 'tmln') {
543
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
544
+ var timeScope = desc.timeScope;
545
+ // console.log('tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
546
+ var timeline = {
547
+ start: timeScope.Strt,
548
+ duration: timeScope.duration,
549
+ inTime: timeScope.inTime,
550
+ outTime: timeScope.outTime,
551
+ autoScope: desc.autoScope,
552
+ audioLevel: desc.audioLevel,
553
+ };
554
+ if (desc.trackList) {
555
+ timeline.tracks = (0, descriptor_1.parseTrackList)(desc.trackList, !!options.logMissingFeatures);
556
+ }
557
+ target.timeline = timeline;
558
+ // console.log('tmln:result', target.name, target.id, require('util').inspect(timeline, false, 99, true));
559
+ }
560
+ else {
561
+ options.logDevFeatures && console.log('Unhandled "shmd" section key', key);
562
+ }
563
+ (0, psdReader_1.skipBytes)(reader, left());
564
+ });
565
+ };
566
+ for (var i = 0; i < count; i++) {
567
+ _loop_1(i);
568
+ }
569
+ (0, psdReader_1.skipBytes)(reader, left());
570
+ }, function (writer, target, _, options) {
571
+ var animationFrames = target.animationFrames, animationFrameFlags = target.animationFrameFlags, timestamp = target.timestamp, timeline = target.timeline;
572
+ var count = 0;
573
+ if (animationFrames)
574
+ count++;
575
+ if (animationFrameFlags)
576
+ count++;
577
+ if (timeline)
578
+ count++;
579
+ if (timestamp !== undefined)
580
+ count++;
581
+ (0, psdWriter_1.writeUint32)(writer, count);
582
+ if (animationFrames) {
583
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
584
+ (0, psdWriter_1.writeSignature)(writer, 'mlst');
585
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
586
+ (0, psdWriter_1.writeZeros)(writer, 3);
587
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
588
+ var _a;
589
+ var desc = {
590
+ LaID: (_a = target.id) !== null && _a !== void 0 ? _a : 0,
591
+ LaSt: [],
592
+ };
593
+ for (var i = 0; i < animationFrames.length; i++) {
594
+ var f = animationFrames[i];
595
+ var frame = {};
596
+ if (f.enable !== undefined)
597
+ frame.enab = f.enable;
598
+ frame.FrLs = f.frames;
599
+ if (f.offset)
600
+ frame.Ofst = (0, descriptor_1.xyToHorzVrtc)(f.offset);
601
+ if (f.referencePoint)
602
+ frame.FXRf = (0, descriptor_1.xyToHorzVrtc)(f.referencePoint);
603
+ if (f.effects)
604
+ frame.Lefx = (0, descriptor_1.serializeEffects)(f.effects, false, false);
605
+ if (f.opacity !== undefined)
606
+ frame.blendOptions = { Opct: (0, descriptor_1.unitsPercent)(f.opacity) };
607
+ desc.LaSt.push(frame);
608
+ }
609
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
610
+ }, true);
611
+ }
612
+ if (animationFrameFlags) {
613
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
614
+ (0, psdWriter_1.writeSignature)(writer, 'mdyn');
615
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
616
+ (0, psdWriter_1.writeZeros)(writer, 3);
617
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
618
+ (0, psdWriter_1.writeUint16)(writer, 0); // unknown
619
+ (0, psdWriter_1.writeUint8)(writer, animationFrameFlags.propagateFrameOne ? 0x0 : 0xf);
620
+ (0, psdWriter_1.writeUint8)(writer, (animationFrameFlags.unifyLayerPosition ? 1 : 0) |
621
+ (animationFrameFlags.unifyLayerStyle ? 2 : 0) |
622
+ (animationFrameFlags.unifyLayerVisibility ? 4 : 0));
623
+ });
624
+ }
625
+ if (timeline) {
626
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
627
+ (0, psdWriter_1.writeSignature)(writer, 'tmln');
628
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
629
+ (0, psdWriter_1.writeZeros)(writer, 3);
630
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
631
+ var desc = {
632
+ Vrsn: 1,
633
+ timeScope: {
634
+ Vrsn: 1,
635
+ Strt: timeline.start,
636
+ duration: timeline.duration,
637
+ inTime: timeline.inTime,
638
+ outTime: timeline.outTime,
639
+ },
640
+ autoScope: timeline.autoScope,
641
+ audioLevel: timeline.audioLevel,
642
+ };
643
+ if (timeline.tracks) {
644
+ desc.trackList = (0, descriptor_1.serializeTrackList)(timeline.tracks);
645
+ }
646
+ var id = options.layerToId.get(target) || target.id || 0;
647
+ if (!id)
648
+ throw new Error('You need to provide layer.id value whan writing document with animations');
649
+ desc.LyrI = id;
650
+ // console.log('WRITE:tmln', target.name, target.id, require('util').inspect(desc, false, 99, true));
651
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'anim');
652
+ }, true);
653
+ }
654
+ if (timestamp !== undefined) {
655
+ (0, psdWriter_1.writeSignature)(writer, '8BIM');
656
+ (0, psdWriter_1.writeSignature)(writer, 'cust');
657
+ (0, psdWriter_1.writeUint8)(writer, 0); // copy (always false)
658
+ (0, psdWriter_1.writeZeros)(writer, 3);
659
+ (0, psdWriter_1.writeSection)(writer, 2, function () {
660
+ var desc = {
661
+ layerTime: timestamp,
662
+ };
663
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'metadata', desc);
664
+ }, true);
665
+ }
666
+ });
667
+ addHandler('vstk', hasKey('vectorStroke'), function (reader, target, left) {
668
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
669
+ // console.log(require('util').inspect(desc, false, 99, true));
670
+ target.vectorStroke = {
671
+ strokeEnabled: desc.strokeEnabled,
672
+ fillEnabled: desc.fillEnabled,
673
+ lineWidth: (0, descriptor_1.parseUnits)(desc.strokeStyleLineWidth),
674
+ lineDashOffset: (0, descriptor_1.parseUnits)(desc.strokeStyleLineDashOffset),
675
+ miterLimit: desc.strokeStyleMiterLimit,
676
+ lineCapType: descriptor_1.strokeStyleLineCapType.decode(desc.strokeStyleLineCapType),
677
+ lineJoinType: descriptor_1.strokeStyleLineJoinType.decode(desc.strokeStyleLineJoinType),
678
+ lineAlignment: descriptor_1.strokeStyleLineAlignment.decode(desc.strokeStyleLineAlignment),
679
+ scaleLock: desc.strokeStyleScaleLock,
680
+ strokeAdjust: desc.strokeStyleStrokeAdjust,
681
+ lineDashSet: desc.strokeStyleLineDashSet.map(descriptor_1.parseUnits),
682
+ blendMode: descriptor_1.BlnM.decode(desc.strokeStyleBlendMode),
683
+ opacity: (0, descriptor_1.parsePercent)(desc.strokeStyleOpacity),
684
+ content: (0, descriptor_1.parseVectorContent)(desc.strokeStyleContent),
685
+ resolution: desc.strokeStyleResolution,
686
+ };
687
+ (0, psdReader_1.skipBytes)(reader, left());
688
+ }, function (writer, target) {
689
+ var _a, _b, _c;
690
+ var stroke = target.vectorStroke;
691
+ var descriptor = {
692
+ strokeStyleVersion: 2,
693
+ strokeEnabled: !!stroke.strokeEnabled,
694
+ fillEnabled: !!stroke.fillEnabled,
695
+ strokeStyleLineWidth: stroke.lineWidth || { value: 3, units: 'Points' },
696
+ strokeStyleLineDashOffset: stroke.lineDashOffset || { value: 0, units: 'Points' },
697
+ strokeStyleMiterLimit: (_a = stroke.miterLimit) !== null && _a !== void 0 ? _a : 100,
698
+ strokeStyleLineCapType: descriptor_1.strokeStyleLineCapType.encode(stroke.lineCapType),
699
+ strokeStyleLineJoinType: descriptor_1.strokeStyleLineJoinType.encode(stroke.lineJoinType),
700
+ strokeStyleLineAlignment: descriptor_1.strokeStyleLineAlignment.encode(stroke.lineAlignment),
701
+ strokeStyleScaleLock: !!stroke.scaleLock,
702
+ strokeStyleStrokeAdjust: !!stroke.strokeAdjust,
703
+ strokeStyleLineDashSet: stroke.lineDashSet || [],
704
+ strokeStyleBlendMode: descriptor_1.BlnM.encode(stroke.blendMode),
705
+ strokeStyleOpacity: (0, descriptor_1.unitsPercent)((_b = stroke.opacity) !== null && _b !== void 0 ? _b : 1),
706
+ strokeStyleContent: (0, descriptor_1.serializeVectorContent)(stroke.content || { type: 'color', color: { r: 0, g: 0, b: 0 } }).descriptor,
707
+ strokeStyleResolution: (_c = stroke.resolution) !== null && _c !== void 0 ? _c : 72,
708
+ };
709
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'strokeStyle', descriptor);
710
+ });
711
+ addHandler('artb', // per-layer arboard info
712
+ hasKey('artboard'), function (reader, target, left) {
713
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
714
+ var rect = desc.artboardRect;
715
+ target.artboard = {
716
+ rect: { top: rect['Top '], left: rect.Left, bottom: rect.Btom, right: rect.Rght },
717
+ guideIndices: desc.guideIndeces,
718
+ presetName: desc.artboardPresetName,
719
+ color: (0, descriptor_1.parseColor)(desc['Clr ']),
720
+ backgroundType: desc.artboardBackgroundType,
721
+ };
722
+ (0, psdReader_1.skipBytes)(reader, left());
723
+ }, function (writer, target) {
724
+ var _a;
725
+ var artboard = target.artboard;
726
+ var rect = artboard.rect;
727
+ var desc = {
728
+ artboardRect: { 'Top ': rect.top, Left: rect.left, Btom: rect.bottom, Rght: rect.right },
729
+ guideIndeces: artboard.guideIndices || [],
730
+ artboardPresetName: artboard.presetName || '',
731
+ 'Clr ': (0, descriptor_1.serializeColor)(artboard.color),
732
+ artboardBackgroundType: (_a = artboard.backgroundType) !== null && _a !== void 0 ? _a : 1,
733
+ };
734
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'artboard', desc);
735
+ });
736
+ addHandler('sn2P', hasKey('usingAlignedRendering'), function (reader, target) { return target.usingAlignedRendering = !!(0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.usingAlignedRendering ? 1 : 0); });
737
+ var placedLayerTypes = ['unknown', 'vector', 'raster', 'image stack'];
738
+ function parseWarp(warp) {
739
+ var _a, _b, _c, _d, _e, _f;
740
+ var result = __assign(__assign({ style: descriptor_1.warpStyle.decode(warp.warpStyle) }, (warp.warpValues ? { values: warp.warpValues } : { value: warp.warpValue || 0 })), { perspective: warp.warpPerspective || 0, perspectiveOther: warp.warpPerspectiveOther || 0, rotate: descriptor_1.Ornt.decode(warp.warpRotate), bounds: warp.bounds && {
741
+ top: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds['Top ']),
742
+ left: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Left),
743
+ bottom: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Btom),
744
+ right: (0, descriptor_1.parseUnitsOrNumber)(warp.bounds.Rght),
745
+ }, uOrder: warp.uOrder, vOrder: warp.vOrder });
746
+ if (warp.deformNumRows != null || warp.deformNumCols != null) {
747
+ result.deformNumRows = warp.deformNumRows;
748
+ result.deformNumCols = warp.deformNumCols;
749
+ }
750
+ var envelopeWarp = warp.customEnvelopeWarp;
751
+ if (envelopeWarp) {
752
+ result.customEnvelopeWarp = {
753
+ meshPoints: [],
754
+ };
755
+ var xs = ((_a = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Hrzn'; })) === null || _a === void 0 ? void 0 : _a.values) || [];
756
+ var ys = ((_b = envelopeWarp.meshPoints.find(function (i) { return i.type === 'Vrtc'; })) === null || _b === void 0 ? void 0 : _b.values) || [];
757
+ for (var i = 0; i < xs.length; i++) {
758
+ result.customEnvelopeWarp.meshPoints.push({ x: xs[i], y: ys[i] });
759
+ }
760
+ if (envelopeWarp.quiltSliceX || envelopeWarp.quiltSliceY) {
761
+ result.customEnvelopeWarp.quiltSliceX = ((_d = (_c = envelopeWarp.quiltSliceX) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.values) || [];
762
+ result.customEnvelopeWarp.quiltSliceY = ((_f = (_e = envelopeWarp.quiltSliceY) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.values) || [];
763
+ }
764
+ }
765
+ return result;
766
+ }
767
+ function isQuiltWarp(warp) {
768
+ var _a, _b;
769
+ return warp.deformNumCols != null || warp.deformNumRows != null ||
770
+ ((_a = warp.customEnvelopeWarp) === null || _a === void 0 ? void 0 : _a.quiltSliceX) || ((_b = warp.customEnvelopeWarp) === null || _b === void 0 ? void 0 : _b.quiltSliceY);
771
+ }
772
+ function encodeWarp(warp) {
773
+ var bounds = warp.bounds;
774
+ var desc = __assign(__assign({ warpStyle: descriptor_1.warpStyle.encode(warp.style) }, (warp.values ? { warpValues: warp.values } : { warpValue: warp.value })), { warpPerspective: warp.perspective || 0, warpPerspectiveOther: warp.perspectiveOther || 0, warpRotate: descriptor_1.Ornt.encode(warp.rotate), bounds: {
775
+ 'Top ': (0, descriptor_1.unitsValue)(bounds && bounds.top || { units: 'Pixels', value: 0 }, 'bounds.top'),
776
+ Left: (0, descriptor_1.unitsValue)(bounds && bounds.left || { units: 'Pixels', value: 0 }, 'bounds.left'),
777
+ Btom: (0, descriptor_1.unitsValue)(bounds && bounds.bottom || { units: 'Pixels', value: 0 }, 'bounds.bottom'),
778
+ Rght: (0, descriptor_1.unitsValue)(bounds && bounds.right || { units: 'Pixels', value: 0 }, 'bounds.right'),
779
+ }, uOrder: warp.uOrder || 0, vOrder: warp.vOrder || 0 });
780
+ var isQuilt = isQuiltWarp(warp);
781
+ if (isQuilt) {
782
+ var desc2 = desc;
783
+ desc2.deformNumRows = warp.deformNumRows || 0;
784
+ desc2.deformNumCols = warp.deformNumCols || 0;
785
+ }
786
+ var customEnvelopeWarp = warp.customEnvelopeWarp;
787
+ if (customEnvelopeWarp) {
788
+ var meshPoints = customEnvelopeWarp.meshPoints || [];
789
+ if (isQuilt) {
790
+ var desc2 = desc;
791
+ desc2.customEnvelopeWarp = {
792
+ quiltSliceX: [{
793
+ type: 'quiltSliceX',
794
+ values: customEnvelopeWarp.quiltSliceX || [],
795
+ }],
796
+ quiltSliceY: [{
797
+ type: 'quiltSliceY',
798
+ values: customEnvelopeWarp.quiltSliceY || [],
799
+ }],
800
+ meshPoints: [
801
+ { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
802
+ { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
803
+ ],
804
+ };
805
+ }
806
+ else {
807
+ desc.customEnvelopeWarp = {
808
+ meshPoints: [
809
+ { type: 'Hrzn', values: meshPoints.map(function (p) { return p.x; }) },
810
+ { type: 'Vrtc', values: meshPoints.map(function (p) { return p.y; }) },
811
+ ],
812
+ };
813
+ }
814
+ }
815
+ return desc;
816
+ }
817
+ addHandler('PlLd', hasKey('placedLayer'), function (reader, target, left) {
818
+ if ((0, psdReader_1.readSignature)(reader) !== 'plcL')
819
+ throw new Error("Invalid PlLd signature");
820
+ if ((0, psdReader_1.readInt32)(reader) !== 3)
821
+ throw new Error("Invalid PlLd version");
822
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
823
+ var pageNumber = (0, psdReader_1.readInt32)(reader);
824
+ var totalPages = (0, psdReader_1.readInt32)(reader); // TODO: check how this works ?
825
+ (0, psdReader_1.readInt32)(reader); // anitAliasPolicy 16
826
+ var placedLayerType = (0, psdReader_1.readInt32)(reader); // 0 = unknown, 1 = vector, 2 = raster, 3 = image stack
827
+ if (!placedLayerTypes[placedLayerType])
828
+ throw new Error('Invalid PlLd type');
829
+ var transform = [];
830
+ for (var i = 0; i < 8; i++)
831
+ transform.push((0, psdReader_1.readFloat64)(reader)); // x, y of 4 corners of the transform
832
+ var warpVersion = (0, psdReader_1.readInt32)(reader);
833
+ if (warpVersion !== 0)
834
+ throw new Error("Invalid Warp version ".concat(warpVersion));
835
+ var warp = (0, descriptor_1.readVersionAndDescriptor)(reader);
836
+ target.placedLayer = target.placedLayer || {
837
+ id: id,
838
+ type: placedLayerTypes[placedLayerType],
839
+ pageNumber: pageNumber,
840
+ totalPages: totalPages,
841
+ transform: transform,
842
+ warp: parseWarp(warp),
843
+ };
844
+ // console.log('PlLd warp', require('util').inspect(warp, false, 99, true));
845
+ // console.log('PlLd', require('util').inspect(target.placedLayer, false, 99, true));
846
+ (0, psdReader_1.skipBytes)(reader, left());
847
+ }, function (writer, target) {
848
+ var placed = target.placedLayer;
849
+ (0, psdWriter_1.writeSignature)(writer, 'plcL');
850
+ (0, psdWriter_1.writeInt32)(writer, 3); // version
851
+ (0, psdWriter_1.writePascalString)(writer, placed.id, 1);
852
+ (0, psdWriter_1.writeInt32)(writer, 1); // pageNumber
853
+ (0, psdWriter_1.writeInt32)(writer, 1); // totalPages
854
+ (0, psdWriter_1.writeInt32)(writer, 16); // anitAliasPolicy
855
+ if (placedLayerTypes.indexOf(placed.type) === -1)
856
+ throw new Error('Invalid placedLayer type');
857
+ (0, psdWriter_1.writeInt32)(writer, placedLayerTypes.indexOf(placed.type));
858
+ for (var i = 0; i < 8; i++)
859
+ (0, psdWriter_1.writeFloat64)(writer, placed.transform[i]);
860
+ (0, psdWriter_1.writeInt32)(writer, 0); // warp version
861
+ var isQuilt = placed.warp && isQuiltWarp(placed.warp);
862
+ var type = isQuilt ? 'quiltWarp' : 'warp';
863
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', type, encodeWarp(placed.warp || {}), type);
864
+ });
865
+ addHandler('SoLd', hasKey('placedLayer'), function (reader, target, left) {
866
+ if ((0, psdReader_1.readSignature)(reader) !== 'soLD')
867
+ throw new Error("Invalid SoLd type");
868
+ if ((0, psdReader_1.readInt32)(reader) !== 4)
869
+ throw new Error("Invalid SoLd version");
870
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
871
+ // console.log('SoLd', require('util').inspect(desc, false, 99, true));
872
+ // console.log('SoLd.warp', require('util').inspect(desc.warp, false, 99, true));
873
+ // console.log('SoLd.quiltWarp', require('util').inspect(desc.quiltWarp, false, 99, true));
874
+ target.placedLayer = {
875
+ id: desc.Idnt,
876
+ placed: desc.placed,
877
+ type: placedLayerTypes[desc.Type],
878
+ pageNumber: desc.PgNm,
879
+ totalPages: desc.totalPages,
880
+ frameStep: desc.frameStep,
881
+ duration: desc.duration,
882
+ frameCount: desc.frameCount,
883
+ transform: desc.Trnf,
884
+ width: desc['Sz '].Wdth,
885
+ height: desc['Sz '].Hght,
886
+ resolution: (0, descriptor_1.parseUnits)(desc.Rslt),
887
+ warp: parseWarp((desc.quiltWarp || desc.warp)),
888
+ };
889
+ if (desc.nonAffineTransform && desc.nonAffineTransform.some(function (x, i) { return x !== desc.Trnf[i]; })) {
890
+ target.placedLayer.nonAffineTransform = desc.nonAffineTransform;
891
+ }
892
+ if (desc.Crop)
893
+ target.placedLayer.crop = desc.Crop;
894
+ if (desc.comp)
895
+ target.placedLayer.comp = desc.comp;
896
+ if (desc.compInfo)
897
+ target.placedLayer.compInfo = desc.compInfo;
898
+ (0, psdReader_1.skipBytes)(reader, left()); // HACK
899
+ }, function (writer, target) {
900
+ var _a, _b;
901
+ (0, psdWriter_1.writeSignature)(writer, 'soLD');
902
+ (0, psdWriter_1.writeInt32)(writer, 4); // version
903
+ var placed = target.placedLayer;
904
+ var desc = __assign(__assign({ Idnt: placed.id, placed: (_a = placed.placed) !== null && _a !== void 0 ? _a : placed.id, PgNm: placed.pageNumber || 1, totalPages: placed.totalPages || 1 }, (placed.crop ? { Crop: placed.crop } : {})), { frameStep: placed.frameStep || { numerator: 0, denominator: 600 }, duration: placed.duration || { numerator: 0, denominator: 600 }, frameCount: placed.frameCount || 0, Annt: 16, Type: placedLayerTypes.indexOf(placed.type), Trnf: placed.transform, nonAffineTransform: (_b = placed.nonAffineTransform) !== null && _b !== void 0 ? _b : placed.transform, quiltWarp: {}, warp: encodeWarp(placed.warp || {}), 'Sz ': {
905
+ Wdth: placed.width || 0,
906
+ Hght: placed.height || 0, // TODO: find size ?
907
+ }, Rslt: placed.resolution ? (0, descriptor_1.unitsValue)(placed.resolution, 'resolution') : { units: 'Density', value: 72 } });
908
+ if (placed.warp && isQuiltWarp(placed.warp)) {
909
+ var quiltWarp = encodeWarp(placed.warp);
910
+ desc.quiltWarp = quiltWarp;
911
+ desc.warp = {
912
+ warpStyle: 'warpStyle.warpNone',
913
+ warpValue: quiltWarp.warpValue,
914
+ warpPerspective: quiltWarp.warpPerspective,
915
+ warpPerspectiveOther: quiltWarp.warpPerspectiveOther,
916
+ warpRotate: quiltWarp.warpRotate,
917
+ bounds: quiltWarp.bounds,
918
+ uOrder: quiltWarp.uOrder,
919
+ vOrder: quiltWarp.vOrder,
920
+ };
921
+ }
922
+ else {
923
+ delete desc.quiltWarp;
924
+ }
925
+ if (placed.comp)
926
+ desc.comp = placed.comp;
927
+ if (placed.compInfo)
928
+ desc.compInfo = placed.compInfo;
929
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, desc.quiltWarp ? 'quiltWarp' : 'warp');
930
+ });
931
+ addHandler('fxrp', hasKey('referencePoint'), function (reader, target) {
932
+ target.referencePoint = {
933
+ x: (0, psdReader_1.readFloat64)(reader),
934
+ y: (0, psdReader_1.readFloat64)(reader),
935
+ };
936
+ }, function (writer, target) {
937
+ (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.x);
938
+ (0, psdWriter_1.writeFloat64)(writer, target.referencePoint.y);
939
+ });
940
+ if (helpers_1.MOCK_HANDLERS) {
941
+ addHandler('Patt', function (target) { return target._Patt !== undefined; }, function (reader, target, left) {
942
+ // console.log('additional info: Patt');
943
+ target._Patt = (0, psdReader_1.readBytes)(reader, left());
944
+ }, function (writer, target) { return false && (0, psdWriter_1.writeBytes)(writer, target._Patt); });
945
+ }
946
+ else {
947
+ addHandler('Patt', // TODO: handle also Pat2 & Pat3
948
+ function (// TODO: handle also Pat2 & Pat3
949
+ target) { return !target; }, function (reader, target, left) {
950
+ if (!left())
951
+ return;
952
+ (0, psdReader_1.skipBytes)(reader, left());
953
+ return; // not supported yet
954
+ target;
955
+ psdReader_1.readPattern;
956
+ // if (!target.patterns) target.patterns = [];
957
+ // target.patterns.push(readPattern(reader));
958
+ // skipBytes(reader, left());
959
+ }, function (_writer, _target) {
960
+ });
961
+ }
962
+ function readRect(reader) {
963
+ var top = (0, psdReader_1.readInt32)(reader);
964
+ var left = (0, psdReader_1.readInt32)(reader);
965
+ var bottom = (0, psdReader_1.readInt32)(reader);
966
+ var right = (0, psdReader_1.readInt32)(reader);
967
+ return { top: top, left: left, bottom: bottom, right: right };
968
+ }
969
+ function writeRect(writer, rect) {
970
+ (0, psdWriter_1.writeInt32)(writer, rect.top);
971
+ (0, psdWriter_1.writeInt32)(writer, rect.left);
972
+ (0, psdWriter_1.writeInt32)(writer, rect.bottom);
973
+ (0, psdWriter_1.writeInt32)(writer, rect.right);
974
+ }
975
+ addHandler('Anno', function (target) { return target.annotations !== undefined; }, function (reader, target, left) {
976
+ var major = (0, psdReader_1.readUint16)(reader);
977
+ var minor = (0, psdReader_1.readUint16)(reader);
978
+ if (major !== 2 || minor !== 1)
979
+ throw new Error('Invalid Anno version');
980
+ var count = (0, psdReader_1.readUint32)(reader);
981
+ var annotations = [];
982
+ for (var i = 0; i < count; i++) {
983
+ /*const length =*/ (0, psdReader_1.readUint32)(reader);
984
+ var type = (0, psdReader_1.readSignature)(reader);
985
+ var open_1 = !!(0, psdReader_1.readUint8)(reader);
986
+ /*const flags =*/ (0, psdReader_1.readUint8)(reader); // always 28
987
+ /*const optionalBlocks =*/ (0, psdReader_1.readUint16)(reader);
988
+ var iconLocation = readRect(reader);
989
+ var popupLocation = readRect(reader);
990
+ var color = (0, psdReader_1.readColor)(reader);
991
+ var author = (0, psdReader_1.readPascalString)(reader, 2);
992
+ var name_1 = (0, psdReader_1.readPascalString)(reader, 2);
993
+ var date = (0, psdReader_1.readPascalString)(reader, 2);
994
+ /*const contentLength =*/ (0, psdReader_1.readUint32)(reader);
995
+ /*const dataType =*/ (0, psdReader_1.readSignature)(reader);
996
+ var dataLength = (0, psdReader_1.readUint32)(reader);
997
+ var data = void 0;
998
+ if (type === 'txtA') {
999
+ if (dataLength >= 2 && (0, psdReader_1.readUint16)(reader) === 0xfeff) {
1000
+ data = (0, psdReader_1.readUnicodeStringWithLength)(reader, (dataLength - 2) / 2);
1001
+ }
1002
+ else {
1003
+ reader.offset -= 2;
1004
+ data = (0, psdReader_1.readAsciiString)(reader, dataLength);
1005
+ }
1006
+ data = data.replace(/\r/g, '\n');
1007
+ }
1008
+ else if (type === 'sndA') {
1009
+ data = (0, psdReader_1.readBytes)(reader, dataLength);
1010
+ }
1011
+ else {
1012
+ throw new Error('Unknown annotation type');
1013
+ }
1014
+ annotations.push({
1015
+ type: type === 'txtA' ? 'text' : 'sound',
1016
+ open: open_1,
1017
+ iconLocation: iconLocation,
1018
+ popupLocation: popupLocation,
1019
+ color: color,
1020
+ author: author,
1021
+ name: name_1,
1022
+ date: date,
1023
+ data: data,
1024
+ });
1025
+ }
1026
+ target.annotations = annotations;
1027
+ (0, psdReader_1.skipBytes)(reader, left());
1028
+ }, function (writer, target) {
1029
+ var annotations = target.annotations;
1030
+ (0, psdWriter_1.writeUint16)(writer, 2);
1031
+ (0, psdWriter_1.writeUint16)(writer, 1);
1032
+ (0, psdWriter_1.writeUint32)(writer, annotations.length);
1033
+ for (var _i = 0, annotations_1 = annotations; _i < annotations_1.length; _i++) {
1034
+ var annotation = annotations_1[_i];
1035
+ var sound = annotation.type === 'sound';
1036
+ if (sound && !(annotation.data instanceof Uint8Array))
1037
+ throw new Error('Sound annotation data should be Uint8Array');
1038
+ if (!sound && typeof annotation.data !== 'string')
1039
+ throw new Error('Text annotation data should be string');
1040
+ var lengthOffset = writer.offset;
1041
+ (0, psdWriter_1.writeUint32)(writer, 0); // length
1042
+ (0, psdWriter_1.writeSignature)(writer, sound ? 'sndA' : 'txtA');
1043
+ (0, psdWriter_1.writeUint8)(writer, annotation.open ? 1 : 0);
1044
+ (0, psdWriter_1.writeUint8)(writer, 28);
1045
+ (0, psdWriter_1.writeUint16)(writer, 1);
1046
+ writeRect(writer, annotation.iconLocation);
1047
+ writeRect(writer, annotation.popupLocation);
1048
+ (0, psdWriter_1.writeColor)(writer, annotation.color);
1049
+ (0, psdWriter_1.writePascalString)(writer, annotation.author || '', 2);
1050
+ (0, psdWriter_1.writePascalString)(writer, annotation.name || '', 2);
1051
+ (0, psdWriter_1.writePascalString)(writer, annotation.date || '', 2);
1052
+ var contentOffset = writer.offset;
1053
+ (0, psdWriter_1.writeUint32)(writer, 0); // content length
1054
+ (0, psdWriter_1.writeSignature)(writer, sound ? 'sndM' : 'txtC');
1055
+ (0, psdWriter_1.writeUint32)(writer, 0); // data length
1056
+ var dataOffset = writer.offset;
1057
+ if (sound) {
1058
+ (0, psdWriter_1.writeBytes)(writer, annotation.data);
1059
+ }
1060
+ else {
1061
+ (0, psdWriter_1.writeUint16)(writer, 0xfeff); // unicode string indicator
1062
+ var text = annotation.data.replace(/\n/g, '\r');
1063
+ for (var i = 0; i < text.length; i++)
1064
+ (0, psdWriter_1.writeUint16)(writer, text.charCodeAt(i));
1065
+ }
1066
+ writer.view.setUint32(lengthOffset, writer.offset - lengthOffset, false);
1067
+ writer.view.setUint32(contentOffset, writer.offset - contentOffset, false);
1068
+ writer.view.setUint32(dataOffset - 4, writer.offset - dataOffset, false);
1069
+ }
1070
+ });
1071
+ addHandler('lnk2', function (target) { return !!target.linkedFiles && target.linkedFiles.length > 0; }, function (reader, target, left, _, options) {
1072
+ var psd = target;
1073
+ psd.linkedFiles = [];
1074
+ while (left() > 8) {
1075
+ var size = readLength64(reader); // size
1076
+ var startOffset = reader.offset;
1077
+ var type = (0, psdReader_1.readSignature)(reader);
1078
+ var version = (0, psdReader_1.readInt32)(reader);
1079
+ var id = (0, psdReader_1.readPascalString)(reader, 1);
1080
+ var name_2 = (0, psdReader_1.readUnicodeString)(reader);
1081
+ var fileType = (0, psdReader_1.readSignature)(reader).trim(); // ' ' if empty
1082
+ var fileCreator = (0, psdReader_1.readSignature)(reader).trim(); // ' ' or '\0\0\0\0' if empty
1083
+ var dataSize = readLength64(reader);
1084
+ var hasFileOpenDescriptor = (0, psdReader_1.readUint8)(reader);
1085
+ var fileOpenDescriptor = hasFileOpenDescriptor ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1086
+ var linkedFileDescriptor = type === 'liFE' ? (0, descriptor_1.readVersionAndDescriptor)(reader) : undefined;
1087
+ var file = { id: id, name: name_2, data: undefined };
1088
+ if (fileType)
1089
+ file.type = fileType;
1090
+ if (fileCreator)
1091
+ file.creator = fileCreator;
1092
+ if (fileOpenDescriptor)
1093
+ file.descriptor = fileOpenDescriptor;
1094
+ if (type === 'liFE' && version > 3) {
1095
+ var year = (0, psdReader_1.readInt32)(reader);
1096
+ var month = (0, psdReader_1.readUint8)(reader);
1097
+ var day = (0, psdReader_1.readUint8)(reader);
1098
+ var hour = (0, psdReader_1.readUint8)(reader);
1099
+ var minute = (0, psdReader_1.readUint8)(reader);
1100
+ var seconds = (0, psdReader_1.readFloat64)(reader);
1101
+ var wholeSeconds = Math.floor(seconds);
1102
+ var ms = (seconds - wholeSeconds) * 1000;
1103
+ file.time = new Date(year, month, day, hour, minute, wholeSeconds, ms);
1104
+ }
1105
+ var fileSize = type === 'liFE' ? readLength64(reader) : 0;
1106
+ if (type === 'liFA')
1107
+ (0, psdReader_1.skipBytes)(reader, 8);
1108
+ if (type === 'liFD')
1109
+ file.data = (0, psdReader_1.readBytes)(reader, dataSize);
1110
+ if (version >= 5)
1111
+ file.childDocumentID = (0, psdReader_1.readUnicodeString)(reader);
1112
+ if (version >= 6)
1113
+ file.assetModTime = (0, psdReader_1.readFloat64)(reader);
1114
+ if (version >= 7)
1115
+ file.assetLockedState = (0, psdReader_1.readUint8)(reader);
1116
+ if (type === 'liFE')
1117
+ file.data = (0, psdReader_1.readBytes)(reader, fileSize);
1118
+ if (options.skipLinkedFilesData)
1119
+ file.data = undefined;
1120
+ psd.linkedFiles.push(file);
1121
+ linkedFileDescriptor;
1122
+ while (size % 4)
1123
+ size++;
1124
+ reader.offset = startOffset + size;
1125
+ }
1126
+ (0, psdReader_1.skipBytes)(reader, left()); // ?
1127
+ }, function (writer, target) {
1128
+ var psd = target;
1129
+ for (var _i = 0, _a = psd.linkedFiles; _i < _a.length; _i++) {
1130
+ var file = _a[_i];
1131
+ var version = 2;
1132
+ if (file.assetLockedState != null)
1133
+ version = 7;
1134
+ else if (file.assetModTime != null)
1135
+ version = 6;
1136
+ else if (file.childDocumentID != null)
1137
+ version = 5;
1138
+ // TODO: else if (file.time != null) version = 3; (only for liFE)
1139
+ (0, psdWriter_1.writeUint32)(writer, 0);
1140
+ (0, psdWriter_1.writeUint32)(writer, 0); // size
1141
+ var sizeOffset = writer.offset;
1142
+ (0, psdWriter_1.writeSignature)(writer, file.data ? 'liFD' : 'liFA');
1143
+ (0, psdWriter_1.writeInt32)(writer, version);
1144
+ (0, psdWriter_1.writePascalString)(writer, file.id || '', 1);
1145
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.name || '');
1146
+ (0, psdWriter_1.writeSignature)(writer, file.type ? "".concat(file.type, " ").substring(0, 4) : ' ');
1147
+ (0, psdWriter_1.writeSignature)(writer, file.creator ? "".concat(file.creator, " ").substring(0, 4) : '\0\0\0\0');
1148
+ writeLength64(writer, file.data ? file.data.byteLength : 0);
1149
+ if (file.descriptor && file.descriptor.compInfo) {
1150
+ var desc = {
1151
+ compInfo: file.descriptor.compInfo,
1152
+ };
1153
+ (0, psdWriter_1.writeUint8)(writer, 1);
1154
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1155
+ }
1156
+ else {
1157
+ (0, psdWriter_1.writeUint8)(writer, 0);
1158
+ }
1159
+ if (file.data)
1160
+ (0, psdWriter_1.writeBytes)(writer, file.data);
1161
+ else
1162
+ writeLength64(writer, 0);
1163
+ if (version >= 5)
1164
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, file.childDocumentID || '');
1165
+ if (version >= 6)
1166
+ (0, psdWriter_1.writeFloat64)(writer, file.assetModTime || 0);
1167
+ if (version >= 7)
1168
+ (0, psdWriter_1.writeUint8)(writer, file.assetLockedState || 0);
1169
+ var size = writer.offset - sizeOffset;
1170
+ writer.view.setUint32(sizeOffset - 4, size, false); // write size
1171
+ while (size % 4) {
1172
+ size++;
1173
+ (0, psdWriter_1.writeUint8)(writer, 0);
1174
+ }
1175
+ }
1176
+ });
1177
+ addHandlerAlias('lnkD', 'lnk2');
1178
+ addHandlerAlias('lnk3', 'lnk2');
1179
+ // this seems to just be zero size block, ignore it
1180
+ addHandler('lnkE', function (target) { return target._lnkE !== undefined; }, function (reader, target, left, _psds, options) {
1181
+ if (options.logMissingFeatures && left()) {
1182
+ console.log("Non-empty lnkE layer info (".concat(left(), " bytes)"));
1183
+ }
1184
+ if (helpers_1.MOCK_HANDLERS) {
1185
+ target._lnkE = (0, psdReader_1.readBytes)(reader, left());
1186
+ }
1187
+ }, function (writer, target) { return helpers_1.MOCK_HANDLERS && (0, psdWriter_1.writeBytes)(writer, target._lnkE); });
1188
+ addHandler('pths', hasKey('pathList'), function (reader, target) {
1189
+ var descriptor = (0, descriptor_1.readVersionAndDescriptor)(reader);
1190
+ target.pathList = []; // TODO: read paths (find example with non-empty list)
1191
+ descriptor;
1192
+ // console.log('pths', descriptor); // TODO: remove this
1193
+ }, function (writer, _target) {
1194
+ var descriptor = {
1195
+ pathList: [], // TODO: write paths
1196
+ };
1197
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'pathsDataClass', descriptor);
1198
+ });
1199
+ addHandler('lyvr', hasKey('version'), function (reader, target) { return target.version = (0, psdReader_1.readUint32)(reader); }, function (writer, target) { return (0, psdWriter_1.writeUint32)(writer, target.version); });
1200
+ function adjustmentType(type) {
1201
+ return function (target) { return !!target.adjustment && target.adjustment.type === type; };
1202
+ }
1203
+ addHandler('brit', adjustmentType('brightness/contrast'), function (reader, target, left) {
1204
+ if (!target.adjustment) { // ignore if got one from CgEd block
1205
+ target.adjustment = {
1206
+ type: 'brightness/contrast',
1207
+ brightness: (0, psdReader_1.readInt16)(reader),
1208
+ contrast: (0, psdReader_1.readInt16)(reader),
1209
+ meanValue: (0, psdReader_1.readInt16)(reader),
1210
+ labColorOnly: !!(0, psdReader_1.readUint8)(reader),
1211
+ useLegacy: true,
1212
+ };
1213
+ }
1214
+ (0, psdReader_1.skipBytes)(reader, left());
1215
+ }, function (writer, target) {
1216
+ var _a;
1217
+ var info = target.adjustment;
1218
+ (0, psdWriter_1.writeInt16)(writer, info.brightness || 0);
1219
+ (0, psdWriter_1.writeInt16)(writer, info.contrast || 0);
1220
+ (0, psdWriter_1.writeInt16)(writer, (_a = info.meanValue) !== null && _a !== void 0 ? _a : 127);
1221
+ (0, psdWriter_1.writeUint8)(writer, info.labColorOnly ? 1 : 0);
1222
+ (0, psdWriter_1.writeZeros)(writer, 1);
1223
+ });
1224
+ function readLevelsChannel(reader) {
1225
+ var shadowInput = (0, psdReader_1.readInt16)(reader);
1226
+ var highlightInput = (0, psdReader_1.readInt16)(reader);
1227
+ var shadowOutput = (0, psdReader_1.readInt16)(reader);
1228
+ var highlightOutput = (0, psdReader_1.readInt16)(reader);
1229
+ var midtoneInput = (0, psdReader_1.readInt16)(reader) / 100;
1230
+ return { shadowInput: shadowInput, highlightInput: highlightInput, shadowOutput: shadowOutput, highlightOutput: highlightOutput, midtoneInput: midtoneInput };
1231
+ }
1232
+ function writeLevelsChannel(writer, channel) {
1233
+ (0, psdWriter_1.writeInt16)(writer, channel.shadowInput);
1234
+ (0, psdWriter_1.writeInt16)(writer, channel.highlightInput);
1235
+ (0, psdWriter_1.writeInt16)(writer, channel.shadowOutput);
1236
+ (0, psdWriter_1.writeInt16)(writer, channel.highlightOutput);
1237
+ (0, psdWriter_1.writeInt16)(writer, Math.round(channel.midtoneInput * 100));
1238
+ }
1239
+ addHandler('levl', adjustmentType('levels'), function (reader, target, left) {
1240
+ if ((0, psdReader_1.readUint16)(reader) !== 2)
1241
+ throw new Error('Invalid levl version');
1242
+ target.adjustment = __assign(__assign({}, target.adjustment), { type: 'levels', rgb: readLevelsChannel(reader), red: readLevelsChannel(reader), green: readLevelsChannel(reader), blue: readLevelsChannel(reader) });
1243
+ (0, psdReader_1.skipBytes)(reader, left());
1244
+ }, function (writer, target) {
1245
+ var info = target.adjustment;
1246
+ var defaultChannel = {
1247
+ shadowInput: 0,
1248
+ highlightInput: 255,
1249
+ shadowOutput: 0,
1250
+ highlightOutput: 255,
1251
+ midtoneInput: 1,
1252
+ };
1253
+ (0, psdWriter_1.writeUint16)(writer, 2); // version
1254
+ writeLevelsChannel(writer, info.rgb || defaultChannel);
1255
+ writeLevelsChannel(writer, info.red || defaultChannel);
1256
+ writeLevelsChannel(writer, info.blue || defaultChannel);
1257
+ writeLevelsChannel(writer, info.green || defaultChannel);
1258
+ for (var i = 0; i < 59; i++)
1259
+ writeLevelsChannel(writer, defaultChannel);
1260
+ });
1261
+ function readCurveChannel(reader) {
1262
+ var nodes = (0, psdReader_1.readUint16)(reader);
1263
+ var channel = [];
1264
+ for (var j = 0; j < nodes; j++) {
1265
+ var output = (0, psdReader_1.readInt16)(reader);
1266
+ var input = (0, psdReader_1.readInt16)(reader);
1267
+ channel.push({ input: input, output: output });
1268
+ }
1269
+ return channel;
1270
+ }
1271
+ function writeCurveChannel(writer, channel) {
1272
+ (0, psdWriter_1.writeUint16)(writer, channel.length);
1273
+ for (var _i = 0, channel_1 = channel; _i < channel_1.length; _i++) {
1274
+ var n = channel_1[_i];
1275
+ (0, psdWriter_1.writeUint16)(writer, n.output);
1276
+ (0, psdWriter_1.writeUint16)(writer, n.input);
1277
+ }
1278
+ }
1279
+ addHandler('curv', adjustmentType('curves'), function (reader, target, left) {
1280
+ (0, psdReader_1.readUint8)(reader);
1281
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1282
+ throw new Error('Invalid curv version');
1283
+ (0, psdReader_1.readUint16)(reader);
1284
+ var channels = (0, psdReader_1.readUint16)(reader);
1285
+ var info = { type: 'curves' };
1286
+ if (channels & 1)
1287
+ info.rgb = readCurveChannel(reader);
1288
+ if (channels & 2)
1289
+ info.red = readCurveChannel(reader);
1290
+ if (channels & 4)
1291
+ info.green = readCurveChannel(reader);
1292
+ if (channels & 8)
1293
+ info.blue = readCurveChannel(reader);
1294
+ target.adjustment = __assign(__assign({}, target.adjustment), info);
1295
+ // ignoring, duplicate information
1296
+ // checkSignature(reader, 'Crv ');
1297
+ // const cVersion = readUint16(reader);
1298
+ // readUint16(reader);
1299
+ // const channelCount = readUint16(reader);
1300
+ // for (let i = 0; i < channelCount; i++) {
1301
+ // const index = readUint16(reader);
1302
+ // const nodes = readUint16(reader);
1303
+ // for (let j = 0; j < nodes; j++) {
1304
+ // const output = readInt16(reader);
1305
+ // const input = readInt16(reader);
1306
+ // }
1307
+ // }
1308
+ (0, psdReader_1.skipBytes)(reader, left());
1309
+ }, function (writer, target) {
1310
+ var info = target.adjustment;
1311
+ var rgb = info.rgb, red = info.red, green = info.green, blue = info.blue;
1312
+ var channels = 0;
1313
+ var channelCount = 0;
1314
+ if (rgb && rgb.length) {
1315
+ channels |= 1;
1316
+ channelCount++;
1317
+ }
1318
+ if (red && red.length) {
1319
+ channels |= 2;
1320
+ channelCount++;
1321
+ }
1322
+ if (green && green.length) {
1323
+ channels |= 4;
1324
+ channelCount++;
1325
+ }
1326
+ if (blue && blue.length) {
1327
+ channels |= 8;
1328
+ channelCount++;
1329
+ }
1330
+ (0, psdWriter_1.writeUint8)(writer, 0);
1331
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1332
+ (0, psdWriter_1.writeUint16)(writer, 0);
1333
+ (0, psdWriter_1.writeUint16)(writer, channels);
1334
+ if (rgb && rgb.length)
1335
+ writeCurveChannel(writer, rgb);
1336
+ if (red && red.length)
1337
+ writeCurveChannel(writer, red);
1338
+ if (green && green.length)
1339
+ writeCurveChannel(writer, green);
1340
+ if (blue && blue.length)
1341
+ writeCurveChannel(writer, blue);
1342
+ (0, psdWriter_1.writeSignature)(writer, 'Crv ');
1343
+ (0, psdWriter_1.writeUint16)(writer, 4); // version
1344
+ (0, psdWriter_1.writeUint16)(writer, 0);
1345
+ (0, psdWriter_1.writeUint16)(writer, channelCount);
1346
+ if (rgb && rgb.length) {
1347
+ (0, psdWriter_1.writeUint16)(writer, 0);
1348
+ writeCurveChannel(writer, rgb);
1349
+ }
1350
+ if (red && red.length) {
1351
+ (0, psdWriter_1.writeUint16)(writer, 1);
1352
+ writeCurveChannel(writer, red);
1353
+ }
1354
+ if (green && green.length) {
1355
+ (0, psdWriter_1.writeUint16)(writer, 2);
1356
+ writeCurveChannel(writer, green);
1357
+ }
1358
+ if (blue && blue.length) {
1359
+ (0, psdWriter_1.writeUint16)(writer, 3);
1360
+ writeCurveChannel(writer, blue);
1361
+ }
1362
+ (0, psdWriter_1.writeZeros)(writer, 2);
1363
+ });
1364
+ addHandler('expA', adjustmentType('exposure'), function (reader, target, left) {
1365
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1366
+ throw new Error('Invalid expA version');
1367
+ target.adjustment = __assign(__assign({}, target.adjustment), { type: 'exposure', exposure: (0, psdReader_1.readFloat32)(reader), offset: (0, psdReader_1.readFloat32)(reader), gamma: (0, psdReader_1.readFloat32)(reader) });
1368
+ (0, psdReader_1.skipBytes)(reader, left());
1369
+ }, function (writer, target) {
1370
+ var info = target.adjustment;
1371
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1372
+ (0, psdWriter_1.writeFloat32)(writer, info.exposure);
1373
+ (0, psdWriter_1.writeFloat32)(writer, info.offset);
1374
+ (0, psdWriter_1.writeFloat32)(writer, info.gamma);
1375
+ (0, psdWriter_1.writeZeros)(writer, 2);
1376
+ });
1377
+ addHandler('vibA', adjustmentType('vibrance'), function (reader, target, left) {
1378
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1379
+ target.adjustment = { type: 'vibrance' };
1380
+ if (desc.vibrance !== undefined)
1381
+ target.adjustment.vibrance = desc.vibrance;
1382
+ if (desc.Strt !== undefined)
1383
+ target.adjustment.saturation = desc.Strt;
1384
+ (0, psdReader_1.skipBytes)(reader, left());
1385
+ }, function (writer, target) {
1386
+ var info = target.adjustment;
1387
+ var desc = {};
1388
+ if (info.vibrance !== undefined)
1389
+ desc.vibrance = info.vibrance;
1390
+ if (info.saturation !== undefined)
1391
+ desc.Strt = info.saturation;
1392
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1393
+ });
1394
+ function readHueChannel(reader) {
1395
+ return {
1396
+ a: (0, psdReader_1.readInt16)(reader),
1397
+ b: (0, psdReader_1.readInt16)(reader),
1398
+ c: (0, psdReader_1.readInt16)(reader),
1399
+ d: (0, psdReader_1.readInt16)(reader),
1400
+ hue: (0, psdReader_1.readInt16)(reader),
1401
+ saturation: (0, psdReader_1.readInt16)(reader),
1402
+ lightness: (0, psdReader_1.readInt16)(reader),
1403
+ };
1404
+ }
1405
+ function writeHueChannel(writer, channel) {
1406
+ var c = channel || {};
1407
+ (0, psdWriter_1.writeInt16)(writer, c.a || 0);
1408
+ (0, psdWriter_1.writeInt16)(writer, c.b || 0);
1409
+ (0, psdWriter_1.writeInt16)(writer, c.c || 0);
1410
+ (0, psdWriter_1.writeInt16)(writer, c.d || 0);
1411
+ (0, psdWriter_1.writeInt16)(writer, c.hue || 0);
1412
+ (0, psdWriter_1.writeInt16)(writer, c.saturation || 0);
1413
+ (0, psdWriter_1.writeInt16)(writer, c.lightness || 0);
1414
+ }
1415
+ addHandler('hue2', adjustmentType('hue/saturation'), function (reader, target, left) {
1416
+ if ((0, psdReader_1.readUint16)(reader) !== 2)
1417
+ throw new Error('Invalid hue2 version');
1418
+ target.adjustment = __assign(__assign({}, target.adjustment), { type: 'hue/saturation', master: readHueChannel(reader), reds: readHueChannel(reader), yellows: readHueChannel(reader), greens: readHueChannel(reader), cyans: readHueChannel(reader), blues: readHueChannel(reader), magentas: readHueChannel(reader) });
1419
+ (0, psdReader_1.skipBytes)(reader, left());
1420
+ }, function (writer, target) {
1421
+ var info = target.adjustment;
1422
+ (0, psdWriter_1.writeUint16)(writer, 2); // version
1423
+ writeHueChannel(writer, info.master);
1424
+ writeHueChannel(writer, info.reds);
1425
+ writeHueChannel(writer, info.yellows);
1426
+ writeHueChannel(writer, info.greens);
1427
+ writeHueChannel(writer, info.cyans);
1428
+ writeHueChannel(writer, info.blues);
1429
+ writeHueChannel(writer, info.magentas);
1430
+ });
1431
+ function readColorBalance(reader) {
1432
+ return {
1433
+ cyanRed: (0, psdReader_1.readInt16)(reader),
1434
+ magentaGreen: (0, psdReader_1.readInt16)(reader),
1435
+ yellowBlue: (0, psdReader_1.readInt16)(reader),
1436
+ };
1437
+ }
1438
+ function writeColorBalance(writer, value) {
1439
+ (0, psdWriter_1.writeInt16)(writer, value.cyanRed || 0);
1440
+ (0, psdWriter_1.writeInt16)(writer, value.magentaGreen || 0);
1441
+ (0, psdWriter_1.writeInt16)(writer, value.yellowBlue || 0);
1442
+ }
1443
+ addHandler('blnc', adjustmentType('color balance'), function (reader, target, left) {
1444
+ target.adjustment = {
1445
+ type: 'color balance',
1446
+ shadows: readColorBalance(reader),
1447
+ midtones: readColorBalance(reader),
1448
+ highlights: readColorBalance(reader),
1449
+ preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
1450
+ };
1451
+ (0, psdReader_1.skipBytes)(reader, left());
1452
+ }, function (writer, target) {
1453
+ var info = target.adjustment;
1454
+ writeColorBalance(writer, info.shadows || {});
1455
+ writeColorBalance(writer, info.midtones || {});
1456
+ writeColorBalance(writer, info.highlights || {});
1457
+ (0, psdWriter_1.writeUint8)(writer, info.preserveLuminosity ? 1 : 0);
1458
+ (0, psdWriter_1.writeZeros)(writer, 1);
1459
+ });
1460
+ addHandler('blwh', adjustmentType('black & white'), function (reader, target, left) {
1461
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1462
+ target.adjustment = {
1463
+ type: 'black & white',
1464
+ reds: desc['Rd '],
1465
+ yellows: desc.Yllw,
1466
+ greens: desc['Grn '],
1467
+ cyans: desc['Cyn '],
1468
+ blues: desc['Bl '],
1469
+ magentas: desc.Mgnt,
1470
+ useTint: !!desc.useTint,
1471
+ presetKind: desc.bwPresetKind,
1472
+ presetFileName: desc.blackAndWhitePresetFileName,
1473
+ };
1474
+ if (desc.tintColor !== undefined)
1475
+ target.adjustment.tintColor = (0, descriptor_1.parseColor)(desc.tintColor);
1476
+ (0, psdReader_1.skipBytes)(reader, left());
1477
+ }, function (writer, target) {
1478
+ var info = target.adjustment;
1479
+ var desc = {
1480
+ 'Rd ': info.reds || 0,
1481
+ Yllw: info.yellows || 0,
1482
+ 'Grn ': info.greens || 0,
1483
+ 'Cyn ': info.cyans || 0,
1484
+ 'Bl ': info.blues || 0,
1485
+ Mgnt: info.magentas || 0,
1486
+ useTint: !!info.useTint,
1487
+ tintColor: (0, descriptor_1.serializeColor)(info.tintColor),
1488
+ bwPresetKind: info.presetKind || 0,
1489
+ blackAndWhitePresetFileName: info.presetFileName || '',
1490
+ };
1491
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1492
+ });
1493
+ addHandler('phfl', adjustmentType('photo filter'), function (reader, target, left) {
1494
+ var version = (0, psdReader_1.readUint16)(reader);
1495
+ if (version !== 2 && version !== 3)
1496
+ throw new Error('Invalid phfl version');
1497
+ var color;
1498
+ if (version === 2) {
1499
+ color = (0, psdReader_1.readColor)(reader);
1500
+ }
1501
+ else { // version 3
1502
+ // TODO: test this, this is probably wrong
1503
+ color = {
1504
+ l: (0, psdReader_1.readInt32)(reader) / 100,
1505
+ a: (0, psdReader_1.readInt32)(reader) / 100,
1506
+ b: (0, psdReader_1.readInt32)(reader) / 100,
1507
+ };
1508
+ }
1509
+ target.adjustment = {
1510
+ type: 'photo filter',
1511
+ color: color,
1512
+ density: (0, psdReader_1.readUint32)(reader) / 100,
1513
+ preserveLuminosity: !!(0, psdReader_1.readUint8)(reader),
1514
+ };
1515
+ (0, psdReader_1.skipBytes)(reader, left());
1516
+ }, function (writer, target) {
1517
+ var info = target.adjustment;
1518
+ (0, psdWriter_1.writeUint16)(writer, 2); // version
1519
+ (0, psdWriter_1.writeColor)(writer, info.color || { l: 0, a: 0, b: 0 });
1520
+ (0, psdWriter_1.writeUint32)(writer, (info.density || 0) * 100);
1521
+ (0, psdWriter_1.writeUint8)(writer, info.preserveLuminosity ? 1 : 0);
1522
+ (0, psdWriter_1.writeZeros)(writer, 3);
1523
+ });
1524
+ function readMixrChannel(reader) {
1525
+ var red = (0, psdReader_1.readInt16)(reader);
1526
+ var green = (0, psdReader_1.readInt16)(reader);
1527
+ var blue = (0, psdReader_1.readInt16)(reader);
1528
+ (0, psdReader_1.skipBytes)(reader, 2);
1529
+ var constant = (0, psdReader_1.readInt16)(reader);
1530
+ return { red: red, green: green, blue: blue, constant: constant };
1531
+ }
1532
+ function writeMixrChannel(writer, channel) {
1533
+ var c = channel || {};
1534
+ (0, psdWriter_1.writeInt16)(writer, c.red);
1535
+ (0, psdWriter_1.writeInt16)(writer, c.green);
1536
+ (0, psdWriter_1.writeInt16)(writer, c.blue);
1537
+ (0, psdWriter_1.writeZeros)(writer, 2);
1538
+ (0, psdWriter_1.writeInt16)(writer, c.constant);
1539
+ }
1540
+ addHandler('mixr', adjustmentType('channel mixer'), function (reader, target, left) {
1541
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1542
+ throw new Error('Invalid mixr version');
1543
+ var adjustment = target.adjustment = __assign(__assign({}, target.adjustment), { type: 'channel mixer', monochrome: !!(0, psdReader_1.readUint16)(reader) });
1544
+ if (!adjustment.monochrome) {
1545
+ adjustment.red = readMixrChannel(reader);
1546
+ adjustment.green = readMixrChannel(reader);
1547
+ adjustment.blue = readMixrChannel(reader);
1548
+ }
1549
+ adjustment.gray = readMixrChannel(reader);
1550
+ (0, psdReader_1.skipBytes)(reader, left());
1551
+ }, function (writer, target) {
1552
+ var info = target.adjustment;
1553
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1554
+ (0, psdWriter_1.writeUint16)(writer, info.monochrome ? 1 : 0);
1555
+ if (info.monochrome) {
1556
+ writeMixrChannel(writer, info.gray);
1557
+ (0, psdWriter_1.writeZeros)(writer, 3 * 5 * 2);
1558
+ }
1559
+ else {
1560
+ writeMixrChannel(writer, info.red);
1561
+ writeMixrChannel(writer, info.green);
1562
+ writeMixrChannel(writer, info.blue);
1563
+ writeMixrChannel(writer, info.gray);
1564
+ }
1565
+ });
1566
+ var colorLookupType = (0, helpers_1.createEnum)('colorLookupType', '3DLUT', {
1567
+ '3dlut': '3DLUT',
1568
+ abstractProfile: 'abstractProfile',
1569
+ deviceLinkProfile: 'deviceLinkProfile',
1570
+ });
1571
+ var LUTFormatType = (0, helpers_1.createEnum)('LUTFormatType', 'look', {
1572
+ look: 'LUTFormatLOOK',
1573
+ cube: 'LUTFormatCUBE',
1574
+ '3dl': 'LUTFormat3DL',
1575
+ });
1576
+ var colorLookupOrder = (0, helpers_1.createEnum)('colorLookupOrder', 'rgb', {
1577
+ rgb: 'rgbOrder',
1578
+ bgr: 'bgrOrder',
1579
+ });
1580
+ addHandler('clrL', adjustmentType('color lookup'), function (reader, target, left) {
1581
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1582
+ throw new Error('Invalid clrL version');
1583
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1584
+ target.adjustment = { type: 'color lookup' };
1585
+ var info = target.adjustment;
1586
+ if (desc.lookupType !== undefined)
1587
+ info.lookupType = colorLookupType.decode(desc.lookupType);
1588
+ if (desc['Nm '] !== undefined)
1589
+ info.name = desc['Nm '];
1590
+ if (desc.Dthr !== undefined)
1591
+ info.dither = desc.Dthr;
1592
+ if (desc.profile !== undefined)
1593
+ info.profile = desc.profile;
1594
+ if (desc.LUTFormat !== undefined)
1595
+ info.lutFormat = LUTFormatType.decode(desc.LUTFormat);
1596
+ if (desc.dataOrder !== undefined)
1597
+ info.dataOrder = colorLookupOrder.decode(desc.dataOrder);
1598
+ if (desc.tableOrder !== undefined)
1599
+ info.tableOrder = colorLookupOrder.decode(desc.tableOrder);
1600
+ if (desc.LUT3DFileData !== undefined)
1601
+ info.lut3DFileData = desc.LUT3DFileData;
1602
+ if (desc.LUT3DFileName !== undefined)
1603
+ info.lut3DFileName = desc.LUT3DFileName;
1604
+ (0, psdReader_1.skipBytes)(reader, left());
1605
+ }, function (writer, target) {
1606
+ var info = target.adjustment;
1607
+ var desc = {};
1608
+ if (info.lookupType !== undefined)
1609
+ desc.lookupType = colorLookupType.encode(info.lookupType);
1610
+ if (info.name !== undefined)
1611
+ desc['Nm '] = info.name;
1612
+ if (info.dither !== undefined)
1613
+ desc.Dthr = info.dither;
1614
+ if (info.profile !== undefined)
1615
+ desc.profile = info.profile;
1616
+ if (info.lutFormat !== undefined)
1617
+ desc.LUTFormat = LUTFormatType.encode(info.lutFormat);
1618
+ if (info.dataOrder !== undefined)
1619
+ desc.dataOrder = colorLookupOrder.encode(info.dataOrder);
1620
+ if (info.tableOrder !== undefined)
1621
+ desc.tableOrder = colorLookupOrder.encode(info.tableOrder);
1622
+ if (info.lut3DFileData !== undefined)
1623
+ desc.LUT3DFileData = info.lut3DFileData;
1624
+ if (info.lut3DFileName !== undefined)
1625
+ desc.LUT3DFileName = info.lut3DFileName;
1626
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1627
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1628
+ });
1629
+ addHandler('nvrt', adjustmentType('invert'), function (reader, target, left) {
1630
+ target.adjustment = { type: 'invert' };
1631
+ (0, psdReader_1.skipBytes)(reader, left());
1632
+ }, function () {
1633
+ // nothing to write here
1634
+ });
1635
+ addHandler('post', adjustmentType('posterize'), function (reader, target, left) {
1636
+ target.adjustment = {
1637
+ type: 'posterize',
1638
+ levels: (0, psdReader_1.readUint16)(reader),
1639
+ };
1640
+ (0, psdReader_1.skipBytes)(reader, left());
1641
+ }, function (writer, target) {
1642
+ var _a;
1643
+ var info = target.adjustment;
1644
+ (0, psdWriter_1.writeUint16)(writer, (_a = info.levels) !== null && _a !== void 0 ? _a : 4);
1645
+ (0, psdWriter_1.writeZeros)(writer, 2);
1646
+ });
1647
+ addHandler('thrs', adjustmentType('threshold'), function (reader, target, left) {
1648
+ target.adjustment = {
1649
+ type: 'threshold',
1650
+ level: (0, psdReader_1.readUint16)(reader),
1651
+ };
1652
+ (0, psdReader_1.skipBytes)(reader, left());
1653
+ }, function (writer, target) {
1654
+ var _a;
1655
+ var info = target.adjustment;
1656
+ (0, psdWriter_1.writeUint16)(writer, (_a = info.level) !== null && _a !== void 0 ? _a : 128);
1657
+ (0, psdWriter_1.writeZeros)(writer, 2);
1658
+ });
1659
+ var grdmColorModels = ['', '', '', 'rgb', 'hsb', '', 'lab'];
1660
+ addHandler('grdm', adjustmentType('gradient map'), function (reader, target, left) {
1661
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1662
+ throw new Error('Invalid grdm version');
1663
+ var info = {
1664
+ type: 'gradient map',
1665
+ gradientType: 'solid',
1666
+ };
1667
+ info.reverse = !!(0, psdReader_1.readUint8)(reader);
1668
+ info.dither = !!(0, psdReader_1.readUint8)(reader);
1669
+ info.name = (0, psdReader_1.readUnicodeString)(reader);
1670
+ info.colorStops = [];
1671
+ info.opacityStops = [];
1672
+ var stopsCount = (0, psdReader_1.readUint16)(reader);
1673
+ for (var i = 0; i < stopsCount; i++) {
1674
+ info.colorStops.push({
1675
+ location: (0, psdReader_1.readUint32)(reader),
1676
+ midpoint: (0, psdReader_1.readUint32)(reader) / 100,
1677
+ color: (0, psdReader_1.readColor)(reader),
1678
+ });
1679
+ (0, psdReader_1.skipBytes)(reader, 2);
1680
+ }
1681
+ var opacityStopsCount = (0, psdReader_1.readUint16)(reader);
1682
+ for (var i = 0; i < opacityStopsCount; i++) {
1683
+ info.opacityStops.push({
1684
+ location: (0, psdReader_1.readUint32)(reader),
1685
+ midpoint: (0, psdReader_1.readUint32)(reader) / 100,
1686
+ opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
1687
+ });
1688
+ }
1689
+ var expansionCount = (0, psdReader_1.readUint16)(reader);
1690
+ if (expansionCount !== 2)
1691
+ throw new Error('Invalid grdm expansion count');
1692
+ var interpolation = (0, psdReader_1.readUint16)(reader);
1693
+ info.smoothness = interpolation / 4096;
1694
+ var length = (0, psdReader_1.readUint16)(reader);
1695
+ if (length !== 32)
1696
+ throw new Error('Invalid grdm length');
1697
+ info.gradientType = (0, psdReader_1.readUint16)(reader) ? 'noise' : 'solid';
1698
+ info.randomSeed = (0, psdReader_1.readUint32)(reader);
1699
+ info.addTransparency = !!(0, psdReader_1.readUint16)(reader);
1700
+ info.restrictColors = !!(0, psdReader_1.readUint16)(reader);
1701
+ info.roughness = (0, psdReader_1.readUint32)(reader) / 4096;
1702
+ info.colorModel = (grdmColorModels[(0, psdReader_1.readUint16)(reader)] || 'rgb');
1703
+ info.min = [
1704
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1705
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1706
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1707
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1708
+ ];
1709
+ info.max = [
1710
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1711
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1712
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1713
+ (0, psdReader_1.readUint16)(reader) / 0x8000,
1714
+ ];
1715
+ (0, psdReader_1.skipBytes)(reader, left());
1716
+ for (var _i = 0, _a = info.colorStops; _i < _a.length; _i++) {
1717
+ var s = _a[_i];
1718
+ s.location /= interpolation;
1719
+ }
1720
+ for (var _b = 0, _c = info.opacityStops; _b < _c.length; _b++) {
1721
+ var s = _c[_b];
1722
+ s.location /= interpolation;
1723
+ }
1724
+ target.adjustment = info;
1725
+ }, function (writer, target) {
1726
+ var _a, _b, _c;
1727
+ var info = target.adjustment;
1728
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1729
+ (0, psdWriter_1.writeUint8)(writer, info.reverse ? 1 : 0);
1730
+ (0, psdWriter_1.writeUint8)(writer, info.dither ? 1 : 0);
1731
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, info.name || '');
1732
+ (0, psdWriter_1.writeUint16)(writer, info.colorStops && info.colorStops.length || 0);
1733
+ var interpolation = Math.round(((_a = info.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1734
+ for (var _i = 0, _d = info.colorStops || []; _i < _d.length; _i++) {
1735
+ var s = _d[_i];
1736
+ (0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
1737
+ (0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
1738
+ (0, psdWriter_1.writeColor)(writer, s.color);
1739
+ (0, psdWriter_1.writeZeros)(writer, 2);
1740
+ }
1741
+ (0, psdWriter_1.writeUint16)(writer, info.opacityStops && info.opacityStops.length || 0);
1742
+ for (var _e = 0, _f = info.opacityStops || []; _e < _f.length; _e++) {
1743
+ var s = _f[_e];
1744
+ (0, psdWriter_1.writeUint32)(writer, Math.round(s.location * interpolation));
1745
+ (0, psdWriter_1.writeUint32)(writer, Math.round(s.midpoint * 100));
1746
+ (0, psdWriter_1.writeUint16)(writer, Math.round(s.opacity * 0xff));
1747
+ }
1748
+ (0, psdWriter_1.writeUint16)(writer, 2); // expansion count
1749
+ (0, psdWriter_1.writeUint16)(writer, interpolation);
1750
+ (0, psdWriter_1.writeUint16)(writer, 32); // length
1751
+ (0, psdWriter_1.writeUint16)(writer, info.gradientType === 'noise' ? 1 : 0);
1752
+ (0, psdWriter_1.writeUint32)(writer, info.randomSeed || 0);
1753
+ (0, psdWriter_1.writeUint16)(writer, info.addTransparency ? 1 : 0);
1754
+ (0, psdWriter_1.writeUint16)(writer, info.restrictColors ? 1 : 0);
1755
+ (0, psdWriter_1.writeUint32)(writer, Math.round(((_b = info.roughness) !== null && _b !== void 0 ? _b : 1) * 4096));
1756
+ var colorModel = grdmColorModels.indexOf((_c = info.colorModel) !== null && _c !== void 0 ? _c : 'rgb');
1757
+ (0, psdWriter_1.writeUint16)(writer, colorModel === -1 ? 3 : colorModel);
1758
+ for (var i = 0; i < 4; i++)
1759
+ (0, psdWriter_1.writeUint16)(writer, Math.round((info.min && info.min[i] || 0) * 0x8000));
1760
+ for (var i = 0; i < 4; i++)
1761
+ (0, psdWriter_1.writeUint16)(writer, Math.round((info.max && info.max[i] || 0) * 0x8000));
1762
+ (0, psdWriter_1.writeZeros)(writer, 4);
1763
+ });
1764
+ function readSelectiveColors(reader) {
1765
+ return {
1766
+ c: (0, psdReader_1.readInt16)(reader),
1767
+ m: (0, psdReader_1.readInt16)(reader),
1768
+ y: (0, psdReader_1.readInt16)(reader),
1769
+ k: (0, psdReader_1.readInt16)(reader),
1770
+ };
1771
+ }
1772
+ function writeSelectiveColors(writer, cmyk) {
1773
+ var c = cmyk || {};
1774
+ (0, psdWriter_1.writeInt16)(writer, c.c);
1775
+ (0, psdWriter_1.writeInt16)(writer, c.m);
1776
+ (0, psdWriter_1.writeInt16)(writer, c.y);
1777
+ (0, psdWriter_1.writeInt16)(writer, c.k);
1778
+ }
1779
+ addHandler('selc', adjustmentType('selective color'), function (reader, target) {
1780
+ if ((0, psdReader_1.readUint16)(reader) !== 1)
1781
+ throw new Error('Invalid selc version');
1782
+ var mode = (0, psdReader_1.readUint16)(reader) ? 'absolute' : 'relative';
1783
+ (0, psdReader_1.skipBytes)(reader, 8);
1784
+ target.adjustment = {
1785
+ type: 'selective color',
1786
+ mode: mode,
1787
+ reds: readSelectiveColors(reader),
1788
+ yellows: readSelectiveColors(reader),
1789
+ greens: readSelectiveColors(reader),
1790
+ cyans: readSelectiveColors(reader),
1791
+ blues: readSelectiveColors(reader),
1792
+ magentas: readSelectiveColors(reader),
1793
+ whites: readSelectiveColors(reader),
1794
+ neutrals: readSelectiveColors(reader),
1795
+ blacks: readSelectiveColors(reader),
1796
+ };
1797
+ }, function (writer, target) {
1798
+ var info = target.adjustment;
1799
+ (0, psdWriter_1.writeUint16)(writer, 1); // version
1800
+ (0, psdWriter_1.writeUint16)(writer, info.mode === 'absolute' ? 1 : 0);
1801
+ (0, psdWriter_1.writeZeros)(writer, 8);
1802
+ writeSelectiveColors(writer, info.reds);
1803
+ writeSelectiveColors(writer, info.yellows);
1804
+ writeSelectiveColors(writer, info.greens);
1805
+ writeSelectiveColors(writer, info.cyans);
1806
+ writeSelectiveColors(writer, info.blues);
1807
+ writeSelectiveColors(writer, info.magentas);
1808
+ writeSelectiveColors(writer, info.whites);
1809
+ writeSelectiveColors(writer, info.neutrals);
1810
+ writeSelectiveColors(writer, info.blacks);
1811
+ });
1812
+ addHandler('CgEd', function (target) {
1813
+ var a = target.adjustment;
1814
+ if (!a)
1815
+ return false;
1816
+ return (a.type === 'brightness/contrast' && !a.useLegacy) ||
1817
+ ((a.type === 'levels' || a.type === 'curves' || a.type === 'exposure' || a.type === 'channel mixer' ||
1818
+ a.type === 'hue/saturation') && a.presetFileName !== undefined);
1819
+ }, function (reader, target, left) {
1820
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1821
+ if (desc.Vrsn !== 1)
1822
+ throw new Error('Invalid CgEd version');
1823
+ // this section can specify preset file name for other adjustment types
1824
+ if ('presetFileName' in desc) {
1825
+ target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.presetKind, presetFileName: desc.presetFileName });
1826
+ }
1827
+ else if ('curvesPresetFileName' in desc) {
1828
+ target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.curvesPresetKind, presetFileName: desc.curvesPresetFileName });
1829
+ }
1830
+ else if ('mixerPresetFileName' in desc) {
1831
+ target.adjustment = __assign(__assign({}, target.adjustment), { presetKind: desc.mixerPresetKind, presetFileName: desc.mixerPresetFileName });
1832
+ }
1833
+ else {
1834
+ target.adjustment = {
1835
+ type: 'brightness/contrast',
1836
+ brightness: desc.Brgh,
1837
+ contrast: desc.Cntr,
1838
+ meanValue: desc.means,
1839
+ useLegacy: !!desc.useLegacy,
1840
+ labColorOnly: !!desc['Lab '],
1841
+ auto: !!desc.Auto,
1842
+ };
1843
+ }
1844
+ (0, psdReader_1.skipBytes)(reader, left());
1845
+ }, function (writer, target) {
1846
+ var _a, _b, _c, _d;
1847
+ var info = target.adjustment;
1848
+ if (info.type === 'levels' || info.type === 'exposure' || info.type === 'hue/saturation') {
1849
+ var desc = {
1850
+ Vrsn: 1,
1851
+ presetKind: (_a = info.presetKind) !== null && _a !== void 0 ? _a : 1,
1852
+ presetFileName: info.presetFileName || '',
1853
+ };
1854
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1855
+ }
1856
+ else if (info.type === 'curves') {
1857
+ var desc = {
1858
+ Vrsn: 1,
1859
+ curvesPresetKind: (_b = info.presetKind) !== null && _b !== void 0 ? _b : 1,
1860
+ curvesPresetFileName: info.presetFileName || '',
1861
+ };
1862
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1863
+ }
1864
+ else if (info.type === 'channel mixer') {
1865
+ var desc = {
1866
+ Vrsn: 1,
1867
+ mixerPresetKind: (_c = info.presetKind) !== null && _c !== void 0 ? _c : 1,
1868
+ mixerPresetFileName: info.presetFileName || '',
1869
+ };
1870
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1871
+ }
1872
+ else if (info.type === 'brightness/contrast') {
1873
+ var desc = {
1874
+ Vrsn: 1,
1875
+ Brgh: info.brightness || 0,
1876
+ Cntr: info.contrast || 0,
1877
+ means: (_d = info.meanValue) !== null && _d !== void 0 ? _d : 127,
1878
+ 'Lab ': !!info.labColorOnly,
1879
+ useLegacy: !!info.useLegacy,
1880
+ Auto: !!info.auto,
1881
+ };
1882
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1883
+ }
1884
+ else {
1885
+ throw new Error('Unhandled CgEd case');
1886
+ }
1887
+ });
1888
+ addHandler('Txt2', hasKey('engineData'), function (reader, target, left) {
1889
+ var data = (0, psdReader_1.readBytes)(reader, left());
1890
+ target.engineData = (0, base64_js_1.fromByteArray)(data);
1891
+ // const engineData = parseEngineData(data);
1892
+ // console.log(require('util').inspect(engineData, false, 99, true));
1893
+ // require('fs').writeFileSync('resources/engineData2Simple.txt', require('util').inspect(engineData, false, 99, false), 'utf8');
1894
+ // require('fs').writeFileSync('test_data.json', JSON.stringify(ed, null, 2), 'utf8');
1895
+ }, function (writer, target) {
1896
+ var buffer = (0, base64_js_1.toByteArray)(target.engineData);
1897
+ (0, psdWriter_1.writeBytes)(writer, buffer);
1898
+ });
1899
+ addHandler('FMsk', hasKey('filterMask'), function (reader, target) {
1900
+ target.filterMask = {
1901
+ colorSpace: (0, psdReader_1.readColor)(reader),
1902
+ opacity: (0, psdReader_1.readUint16)(reader) / 0xff,
1903
+ };
1904
+ }, function (writer, target) {
1905
+ var _a;
1906
+ (0, psdWriter_1.writeColor)(writer, target.filterMask.colorSpace);
1907
+ (0, psdWriter_1.writeUint16)(writer, (0, helpers_1.clamp)((_a = target.filterMask.opacity) !== null && _a !== void 0 ? _a : 1, 0, 1) * 0xff);
1908
+ });
1909
+ addHandler('artd', // document-wide artboard info
1910
+ function (// document-wide artboard info
1911
+ target) { return target.artboards !== undefined; }, function (reader, target, left) {
1912
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1913
+ target.artboards = {
1914
+ count: desc['Cnt '],
1915
+ autoExpandOffset: { horizontal: desc.autoExpandOffset.Hrzn, vertical: desc.autoExpandOffset.Vrtc },
1916
+ origin: { horizontal: desc.origin.Hrzn, vertical: desc.origin.Vrtc },
1917
+ autoExpandEnabled: desc.autoExpandEnabled,
1918
+ autoNestEnabled: desc.autoNestEnabled,
1919
+ autoPositionEnabled: desc.autoPositionEnabled,
1920
+ shrinkwrapOnSaveEnabled: desc.shrinkwrapOnSaveEnabled,
1921
+ docDefaultNewArtboardBackgroundColor: (0, descriptor_1.parseColor)(desc.docDefaultNewArtboardBackgroundColor),
1922
+ docDefaultNewArtboardBackgroundType: desc.docDefaultNewArtboardBackgroundType,
1923
+ };
1924
+ (0, psdReader_1.skipBytes)(reader, left());
1925
+ }, function (writer, target) {
1926
+ var _a, _b, _c, _d, _e;
1927
+ var artb = target.artboards;
1928
+ var desc = {
1929
+ 'Cnt ': artb.count,
1930
+ autoExpandOffset: artb.autoExpandOffset ? { Hrzn: artb.autoExpandOffset.horizontal, Vrtc: artb.autoExpandOffset.vertical } : { Hrzn: 0, Vrtc: 0 },
1931
+ origin: artb.origin ? { Hrzn: artb.origin.horizontal, Vrtc: artb.origin.vertical } : { Hrzn: 0, Vrtc: 0 },
1932
+ autoExpandEnabled: (_a = artb.autoExpandEnabled) !== null && _a !== void 0 ? _a : true,
1933
+ autoNestEnabled: (_b = artb.autoNestEnabled) !== null && _b !== void 0 ? _b : true,
1934
+ autoPositionEnabled: (_c = artb.autoPositionEnabled) !== null && _c !== void 0 ? _c : true,
1935
+ shrinkwrapOnSaveEnabled: (_d = artb.shrinkwrapOnSaveEnabled) !== null && _d !== void 0 ? _d : true,
1936
+ docDefaultNewArtboardBackgroundColor: (0, descriptor_1.serializeColor)(artb.docDefaultNewArtboardBackgroundColor),
1937
+ docDefaultNewArtboardBackgroundType: (_e = artb.docDefaultNewArtboardBackgroundType) !== null && _e !== void 0 ? _e : 1,
1938
+ };
1939
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc, 'artd');
1940
+ });
1941
+ function hasMultiEffects(effects) {
1942
+ return Object.keys(effects).map(function (key) { return effects[key]; }).some(function (v) { return Array.isArray(v) && v.length > 1; });
1943
+ }
1944
+ exports.hasMultiEffects = hasMultiEffects;
1945
+ addHandler('lfx2', function (target) { return target.effects !== undefined && !hasMultiEffects(target.effects); }, function (reader, target, left, _, options) {
1946
+ var version = (0, psdReader_1.readUint32)(reader);
1947
+ if (version !== 0)
1948
+ throw new Error("Invalid lfx2 version");
1949
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1950
+ // console.log(require('util').inspect(desc, false, 99, true));
1951
+ // TODO: don't discard if we got it from lmfx
1952
+ // discard if read in 'lrFX' section
1953
+ target.effects = (0, descriptor_1.parseEffects)(desc, !!options.logMissingFeatures);
1954
+ (0, psdReader_1.skipBytes)(reader, left());
1955
+ }, function (writer, target, _, options) {
1956
+ var desc = (0, descriptor_1.serializeEffects)(target.effects, !!options.logMissingFeatures, false);
1957
+ // console.log(require('util').inspect(desc, false, 99, true));
1958
+ (0, psdWriter_1.writeUint32)(writer, 0); // version
1959
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1960
+ });
1961
+ addHandler('cinf', hasKey('compositorUsed'), function (reader, target, left) {
1962
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1963
+ // console.log(require('util').inspect(desc, false, 99, true));
1964
+ target.compositorUsed = {
1965
+ description: desc.description,
1966
+ reason: desc.reason,
1967
+ engine: desc.Engn.split('.')[1],
1968
+ enableCompCore: desc.enableCompCore.split('.')[1],
1969
+ enableCompCoreGPU: desc.enableCompCoreGPU.split('.')[1],
1970
+ compCoreSupport: desc.compCoreSupport.split('.')[1],
1971
+ compCoreGPUSupport: desc.compCoreGPUSupport.split('.')[1],
1972
+ };
1973
+ (0, psdReader_1.skipBytes)(reader, left());
1974
+ }, function (writer, target) {
1975
+ var cinf = target.compositorUsed;
1976
+ var desc = {
1977
+ Vrsn: { major: 1, minor: 0, fix: 0 },
1978
+ // psVersion: { major: 22, minor: 3, fix: 1 }, // TESTING
1979
+ description: cinf.description,
1980
+ reason: cinf.reason,
1981
+ Engn: "Engn.".concat(cinf.engine),
1982
+ enableCompCore: "enable.".concat(cinf.enableCompCore),
1983
+ enableCompCoreGPU: "enable.".concat(cinf.enableCompCoreGPU),
1984
+ // enableCompCoreThreads: `enable.feature`, // TESTING
1985
+ compCoreSupport: "reason.".concat(cinf.compCoreSupport),
1986
+ compCoreGPUSupport: "reason.".concat(cinf.compCoreGPUSupport),
1987
+ };
1988
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', desc);
1989
+ });
1990
+ // extension settings ?, ignore it
1991
+ addHandler('extn', function (target) { return target._extn !== undefined; }, function (reader, target) {
1992
+ var desc = (0, descriptor_1.readVersionAndDescriptor)(reader);
1993
+ // console.log(require('util').inspect(desc, false, 99, true));
1994
+ if (helpers_1.MOCK_HANDLERS)
1995
+ target._extn = desc;
1996
+ }, function (writer, target) {
1997
+ // TODO: need to add correct types for desc fields (resources/src.psd)
1998
+ if (helpers_1.MOCK_HANDLERS)
1999
+ (0, descriptor_1.writeVersionAndDescriptor)(writer, '', 'null', target._extn);
2000
+ });
2001
+ addHandler('iOpa', hasKey('fillOpacity'), function (reader, target) {
2002
+ target.fillOpacity = (0, psdReader_1.readUint8)(reader) / 0xff;
2003
+ (0, psdReader_1.skipBytes)(reader, 3);
2004
+ }, function (writer, target) {
2005
+ (0, psdWriter_1.writeUint8)(writer, target.fillOpacity * 0xff);
2006
+ (0, psdWriter_1.writeZeros)(writer, 3);
2007
+ });
2008
+ addHandler('brst', hasKey('channelBlendingRestrictions'), function (reader, target, left) {
2009
+ target.channelBlendingRestrictions = [];
2010
+ while (left() > 4) {
2011
+ target.channelBlendingRestrictions.push((0, psdReader_1.readInt32)(reader));
2012
+ }
2013
+ }, function (writer, target) {
2014
+ for (var _i = 0, _a = target.channelBlendingRestrictions; _i < _a.length; _i++) {
2015
+ var channel = _a[_i];
2016
+ (0, psdWriter_1.writeInt32)(writer, channel);
2017
+ }
2018
+ });
2019
+ addHandler('tsly', hasKey('transparencyShapesLayer'), function (reader, target) {
2020
+ target.transparencyShapesLayer = !!(0, psdReader_1.readUint8)(reader);
2021
+ (0, psdReader_1.skipBytes)(reader, 3);
2022
+ }, function (writer, target) {
2023
+ (0, psdWriter_1.writeUint8)(writer, target.transparencyShapesLayer ? 1 : 0);
2024
+ (0, psdWriter_1.writeZeros)(writer, 3);
2025
+ });
2026
+ //# sourceMappingURL=additionalInfo.js.map