ag-psd 15.0.1 → 15.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/TODO +0 -2
  2. package/clean.js +3 -0
  3. package/dist/abr.d.ts +132 -132
  4. package/dist/abr.js +270 -271
  5. package/dist/abr.js.map +1 -0
  6. package/dist/additionalInfo.d.ts +25 -25
  7. package/dist/additionalInfo.js +2026 -2045
  8. package/dist/additionalInfo.js.map +1 -0
  9. package/dist/bundle.js +9164 -8725
  10. package/dist/csh.d.ts +10 -10
  11. package/dist/csh.js +48 -49
  12. package/dist/csh.js.map +1 -0
  13. package/dist/descriptor.d.ts +411 -390
  14. package/dist/descriptor.js +1689 -1644
  15. package/dist/descriptor.js.map +1 -0
  16. package/dist/effectsHelpers.d.ts +5 -5
  17. package/dist/effectsHelpers.js +309 -310
  18. package/dist/effectsHelpers.js.map +1 -0
  19. package/dist/engineData.d.ts +2 -2
  20. package/dist/engineData.js +337 -338
  21. package/dist/engineData.js.map +1 -0
  22. package/dist/helpers.d.ts +93 -93
  23. package/dist/helpers.js +332 -333
  24. package/dist/helpers.js.map +1 -0
  25. package/dist/imageResources.d.ts +13 -13
  26. package/dist/imageResources.js +1007 -788
  27. package/dist/imageResources.js.map +1 -0
  28. package/dist/index.d.ts +20 -20
  29. package/dist/index.js +53 -54
  30. package/dist/index.js.map +1 -0
  31. package/dist/initializeCanvas.d.ts +1 -1
  32. package/dist/initializeCanvas.js +26 -27
  33. package/dist/initializeCanvas.js.map +1 -0
  34. package/dist/jpeg.d.ts +1 -1
  35. package/dist/jpeg.js +1019 -1020
  36. package/dist/jpeg.js.map +1 -0
  37. package/dist/psd.d.ts +1200 -1147
  38. package/dist/psd.js +22 -23
  39. package/dist/psd.js.map +1 -0
  40. package/dist/psdReader.d.ts +36 -36
  41. package/dist/psdReader.js +974 -959
  42. package/dist/psdReader.js.map +1 -0
  43. package/dist/psdWriter.d.ts +27 -27
  44. package/dist/psdWriter.js +709 -690
  45. package/dist/psdWriter.js.map +1 -0
  46. package/dist/text.d.ts +168 -168
  47. package/dist/text.js +557 -558
  48. package/dist/text.js.map +1 -0
  49. package/dist/utf8.d.ts +5 -5
  50. package/dist/utf8.js +152 -153
  51. package/dist/utf8.js.map +1 -0
  52. package/dist-es/abr.d.ts +132 -132
  53. package/dist-es/abr.js +266 -267
  54. package/dist-es/abr.js.map +1 -0
  55. package/dist-es/additionalInfo.d.ts +25 -25
  56. package/dist-es/additionalInfo.js +2020 -2039
  57. package/dist-es/additionalInfo.js.map +1 -0
  58. package/dist-es/csh.d.ts +10 -10
  59. package/dist-es/csh.js +44 -45
  60. package/dist-es/csh.js.map +1 -0
  61. package/dist-es/descriptor.d.ts +411 -390
  62. package/dist-es/descriptor.js +1661 -1616
  63. package/dist-es/descriptor.js.map +1 -0
  64. package/dist-es/effectsHelpers.d.ts +5 -5
  65. package/dist-es/effectsHelpers.js +304 -305
  66. package/dist-es/effectsHelpers.js.map +1 -0
  67. package/dist-es/engineData.d.ts +2 -2
  68. package/dist-es/engineData.js +332 -333
  69. package/dist-es/engineData.js.map +1 -0
  70. package/dist-es/helpers.d.ts +93 -93
  71. package/dist-es/helpers.js +315 -316
  72. package/dist-es/helpers.js.map +1 -0
  73. package/dist-es/imageResources.d.ts +13 -13
  74. package/dist-es/imageResources.js +1004 -785
  75. package/dist-es/imageResources.js.map +1 -0
  76. package/dist-es/index.d.ts +20 -20
  77. package/dist-es/index.js +31 -32
  78. package/dist-es/index.js.map +1 -0
  79. package/dist-es/initializeCanvas.d.ts +1 -1
  80. package/dist-es/initializeCanvas.js +22 -23
  81. package/dist-es/initializeCanvas.js.map +1 -0
  82. package/dist-es/jpeg.d.ts +1 -1
  83. package/dist-es/jpeg.js +1015 -1016
  84. package/dist-es/jpeg.js.map +1 -0
  85. package/dist-es/psd.d.ts +1200 -1147
  86. package/dist-es/psd.js +19 -20
  87. package/dist-es/psd.js.map +1 -0
  88. package/dist-es/psdReader.d.ts +36 -36
  89. package/dist-es/psdReader.js +944 -929
  90. package/dist-es/psdReader.js.map +1 -0
  91. package/dist-es/psdWriter.d.ts +27 -27
  92. package/dist-es/psdWriter.js +685 -666
  93. package/dist-es/psdWriter.js.map +1 -0
  94. package/dist-es/text.d.ts +168 -168
  95. package/dist-es/text.js +552 -553
  96. package/dist-es/text.js.map +1 -0
  97. package/dist-es/utf8.d.ts +5 -5
  98. package/dist-es/utf8.js +145 -146
  99. package/dist-es/utf8.js.map +1 -0
  100. package/package.json +11 -17
  101. package/tsconfig-es6.json +7 -0
  102. package/tsconfig.json +7 -1
@@ -1,1644 +1,1689 @@
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.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = exports.strokeStyleLineCapType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.stdTrackID = exports.animInterpStyleEnum = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.unitsValue = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.serializeColor = exports.parseColor = exports.serializeVectorContent = exports.parseVectorContent = exports.serializeTrackList = exports.parseTrackList = exports.parseEffects = exports.serializeEffects = exports.xyToHorzVrtc = exports.horzVrtcToXY = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
15
- var helpers_1 = require("./helpers");
16
- var psdReader_1 = require("./psdReader");
17
- var psdWriter_1 = require("./psdWriter");
18
- function revMap(map) {
19
- var result = {};
20
- Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
21
- return result;
22
- }
23
- var unitsMap = {
24
- '#Ang': 'Angle',
25
- '#Rsl': 'Density',
26
- '#Rlt': 'Distance',
27
- '#Nne': 'None',
28
- '#Prc': 'Percent',
29
- '#Pxl': 'Pixels',
30
- '#Mlm': 'Millimeters',
31
- '#Pnt': 'Points',
32
- 'RrPi': 'Picas',
33
- 'RrIn': 'Inches',
34
- 'RrCm': 'Centimeters',
35
- };
36
- var unitsMapRev = revMap(unitsMap);
37
- var logErrors = false;
38
- function setLogErrors(value) {
39
- logErrors = value;
40
- }
41
- exports.setLogErrors = setLogErrors;
42
- function makeType(name, classID) {
43
- return { name: name, classID: classID };
44
- }
45
- var nullType = makeType('', 'null');
46
- var fieldToExtType = {
47
- strokeStyleContent: makeType('', 'solidColorLayer'),
48
- // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
49
- printProofSetup: makeType('Proof Setup', 'proofSetup'),
50
- patternFill: makeType('', 'patternFill'),
51
- Grad: makeType('Gradient', 'Grdn'),
52
- ebbl: makeType('', 'ebbl'),
53
- SoFi: makeType('', 'SoFi'),
54
- GrFl: makeType('', 'GrFl'),
55
- sdwC: makeType('', 'RGBC'),
56
- hglC: makeType('', 'RGBC'),
57
- 'Clr ': makeType('', 'RGBC'),
58
- 'tintColor': makeType('', 'RGBC'),
59
- Ofst: makeType('', 'Pnt '),
60
- ChFX: makeType('', 'ChFX'),
61
- MpgS: makeType('', 'ShpC'),
62
- DrSh: makeType('', 'DrSh'),
63
- IrSh: makeType('', 'IrSh'),
64
- OrGl: makeType('', 'OrGl'),
65
- IrGl: makeType('', 'IrGl'),
66
- TrnS: makeType('', 'ShpC'),
67
- Ptrn: makeType('', 'Ptrn'),
68
- FrFX: makeType('', 'FrFX'),
69
- phase: makeType('', 'Pnt '),
70
- frameStep: nullType,
71
- duration: nullType,
72
- workInTime: nullType,
73
- workOutTime: nullType,
74
- audioClipGroupList: nullType,
75
- bounds: makeType('', 'Rctn'),
76
- customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
77
- warp: makeType('', 'warp'),
78
- 'Sz ': makeType('', 'Pnt '),
79
- origin: makeType('', 'Pnt '),
80
- autoExpandOffset: makeType('', 'Pnt '),
81
- keyOriginShapeBBox: makeType('', 'unitRect'),
82
- Vrsn: nullType,
83
- psVersion: nullType,
84
- docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
85
- artboardRect: makeType('', 'classFloatRect'),
86
- keyOriginRRectRadii: makeType('', 'radii'),
87
- keyOriginBoxCorners: nullType,
88
- rectangleCornerA: makeType('', 'Pnt '),
89
- rectangleCornerB: makeType('', 'Pnt '),
90
- rectangleCornerC: makeType('', 'Pnt '),
91
- rectangleCornerD: makeType('', 'Pnt '),
92
- compInfo: nullType,
93
- Trnf: makeType('Transform', 'Trnf'),
94
- quiltWarp: makeType('', 'quiltWarp'),
95
- generatorSettings: nullType,
96
- crema: nullType,
97
- FrIn: nullType,
98
- blendOptions: nullType,
99
- FXRf: nullType,
100
- Lefx: nullType,
101
- time: nullType,
102
- animKey: nullType,
103
- timeScope: nullType,
104
- inTime: nullType,
105
- outTime: nullType,
106
- sheetStyle: nullType,
107
- translation: nullType,
108
- Skew: nullType,
109
- 'Lnk ': makeType('', 'ExternalFileLink'),
110
- frameReader: makeType('', 'FrameReader'),
111
- effectParams: makeType('', 'motionTrackEffectParams'),
112
- };
113
- var fieldToArrayExtType = {
114
- 'Crv ': makeType('', 'CrPt'),
115
- Clrs: makeType('', 'Clrt'),
116
- Trns: makeType('', 'TrnS'),
117
- keyDescriptorList: nullType,
118
- solidFillMulti: makeType('', 'SoFi'),
119
- gradientFillMulti: makeType('', 'GrFl'),
120
- dropShadowMulti: makeType('', 'DrSh'),
121
- innerShadowMulti: makeType('', 'IrSh'),
122
- frameFXMulti: makeType('', 'FrFX'),
123
- FrIn: nullType,
124
- FSts: nullType,
125
- LaSt: nullType,
126
- sheetTimelineOptions: nullType,
127
- trackList: makeType('', 'animationTrack'),
128
- globalTrackList: makeType('', 'animationTrack'),
129
- keyList: nullType,
130
- audioClipGroupList: nullType,
131
- audioClipList: nullType,
132
- };
133
- var typeToField = {
134
- 'TEXT': [
135
- 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
136
- 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
137
- 'artboardPresetName', 'json', 'groupID', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor',
138
- ],
139
- 'tdta': ['EngineData', 'LUT3DFileData'],
140
- 'long': [
141
- 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
142
- 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
143
- 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
144
- 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
145
- 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
146
- 'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',
147
- 'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
148
- 'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin',
149
- ],
150
- 'enum': [
151
- 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
152
- 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
153
- 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
154
- 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
155
- 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
156
- 'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle',
157
- ],
158
- 'bool': [
159
- 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
160
- 'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape',
161
- 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
162
- 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
163
- 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
164
- 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
165
- 'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
166
- 'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
167
- ],
168
- 'doub': [
169
- 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
170
- 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
171
- 'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
172
- ],
173
- 'UntF': [
174
- 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
175
- 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
176
- 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
177
- 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
178
- ],
179
- 'VlLs': [
180
- 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs',
181
- 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
182
- 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
183
- 'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
184
- ],
185
- 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
186
- 'obj ': ['null'],
187
- };
188
- var channels = [
189
- 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
190
- ];
191
- var fieldToArrayType = {
192
- 'Mnm ': 'long',
193
- 'Mxm ': 'long',
194
- 'FrLs': 'long',
195
- 'strokeStyleLineDashSet': 'UntF',
196
- 'Trnf': 'doub',
197
- 'nonAffineTransform': 'doub',
198
- 'keyDescriptorList': 'Objc',
199
- 'gradientFillMulti': 'Objc',
200
- 'solidFillMulti': 'Objc',
201
- 'frameFXMulti': 'Objc',
202
- 'innerShadowMulti': 'Objc',
203
- 'dropShadowMulti': 'Objc',
204
- 'LaSt': 'Objc',
205
- 'FrIn': 'Objc',
206
- 'FSts': 'Objc',
207
- 'FsFr': 'long',
208
- 'blendOptions': 'Objc',
209
- 'sheetTimelineOptions': 'Objc',
210
- 'keyList': 'Objc',
211
- };
212
- var fieldToType = {};
213
- for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
214
- var type = _a[_i];
215
- for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
216
- var field = _c[_b];
217
- fieldToType[field] = type;
218
- }
219
- }
220
- for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
221
- var field = _e[_d];
222
- if (!fieldToType[field])
223
- fieldToType[field] = 'Objc';
224
- }
225
- for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
226
- var field = _g[_f];
227
- fieldToArrayType[field] = 'Objc';
228
- }
229
- function getTypeByKey(key, value, root, parent) {
230
- if (key === 'Sz ') {
231
- return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
232
- }
233
- else if (key === 'Type') {
234
- return typeof value === 'string' ? 'enum' : 'long';
235
- }
236
- else if (key === 'AntA') {
237
- return typeof value === 'string' ? 'enum' : 'bool';
238
- }
239
- else if ((key === 'Hrzn' || key === 'Vrtc') && parent.Type === 'keyType.Pstn') {
240
- return 'long';
241
- }
242
- else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
243
- return typeof value === 'number' ? 'doub' : 'UntF';
244
- }
245
- else if (key === 'Vrsn') {
246
- return typeof value === 'number' ? 'long' : 'Objc';
247
- }
248
- else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
249
- return root === 'artd' ? 'long' : 'doub';
250
- }
251
- else if (key === 'Trnf') {
252
- return Array.isArray(value) ? 'VlLs' : 'Objc';
253
- }
254
- else {
255
- return fieldToType[key];
256
- }
257
- }
258
- function readAsciiStringOrClassId(reader) {
259
- var length = (0, psdReader_1.readInt32)(reader);
260
- return (0, psdReader_1.readAsciiString)(reader, length || 4);
261
- }
262
- exports.readAsciiStringOrClassId = readAsciiStringOrClassId;
263
- function writeAsciiStringOrClassId(writer, value) {
264
- if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
265
- // write classId
266
- (0, psdWriter_1.writeInt32)(writer, 0);
267
- (0, psdWriter_1.writeSignature)(writer, value);
268
- }
269
- else {
270
- // write ascii string
271
- (0, psdWriter_1.writeInt32)(writer, value.length);
272
- for (var i = 0; i < value.length; i++) {
273
- (0, psdWriter_1.writeUint8)(writer, value.charCodeAt(i));
274
- }
275
- }
276
- }
277
- function readDescriptorStructure(reader) {
278
- var object = {};
279
- // object.__struct =
280
- readClassStructure(reader);
281
- var itemsCount = (0, psdReader_1.readUint32)(reader);
282
- // console.log('//', object.__struct);
283
- for (var i = 0; i < itemsCount; i++) {
284
- var key = readAsciiStringOrClassId(reader);
285
- var type = (0, psdReader_1.readSignature)(reader);
286
- // console.log(`> '${key}' '${type}'`);
287
- var data = readOSType(reader, type);
288
- // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
289
- object[key] = data;
290
- }
291
- return object;
292
- }
293
- exports.readDescriptorStructure = readDescriptorStructure;
294
- function writeDescriptorStructure(writer, name, classId, value, root) {
295
- if (logErrors && !classId)
296
- console.log('Missing classId for: ', name, classId, value);
297
- // write class structure
298
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
299
- writeAsciiStringOrClassId(writer, classId);
300
- var keys = Object.keys(value);
301
- (0, psdWriter_1.writeUint32)(writer, keys.length);
302
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
303
- var key = keys_1[_i];
304
- var type = getTypeByKey(key, value[key], root, value);
305
- var extType = fieldToExtType[key];
306
- if (key === 'Scl ' && 'Hrzn' in value[key]) {
307
- type = 'Objc';
308
- extType = nullType;
309
- }
310
- else if (key === 'audioClipGroupList' && keys.length === 1) {
311
- type = 'VlLs';
312
- }
313
- else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
314
- type = 'doub';
315
- }
316
- else if (key === 'Strt') {
317
- type = 'Objc';
318
- extType = nullType;
319
- }
320
- else if (channels.indexOf(key) !== -1) {
321
- type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
322
- }
323
- else if (key === 'profile') {
324
- type = classId === 'printOutput' ? 'TEXT' : 'tdta';
325
- }
326
- else if (key === 'strokeStyleContent') {
327
- if (value[key]['Clr ']) {
328
- extType = makeType('', 'solidColorLayer');
329
- }
330
- else if (value[key].Grad) {
331
- extType = makeType('', 'gradientLayer');
332
- }
333
- else if (value[key].Ptrn) {
334
- extType = makeType('', 'patternLayer');
335
- }
336
- else {
337
- logErrors && console.log('Invalid strokeStyleContent value', value[key]);
338
- }
339
- }
340
- else if (key === 'bounds' && root === 'quiltWarp') {
341
- extType = makeType('', 'classFloatRect');
342
- }
343
- if (extType && extType.classID === 'RGBC') {
344
- if ('H ' in value[key])
345
- extType = { classID: 'HSBC', name: '' };
346
- // TODO: other color spaces
347
- }
348
- writeAsciiStringOrClassId(writer, key);
349
- (0, psdWriter_1.writeSignature)(writer, type || 'long');
350
- writeOSType(writer, type || 'long', value[key], key, extType, root);
351
- if (logErrors && !type)
352
- console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
353
- }
354
- }
355
- exports.writeDescriptorStructure = writeDescriptorStructure;
356
- function readOSType(reader, type) {
357
- switch (type) {
358
- case 'obj ': // Reference
359
- return readReferenceStructure(reader);
360
- case 'Objc': // Descriptor
361
- case 'GlbO': // GlobalObject same as Descriptor
362
- return readDescriptorStructure(reader);
363
- case 'VlLs': { // List
364
- var length_1 = (0, psdReader_1.readInt32)(reader);
365
- var items = [];
366
- for (var i = 0; i < length_1; i++) {
367
- var type_1 = (0, psdReader_1.readSignature)(reader);
368
- // console.log(' >', type);
369
- items.push(readOSType(reader, type_1));
370
- }
371
- return items;
372
- }
373
- case 'doub': // Double
374
- return (0, psdReader_1.readFloat64)(reader);
375
- case 'UntF': { // Unit double
376
- var units = (0, psdReader_1.readSignature)(reader);
377
- var value = (0, psdReader_1.readFloat64)(reader);
378
- if (!unitsMap[units])
379
- throw new Error("Invalid units: ".concat(units));
380
- return { units: unitsMap[units], value: value };
381
- }
382
- case 'UnFl': { // Unit float
383
- var units = (0, psdReader_1.readSignature)(reader);
384
- var value = (0, psdReader_1.readFloat32)(reader);
385
- if (!unitsMap[units])
386
- throw new Error("Invalid units: ".concat(units));
387
- return { units: unitsMap[units], value: value };
388
- }
389
- case 'TEXT': // String
390
- return (0, psdReader_1.readUnicodeString)(reader);
391
- case 'enum': { // Enumerated
392
- var type_2 = readAsciiStringOrClassId(reader);
393
- var value = readAsciiStringOrClassId(reader);
394
- return "".concat(type_2, ".").concat(value);
395
- }
396
- case 'long': // Integer
397
- return (0, psdReader_1.readInt32)(reader);
398
- case 'comp': { // Large Integer
399
- var low = (0, psdReader_1.readUint32)(reader);
400
- var high = (0, psdReader_1.readUint32)(reader);
401
- return { low: low, high: high };
402
- }
403
- case 'bool': // Boolean
404
- return !!(0, psdReader_1.readUint8)(reader);
405
- case 'type': // Class
406
- case 'GlbC': // Class
407
- return readClassStructure(reader);
408
- case 'alis': { // Alias
409
- var length_2 = (0, psdReader_1.readInt32)(reader);
410
- return (0, psdReader_1.readAsciiString)(reader, length_2);
411
- }
412
- case 'tdta': { // Raw Data
413
- var length_3 = (0, psdReader_1.readInt32)(reader);
414
- return (0, psdReader_1.readBytes)(reader, length_3);
415
- }
416
- case 'ObAr': { // Object array
417
- (0, psdReader_1.readInt32)(reader); // version: 16
418
- (0, psdReader_1.readUnicodeString)(reader); // name: ''
419
- readAsciiStringOrClassId(reader); // 'rationalPoint'
420
- var length_4 = (0, psdReader_1.readInt32)(reader);
421
- var items = [];
422
- for (var i = 0; i < length_4; i++) {
423
- var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
424
- (0, psdReader_1.readSignature)(reader); // UnFl
425
- (0, psdReader_1.readSignature)(reader); // units ? '#Pxl'
426
- var valuesCount = (0, psdReader_1.readInt32)(reader);
427
- var values = [];
428
- for (var j = 0; j < valuesCount; j++) {
429
- values.push((0, psdReader_1.readFloat64)(reader));
430
- }
431
- items.push({ type: type1, values: values });
432
- }
433
- return items;
434
- }
435
- case 'Pth ': { // File path
436
- /*const length =*/ (0, psdReader_1.readInt32)(reader);
437
- var sig = (0, psdReader_1.readSignature)(reader);
438
- /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
439
- var charsCount = (0, psdReader_1.readInt32LE)(reader);
440
- var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
441
- return { sig: sig, path: path };
442
- }
443
- default:
444
- throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
445
- }
446
- }
447
- var ObArTypes = {
448
- meshPoints: 'rationalPoint',
449
- quiltSliceX: 'UntF',
450
- quiltSliceY: 'UntF',
451
- };
452
- function writeOSType(writer, type, value, key, extType, root) {
453
- switch (type) {
454
- case 'obj ': // Reference
455
- writeReferenceStructure(writer, key, value);
456
- break;
457
- case 'Objc': // Descriptor
458
- case 'GlbO': // GlobalObject same as Descriptor
459
- if (!extType)
460
- throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
461
- writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
462
- break;
463
- case 'VlLs': // List
464
- (0, psdWriter_1.writeInt32)(writer, value.length);
465
- for (var i = 0; i < value.length; i++) {
466
- var type_3 = fieldToArrayType[key];
467
- (0, psdWriter_1.writeSignature)(writer, type_3 || 'long');
468
- writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
469
- if (logErrors && !type_3)
470
- console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
471
- }
472
- break;
473
- case 'doub': // Double
474
- (0, psdWriter_1.writeFloat64)(writer, value);
475
- break;
476
- case 'UntF': // Unit double
477
- if (!unitsMapRev[value.units])
478
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
479
- (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
480
- (0, psdWriter_1.writeFloat64)(writer, value.value);
481
- break;
482
- case 'UnFl': // Unit float
483
- if (!unitsMapRev[value.units])
484
- throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
485
- (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
486
- (0, psdWriter_1.writeFloat32)(writer, value.value);
487
- break;
488
- case 'TEXT': // String
489
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
490
- break;
491
- case 'enum': { // Enumerated
492
- var _a = value.split('.'), _type = _a[0], val = _a[1];
493
- writeAsciiStringOrClassId(writer, _type);
494
- writeAsciiStringOrClassId(writer, val);
495
- break;
496
- }
497
- case 'long': // Integer
498
- (0, psdWriter_1.writeInt32)(writer, value);
499
- break;
500
- // case 'comp': // Large Integer
501
- // writeLargeInteger(reader);
502
- case 'bool': // Boolean
503
- (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
504
- break;
505
- // case 'type': // Class
506
- // case 'GlbC': // Class
507
- // writeClassStructure(reader);
508
- // case 'alis': // Alias
509
- // writeAliasStructure(reader);
510
- case 'tdta': // Raw Data
511
- (0, psdWriter_1.writeInt32)(writer, value.byteLength);
512
- (0, psdWriter_1.writeBytes)(writer, value);
513
- break;
514
- case 'ObAr': { // Object array
515
- (0, psdWriter_1.writeInt32)(writer, 16); // version
516
- (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, ''); // name
517
- var type_4 = ObArTypes[key];
518
- if (!type_4)
519
- throw new Error("Not implemented ObArType for: ".concat(key));
520
- writeAsciiStringOrClassId(writer, type_4);
521
- (0, psdWriter_1.writeInt32)(writer, value.length);
522
- for (var i = 0; i < value.length; i++) {
523
- writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
524
- (0, psdWriter_1.writeSignature)(writer, 'UnFl');
525
- (0, psdWriter_1.writeSignature)(writer, '#Pxl');
526
- (0, psdWriter_1.writeInt32)(writer, value[i].values.length);
527
- for (var j = 0; j < value[i].values.length; j++) {
528
- (0, psdWriter_1.writeFloat64)(writer, value[i].values[j]);
529
- }
530
- }
531
- break;
532
- }
533
- // case 'Pth ': // File path
534
- // writeFilePath(reader);
535
- default:
536
- throw new Error("Not implemented descriptor OSType: ".concat(type));
537
- }
538
- }
539
- function readReferenceStructure(reader) {
540
- var itemsCount = (0, psdReader_1.readInt32)(reader);
541
- var items = [];
542
- for (var i = 0; i < itemsCount; i++) {
543
- var type = (0, psdReader_1.readSignature)(reader);
544
- switch (type) {
545
- case 'prop': { // Property
546
- readClassStructure(reader);
547
- var keyID = readAsciiStringOrClassId(reader);
548
- items.push(keyID);
549
- break;
550
- }
551
- case 'Clss': // Class
552
- items.push(readClassStructure(reader));
553
- break;
554
- case 'Enmr': { // Enumerated Reference
555
- readClassStructure(reader);
556
- var typeID = readAsciiStringOrClassId(reader);
557
- var value = readAsciiStringOrClassId(reader);
558
- items.push("".concat(typeID, ".").concat(value));
559
- break;
560
- }
561
- case 'rele': { // Offset
562
- // const { name, classID } =
563
- readClassStructure(reader);
564
- items.push((0, psdReader_1.readUint32)(reader));
565
- break;
566
- }
567
- case 'Idnt': // Identifier
568
- items.push((0, psdReader_1.readInt32)(reader));
569
- break;
570
- case 'indx': // Index
571
- items.push((0, psdReader_1.readInt32)(reader));
572
- break;
573
- case 'name': { // Name
574
- readClassStructure(reader);
575
- items.push((0, psdReader_1.readUnicodeString)(reader));
576
- break;
577
- }
578
- default:
579
- throw new Error("Invalid descriptor reference type: ".concat(type));
580
- }
581
- }
582
- return items;
583
- }
584
- function writeReferenceStructure(writer, _key, items) {
585
- (0, psdWriter_1.writeInt32)(writer, items.length);
586
- for (var i = 0; i < items.length; i++) {
587
- var value = items[i];
588
- var type = 'unknown';
589
- if (typeof value === 'string') {
590
- if (/^[a-z]+\.[a-z]+$/i.test(value)) {
591
- type = 'Enmr';
592
- }
593
- else {
594
- type = 'name';
595
- }
596
- }
597
- (0, psdWriter_1.writeSignature)(writer, type);
598
- switch (type) {
599
- // case 'prop': // Property
600
- // case 'Clss': // Class
601
- case 'Enmr': { // Enumerated Reference
602
- var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
603
- writeClassStructure(writer, '\0', typeID);
604
- writeAsciiStringOrClassId(writer, typeID);
605
- writeAsciiStringOrClassId(writer, enumValue);
606
- break;
607
- }
608
- // case 'rele': // Offset
609
- // case 'Idnt': // Identifier
610
- // case 'indx': // Index
611
- case 'name': { // Name
612
- writeClassStructure(writer, '\0', 'Lyr ');
613
- (0, psdWriter_1.writeUnicodeString)(writer, value + '\0');
614
- break;
615
- }
616
- default:
617
- throw new Error("Invalid descriptor reference type: ".concat(type));
618
- }
619
- }
620
- return items;
621
- }
622
- function readClassStructure(reader) {
623
- var name = (0, psdReader_1.readUnicodeString)(reader);
624
- var classID = readAsciiStringOrClassId(reader);
625
- // console.log({ name, classID });
626
- return { name: name, classID: classID };
627
- }
628
- function writeClassStructure(writer, name, classID) {
629
- (0, psdWriter_1.writeUnicodeString)(writer, name);
630
- writeAsciiStringOrClassId(writer, classID);
631
- }
632
- function readVersionAndDescriptor(reader) {
633
- var version = (0, psdReader_1.readUint32)(reader);
634
- if (version !== 16)
635
- throw new Error("Invalid descriptor version: ".concat(version));
636
- var desc = readDescriptorStructure(reader);
637
- // console.log(require('util').inspect(desc, false, 99, true));
638
- return desc;
639
- }
640
- exports.readVersionAndDescriptor = readVersionAndDescriptor;
641
- function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
642
- if (root === void 0) { root = ''; }
643
- (0, psdWriter_1.writeUint32)(writer, 16); // version
644
- writeDescriptorStructure(writer, name, classID, descriptor, root);
645
- }
646
- exports.writeVersionAndDescriptor = writeVersionAndDescriptor;
647
- function horzVrtcToXY(hv) {
648
- return { x: hv.Hrzn, y: hv.Vrtc };
649
- }
650
- exports.horzVrtcToXY = horzVrtcToXY;
651
- function xyToHorzVrtc(xy) {
652
- return { Hrzn: xy.x, Vrtc: xy.y };
653
- }
654
- exports.xyToHorzVrtc = xyToHorzVrtc;
655
- function parseFxObject(fx) {
656
- var stroke = {
657
- enabled: !!fx.enab,
658
- position: exports.FStl.decode(fx.Styl),
659
- fillType: exports.FrFl.decode(fx.PntT),
660
- blendMode: exports.BlnM.decode(fx['Md ']),
661
- opacity: parsePercent(fx.Opct),
662
- size: parseUnits(fx['Sz ']),
663
- };
664
- if (fx.present !== undefined)
665
- stroke.present = fx.present;
666
- if (fx.showInDialog !== undefined)
667
- stroke.showInDialog = fx.showInDialog;
668
- if (fx.overprint !== undefined)
669
- stroke.overprint = fx.overprint;
670
- if (fx['Clr '])
671
- stroke.color = parseColor(fx['Clr ']);
672
- if (fx.Grad)
673
- stroke.gradient = parseGradientContent(fx);
674
- if (fx.Ptrn)
675
- stroke.pattern = parsePatternContent(fx);
676
- return stroke;
677
- }
678
- function serializeFxObject(stroke) {
679
- var FrFX = {};
680
- FrFX.enab = !!stroke.enabled;
681
- if (stroke.present !== undefined)
682
- FrFX.present = !!stroke.present;
683
- if (stroke.showInDialog !== undefined)
684
- FrFX.showInDialog = !!stroke.showInDialog;
685
- FrFX.Styl = exports.FStl.encode(stroke.position);
686
- FrFX.PntT = exports.FrFl.encode(stroke.fillType);
687
- FrFX['Md '] = exports.BlnM.encode(stroke.blendMode);
688
- FrFX.Opct = unitsPercent(stroke.opacity);
689
- FrFX['Sz '] = unitsValue(stroke.size, 'size');
690
- if (stroke.color)
691
- FrFX['Clr '] = serializeColor(stroke.color);
692
- if (stroke.gradient)
693
- FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
694
- if (stroke.pattern)
695
- FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
696
- if (stroke.overprint !== undefined)
697
- FrFX.overprint = !!stroke.overprint;
698
- return FrFX;
699
- }
700
- function serializeEffects(e, log, multi) {
701
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
702
- var info = multi ? {
703
- 'Scl ': unitsPercent((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
704
- masterFXSwitch: !e.disabled,
705
- } : {
706
- masterFXSwitch: !e.disabled,
707
- 'Scl ': unitsPercent((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
708
- };
709
- var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
710
- for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
711
- var key = arrayKeys_1[_i];
712
- if (e[key] && !Array.isArray(e[key]))
713
- throw new Error("".concat(key, " should be an array"));
714
- }
715
- if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
716
- info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
717
- if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
718
- info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
719
- if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
720
- info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
721
- if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
722
- info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
723
- if (e.outerGlow)
724
- info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
725
- if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
726
- info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
727
- if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
728
- info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
729
- if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
730
- info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
731
- if (e.innerGlow)
732
- info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
733
- if (e.bevel)
734
- info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
735
- if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
736
- info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
737
- if (e.patternOverlay)
738
- info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
739
- if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
740
- info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
741
- if (e.satin)
742
- info.ChFX = serializeEffectObject(e.satin, 'satin', log);
743
- if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
744
- info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
745
- if (multi) {
746
- info.numModifyingFX = 0;
747
- for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
748
- var key = _q[_p];
749
- var value = e[key];
750
- if (Array.isArray(value)) {
751
- for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
752
- var effect = value_1[_r];
753
- if (effect.enabled)
754
- info.numModifyingFX++;
755
- }
756
- }
757
- }
758
- }
759
- return info;
760
- }
761
- exports.serializeEffects = serializeEffects;
762
- function parseEffects(info, log) {
763
- var effects = {};
764
- if (!info.masterFXSwitch)
765
- effects.disabled = true;
766
- if (info['Scl '])
767
- effects.scale = parsePercent(info['Scl ']);
768
- if (info.DrSh)
769
- effects.dropShadow = [parseEffectObject(info.DrSh, log)];
770
- if (info.dropShadowMulti)
771
- effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
772
- if (info.IrSh)
773
- effects.innerShadow = [parseEffectObject(info.IrSh, log)];
774
- if (info.innerShadowMulti)
775
- effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
776
- if (info.OrGl)
777
- effects.outerGlow = parseEffectObject(info.OrGl, log);
778
- if (info.IrGl)
779
- effects.innerGlow = parseEffectObject(info.IrGl, log);
780
- if (info.ebbl)
781
- effects.bevel = parseEffectObject(info.ebbl, log);
782
- if (info.SoFi)
783
- effects.solidFill = [parseEffectObject(info.SoFi, log)];
784
- if (info.solidFillMulti)
785
- effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
786
- if (info.patternFill)
787
- effects.patternOverlay = parseEffectObject(info.patternFill, log);
788
- if (info.GrFl)
789
- effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
790
- if (info.gradientFillMulti)
791
- effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
792
- if (info.ChFX)
793
- effects.satin = parseEffectObject(info.ChFX, log);
794
- if (info.FrFX)
795
- effects.stroke = [parseFxObject(info.FrFX)];
796
- if (info.frameFXMulti)
797
- effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
798
- return effects;
799
- }
800
- exports.parseEffects = parseEffects;
801
- function parseKeyList(keyList, logMissingFeatures) {
802
- var keys = [];
803
- for (var j = 0; j < keyList.length; j++) {
804
- var key = keyList[j];
805
- var time = key.time, selected = key.selected, animKey = key.animKey;
806
- var interpolation = exports.animInterpStyleEnum.decode(key.animInterpStyle);
807
- switch (animKey.Type) {
808
- case 'keyType.Opct':
809
- keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });
810
- break;
811
- case 'keyType.Pstn':
812
- keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });
813
- break;
814
- case 'keyType.Trnf':
815
- keys.push({
816
- interpolation: interpolation,
817
- time: time,
818
- selected: selected,
819
- type: 'transform',
820
- scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)
821
- });
822
- break;
823
- case 'keyType.sheetStyle': {
824
- var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };
825
- if (animKey.sheetStyle.Lefx)
826
- key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);
827
- keys.push(key_1);
828
- break;
829
- }
830
- case 'keyType.globalLighting': {
831
- keys.push({
832
- interpolation: interpolation,
833
- time: time,
834
- selected: selected,
835
- type: 'globalLighting',
836
- globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude
837
- });
838
- break;
839
- }
840
- default: throw new Error("Unsupported keyType value");
841
- }
842
- }
843
- return keys;
844
- }
845
- function serializeKeyList(keys) {
846
- var keyList = [];
847
- for (var j = 0; j < keys.length; j++) {
848
- var key = keys[j];
849
- var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;
850
- var animInterpStyle = exports.animInterpStyleEnum.encode(interpolation);
851
- var animKey = void 0;
852
- switch (key.type) {
853
- case 'opacity':
854
- animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };
855
- break;
856
- case 'position':
857
- animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };
858
- break;
859
- case 'transform':
860
- animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };
861
- break;
862
- case 'style':
863
- animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };
864
- if (key.style)
865
- animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };
866
- break;
867
- case 'globalLighting': {
868
- animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };
869
- break;
870
- }
871
- default: throw new Error("Unsupported keyType value");
872
- }
873
- keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });
874
- }
875
- return keyList;
876
- }
877
- function parseTrackList(trackList, logMissingFeatures) {
878
- var tracks = [];
879
- for (var i = 0; i < trackList.length; i++) {
880
- var tr = trackList[i];
881
- var track = {
882
- type: exports.stdTrackID.decode(tr.trackID),
883
- enabled: tr.enab,
884
- keys: parseKeyList(tr.keyList, logMissingFeatures),
885
- };
886
- if (tr.effectParams) {
887
- track.effectParams = {
888
- fillCanvas: tr.effectParams.fillCanvas,
889
- zoomOrigin: tr.effectParams.zoomOrigin,
890
- keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),
891
- };
892
- }
893
- tracks.push(track);
894
- }
895
- return tracks;
896
- }
897
- exports.parseTrackList = parseTrackList;
898
- function serializeTrackList(tracks) {
899
- var trackList = [];
900
- for (var i = 0; i < tracks.length; i++) {
901
- var t = tracks[i];
902
- trackList.push(__assign(__assign({ trackID: exports.stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {
903
- effectParams: {
904
- keyList: serializeKeyList(t.keys),
905
- fillCanvas: t.effectParams.fillCanvas,
906
- zoomOrigin: t.effectParams.zoomOrigin,
907
- }
908
- } : {})), { keyList: serializeKeyList(t.keys) }));
909
- }
910
- return trackList;
911
- }
912
- exports.serializeTrackList = serializeTrackList;
913
- function parseEffectObject(obj, reportErrors) {
914
- var result = {};
915
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
916
- var key = _a[_i];
917
- var val = obj[key];
918
- switch (key) {
919
- case 'enab':
920
- result.enabled = !!val;
921
- break;
922
- case 'uglg':
923
- result.useGlobalLight = !!val;
924
- break;
925
- case 'AntA':
926
- result.antialiased = !!val;
927
- break;
928
- case 'Algn':
929
- result.align = !!val;
930
- break;
931
- case 'Dthr':
932
- result.dither = !!val;
933
- break;
934
- case 'Invr':
935
- result.invert = !!val;
936
- break;
937
- case 'Rvrs':
938
- result.reverse = !!val;
939
- break;
940
- case 'Clr ':
941
- result.color = parseColor(val);
942
- break;
943
- case 'hglC':
944
- result.highlightColor = parseColor(val);
945
- break;
946
- case 'sdwC':
947
- result.shadowColor = parseColor(val);
948
- break;
949
- case 'Styl':
950
- result.position = exports.FStl.decode(val);
951
- break;
952
- case 'Md ':
953
- result.blendMode = exports.BlnM.decode(val);
954
- break;
955
- case 'hglM':
956
- result.highlightBlendMode = exports.BlnM.decode(val);
957
- break;
958
- case 'sdwM':
959
- result.shadowBlendMode = exports.BlnM.decode(val);
960
- break;
961
- case 'bvlS':
962
- result.style = exports.BESl.decode(val);
963
- break;
964
- case 'bvlD':
965
- result.direction = exports.BESs.decode(val);
966
- break;
967
- case 'bvlT':
968
- result.technique = exports.bvlT.decode(val);
969
- break;
970
- case 'GlwT':
971
- result.technique = exports.BETE.decode(val);
972
- break;
973
- case 'glwS':
974
- result.source = exports.IGSr.decode(val);
975
- break;
976
- case 'Type':
977
- result.type = exports.GrdT.decode(val);
978
- break;
979
- case 'gs99':
980
- result.interpolationMethod = exports.gradientInterpolationMethodType.decode(val);
981
- break;
982
- case 'Opct':
983
- result.opacity = parsePercent(val);
984
- break;
985
- case 'hglO':
986
- result.highlightOpacity = parsePercent(val);
987
- break;
988
- case 'sdwO':
989
- result.shadowOpacity = parsePercent(val);
990
- break;
991
- case 'lagl':
992
- result.angle = parseAngle(val);
993
- break;
994
- case 'Angl':
995
- result.angle = parseAngle(val);
996
- break;
997
- case 'Lald':
998
- result.altitude = parseAngle(val);
999
- break;
1000
- case 'Sftn':
1001
- result.soften = parseUnits(val);
1002
- break;
1003
- case 'srgR':
1004
- result.strength = parsePercent(val);
1005
- break;
1006
- case 'blur':
1007
- result.size = parseUnits(val);
1008
- break;
1009
- case 'Nose':
1010
- result.noise = parsePercent(val);
1011
- break;
1012
- case 'Inpr':
1013
- result.range = parsePercent(val);
1014
- break;
1015
- case 'Ckmt':
1016
- result.choke = parseUnits(val);
1017
- break;
1018
- case 'ShdN':
1019
- result.jitter = parsePercent(val);
1020
- break;
1021
- case 'Dstn':
1022
- result.distance = parseUnits(val);
1023
- break;
1024
- case 'Scl ':
1025
- result.scale = parsePercent(val);
1026
- break;
1027
- case 'Ptrn':
1028
- result.pattern = { name: val['Nm '], id: val.Idnt };
1029
- break;
1030
- case 'phase':
1031
- result.phase = { x: val.Hrzn, y: val.Vrtc };
1032
- break;
1033
- case 'Ofst':
1034
- result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };
1035
- break;
1036
- case 'MpgS':
1037
- case 'TrnS':
1038
- result.contour = {
1039
- name: val['Nm '],
1040
- curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
1041
- };
1042
- break;
1043
- case 'Grad':
1044
- result.gradient = parseGradient(val);
1045
- break;
1046
- case 'useTexture':
1047
- case 'useShape':
1048
- case 'layerConceals':
1049
- case 'present':
1050
- case 'showInDialog':
1051
- case 'antialiasGloss':
1052
- result[key] = val;
1053
- break;
1054
- default:
1055
- reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1056
- }
1057
- }
1058
- return result;
1059
- }
1060
- function serializeEffectObject(obj, objName, reportErrors) {
1061
- var result = {};
1062
- for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
1063
- var objKey = _a[_i];
1064
- var key = objKey;
1065
- var val = obj[key];
1066
- switch (key) {
1067
- case 'enabled':
1068
- result.enab = !!val;
1069
- break;
1070
- case 'useGlobalLight':
1071
- result.uglg = !!val;
1072
- break;
1073
- case 'antialiased':
1074
- result.AntA = !!val;
1075
- break;
1076
- case 'align':
1077
- result.Algn = !!val;
1078
- break;
1079
- case 'dither':
1080
- result.Dthr = !!val;
1081
- break;
1082
- case 'invert':
1083
- result.Invr = !!val;
1084
- break;
1085
- case 'reverse':
1086
- result.Rvrs = !!val;
1087
- break;
1088
- case 'color':
1089
- result['Clr '] = serializeColor(val);
1090
- break;
1091
- case 'highlightColor':
1092
- result.hglC = serializeColor(val);
1093
- break;
1094
- case 'shadowColor':
1095
- result.sdwC = serializeColor(val);
1096
- break;
1097
- case 'position':
1098
- result.Styl = exports.FStl.encode(val);
1099
- break;
1100
- case 'blendMode':
1101
- result['Md '] = exports.BlnM.encode(val);
1102
- break;
1103
- case 'highlightBlendMode':
1104
- result.hglM = exports.BlnM.encode(val);
1105
- break;
1106
- case 'shadowBlendMode':
1107
- result.sdwM = exports.BlnM.encode(val);
1108
- break;
1109
- case 'style':
1110
- result.bvlS = exports.BESl.encode(val);
1111
- break;
1112
- case 'direction':
1113
- result.bvlD = exports.BESs.encode(val);
1114
- break;
1115
- case 'technique':
1116
- if (objName === 'bevel') {
1117
- result.bvlT = exports.bvlT.encode(val);
1118
- }
1119
- else {
1120
- result.GlwT = exports.BETE.encode(val);
1121
- }
1122
- break;
1123
- case 'source':
1124
- result.glwS = exports.IGSr.encode(val);
1125
- break;
1126
- case 'type':
1127
- result.Type = exports.GrdT.encode(val);
1128
- break;
1129
- case 'interpolationMethod':
1130
- result.gs99 = exports.gradientInterpolationMethodType.encode(val);
1131
- break;
1132
- case 'opacity':
1133
- result.Opct = unitsPercent(val);
1134
- break;
1135
- case 'highlightOpacity':
1136
- result.hglO = unitsPercent(val);
1137
- break;
1138
- case 'shadowOpacity':
1139
- result.sdwO = unitsPercent(val);
1140
- break;
1141
- case 'angle':
1142
- if (objName === 'gradientOverlay') {
1143
- result.Angl = unitsAngle(val);
1144
- }
1145
- else {
1146
- result.lagl = unitsAngle(val);
1147
- }
1148
- break;
1149
- case 'altitude':
1150
- result.Lald = unitsAngle(val);
1151
- break;
1152
- case 'soften':
1153
- result.Sftn = unitsValue(val, key);
1154
- break;
1155
- case 'strength':
1156
- result.srgR = unitsPercent(val);
1157
- break;
1158
- case 'size':
1159
- result.blur = unitsValue(val, key);
1160
- break;
1161
- case 'noise':
1162
- result.Nose = unitsPercent(val);
1163
- break;
1164
- case 'range':
1165
- result.Inpr = unitsPercent(val);
1166
- break;
1167
- case 'choke':
1168
- result.Ckmt = unitsValue(val, key);
1169
- break;
1170
- case 'jitter':
1171
- result.ShdN = unitsPercent(val);
1172
- break;
1173
- case 'distance':
1174
- result.Dstn = unitsValue(val, key);
1175
- break;
1176
- case 'scale':
1177
- result['Scl '] = unitsPercent(val);
1178
- break;
1179
- case 'pattern':
1180
- result.Ptrn = { 'Nm ': val.name, Idnt: val.id };
1181
- break;
1182
- case 'phase':
1183
- result.phase = { Hrzn: val.x, Vrtc: val.y };
1184
- break;
1185
- case 'offset':
1186
- result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };
1187
- break;
1188
- case 'contour': {
1189
- result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {
1190
- 'Nm ': val.name,
1191
- 'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),
1192
- };
1193
- break;
1194
- }
1195
- case 'gradient':
1196
- result.Grad = serializeGradient(val);
1197
- break;
1198
- case 'useTexture':
1199
- case 'useShape':
1200
- case 'layerConceals':
1201
- case 'present':
1202
- case 'showInDialog':
1203
- case 'antialiasGloss':
1204
- result[key] = val;
1205
- break;
1206
- default:
1207
- reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1208
- }
1209
- }
1210
- return result;
1211
- }
1212
- function parseGradient(grad) {
1213
- if (grad.GrdF === 'GrdF.CstS') {
1214
- var samples_1 = grad.Intr || 4096;
1215
- return {
1216
- type: 'solid',
1217
- name: grad['Nm '],
1218
- smoothness: grad.Intr / 4096,
1219
- colorStops: grad.Clrs.map(function (s) { return ({
1220
- color: parseColor(s['Clr ']),
1221
- location: s.Lctn / samples_1,
1222
- midpoint: s.Mdpn / 100,
1223
- }); }),
1224
- opacityStops: grad.Trns.map(function (s) { return ({
1225
- opacity: parsePercent(s.Opct),
1226
- location: s.Lctn / samples_1,
1227
- midpoint: s.Mdpn / 100,
1228
- }); }),
1229
- };
1230
- }
1231
- else {
1232
- return {
1233
- type: 'noise',
1234
- name: grad['Nm '],
1235
- roughness: grad.Smth / 4096,
1236
- colorModel: exports.ClrS.decode(grad.ClrS),
1237
- randomSeed: grad.RndS,
1238
- restrictColors: !!grad.VctC,
1239
- addTransparency: !!grad.ShTr,
1240
- min: grad['Mnm '].map(function (x) { return x / 100; }),
1241
- max: grad['Mxm '].map(function (x) { return x / 100; }),
1242
- };
1243
- }
1244
- }
1245
- function serializeGradient(grad) {
1246
- var _a, _b;
1247
- if (grad.type === 'solid') {
1248
- var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1249
- return {
1250
- 'Nm ': grad.name || '',
1251
- GrdF: 'GrdF.CstS',
1252
- Intr: samples_2,
1253
- Clrs: grad.colorStops.map(function (s) {
1254
- var _a;
1255
- return ({
1256
- 'Clr ': serializeColor(s.color),
1257
- Type: 'Clry.UsrS',
1258
- Lctn: Math.round(s.location * samples_2),
1259
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1260
- });
1261
- }),
1262
- Trns: grad.opacityStops.map(function (s) {
1263
- var _a;
1264
- return ({
1265
- Opct: unitsPercent(s.opacity),
1266
- Lctn: Math.round(s.location * samples_2),
1267
- Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1268
- });
1269
- }),
1270
- };
1271
- }
1272
- else {
1273
- return {
1274
- GrdF: 'GrdF.ClNs',
1275
- 'Nm ': grad.name || '',
1276
- ShTr: !!grad.addTransparency,
1277
- VctC: !!grad.restrictColors,
1278
- ClrS: exports.ClrS.encode(grad.colorModel),
1279
- RndS: grad.randomSeed || 0,
1280
- Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
1281
- 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
1282
- 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
1283
- };
1284
- }
1285
- }
1286
- function parseGradientContent(descriptor) {
1287
- var result = parseGradient(descriptor.Grad);
1288
- result.style = exports.GrdT.decode(descriptor.Type);
1289
- if (descriptor.Dthr !== undefined)
1290
- result.dither = descriptor.Dthr;
1291
- if (descriptor.Rvrs !== undefined)
1292
- result.reverse = descriptor.Rvrs;
1293
- if (descriptor.Angl !== undefined)
1294
- result.angle = parseAngle(descriptor.Angl);
1295
- if (descriptor['Scl '] !== undefined)
1296
- result.scale = parsePercent(descriptor['Scl ']);
1297
- if (descriptor.Algn !== undefined)
1298
- result.align = descriptor.Algn;
1299
- if (descriptor.Ofst !== undefined) {
1300
- result.offset = {
1301
- x: parsePercent(descriptor.Ofst.Hrzn),
1302
- y: parsePercent(descriptor.Ofst.Vrtc)
1303
- };
1304
- }
1305
- return result;
1306
- }
1307
- function parsePatternContent(descriptor) {
1308
- var result = {
1309
- name: descriptor.Ptrn['Nm '],
1310
- id: descriptor.Ptrn.Idnt,
1311
- };
1312
- if (descriptor.Lnkd !== undefined)
1313
- result.linked = descriptor.Lnkd;
1314
- if (descriptor.phase !== undefined)
1315
- result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
1316
- return result;
1317
- }
1318
- function parseVectorContent(descriptor) {
1319
- if ('Grad' in descriptor) {
1320
- return parseGradientContent(descriptor);
1321
- }
1322
- else if ('Ptrn' in descriptor) {
1323
- return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
1324
- }
1325
- else if ('Clr ' in descriptor) {
1326
- return { type: 'color', color: parseColor(descriptor['Clr ']) };
1327
- }
1328
- else {
1329
- throw new Error('Invalid vector content');
1330
- }
1331
- }
1332
- exports.parseVectorContent = parseVectorContent;
1333
- function serializeGradientContent(content) {
1334
- var result = {};
1335
- if (content.dither !== undefined)
1336
- result.Dthr = content.dither;
1337
- if (content.reverse !== undefined)
1338
- result.Rvrs = content.reverse;
1339
- if (content.angle !== undefined)
1340
- result.Angl = unitsAngle(content.angle);
1341
- result.Type = exports.GrdT.encode(content.style);
1342
- if (content.align !== undefined)
1343
- result.Algn = content.align;
1344
- if (content.scale !== undefined)
1345
- result['Scl '] = unitsPercent(content.scale);
1346
- if (content.offset) {
1347
- result.Ofst = {
1348
- Hrzn: unitsPercent(content.offset.x),
1349
- Vrtc: unitsPercent(content.offset.y),
1350
- };
1351
- }
1352
- result.Grad = serializeGradient(content);
1353
- return result;
1354
- }
1355
- function serializePatternContent(content) {
1356
- var result = {
1357
- Ptrn: {
1358
- 'Nm ': content.name || '',
1359
- Idnt: content.id || '',
1360
- }
1361
- };
1362
- if (content.linked !== undefined)
1363
- result.Lnkd = !!content.linked;
1364
- if (content.phase !== undefined)
1365
- result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
1366
- return result;
1367
- }
1368
- function serializeVectorContent(content) {
1369
- if (content.type === 'color') {
1370
- return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
1371
- }
1372
- else if (content.type === 'pattern') {
1373
- return { key: 'PtFl', descriptor: serializePatternContent(content) };
1374
- }
1375
- else {
1376
- return { key: 'GdFl', descriptor: serializeGradientContent(content) };
1377
- }
1378
- }
1379
- exports.serializeVectorContent = serializeVectorContent;
1380
- function parseColor(color) {
1381
- if ('H ' in color) {
1382
- return { h: parsePercentOrAngle(color['H ']), s: color.Strt, b: color.Brgh };
1383
- }
1384
- else if ('Rd ' in color) {
1385
- return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
1386
- }
1387
- else if ('Cyn ' in color) {
1388
- return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
1389
- }
1390
- else if ('Gry ' in color) {
1391
- return { k: color['Gry '] };
1392
- }
1393
- else if ('Lmnc' in color) {
1394
- return { l: color.Lmnc, a: color['A '], b: color['B '] };
1395
- }
1396
- else {
1397
- throw new Error('Unsupported color descriptor');
1398
- }
1399
- }
1400
- exports.parseColor = parseColor;
1401
- function serializeColor(color) {
1402
- if (!color) {
1403
- return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
1404
- }
1405
- else if ('r' in color) {
1406
- return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
1407
- }
1408
- else if ('h' in color) {
1409
- return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
1410
- }
1411
- else if ('c' in color) {
1412
- return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
1413
- }
1414
- else if ('l' in color) {
1415
- return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
1416
- }
1417
- else if ('k' in color) {
1418
- return { 'Gry ': color.k };
1419
- }
1420
- else {
1421
- throw new Error('Invalid color value');
1422
- }
1423
- }
1424
- exports.serializeColor = serializeColor;
1425
- function parseAngle(x) {
1426
- if (x === undefined)
1427
- return 0;
1428
- if (x.units !== 'Angle')
1429
- throw new Error("Invalid units: ".concat(x.units));
1430
- return x.value;
1431
- }
1432
- exports.parseAngle = parseAngle;
1433
- function parsePercent(x) {
1434
- if (x === undefined)
1435
- return 1;
1436
- if (x.units !== 'Percent')
1437
- throw new Error("Invalid units: ".concat(x.units));
1438
- return x.value / 100;
1439
- }
1440
- exports.parsePercent = parsePercent;
1441
- function parsePercentOrAngle(x) {
1442
- if (x === undefined)
1443
- return 1;
1444
- if (x.units === 'Percent')
1445
- return x.value / 100;
1446
- if (x.units === 'Angle')
1447
- return x.value / 360;
1448
- throw new Error("Invalid units: ".concat(x.units));
1449
- }
1450
- exports.parsePercentOrAngle = parsePercentOrAngle;
1451
- function parseUnits(_a) {
1452
- var units = _a.units, value = _a.value;
1453
- if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1454
- units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1455
- throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1456
- }
1457
- return { value: value, units: units };
1458
- }
1459
- exports.parseUnits = parseUnits;
1460
- function parseUnitsOrNumber(value, units) {
1461
- if (units === void 0) { units = 'Pixels'; }
1462
- if (typeof value === 'number')
1463
- return { value: value, units: units };
1464
- return parseUnits(value);
1465
- }
1466
- exports.parseUnitsOrNumber = parseUnitsOrNumber;
1467
- function parseUnitsToNumber(_a, expectedUnits) {
1468
- var units = _a.units, value = _a.value;
1469
- if (units !== expectedUnits)
1470
- throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1471
- return value;
1472
- }
1473
- exports.parseUnitsToNumber = parseUnitsToNumber;
1474
- function unitsAngle(value) {
1475
- return { units: 'Angle', value: value || 0 };
1476
- }
1477
- exports.unitsAngle = unitsAngle;
1478
- function unitsPercent(value) {
1479
- return { units: 'Percent', value: Math.round((value || 0) * 100) };
1480
- }
1481
- exports.unitsPercent = unitsPercent;
1482
- function unitsValue(x, key) {
1483
- if (x == null)
1484
- return { units: 'Pixels', value: 0 };
1485
- if (typeof x !== 'object')
1486
- throw new Error("Invalid value: ".concat(JSON.stringify(x), " (key: ").concat(key, ") (should have value and units)"));
1487
- var units = x.units, value = x.value;
1488
- if (typeof value !== 'number')
1489
- throw new Error("Invalid value in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1490
- if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1491
- units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1492
- throw new Error("Invalid units in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1493
- }
1494
- return { units: units, value: value };
1495
- }
1496
- exports.unitsValue = unitsValue;
1497
- exports.textGridding = (0, helpers_1.createEnum)('textGridding', 'none', {
1498
- none: 'None',
1499
- round: 'Rnd ',
1500
- });
1501
- exports.Ornt = (0, helpers_1.createEnum)('Ornt', 'horizontal', {
1502
- horizontal: 'Hrzn',
1503
- vertical: 'Vrtc',
1504
- });
1505
- exports.Annt = (0, helpers_1.createEnum)('Annt', 'sharp', {
1506
- none: 'Anno',
1507
- sharp: 'antiAliasSharp',
1508
- crisp: 'AnCr',
1509
- strong: 'AnSt',
1510
- smooth: 'AnSm',
1511
- platform: 'antiAliasPlatformGray',
1512
- platformLCD: 'antiAliasPlatformLCD',
1513
- });
1514
- exports.warpStyle = (0, helpers_1.createEnum)('warpStyle', 'none', {
1515
- none: 'warpNone',
1516
- arc: 'warpArc',
1517
- arcLower: 'warpArcLower',
1518
- arcUpper: 'warpArcUpper',
1519
- arch: 'warpArch',
1520
- bulge: 'warpBulge',
1521
- shellLower: 'warpShellLower',
1522
- shellUpper: 'warpShellUpper',
1523
- flag: 'warpFlag',
1524
- wave: 'warpWave',
1525
- fish: 'warpFish',
1526
- rise: 'warpRise',
1527
- fisheye: 'warpFisheye',
1528
- inflate: 'warpInflate',
1529
- squeeze: 'warpSqueeze',
1530
- twist: 'warpTwist',
1531
- custom: 'warpCustom',
1532
- });
1533
- exports.BlnM = (0, helpers_1.createEnum)('BlnM', 'normal', {
1534
- 'normal': 'Nrml',
1535
- 'dissolve': 'Dslv',
1536
- 'darken': 'Drkn',
1537
- 'multiply': 'Mltp',
1538
- 'color burn': 'CBrn',
1539
- 'linear burn': 'linearBurn',
1540
- 'darker color': 'darkerColor',
1541
- 'lighten': 'Lghn',
1542
- 'screen': 'Scrn',
1543
- 'color dodge': 'CDdg',
1544
- 'linear dodge': 'linearDodge',
1545
- 'lighter color': 'lighterColor',
1546
- 'overlay': 'Ovrl',
1547
- 'soft light': 'SftL',
1548
- 'hard light': 'HrdL',
1549
- 'vivid light': 'vividLight',
1550
- 'linear light': 'linearLight',
1551
- 'pin light': 'pinLight',
1552
- 'hard mix': 'hardMix',
1553
- 'difference': 'Dfrn',
1554
- 'exclusion': 'Xclu',
1555
- 'subtract': 'blendSubtraction',
1556
- 'divide': 'blendDivide',
1557
- 'hue': 'H ',
1558
- 'saturation': 'Strt',
1559
- 'color': 'Clr ',
1560
- 'luminosity': 'Lmns',
1561
- // used in ABR
1562
- 'linear height': 'linearHeight',
1563
- 'height': 'Hght',
1564
- 'subtraction': 'Sbtr', // 2nd version of subtract ?
1565
- });
1566
- exports.BESl = (0, helpers_1.createEnum)('BESl', 'inner bevel', {
1567
- 'inner bevel': 'InrB',
1568
- 'outer bevel': 'OtrB',
1569
- 'emboss': 'Embs',
1570
- 'pillow emboss': 'PlEb',
1571
- 'stroke emboss': 'strokeEmboss',
1572
- });
1573
- exports.bvlT = (0, helpers_1.createEnum)('bvlT', 'smooth', {
1574
- 'smooth': 'SfBL',
1575
- 'chisel hard': 'PrBL',
1576
- 'chisel soft': 'Slmt',
1577
- });
1578
- exports.BESs = (0, helpers_1.createEnum)('BESs', 'up', {
1579
- up: 'In ',
1580
- down: 'Out ',
1581
- });
1582
- exports.BETE = (0, helpers_1.createEnum)('BETE', 'softer', {
1583
- softer: 'SfBL',
1584
- precise: 'PrBL',
1585
- });
1586
- exports.IGSr = (0, helpers_1.createEnum)('IGSr', 'edge', {
1587
- edge: 'SrcE',
1588
- center: 'SrcC',
1589
- });
1590
- exports.GrdT = (0, helpers_1.createEnum)('GrdT', 'linear', {
1591
- linear: 'Lnr ',
1592
- radial: 'Rdl ',
1593
- angle: 'Angl',
1594
- reflected: 'Rflc',
1595
- diamond: 'Dmnd',
1596
- });
1597
- exports.animInterpStyleEnum = (0, helpers_1.createEnum)('animInterpStyle', 'linear', {
1598
- linear: 'Lnr ',
1599
- hold: 'hold',
1600
- });
1601
- exports.stdTrackID = (0, helpers_1.createEnum)('stdTrackID', 'opacity', {
1602
- opacity: 'opacityTrack',
1603
- style: 'styleTrack',
1604
- sheetTransform: 'sheetTransformTrack',
1605
- sheetPosition: 'sheetPositionTrack',
1606
- globalLighting: 'globalLightingTrack',
1607
- });
1608
- exports.gradientInterpolationMethodType = (0, helpers_1.createEnum)('gradientInterpolationMethodType', 'perceptual', {
1609
- perceptual: 'Perc',
1610
- linear: 'Lnr',
1611
- classic: 'Gcls',
1612
- });
1613
- exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
1614
- rgb: 'RGBC',
1615
- hsb: 'HSBl',
1616
- lab: 'LbCl',
1617
- });
1618
- exports.FStl = (0, helpers_1.createEnum)('FStl', 'outside', {
1619
- outside: 'OutF',
1620
- center: 'CtrF',
1621
- inside: 'InsF'
1622
- });
1623
- exports.FrFl = (0, helpers_1.createEnum)('FrFl', 'color', {
1624
- color: 'SClr',
1625
- gradient: 'GrFl',
1626
- pattern: 'Ptrn',
1627
- });
1628
- exports.strokeStyleLineCapType = (0, helpers_1.createEnum)('strokeStyleLineCapType', 'butt', {
1629
- butt: 'strokeStyleButtCap',
1630
- round: 'strokeStyleRoundCap',
1631
- square: 'strokeStyleSquareCap',
1632
- });
1633
- exports.strokeStyleLineJoinType = (0, helpers_1.createEnum)('strokeStyleLineJoinType', 'miter', {
1634
- miter: 'strokeStyleMiterJoin',
1635
- round: 'strokeStyleRoundJoin',
1636
- bevel: 'strokeStyleBevelJoin',
1637
- });
1638
- exports.strokeStyleLineAlignment = (0, helpers_1.createEnum)('strokeStyleLineAlignment', 'inside', {
1639
- inside: 'strokeStyleAlignInside',
1640
- center: 'strokeStyleAlignCenter',
1641
- outside: 'strokeStyleAlignOutside',
1642
- });
1643
-
1644
- //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDbkQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDbkQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDdEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDcEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDeEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDbEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDckQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDckQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDbkQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDdEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDdEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDckQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUN6RSxLQUFLLE9BQU87Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUNqRSxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUM3RixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssTUFBTTtnQkFDVixNQUFNLENBQUMsT0FBTyxHQUFHO29CQUNoQixJQUFJLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDakIsS0FBSyxFQUFHLEdBQUcsQ0FBQyxNQUFNLENBQVcsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUExQixDQUEwQixDQUFDO2lCQUNsRSxDQUFDO2dCQUNGLE1BQU07WUFDUCxLQUFLLE1BQU07Z0JBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN6RCxLQUFLLFlBQVksQ0FBQztZQUNsQixLQUFLLFVBQVUsQ0FBQztZQUNoQixLQUFLLGVBQWUsQ0FBQztZQUNyQixLQUFLLFNBQVMsQ0FBQztZQUNmLEtBQUssY0FBYyxDQUFDO1lBQ3BCLEtBQUssZ0JBQWdCO2dCQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQUMsTUFBTTtZQUNoRDtnQkFDQyxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBd0IsR0FBRyxjQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDMUU7S0FDRDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsR0FBUSxFQUFFLE9BQWUsRUFBRSxZQUFxQjtJQUM5RSxJQUFNLE1BQU0sR0FBUSxFQUFFLENBQUM7SUFFdkIsS0FBcUIsVUFBZ0IsRUFBaEIsS0FBQSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFoQixjQUFnQixFQUFoQixJQUFnQixFQUFFO1FBQWxDLElBQU0sTUFBTSxTQUFBO1FBQ2hCLElBQU0sR0FBRyxHQUFxQixNQUFhLENBQUM7UUFDNUMsSUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLFFBQVEsR0FBRyxFQUFFO1lBQ1osS0FBSyxTQUFTO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFBQyxNQUFNO1lBQzNDLEtBQUssZ0JBQWdCO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFBQyxNQUFNO1lBQ2xELEtBQUssYUFBYTtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUMsTUFBTTtZQUMvQyxLQUFLLE9BQU87Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLE1BQU07WUFDekMsS0FBSyxRQUFRO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFBQyxNQUFNO1lBQzFDLEtBQUssUUFBUTtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQUMsTUFBTTtZQUMxQyxLQUFLLFNBQVM7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUFDLE1BQU07WUFDM0MsS0FBSyxPQUFPO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUMxRCxLQUFLLGdCQUFnQjtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ2hFLEtBQUssYUFBYTtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQzdELEtBQUssVUFBVTtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN2RCxLQUFLLFdBQVc7Z0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFlBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUMzRCxLQUFLLG9CQUFvQjtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNqRSxLQUFLLGlCQUFpQjtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUM5RCxLQUFLLE9BQU87Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxZQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDcEQsS0FBSyxXQUFXO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3hELEtBQUssV0FBVztnQkFDZixJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7b0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDL0I7cUJBQU07b0JBQ04sTUFBTSxDQUFDLElBQUksR0FBRyxZQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQjtnQkFDRCxNQUFNO1lBQ1AsS0FBSyxRQUFRO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3JELEtBQUssTUFBTTtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUNuRCxLQUFLLHFCQUFxQjtnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLHVDQUErQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQzdGLEtBQUssU0FBUztnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3ZELEtBQUssa0JBQWtCO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDaEUsS0FBSyxlQUFlO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDN0QsS0FBSyxPQUFPO2dCQUNYLElBQUksT0FBTyxLQUFLLGlCQUFpQixFQUFFO29CQUNsQyxNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDOUI7cUJBQU07b0JBQ04sTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQzlCO2dCQUNELE1BQU07WUFDUCxLQUFLLFVBQVU7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN0RCxLQUFLLFFBQVE7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDekQsS0FBSyxVQUFVO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDeEQsS0FBSyxNQUFNO2dCQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3ZELEtBQUssT0FBTztnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3JELEtBQUssT0FBTztnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFBQyxNQUFNO1lBQ3JELEtBQUssT0FBTztnQkFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN4RCxLQUFLLFFBQVE7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN0RCxLQUFLLFVBQVU7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUFDLE1BQU07WUFDM0QsS0FBSyxPQUFPO2dCQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUMsTUFBTTtZQUN4RCxLQUFLLFNBQVM7Z0JBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQUMsTUFBTTtZQUN4RSxLQUFLLE9BQU87Z0JBQUUsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLElB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QUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDL0U7U0FBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUU7UUFDM0IsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7S0FDaEU7U0FBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUU7UUFDM0IsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQzVFO1NBQU0sSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFO1FBQzNCLE9BQU8sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7S0FDNUI7U0FBTSxJQUFJLE1BQU0sSUFBSSxLQUFLLEVBQUU7UUFDM0IsT0FBTyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO0tBQzdEO1NBQU07UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7S0FDaEQ7QUFDRixDQUFDO0FBZEQsZ0NBY0M7QUFFRCxTQUFnQixjQUFjLENBQUMsS0FBd0I7SUFDdEQsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNYLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDO0tBQzNDO1NBQU0sSUFBSSxHQUFHLElBQUksS0FBSyxFQUFF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RTtJQUN2RyxNQUFNLEVBQUUsd0JBQXdCO0lBQ2hDLE1BQU0sRUFBRSx3QkFBd0I7SUFDaEMsT0FBTyxFQUFFLHlCQUF5QjtDQUNsQyxDQUFDLENBQUMiLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUVudW0gfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5pbXBvcnQge1xyXG5cdEFudGlBbGlhcywgQmV2ZWxEaXJlY3Rpb24sIEJldmVsU3R5bGUsIEJldmVsVGVjaG5pcXVlLCBCbGVuZE1vZGUsIENvbG9yLCBFZmZlY3RDb250b3VyLFxyXG5cdEVmZmVjdE5vaXNlR3JhZGllbnQsIEVmZmVjdFBhdHRlcm4sIEVmZmVjdFNvbGlkR3JhZGllbnQsIEV4dHJhR3JhZGllbnRJbmZvLCBFeHRyYVBhdHRlcm5JbmZvLFxyXG5cdEdsb3dTb3VyY2UsIEdsb3dUZWNobmlxdWUsIEdyYWRpZW50U3R5bGUsIEludGVycG9sYXRpb25NZXRob2QsIExheWVyRWZmZWN0QmV2ZWwsXHJcblx0TGF5ZXJFZmZlY3RHcmFkaWVudE92ZXJsYXksIExheWVyRWZmZWN0SW5uZXJHbG93LCBMYXllckVmZmVjdFBhdHRlcm5PdmVybGF5LFxyXG5cdExheWVyRWZmZWN0U2F0aW4sIExheWVyRWZmZWN0U2hhZG93LCBMYXllckVmZmVjdHNJbmZvLCBMYXllckVmZmVjdFNvbGlkRmlsbCxcclxuXHRMYXllckVmZmVjdHNPdXRlckdsb3csIExheWVyRWZmZWN0U3Ryb2tlLCBMaW5lQWxpZ25tZW50LCBMaW5lQ2FwVHlwZSwgTGluZUpvaW5UeXBlLFxyXG5cdE9yaWVudGF0aW9uLCBUZXh0R3JpZGRpbmcsIFRpbWVsaW5lS2V5LCBUaW1lbGluZUtleUludGVycG9sYXRpb24sIFRpbWVsaW5lVHJhY2ssIFRpbWVsaW5lVHJhY2tUeXBlLFxyXG5cdFVuaXRzLCBVbml0c1ZhbHVlLCBWZWN0b3JDb250ZW50LCBXYXJwU3R5bGVcclxufSBmcm9tICcuL3BzZCc7XHJcbmltcG9ydCB7XHJcblx0UHNkUmVhZGVyLCByZWFkU2lnbmF0dXJlLCByZWFkVW5pY29kZVN0cmluZywgcmVhZFVpbnQzMiwgcmVhZFVpbnQ4LCByZWFkRmxvYXQ2NCxcclxuXHRyZWFkQnl0ZXMsIHJlYWRBc2NpaVN0cmluZywgcmVhZEludDMyLCByZWFkRmxvYXQzMiwgcmVhZEludDMyTEUsIHJlYWRVbmljb2RlU3RyaW5nV2l0aExlbmd0aFxyXG59IGZyb20gJy4vcHNkUmVhZGVyJztcclxuaW1wb3J0IHtcclxuXHRQc2RXcml0ZXIsIHdyaXRlU2lnbmF0dXJlLCB3cml0ZUJ5dGVzLCB3cml0ZVVpbnQzMiwgd3JpdGVGbG9hdDY0LCB3cml0ZVVpbnQ4LFxyXG5cdHdyaXRlVW5pY29kZVN0cmluZ1dpdGhQYWRkaW5nLCB3cml0ZUludDMyLCB3cml0ZUZsb2F0MzIsIHdyaXRlVW5pY29kZVN0cmluZ1xyXG59IGZyb20gJy4vcHNkV3JpdGVyJztcclxuXHJcbmludGVyZmFjZSBEaWN0IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9XHJcbmludGVyZmFjZSBOYW1lQ2xhc3NJRCB7IG5hbWU6IHN0cmluZzsgY2xhc3NJRDogc3RyaW5nOyB9XHJcbmludGVyZmFjZSBFeHRUeXBlRGljdCB7IFtrZXk6IHN0cmluZ106IE5hbWVDbGFzc0lEOyB9XHJcblxyXG5mdW5jdGlvbiByZXZNYXAobWFwOiBEaWN0KSB7XHJcblx0Y29uc3QgcmVzdWx0OiBEaWN0ID0ge307XHJcblx0T2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGtleSA9PiByZXN1bHRbbWFwW2tleV1dID0ga2V5KTtcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5jb25zdCB1bml0c01hcDogRGljdCA9IHtcclxuXHQnI0FuZyc6ICdBbmdsZScsXHJcblx0JyNSc2wnOiAnRGVuc2l0eScsXHJcblx0JyNSbHQnOiAnRGlzdGFuY2UnLFxyXG5cdCcjTm5lJzogJ05vbmUnLFxyXG5cdCcjUHJjJzogJ1BlcmNlbnQnLFxyXG5cdCcjUHhsJzogJ1BpeGVscycsXHJcblx0JyNNbG0nOiAnTWlsbGltZXRlcnMnLFxyXG5cdCcjUG50JzogJ1BvaW50cycsXHJcblx0J1JyUGknOiAnUGljYXMnLFxyXG5cdCdSckluJzogJ0luY2hlcycsXHJcblx0J1JyQ20nOiAnQ2VudGltZXRlcnMnLFxyXG59O1xyXG5cclxuY29uc3QgdW5pdHNNYXBSZXYgPSByZXZNYXAodW5pdHNNYXApO1xyXG5sZXQgbG9nRXJyb3JzID0gZmFsc2U7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9nRXJyb3JzKHZhbHVlOiBib29sZWFuKSB7XHJcblx0bG9nRXJyb3JzID0gdmFsdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1ha2VUeXBlKG5hbWU6IHN0cmluZywgY2xhc3NJRDogc3RyaW5nKSB7XHJcblx0cmV0dXJuIHsgbmFtZSwgY2xhc3NJRCB9O1xyXG59XHJcblxyXG5jb25zdCBudWxsVHlwZSA9IG1ha2VUeXBlKCcnLCAnbnVsbCcpO1xyXG5cclxuY29uc3QgZmllbGRUb0V4dFR5cGU6IEV4dFR5cGVEaWN0ID0ge1xyXG5cdHN0cm9rZVN0eWxlQ29udGVudDogbWFrZVR5cGUoJycsICdzb2xpZENvbG9yTGF5ZXInKSxcclxuXHQvLyBwcmludFByb29mU2V0dXA6IG1ha2VUeXBlKCfmoKHmoLforr7nva4nLCAncHJvb2ZTZXR1cCcpLCAvLyBURVNUSU5HXHJcblx0cHJpbnRQcm9vZlNldHVwOiBtYWtlVHlwZSgnUHJvb2YgU2V0dXAnLCAncHJvb2ZTZXR1cCcpLFxyXG5cdHBhdHRlcm5GaWxsOiBtYWtlVHlwZSgnJywgJ3BhdHRlcm5GaWxsJyksXHJcblx0R3JhZDogbWFrZVR5cGUoJ0dyYWRpZW50JywgJ0dyZG4nKSxcclxuXHRlYmJsOiBtYWtlVHlwZSgnJywgJ2ViYmwnKSxcclxuXHRTb0ZpOiBtYWtlVHlwZSgnJywgJ1NvRmknKSxcclxuXHRHckZsOiBtYWtlVHlwZSgnJywgJ0dyRmwnKSxcclxuXHRzZHdDOiBtYWtlVHlwZSgnJywgJ1JHQkMnKSxcclxuXHRoZ2xDOiBtYWtlVHlwZSgnJywgJ1JHQkMnKSxcclxuXHQnQ2xyICc6IG1ha2VUeXBlKCcnLCAnUkdCQycpLFxyXG5cdCd0aW50Q29sb3InOiBtYWtlVHlwZSgnJywgJ1JHQkMnKSxcclxuXHRPZnN0OiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRDaEZYOiBtYWtlVHlwZSgnJywgJ0NoRlgnKSxcclxuXHRNcGdTOiBtYWtlVHlwZSgnJywgJ1NocEMnKSxcclxuXHREclNoOiBtYWtlVHlwZSgnJywgJ0RyU2gnKSxcclxuXHRJclNoOiBtYWtlVHlwZSgnJywgJ0lyU2gnKSxcclxuXHRPckdsOiBtYWtlVHlwZSgnJywgJ09yR2wnKSxcclxuXHRJckdsOiBtYWtlVHlwZSgnJywgJ0lyR2wnKSxcclxuXHRUcm5TOiBtYWtlVHlwZSgnJywgJ1NocEMnKSxcclxuXHRQdHJuOiBtYWtlVHlwZSgnJywgJ1B0cm4nKSxcclxuXHRGckZYOiBtYWtlVHlwZSgnJywgJ0ZyRlgnKSxcclxuXHRwaGFzZTogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0ZnJhbWVTdGVwOiBudWxsVHlwZSxcclxuXHRkdXJhdGlvbjogbnVsbFR5cGUsXHJcblx0d29ya0luVGltZTogbnVsbFR5cGUsXHJcblx0d29ya091dFRpbWU6IG51bGxUeXBlLFxyXG5cdGF1ZGlvQ2xpcEdyb3VwTGlzdDogbnVsbFR5cGUsXHJcblx0Ym91bmRzOiBtYWtlVHlwZSgnJywgJ1JjdG4nKSxcclxuXHRjdXN0b21FbnZlbG9wZVdhcnA6IG1ha2VUeXBlKCcnLCAnY3VzdG9tRW52ZWxvcGVXYXJwJyksXHJcblx0d2FycDogbWFrZVR5cGUoJycsICd3YXJwJyksXHJcblx0J1N6ICAnOiBtYWtlVHlwZSgnJywgJ1BudCAnKSxcclxuXHRvcmlnaW46IG1ha2VUeXBlKCcnLCAnUG50ICcpLFxyXG5cdGF1dG9FeHBhbmRPZmZzZXQ6IG1ha2VUeXBlKCcnLCAnUG50ICcpLFxyXG5cdGtleU9yaWdpblNoYXBlQkJveDogbWFrZVR5cGUoJycsICd1bml0UmVjdCcpLFxyXG5cdFZyc246IG51bGxUeXBlLFxyXG5cdHBzVmVyc2lvbjogbnVsbFR5cGUsXHJcblx0ZG9jRGVmYXVsdE5ld0FydGJvYXJkQmFja2dyb3VuZENvbG9yOiBtYWtlVHlwZSgnJywgJ1JHQkMnKSxcclxuXHRhcnRib2FyZFJlY3Q6IG1ha2VUeXBlKCcnLCAnY2xhc3NGbG9hdFJlY3QnKSxcclxuXHRrZXlPcmlnaW5SUmVjdFJhZGlpOiBtYWtlVHlwZSgnJywgJ3JhZGlpJyksXHJcblx0a2V5T3JpZ2luQm94Q29ybmVyczogbnVsbFR5cGUsXHJcblx0cmVjdGFuZ2xlQ29ybmVyQTogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0cmVjdGFuZ2xlQ29ybmVyQjogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0cmVjdGFuZ2xlQ29ybmVyQzogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0cmVjdGFuZ2xlQ29ybmVyRDogbWFrZVR5cGUoJycsICdQbnQgJyksXHJcblx0Y29tcEluZm86IG51bGxUeXBlLFxyXG5cdFRybmY6IG1ha2VUeXBlKCdUcmFuc2Zvcm0nLCAnVHJuZicpLFxyXG5cdHF1aWx0V2FycDogbWFrZVR5cGUoJycsICdxdWlsdFdhcnAnKSxcclxuXHRnZW5lcmF0b3JTZXR0aW5nczogbnVsbFR5cGUsXHJcblx0Y3JlbWE6IG51bGxUeXBlLFxyXG5cdEZySW46IG51bGxUeXBlLFxyXG5cdGJsZW5kT3B0aW9uczogbnVsbFR5cGUsXHJcblx0RlhSZjogbnVsbFR5cGUsXHJcblx0TGVmeDogbnVsbFR5cGUsXHJcblx0dGltZTogbnVsbFR5cGUsXHJcblx0YW5pbUtleTogbnVsbFR5cGUsXHJcblx0dGltZVNjb3BlOiBudWxsVHlwZSxcclxuXHRpblRpbWU6IG51bGxUeXBlLFxyXG5cdG91dFRpbWU6IG51bGxUeXBlLFxyXG5cdHNoZWV0U3R5bGU6IG51bGxUeXBlLFxyXG5cdHRyYW5zbGF0aW9uOiBudWxsVHlwZSxcclxuXHRTa2V3OiBudWxsVHlwZSxcclxuXHQnTG5rICc6IG1ha2VUeXBlKCcnLCAnRXh0ZXJuYWxGaWxlTGluaycpLFxyXG5cdGZyYW1lUmVhZGVyOiBtYWtlVHlwZSgnJywgJ0ZyYW1lUmVhZGVyJyksXHJcblx0ZWZmZWN0UGFyYW1zOiBtYWtlVHlwZSgnJywgJ21vdGlvblRyYWNrRWZmZWN0UGFyYW1zJyksXHJcbn07XHJcblxyXG5jb25zdCBmaWVsZFRvQXJyYXlFeHRUeXBlOiBFeHRUeXBlRGljdCA9IHtcclxuXHQnQ3J2ICc6IG1ha2VUeXBlKCcnLCAnQ3JQdCcpLFxyXG5cdENscnM6IG1ha2VUeXBlKCcnLCAnQ2xydCcpLFxyXG5cdFRybnM6IG1ha2VUeXBlKCcnLCAnVHJuUycpLFxyXG5cdGtleURlc2NyaXB0b3JMaXN0OiBudWxsVHlwZSxcclxuXHRzb2xpZEZpbGxNdWx0aTogbWFrZVR5cGUoJycsICdTb0ZpJyksXHJcblx0Z3JhZGllbnRGaWxsTXVsdGk6IG1ha2VUeXBlKCcnLCAnR3JGbCcpLFxyXG5cdGRyb3BTaGFkb3dNdWx0aTogbWFrZVR5cGUoJycsICdEclNoJyksXHJcblx0aW5uZXJTaGFkb3dNdWx0aTogbWFrZVR5cGUoJycsICdJclNoJyksXHJcblx0ZnJhbWVGWE11bHRpOiBtYWtlVHlwZSgnJywgJ0ZyRlgnKSxcclxuXHRGckluOiBudWxsVHlwZSxcclxuXHRGU3RzOiBudWxsVHlwZSxcclxuXHRMYVN0OiBudWxsVHlwZSxcclxuXHRzaGVldFRpbWVsaW5lT3B0aW9uczogbnVsbFR5cGUsXHJcblx0dHJhY2tMaXN0OiBtYWtlVHlwZSgnJywgJ2FuaW1hdGlvblRyYWNrJyksXHJcblx0Z2xvYmFsVHJhY2tMaXN0OiBtYWtlVHlwZSgnJywgJ2FuaW1hdGlvblRyYWNrJyksXHJcblx0a2V5TGlzdDogbnVsbFR5cGUsXHJcblx0YXVkaW9DbGlwR3JvdXBMaXN0OiBudWxsVHlwZSxcclxuXHRhdWRpb0NsaXBMaXN0OiBudWxsVHlwZSxcclxufTtcclxuXHJcbmNvbnN0IHR5cGVUb0ZpZWxkOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdOyB9ID0ge1xyXG5cdCdURVhUJzogW1xyXG5cdFx0J1R4dCAnLCAncHJpbnRlck5hbWUnLCAnTm0gICcsICdJZG50JywgJ2JsYWNrQW5kV2hpdGVQcmVzZXRGaWxlTmFtZScsICdMVVQzREZpbGVOYW1lJyxcclxuXHRcdCdwcmVzZXRGaWxlTmFtZScsICdjdXJ2ZXNQcmVzZXRGaWxlTmFtZScsICdtaXhlclByZXNldEZpbGVOYW1lJywgJ3BsYWNlZCcsICdkZXNjcmlwdGlvbicsICdyZWFzb24nLFxyXG5cdFx0J2FydGJvYXJkUHJlc2V0TmFtZScsICdqc29uJywgJ2dyb3VwSUQnLCAnY2xpcElEJywgJ3JlbFBhdGgnLCAnZnVsbFBhdGgnLCAnbWVkaWFEZXNjcmlwdG9yJyxcclxuXHRdLFxyXG5cdCd0ZHRhJzogWydFbmdpbmVEYXRhJywgJ0xVVDNERmlsZURhdGEnXSxcclxuXHQnbG9uZyc6IFtcclxuXHRcdCdUZXh0SW5kZXgnLCAnUm5kUycsICdNZHBuJywgJ1NtdGgnLCAnTGN0bicsICdzdHJva2VTdHlsZVZlcnNpb24nLCAnTGFJRCcsICdWcnNuJywgJ0NudCAnLFxyXG5cdFx0J0JyZ2gnLCAnQ250cicsICdtZWFucycsICd2aWJyYW5jZScsICdTdHJ0JywgJ2J3UHJlc2V0S2luZCcsICdwcmVzZXRLaW5kJywgJ2NvbXAnLCAnY29tcElEJywgJ29yaWdpbmFsQ29tcElEJyxcclxuXHRcdCdjdXJ2ZXNQcmVzZXRLaW5kJywgJ21peGVyUHJlc2V0S2luZCcsICd1T3JkZXInLCAndk9yZGVyJywgJ1BnTm0nLCAndG90YWxQYWdlcycsICdDcm9wJyxcclxuXHRcdCdudW1lcmF0b3InLCAnZGVub21pbmF0b3InLCAnZnJhbWVDb3VudCcsICdBbm50JywgJ2tleU9yaWdpblR5cGUnLCAndW5pdFZhbHVlUXVhZFZlcnNpb24nLFxyXG5cdFx0J2tleU9yaWdpbkluZGV4JywgJ21ham9yJywgJ21pbm9yJywgJ2ZpeCcsICdkb2NEZWZhdWx0TmV3QXJ0Ym9hcmRCYWNrZ3JvdW5kVHlwZScsICdhcnRib2FyZEJhY2tncm91bmRUeXBlJyxcclxuXHRcdCdudW1Nb2RpZnlpbmdGWCcsICdkZWZvcm1OdW1Sb3dzJywgJ2RlZm9ybU51bUNvbHMnLCAnRnJJRCcsICdGckRsJywgJ0ZzSUQnLCAnTENudCcsICdBRnJtJywgJ0FGU3QnLFxyXG5cdFx0J251bUJlZm9yZScsICdudW1BZnRlcicsICdTcGNuJywgJ21pbk9wYWNpdHknLCAnbWF4T3BhY2l0eScsICdCbG5NJywgJ3NoZWV0SUQnLCAnZ2JsQScsICdnbG9iYWxBbHRpdHVkZScsXHJcblx0XHQnZGVzY1ZlcnNpb24nLCAnZnJhbWVSZWFkZXJUeXBlJywgJ0x5ckknLCAnem9vbU9yaWdpbicsXHJcblx0XSxcclxuXHQnZW51bSc6IFtcclxuXHRcdCd0ZXh0R3JpZGRpbmcnLCAnT3JudCcsICd3YXJwU3R5bGUnLCAnd2FycFJvdGF0ZScsICdJbnRlJywgJ0JsdG4nLCAnQ2xyUycsXHJcblx0XHQnc2R3TScsICdoZ2xNJywgJ2J2bFQnLCAnYnZsUycsICdidmxEJywgJ01kICAnLCAnZ2x3UycsICdHcmRGJywgJ0dsd1QnLFxyXG5cdFx0J3N0cm9rZVN0eWxlTGluZUNhcFR5cGUnLCAnc3Ryb2tlU3R5bGVMaW5lSm9pblR5cGUnLCAnc3Ryb2tlU3R5bGVMaW5lQWxpZ25tZW50JyxcclxuXHRcdCdzdHJva2VTdHlsZUJsZW5kTW9kZScsICdQbnRUJywgJ1N0eWwnLCAnbG9va3VwVHlwZScsICdMVVRGb3JtYXQnLCAnZGF0YU9yZGVyJyxcclxuXHRcdCd0YWJsZU9yZGVyJywgJ2VuYWJsZUNvbXBDb3JlJywgJ2VuYWJsZUNvbXBDb3JlR1BVJywgJ2NvbXBDb3JlU3VwcG9ydCcsICdjb21wQ29yZUdQVVN1cHBvcnQnLCAnRW5nbicsXHJcblx0XHQnZW5hYmxlQ29tcENvcmVUaHJlYWRzJywgJ2dzOTknLCAnRnJEcycsICd0cmFja0lEJywgJ2FuaW1JbnRlcnBTdHlsZScsXHJcblx0XSxcclxuXHQnYm9vbCc6IFtcclxuXHRcdCdQc3RTJywgJ3ByaW50U2l4dGVlbkJpdCcsICdtYXN0ZXJGWFN3aXRjaCcsICdlbmFiJywgJ3VnbGcnLCAnYW50aWFsaWFzR2xvc3MnLFxyXG5cdFx0J3VzZVNoYXBlJywgJ3VzZVRleHR1cmUnLCAndWdsZycsICdhbnRpYWxpYXNHbG9zcycsICd1c2VTaGFwZScsXHJcblx0XHQndXNlVGV4dHVyZScsICdBbGduJywgJ1J2cnMnLCAnRHRocicsICdJbnZyJywgJ1ZjdEMnLCAnU2hUcicsICdsYXllckNvbmNlYWxzJyxcclxuXHRcdCdzdHJva2VFbmFibGVkJywgJ2ZpbGxFbmFibGVkJywgJ3N0cm9rZVN0eWxlU2NhbGVMb2NrJywgJ3N0cm9rZVN0eWxlU3Ryb2tlQWRqdXN0JyxcclxuXHRcdCdoYXJkUHJvb2YnLCAnTXBCbCcsICdwYXBlcldoaXRlJywgJ3VzZUxlZ2FjeScsICdBdXRvJywgJ0xhYiAnLCAndXNlVGludCcsICdrZXlTaGFwZUludmFsaWRhdGVkJyxcclxuXHRcdCdhdXRvRXhwYW5kRW5hYmxlZCcsICdhdXRvTmVzdEVuYWJsZWQnLCAnYXV0b1Bvc2l0aW9uRW5hYmxlZCcsICdzaHJpbmt3cmFwT25TYXZlRW5hYmxlZCcsXHJcblx0XHQncHJlc2VudCcsICdzaG93SW5EaWFsb2cnLCAnb3ZlcnByaW50JywgJ3NoZWV0RGlzY2xvc2VkJywgJ2xpZ2h0c0Rpc2Nsb3NlZCcsICdtZXNoZXNEaXNjbG9zZWQnLFxyXG5cdFx0J21hdGVyaWFsc0Rpc2Nsb3NlZCcsICdoYXNNb3Rpb24nLCAnbXV0ZWQnLCAnRWZmYycsICdzZWxlY3RlZCcsICdhdXRvU2NvcGUnLCAnZmlsbENhbnZhcycsXHJcblx0XSxcclxuXHQnZG91Yic6IFtcclxuXHRcdCd3YXJwVmFsdWUnLCAnd2FycFBlcnNwZWN0aXZlJywgJ3dhcnBQZXJzcGVjdGl2ZU90aGVyJywgJ0ludHInLCAnV2R0aCcsICdIZ2h0JyxcclxuXHRcdCdzdHJva2VTdHlsZU1pdGVyTGltaXQnLCAnc3Ryb2tlU3R5bGVSZXNvbHV0aW9uJywgJ2xheWVyVGltZScsICdrZXlPcmlnaW5SZXNvbHV0aW9uJyxcclxuXHRcdCd4eCcsICd4eScsICd5eCcsICd5eScsICd0eCcsICd0eScsICdGckdBJywgJ2ZyYW1lUmF0ZScsICdhdWRpb0xldmVsJywgJ3JvdGF0aW9uJyxcclxuXHRdLFxyXG5cdCdVbnRGJzogW1xyXG5cdFx0J1NjbCAnLCAnc2R3TycsICdoZ2xPJywgJ2xhZ2wnLCAnTGFsZCcsICdzcmdSJywgJ2JsdXInLCAnU2Z0bicsICdPcGN0JywgJ0RzdG4nLCAnQW5nbCcsXHJcblx0XHQnQ2ttdCcsICdOb3NlJywgJ0lucHInLCAnU2hkTicsICdzdHJva2VTdHlsZUxpbmVXaWR0aCcsICdzdHJva2VTdHlsZUxpbmVEYXNoT2Zmc2V0JyxcclxuXHRcdCdzdHJva2VTdHlsZU9wYWNpdHknLCAnSCAgICcsICdUb3AgJywgJ0xlZnQnLCAnQnRvbScsICdSZ2h0JywgJ1JzbHQnLFxyXG5cdFx0J3RvcFJpZ2h0JywgJ3RvcExlZnQnLCAnYm90dG9tTGVmdCcsICdib3R0b21SaWdodCcsXHJcblx0XSxcclxuXHQnVmxMcyc6IFtcclxuXHRcdCdDcnYgJywgJ0NscnMnLCAnTW5tICcsICdNeG0gJywgJ1RybnMnLCAncGF0aExpc3QnLCAnc3Ryb2tlU3R5bGVMaW5lRGFzaFNldCcsICdGckxzJyxcclxuXHRcdCdMYVN0JywgJ1RybmYnLCAnbm9uQWZmaW5lVHJhbnNmb3JtJywgJ2tleURlc2NyaXB0b3JMaXN0JywgJ2d1aWRlSW5kZWNlcycsICdncmFkaWVudEZpbGxNdWx0aScsXHJcblx0XHQnc29saWRGaWxsTXVsdGknLCAnZnJhbWVGWE11bHRpJywgJ2lubmVyU2hhZG93TXVsdGknLCAnZHJvcFNoYWRvd011bHRpJywgJ0ZySW4nLCAnRlN0cycsICdGc0ZyJyxcclxuXHRcdCdzaGVldFRpbWVsaW5lT3B0aW9ucycsICdhdWRpb0NsaXBMaXN0JywgJ3RyYWNrTGlzdCcsICdnbG9iYWxUcmFja0xpc3QnLCAna2V5TGlzdCcsICdhdWRpb0NsaXBMaXN0JyxcclxuXHRdLFxyXG5cdCdPYkFyJzogWydtZXNoUG9pbnRzJywgJ3F1aWx0U2xpY2VYJywgJ3F1aWx0U2xpY2VZJ10sXHJcblx0J29iaiAnOiBbJ251bGwnXSxcclxufTtcclxuXHJcbmNvbnN0IGNoYW5uZWxzID0gW1xyXG5cdCdSZCAgJywgJ0dybiAnLCAnQmwgICcsICdZbGx3JywgJ1lsdyAnLCAnQ3luICcsICdNZ250JywgJ0JsY2snLCAnR3J5ICcsICdMbW5jJywgJ0EgICAnLCAnQiAgICcsXHJcbl07XHJcblxyXG5jb25zdCBmaWVsZFRvQXJyYXlUeXBlOiBEaWN0ID0ge1xyXG5cdCdNbm0gJzogJ2xvbmcnLFxyXG5cdCdNeG0gJzogJ2xvbmcnLFxyXG5cdCdGckxzJzogJ2xvbmcnLFxyXG5cdCdzdHJva2VTdHlsZUxpbmVEYXNoU2V0JzogJ1VudEYnLFxyXG5cdCdUcm5mJzogJ2RvdWInLFxyXG5cdCdub25BZmZpbmVUcmFuc2Zvcm0nOiAnZG91YicsXHJcblx0J2tleURlc2NyaXB0b3JMaXN0JzogJ09iamMnLFxyXG5cdCdncmFkaWVudEZpbGxNdWx0aSc6ICdPYmpjJyxcclxuXHQnc29saWRGaWxsTXVsdGknOiAnT2JqYycsXHJcblx0J2ZyYW1lRlhNdWx0aSc6ICdPYmpjJyxcclxuXHQnaW5uZXJTaGFkb3dNdWx0aSc6ICdPYmpjJyxcclxuXHQnZHJvcFNoYWRvd011bHRpJzogJ09iamMnLFxyXG5cdCdMYVN0JzogJ09iamMnLFxyXG5cdCdGckluJzogJ09iamMnLFxyXG5cdCdGU3RzJzogJ09iamMnLFxyXG5cdCdGc0ZyJzogJ2xvbmcnLFxyXG5cdCdibGVuZE9wdGlvbnMnOiAnT2JqYycsXHJcblx0J3NoZWV0VGltZWxpbmVPcHRpb25zJzogJ09iamMnLFxyXG5cdCdrZXlMaXN0JzogJ09iamMnLFxyXG59O1xyXG5cclxuY29uc3QgZmllbGRUb1R5cGU6IERpY3QgPSB7fTtcclxuXHJcbmZvciAoY29uc3QgdHlwZSBvZiBPYmplY3Qua2V5cyh0eXBlVG9GaWVsZCkpIHtcclxuXHRmb3IgKGNvbnN0IGZpZWxkIG9mIHR5cGVUb0ZpZWxkW3R5cGVdKSB7XHJcblx0XHRmaWVsZFRvVHlwZVtmaWVsZF0gPSB0eXBlO1xyXG5cdH1cclxufVxyXG5cclxuZm9yIChjb25zdCBmaWVsZCBvZiBPYmplY3Qua2V5cyhmaWVsZFRvRXh0VHlwZSkpIHtcclxuXHRpZiAoIWZpZWxkVG9UeXBlW2ZpZWxkXSkgZmllbGRUb1R5cGVbZmllbGRdID0gJ09iamMnO1xyXG59XHJcblxyXG5mb3IgKGNvbnN0IGZpZWxkIG9mIE9iamVjdC5rZXlzKGZpZWxkVG9BcnJheUV4dFR5cGUpKSB7XHJcblx0ZmllbGRUb0FycmF5VHlwZVtmaWVsZF0gPSAnT2JqYyc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFR5cGVCeUtleShrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgcm9vdDogc3RyaW5nLCBwYXJlbnQ6IGFueSkge1xyXG5cdGlmIChrZXkgPT09ICdTeiAgJykge1xyXG5cdFx0cmV0dXJuICgnV2R0aCcgaW4gdmFsdWUpID8gJ09iamMnIDogKCgndW5pdHMnIGluIHZhbHVlKSA/ICdVbnRGJyA6ICdkb3ViJyk7XHJcblx0fSBlbHNlIGlmIChrZXkgPT09ICdUeXBlJykge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyAnZW51bScgOiAnbG9uZyc7XHJcblx0fSBlbHNlIGlmIChrZXkgPT09ICdBbnRBJykge1xyXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyAnZW51bScgOiAnYm9vbCc7XHJcblx0fSBlbHNlIGlmICgoa2V5ID09PSAnSHJ6bicgfHwga2V5ID09PSAnVnJ0YycpICYmIHBhcmVudC5UeXBlID09PSAna2V5VHlwZS5Qc3RuJykge1xyXG5cdFx0cmV0dXJuICdsb25nJztcclxuXHR9IGVsc2UgaWYgKGtleSA9PT0gJ0hyem4nIHx8IGtleSA9PT0gJ1ZydGMnIHx8IGtleSA9PT0gJ1RvcCAnIHx8IGtleSA9PT0gJ0xlZnQnIHx8IGtleSA9PT0gJ0J0b20nIHx8IGtleSA9PT0gJ1JnaHQnKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/ICdkb3ViJyA6ICdVbnRGJztcclxuXHR9IGVsc2UgaWYgKGtleSA9PT0gJ1Zyc24nKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/ICdsb25nJyA6ICdPYmpjJztcclxuXHR9IGVsc2UgaWYgKGtleSA9PT0gJ1JkICAnIHx8IGtleSA9PT0gJ0dybiAnIHx8IGtleSA9PT0gJ0JsICAnKSB7XHJcblx0XHRyZXR1cm4gcm9vdCA9PT0gJ2FydGQnID8gJ2xvbmcnIDogJ2RvdWInO1xyXG5cdH0gZWxzZSBpZiAoa2V5ID09PSAnVHJuZicpIHtcclxuXHRcdHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/ICdWbExzJyA6ICdPYmpjJztcclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIGZpZWxkVG9UeXBlW2tleV07XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcjogUHNkUmVhZGVyKSB7XHJcblx0Y29uc3QgbGVuZ3RoID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0cmV0dXJuIHJlYWRBc2NpaVN0cmluZyhyZWFkZXIsIGxlbmd0aCB8fCA0KTtcclxufVxyXG5cclxuZnVuY3Rpb24gd3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXI6IFBzZFdyaXRlciwgdmFsdWU6IHN0cmluZykge1xyXG5cdGlmICh2YWx1ZS5sZW5ndGggPT09IDQgJiYgdmFsdWUgIT09ICd3YXJwJyAmJiB2YWx1ZSAhPT0gJ3RpbWUnICYmIHZhbHVlICE9PSAnaG9sZCcpIHtcclxuXHRcdC8vIHdyaXRlIGNsYXNzSWRcclxuXHRcdHdyaXRlSW50MzIod3JpdGVyLCAwKTtcclxuXHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgdmFsdWUpO1xyXG5cdH0gZWxzZSB7XHJcblx0XHQvLyB3cml0ZSBhc2NpaSBzdHJpbmdcclxuXHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZS5sZW5ndGgpO1xyXG5cclxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0d3JpdGVVaW50OCh3cml0ZXIsIHZhbHVlLmNoYXJDb2RlQXQoaSkpO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlYWREZXNjcmlwdG9yU3RydWN0dXJlKHJlYWRlcjogUHNkUmVhZGVyKSB7XHJcblx0Y29uc3Qgb2JqZWN0OiBhbnkgPSB7fTtcclxuXHQvLyBvYmplY3QuX19zdHJ1Y3QgPVxyXG5cdHJlYWRDbGFzc1N0cnVjdHVyZShyZWFkZXIpO1xyXG5cdGNvbnN0IGl0ZW1zQ291bnQgPSByZWFkVWludDMyKHJlYWRlcik7XHJcblx0Ly8gY29uc29sZS5sb2coJy8vJywgb2JqZWN0Ll9fc3RydWN0KTtcclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zQ291bnQ7IGkrKykge1xyXG5cdFx0Y29uc3Qga2V5ID0gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcik7XHJcblx0XHRjb25zdCB0eXBlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xyXG5cdFx0Ly8gY29uc29sZS5sb2coYD4gJyR7a2V5fScgJyR7dHlwZX0nYCk7XHJcblx0XHRjb25zdCBkYXRhID0gcmVhZE9TVHlwZShyZWFkZXIsIHR5cGUpO1xyXG5cdFx0Ly8gaWYgKCFnZXRUeXBlQnlLZXkoa2V5LCBkYXRhKSkgY29uc29sZS5sb2coYD4gJyR7a2V5fScgJyR7dHlwZX0nYCwgZGF0YSk7XHJcblx0XHRvYmplY3Rba2V5XSA9IGRhdGE7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gb2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVEZXNjcmlwdG9yU3RydWN0dXJlKHdyaXRlcjogUHNkV3JpdGVyLCBuYW1lOiBzdHJpbmcsIGNsYXNzSWQ6IHN0cmluZywgdmFsdWU6IGFueSwgcm9vdDogc3RyaW5nKSB7XHJcblx0aWYgKGxvZ0Vycm9ycyAmJiAhY2xhc3NJZCkgY29uc29sZS5sb2coJ01pc3NpbmcgY2xhc3NJZCBmb3I6ICcsIG5hbWUsIGNsYXNzSWQsIHZhbHVlKTtcclxuXHJcblx0Ly8gd3JpdGUgY2xhc3Mgc3RydWN0dXJlXHJcblx0d3JpdGVVbmljb2RlU3RyaW5nV2l0aFBhZGRpbmcod3JpdGVyLCBuYW1lKTtcclxuXHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgY2xhc3NJZCk7XHJcblxyXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XHJcblx0d3JpdGVVaW50MzIod3JpdGVyLCBrZXlzLmxlbmd0aCk7XHJcblxyXG5cdGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuXHRcdGxldCB0eXBlID0gZ2V0VHlwZUJ5S2V5KGtleSwgdmFsdWVba2V5XSwgcm9vdCwgdmFsdWUpO1xyXG5cdFx0bGV0IGV4dFR5cGUgPSBmaWVsZFRvRXh0VHlwZVtrZXldO1xyXG5cclxuXHRcdGlmIChrZXkgPT09ICdTY2wgJyAmJiAnSHJ6bicgaW4gdmFsdWVba2V5XSkge1xyXG5cdFx0XHR0eXBlID0gJ09iamMnO1xyXG5cdFx0XHRleHRUeXBlID0gbnVsbFR5cGU7XHJcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ2F1ZGlvQ2xpcEdyb3VwTGlzdCcgJiYga2V5cy5sZW5ndGggPT09IDEpIHtcclxuXHRcdFx0dHlwZSA9ICdWbExzJztcclxuXHRcdH0gZWxzZSBpZiAoKGtleSA9PT0gJ1N0cnQnIHx8IGtleSA9PT0gJ0JyZ2gnKSAmJiAnSCAgICcgaW4gdmFsdWUpIHtcclxuXHRcdFx0dHlwZSA9ICdkb3ViJztcclxuXHRcdH0gZWxzZSBpZiAoa2V5ID09PSAnU3RydCcpIHtcclxuXHRcdFx0dHlwZSA9ICdPYmpjJztcclxuXHRcdFx0ZXh0VHlwZSA9IG51bGxUeXBlO1xyXG5cdFx0fSBlbHNlIGlmIChjaGFubmVscy5pbmRleE9mKGtleSkgIT09IC0xKSB7XHJcblx0XHRcdHR5cGUgPSAoY2xhc3NJZCA9PT0gJ1JHQkMnICYmIHJvb3QgIT09ICdhcnRkJykgPyAnZG91YicgOiAnbG9uZyc7XHJcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3Byb2ZpbGUnKSB7XHJcblx0XHRcdHR5cGUgPSBjbGFzc0lkID09PSAncHJpbnRPdXRwdXQnID8gJ1RFWFQnIDogJ3RkdGEnO1xyXG5cdFx0fSBlbHNlIGlmIChrZXkgPT09ICdzdHJva2VTdHlsZUNvbnRlbnQnKSB7XHJcblx0XHRcdGlmICh2YWx1ZVtrZXldWydDbHIgJ10pIHtcclxuXHRcdFx0XHRleHRUeXBlID0gbWFrZVR5cGUoJycsICdzb2xpZENvbG9yTGF5ZXInKTtcclxuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZVtrZXldLkdyYWQpIHtcclxuXHRcdFx0XHRleHRUeXBlID0gbWFrZVR5cGUoJycsICdncmFkaWVudExheWVyJyk7XHJcblx0XHRcdH0gZWxzZSBpZiAodmFsdWVba2V5XS5QdHJuKSB7XHJcblx0XHRcdFx0ZXh0VHlwZSA9IG1ha2VUeXBlKCcnLCAncGF0dGVybkxheWVyJyk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bG9nRXJyb3JzICYmIGNvbnNvbGUubG9nKCdJbnZhbGlkIHN0cm9rZVN0eWxlQ29udGVudCB2YWx1ZScsIHZhbHVlW2tleV0pO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ2JvdW5kcycgJiYgcm9vdCA9PT0gJ3F1aWx0V2FycCcpIHtcclxuXHRcdFx0ZXh0VHlwZSA9IG1ha2VUeXBlKCcnLCAnY2xhc3NGbG9hdFJlY3QnKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoZXh0VHlwZSAmJiBleHRUeXBlLmNsYXNzSUQgPT09ICdSR0JDJykge1xyXG5cdFx0XHRpZiAoJ0ggICAnIGluIHZhbHVlW2tleV0pIGV4dFR5cGUgPSB7IGNsYXNzSUQ6ICdIU0JDJywgbmFtZTogJycgfTtcclxuXHRcdFx0Ly8gVE9ETzogb3RoZXIgY29sb3Igc3BhY2VzXHJcblx0XHR9XHJcblxyXG5cdFx0d3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXIsIGtleSk7XHJcblx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHR5cGUgfHwgJ2xvbmcnKTtcclxuXHRcdHdyaXRlT1NUeXBlKHdyaXRlciwgdHlwZSB8fCAnbG9uZycsIHZhbHVlW2tleV0sIGtleSwgZXh0VHlwZSwgcm9vdCk7XHJcblx0XHRpZiAobG9nRXJyb3JzICYmICF0eXBlKSBjb25zb2xlLmxvZyhgTWlzc2luZyBkZXNjcmlwdG9yIGZpZWxkIHR5cGUgZm9yOiAnJHtrZXl9JyBpbmAsIHZhbHVlKTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRPU1R5cGUocmVhZGVyOiBQc2RSZWFkZXIsIHR5cGU6IHN0cmluZykge1xyXG5cdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0Y2FzZSAnb2JqICc6IC8vIFJlZmVyZW5jZVxyXG5cdFx0XHRyZXR1cm4gcmVhZFJlZmVyZW5jZVN0cnVjdHVyZShyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnT2JqYyc6IC8vIERlc2NyaXB0b3JcclxuXHRcdGNhc2UgJ0dsYk8nOiAvLyBHbG9iYWxPYmplY3Qgc2FtZSBhcyBEZXNjcmlwdG9yXHJcblx0XHRcdHJldHVybiByZWFkRGVzY3JpcHRvclN0cnVjdHVyZShyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnVmxMcyc6IHsgLy8gTGlzdFxyXG5cdFx0XHRjb25zdCBsZW5ndGggPSByZWFkSW50MzIocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgaXRlbXM6IGFueVtdID0gW107XHJcblxyXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0Y29uc3QgdHlwZSA9IHJlYWRTaWduYXR1cmUocmVhZGVyKTtcclxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZygnICA+JywgdHlwZSk7XHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkT1NUeXBlKHJlYWRlciwgdHlwZSkpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gaXRlbXM7XHJcblx0XHR9XHJcblx0XHRjYXNlICdkb3ViJzogLy8gRG91YmxlXHJcblx0XHRcdHJldHVybiByZWFkRmxvYXQ2NChyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnVW50Ric6IHsgLy8gVW5pdCBkb3VibGVcclxuXHRcdFx0Y29uc3QgdW5pdHMgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IHZhbHVlID0gcmVhZEZsb2F0NjQocmVhZGVyKTtcclxuXHRcdFx0aWYgKCF1bml0c01hcFt1bml0c10pIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0czogJHt1bml0c31gKTtcclxuXHRcdFx0cmV0dXJuIHsgdW5pdHM6IHVuaXRzTWFwW3VuaXRzXSwgdmFsdWUgfTtcclxuXHRcdH1cclxuXHRcdGNhc2UgJ1VuRmwnOiB7IC8vIFVuaXQgZmxvYXRcclxuXHRcdFx0Y29uc3QgdW5pdHMgPSByZWFkU2lnbmF0dXJlKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IHZhbHVlID0gcmVhZEZsb2F0MzIocmVhZGVyKTtcclxuXHRcdFx0aWYgKCF1bml0c01hcFt1bml0c10pIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0czogJHt1bml0c31gKTtcclxuXHRcdFx0cmV0dXJuIHsgdW5pdHM6IHVuaXRzTWFwW3VuaXRzXSwgdmFsdWUgfTtcclxuXHRcdH1cclxuXHRcdGNhc2UgJ1RFWFQnOiAvLyBTdHJpbmdcclxuXHRcdFx0cmV0dXJuIHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcik7XHJcblx0XHRjYXNlICdlbnVtJzogeyAvLyBFbnVtZXJhdGVkXHJcblx0XHRcdGNvbnN0IHR5cGUgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgdmFsdWUgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdFx0cmV0dXJuIGAke3R5cGV9LiR7dmFsdWV9YDtcclxuXHRcdH1cclxuXHRcdGNhc2UgJ2xvbmcnOiAvLyBJbnRlZ2VyXHJcblx0XHRcdHJldHVybiByZWFkSW50MzIocmVhZGVyKTtcclxuXHRcdGNhc2UgJ2NvbXAnOiB7IC8vIExhcmdlIEludGVnZXJcclxuXHRcdFx0Y29uc3QgbG93ID0gcmVhZFVpbnQzMihyZWFkZXIpO1xyXG5cdFx0XHRjb25zdCBoaWdoID0gcmVhZFVpbnQzMihyZWFkZXIpO1xyXG5cdFx0XHRyZXR1cm4geyBsb3csIGhpZ2ggfTtcclxuXHRcdH1cclxuXHRcdGNhc2UgJ2Jvb2wnOiAvLyBCb29sZWFuXHJcblx0XHRcdHJldHVybiAhIXJlYWRVaW50OChyZWFkZXIpO1xyXG5cdFx0Y2FzZSAndHlwZSc6IC8vIENsYXNzXHJcblx0XHRjYXNlICdHbGJDJzogLy8gQ2xhc3NcclxuXHRcdFx0cmV0dXJuIHJlYWRDbGFzc1N0cnVjdHVyZShyZWFkZXIpO1xyXG5cdFx0Y2FzZSAnYWxpcyc6IHsgLy8gQWxpYXNcclxuXHRcdFx0Y29uc3QgbGVuZ3RoID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0XHRcdHJldHVybiByZWFkQXNjaWlTdHJpbmcocmVhZGVyLCBsZW5ndGgpO1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAndGR0YSc6IHsgLy8gUmF3IERhdGFcclxuXHRcdFx0Y29uc3QgbGVuZ3RoID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0XHRcdHJldHVybiByZWFkQnl0ZXMocmVhZGVyLCBsZW5ndGgpO1xyXG5cdFx0fVxyXG5cdFx0Y2FzZSAnT2JBcic6IHsgLy8gT2JqZWN0IGFycmF5XHJcblx0XHRcdHJlYWRJbnQzMihyZWFkZXIpOyAvLyB2ZXJzaW9uOiAxNlxyXG5cdFx0XHRyZWFkVW5pY29kZVN0cmluZyhyZWFkZXIpOyAvLyBuYW1lOiAnJ1xyXG5cdFx0XHRyZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTsgLy8gJ3JhdGlvbmFsUG9pbnQnXHJcblx0XHRcdGNvbnN0IGxlbmd0aCA9IHJlYWRJbnQzMihyZWFkZXIpO1xyXG5cdFx0XHRjb25zdCBpdGVtczogYW55W10gPSBbXTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRjb25zdCB0eXBlMSA9IHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpOyAvLyB0eXBlIEhyem4gfCBWcnRjXHJcblx0XHRcdFx0cmVhZFNpZ25hdHVyZShyZWFkZXIpOyAvLyBVbkZsXHJcblxyXG5cdFx0XHRcdHJlYWRTaWduYXR1cmUocmVhZGVyKTsgLy8gdW5pdHMgPyAnI1B4bCdcclxuXHRcdFx0XHRjb25zdCB2YWx1ZXNDb3VudCA9IHJlYWRJbnQzMihyZWFkZXIpO1xyXG5cdFx0XHRcdGNvbnN0IHZhbHVlczogbnVtYmVyW10gPSBbXTtcclxuXHRcdFx0XHRmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlc0NvdW50OyBqKyspIHtcclxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKHJlYWRGbG9hdDY0KHJlYWRlcikpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aXRlbXMucHVzaCh7IHR5cGU6IHR5cGUxLCB2YWx1ZXMgfSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBpdGVtcztcclxuXHRcdH1cclxuXHRcdGNhc2UgJ1B0aCAnOiB7IC8vIEZpbGUgcGF0aFxyXG5cdFx0XHQvKmNvbnN0IGxlbmd0aCA9Ki8gcmVhZEludDMyKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IHNpZyA9IHJlYWRTaWduYXR1cmUocmVhZGVyKTtcclxuXHRcdFx0Lypjb25zdCBwYXRoU2l6ZSA9Ki8gcmVhZEludDMyTEUocmVhZGVyKTtcclxuXHRcdFx0Y29uc3QgY2hhcnNDb3VudCA9IHJlYWRJbnQzMkxFKHJlYWRlcik7XHJcblx0XHRcdGNvbnN0IHBhdGggPSByZWFkVW5pY29kZVN0cmluZ1dpdGhMZW5ndGgocmVhZGVyLCBjaGFyc0NvdW50KTtcclxuXHRcdFx0cmV0dXJuIHsgc2lnLCBwYXRoIH07XHJcblx0XHR9XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgVHlTaCBkZXNjcmlwdG9yIE9TVHlwZTogJHt0eXBlfSBhdCAke3JlYWRlci5vZmZzZXQudG9TdHJpbmcoMTYpfWApO1xyXG5cdH1cclxufVxyXG5cclxuY29uc3QgT2JBclR5cGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZDsgfSA9IHtcclxuXHRtZXNoUG9pbnRzOiAncmF0aW9uYWxQb2ludCcsXHJcblx0cXVpbHRTbGljZVg6ICdVbnRGJyxcclxuXHRxdWlsdFNsaWNlWTogJ1VudEYnLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gd3JpdGVPU1R5cGUod3JpdGVyOiBQc2RXcml0ZXIsIHR5cGU6IHN0cmluZywgdmFsdWU6IGFueSwga2V5OiBzdHJpbmcsIGV4dFR5cGU6IE5hbWVDbGFzc0lEIHwgdW5kZWZpbmVkLCByb290OiBzdHJpbmcpIHtcclxuXHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdGNhc2UgJ29iaiAnOiAvLyBSZWZlcmVuY2VcclxuXHRcdFx0d3JpdGVSZWZlcmVuY2VTdHJ1Y3R1cmUod3JpdGVyLCBrZXksIHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdPYmpjJzogLy8gRGVzY3JpcHRvclxyXG5cdFx0Y2FzZSAnR2xiTyc6IC8vIEdsb2JhbE9iamVjdCBzYW1lIGFzIERlc2NyaXB0b3JcclxuXHRcdFx0aWYgKCFleHRUeXBlKSB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZXh0IHR5cGUgZm9yOiAnJHtrZXl9JyAoJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9KWApO1xyXG5cdFx0XHR3cml0ZURlc2NyaXB0b3JTdHJ1Y3R1cmUod3JpdGVyLCBleHRUeXBlLm5hbWUsIGV4dFR5cGUuY2xhc3NJRCwgdmFsdWUsIHJvb3QpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ1ZsTHMnOiAvLyBMaXN0XHJcblx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZS5sZW5ndGgpO1xyXG5cclxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGNvbnN0IHR5cGUgPSBmaWVsZFRvQXJyYXlUeXBlW2tleV07XHJcblx0XHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCB0eXBlIHx8ICdsb25nJyk7XHJcblx0XHRcdFx0d3JpdGVPU1R5cGUod3JpdGVyLCB0eXBlIHx8ICdsb25nJywgdmFsdWVbaV0sICcnLCBmaWVsZFRvQXJyYXlFeHRUeXBlW2tleV0sIHJvb3QpO1xyXG5cdFx0XHRcdGlmIChsb2dFcnJvcnMgJiYgIXR5cGUpIGNvbnNvbGUubG9nKGBNaXNzaW5nIGRlc2NyaXB0b3IgYXJyYXkgdHlwZSBmb3I6ICcke2tleX0nIGluYCwgdmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnZG91Yic6IC8vIERvdWJsZVxyXG5cdFx0XHR3cml0ZUZsb2F0NjQod3JpdGVyLCB2YWx1ZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnVW50Ric6IC8vIFVuaXQgZG91YmxlXHJcblx0XHRcdGlmICghdW5pdHNNYXBSZXZbdmFsdWUudW5pdHNdKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7dmFsdWUudW5pdHN9IGluICR7a2V5fWApO1xyXG5cdFx0XHR3cml0ZVNpZ25hdHVyZSh3cml0ZXIsIHVuaXRzTWFwUmV2W3ZhbHVlLnVuaXRzXSk7XHJcblx0XHRcdHdyaXRlRmxvYXQ2NCh3cml0ZXIsIHZhbHVlLnZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdVbkZsJzogLy8gVW5pdCBmbG9hdFxyXG5cdFx0XHRpZiAoIXVuaXRzTWFwUmV2W3ZhbHVlLnVuaXRzXSkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke3ZhbHVlLnVuaXRzfSBpbiAke2tleX1gKTtcclxuXHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCB1bml0c01hcFJldlt2YWx1ZS51bml0c10pO1xyXG5cdFx0XHR3cml0ZUZsb2F0MzIod3JpdGVyLCB2YWx1ZS52YWx1ZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnVEVYVCc6IC8vIFN0cmluZ1xyXG5cdFx0XHR3cml0ZVVuaWNvZGVTdHJpbmdXaXRoUGFkZGluZyh3cml0ZXIsIHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdlbnVtJzogeyAvLyBFbnVtZXJhdGVkXHJcblx0XHRcdGNvbnN0IFtfdHlwZSwgdmFsXSA9IHZhbHVlLnNwbGl0KCcuJyk7XHJcblx0XHRcdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCBfdHlwZSk7XHJcblx0XHRcdHdyaXRlQXNjaWlTdHJpbmdPckNsYXNzSWQod3JpdGVyLCB2YWwpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHRcdGNhc2UgJ2xvbmcnOiAvLyBJbnRlZ2VyXHJcblx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Ly8gY2FzZSAnY29tcCc6IC8vIExhcmdlIEludGVnZXJcclxuXHRcdC8vIFx0d3JpdGVMYXJnZUludGVnZXIocmVhZGVyKTtcclxuXHRcdGNhc2UgJ2Jvb2wnOiAvLyBCb29sZWFuXHJcblx0XHRcdHdyaXRlVWludDgod3JpdGVyLCB2YWx1ZSA/IDEgOiAwKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHQvLyBjYXNlICd0eXBlJzogLy8gQ2xhc3NcclxuXHRcdC8vIGNhc2UgJ0dsYkMnOiAvLyBDbGFzc1xyXG5cdFx0Ly8gXHR3cml0ZUNsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHQvLyBjYXNlICdhbGlzJzogLy8gQWxpYXNcclxuXHRcdC8vIFx0d3JpdGVBbGlhc1N0cnVjdHVyZShyZWFkZXIpO1xyXG5cdFx0Y2FzZSAndGR0YSc6IC8vIFJhdyBEYXRhXHJcblx0XHRcdHdyaXRlSW50MzIod3JpdGVyLCB2YWx1ZS5ieXRlTGVuZ3RoKTtcclxuXHRcdFx0d3JpdGVCeXRlcyh3cml0ZXIsIHZhbHVlKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdPYkFyJzogeyAvLyBPYmplY3QgYXJyYXlcclxuXHRcdFx0d3JpdGVJbnQzMih3cml0ZXIsIDE2KTsgLy8gdmVyc2lvblxyXG5cdFx0XHR3cml0ZVVuaWNvZGVTdHJpbmdXaXRoUGFkZGluZyh3cml0ZXIsICcnKTsgLy8gbmFtZVxyXG5cdFx0XHRjb25zdCB0eXBlID0gT2JBclR5cGVzW2tleV07XHJcblx0XHRcdGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgT2JBclR5cGUgZm9yOiAke2tleX1gKTtcclxuXHRcdFx0d3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXIsIHR5cGUpO1xyXG5cdFx0XHR3cml0ZUludDMyKHdyaXRlciwgdmFsdWUubGVuZ3RoKTtcclxuXHJcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgdmFsdWVbaV0udHlwZSk7IC8vIEhyem4gfCBWcnRjXHJcblx0XHRcdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCAnVW5GbCcpO1xyXG5cdFx0XHRcdHdyaXRlU2lnbmF0dXJlKHdyaXRlciwgJyNQeGwnKTtcclxuXHRcdFx0XHR3cml0ZUludDMyKHdyaXRlciwgdmFsdWVbaV0udmFsdWVzLmxlbmd0aCk7XHJcblxyXG5cdFx0XHRcdGZvciAobGV0IGogPSAwOyBqIDwgdmFsdWVbaV0udmFsdWVzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHR3cml0ZUZsb2F0NjQod3JpdGVyLCB2YWx1ZVtpXS52YWx1ZXNbal0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHRcdC8vIGNhc2UgJ1B0aCAnOiAvLyBGaWxlIHBhdGhcclxuXHRcdC8vIFx0d3JpdGVGaWxlUGF0aChyZWFkZXIpO1xyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBOb3QgaW1wbGVtZW50ZWQgZGVzY3JpcHRvciBPU1R5cGU6ICR7dHlwZX1gKTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlYWRSZWZlcmVuY2VTdHJ1Y3R1cmUocmVhZGVyOiBQc2RSZWFkZXIpIHtcclxuXHRjb25zdCBpdGVtc0NvdW50ID0gcmVhZEludDMyKHJlYWRlcik7XHJcblx0Y29uc3QgaXRlbXM6IGFueVtdID0gW107XHJcblxyXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNDb3VudDsgaSsrKSB7XHJcblx0XHRjb25zdCB0eXBlID0gcmVhZFNpZ25hdHVyZShyZWFkZXIpO1xyXG5cclxuXHRcdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0XHRjYXNlICdwcm9wJzogeyAvLyBQcm9wZXJ0eVxyXG5cdFx0XHRcdHJlYWRDbGFzc1N0cnVjdHVyZShyZWFkZXIpO1xyXG5cdFx0XHRcdGNvbnN0IGtleUlEID0gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcik7XHJcblx0XHRcdFx0aXRlbXMucHVzaChrZXlJRCk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAnQ2xzcyc6IC8vIENsYXNzXHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkQ2xhc3NTdHJ1Y3R1cmUocmVhZGVyKSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ0VubXInOiB7IC8vIEVudW1lcmF0ZWQgUmVmZXJlbmNlXHJcblx0XHRcdFx0cmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRcdFx0Y29uc3QgdHlwZUlEID0gcmVhZEFzY2lpU3RyaW5nT3JDbGFzc0lkKHJlYWRlcik7XHJcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSByZWFkQXNjaWlTdHJpbmdPckNsYXNzSWQocmVhZGVyKTtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKGAke3R5cGVJRH0uJHt2YWx1ZX1gKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRjYXNlICdyZWxlJzogeyAvLyBPZmZzZXRcclxuXHRcdFx0XHQvLyBjb25zdCB7IG5hbWUsIGNsYXNzSUQgfSA9XHJcblx0XHRcdFx0cmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkVWludDMyKHJlYWRlcikpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ0lkbnQnOiAvLyBJZGVudGlmaWVyXHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkSW50MzIocmVhZGVyKSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2luZHgnOiAvLyBJbmRleFxyXG5cdFx0XHRcdGl0ZW1zLnB1c2gocmVhZEludDMyKHJlYWRlcikpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICduYW1lJzogeyAvLyBOYW1lXHJcblx0XHRcdFx0cmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcik7XHJcblx0XHRcdFx0aXRlbXMucHVzaChyZWFkVW5pY29kZVN0cmluZyhyZWFkZXIpKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXNjcmlwdG9yIHJlZmVyZW5jZSB0eXBlOiAke3R5cGV9YCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gaXRlbXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlUmVmZXJlbmNlU3RydWN0dXJlKHdyaXRlcjogUHNkV3JpdGVyLCBfa2V5OiBzdHJpbmcsIGl0ZW1zOiBhbnlbXSkge1xyXG5cdHdyaXRlSW50MzIod3JpdGVyLCBpdGVtcy5sZW5ndGgpO1xyXG5cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjb25zdCB2YWx1ZSA9IGl0ZW1zW2ldO1xyXG5cdFx0bGV0IHR5cGUgPSAndW5rbm93bic7XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0aWYgKC9eW2Etel0rXFwuW2Etel0rJC9pLnRlc3QodmFsdWUpKSB7XHJcblx0XHRcdFx0dHlwZSA9ICdFbm1yJztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0eXBlID0gJ25hbWUnO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0d3JpdGVTaWduYXR1cmUod3JpdGVyLCB0eXBlKTtcclxuXHJcblx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0Ly8gY2FzZSAncHJvcCc6IC8vIFByb3BlcnR5XHJcblx0XHRcdC8vIGNhc2UgJ0Nsc3MnOiAvLyBDbGFzc1xyXG5cdFx0XHRjYXNlICdFbm1yJzogeyAvLyBFbnVtZXJhdGVkIFJlZmVyZW5jZVxyXG5cdFx0XHRcdGNvbnN0IFt0eXBlSUQsIGVudW1WYWx1ZV0gPSB2YWx1ZS5zcGxpdCgnLicpO1xyXG5cdFx0XHRcdHdyaXRlQ2xhc3NTdHJ1Y3R1cmUod3JpdGVyLCAnXFwwJywgdHlwZUlEKTtcclxuXHRcdFx0XHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgdHlwZUlEKTtcclxuXHRcdFx0XHR3cml0ZUFzY2lpU3RyaW5nT3JDbGFzc0lkKHdyaXRlciwgZW51bVZhbHVlKTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBjYXNlICdyZWxlJzogLy8gT2Zmc2V0XHJcblx0XHRcdC8vIGNhc2UgJ0lkbnQnOiAvLyBJZGVudGlmaWVyXHJcblx0XHRcdC8vIGNhc2UgJ2luZHgnOiAvLyBJbmRleFxyXG5cdFx0XHRjYXNlICduYW1lJzogeyAvLyBOYW1lXHJcblx0XHRcdFx0d3JpdGVDbGFzc1N0cnVjdHVyZSh3cml0ZXIsICdcXDAnLCAnTHlyICcpO1xyXG5cdFx0XHRcdHdyaXRlVW5pY29kZVN0cmluZyh3cml0ZXIsIHZhbHVlICsgJ1xcMCcpO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRlc2NyaXB0b3IgcmVmZXJlbmNlIHR5cGU6ICR7dHlwZX1gKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBpdGVtcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVhZENsYXNzU3RydWN0dXJlKHJlYWRlcjogUHNkUmVhZGVyKSB7XHJcblx0Y29uc3QgbmFtZSA9IHJlYWRVbmljb2RlU3RyaW5nKHJlYWRlcik7XHJcblx0Y29uc3QgY2xhc3NJRCA9IHJlYWRBc2NpaVN0cmluZ09yQ2xhc3NJZChyZWFkZXIpO1xyXG5cdC8vIGNvbnNvbGUubG9nKHsgbmFtZSwgY2xhc3NJRCB9KTtcclxuXHRyZXR1cm4geyBuYW1lLCBjbGFzc0lEIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdyaXRlQ2xhc3NTdHJ1Y3R1cmUod3JpdGVyOiBQc2RXcml0ZXIsIG5hbWU6IHN0cmluZywgY2xhc3NJRDogc3RyaW5nKSB7XHJcblx0d3JpdGVVbmljb2RlU3RyaW5nKHdyaXRlciwgbmFtZSk7XHJcblx0d3JpdGVBc2NpaVN0cmluZ09yQ2xhc3NJZCh3cml0ZXIsIGNsYXNzSUQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVhZFZlcnNpb25BbmREZXNjcmlwdG9yKHJlYWRlcjogUHNkUmVhZGVyKSB7XHJcblx0Y29uc3QgdmVyc2lvbiA9IHJlYWRVaW50MzIocmVhZGVyKTtcclxuXHRpZiAodmVyc2lvbiAhPT0gMTYpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXNjcmlwdG9yIHZlcnNpb246ICR7dmVyc2lvbn1gKTtcclxuXHRjb25zdCBkZXNjID0gcmVhZERlc2NyaXB0b3JTdHJ1Y3R1cmUocmVhZGVyKTtcclxuXHQvLyBjb25zb2xlLmxvZyhyZXF1aXJlKCd1dGlsJykuaW5zcGVjdChkZXNjLCBmYWxzZSwgOTksIHRydWUpKTtcclxuXHRyZXR1cm4gZGVzYztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlVmVyc2lvbkFuZERlc2NyaXB0b3Iod3JpdGVyOiBQc2RXcml0ZXIsIG5hbWU6IHN0cmluZywgY2xhc3NJRDogc3RyaW5nLCBkZXNjcmlwdG9yOiBhbnksIHJvb3QgPSAnJykge1xyXG5cdHdyaXRlVWludDMyKHdyaXRlciwgMTYpOyAvLyB2ZXJzaW9uXHJcblx0d3JpdGVEZXNjcmlwdG9yU3RydWN0dXJlKHdyaXRlciwgbmFtZSwgY2xhc3NJRCwgZGVzY3JpcHRvciwgcm9vdCk7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIERlc2NyaXB0b3JVbml0cyA9ICdBbmdsZScgfCAnRGVuc2l0eScgfCAnRGlzdGFuY2UnIHwgJ05vbmUnIHwgJ1BlcmNlbnQnIHwgJ1BpeGVscycgfFxyXG5cdCdNaWxsaW1ldGVycycgfCAnUG9pbnRzJyB8ICdQaWNhcycgfCAnSW5jaGVzJyB8ICdDZW50aW1ldGVycyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JVbml0c1ZhbHVlIHtcclxuXHR1bml0czogRGVzY3JpcHRvclVuaXRzO1xyXG5cdHZhbHVlOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIERlc2NyaXB0b3JDb2xvciA9IHtcclxuXHQnUmQgICc6IG51bWJlcjtcclxuXHQnR3JuICc6IG51bWJlcjtcclxuXHQnQmwgICc6IG51bWJlcjtcclxufSB8IHtcclxuXHQnSCAgICc6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdFN0cnQ6IG51bWJlcjtcclxuXHRCcmdoOiBudW1iZXI7XHJcbn0gfCB7XHJcblx0J0N5biAnOiBudW1iZXI7XHJcblx0TWdudDogbnVtYmVyO1xyXG5cdCdZbHcgJzogbnVtYmVyO1xyXG5cdEJsY2s6IG51bWJlcjtcclxufSB8IHtcclxuXHQnR3J5ICc6IG51bWJlcjtcclxufSB8IHtcclxuXHRMbW5jOiBudW1iZXI7XHJcblx0J0EgICAnOiBudW1iZXI7XHJcblx0J0IgICAnOiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERlc2NpcHRvclBhdHRlcm4ge1xyXG5cdCdObSAgJzogc3RyaW5nO1xyXG5cdElkbnQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgRGVzY2lwdG9yR3JhZGllbnQgPSB7XHJcblx0J05tICAnOiBzdHJpbmc7XHJcblx0R3JkRjogJ0dyZEYuQ3N0Uyc7XHJcblx0SW50cjogbnVtYmVyO1xyXG5cdENscnM6IHtcclxuXHRcdCdDbHIgJzogRGVzY3JpcHRvckNvbG9yO1xyXG5cdFx0VHlwZTogJ0NscnkuVXNyUyc7XHJcblx0XHRMY3RuOiBudW1iZXI7XHJcblx0XHRNZHBuOiBudW1iZXI7XHJcblx0fVtdO1xyXG5cdFRybnM6IHtcclxuXHRcdE9wY3Q6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdFx0TGN0bjogbnVtYmVyO1xyXG5cdFx0TWRwbjogbnVtYmVyO1xyXG5cdH1bXTtcclxufSB8IHtcclxuXHRHcmRGOiAnR3JkRi5DbE5zJztcclxuXHRTbXRoOiBudW1iZXI7XHJcblx0J05tICAnOiBzdHJpbmc7XHJcblx0Q2xyUzogc3RyaW5nO1xyXG5cdFJuZFM6IG51bWJlcjtcclxuXHRWY3RDPzogYm9vbGVhbjtcclxuXHRTaFRyPzogYm9vbGVhbjtcclxuXHQnTW5tICc6IG51bWJlcltdO1xyXG5cdCdNeG0gJzogbnVtYmVyW107XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JDb2xvckNvbnRlbnQge1xyXG5cdCdDbHIgJzogRGVzY3JpcHRvckNvbG9yO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JHcmFkaWVudENvbnRlbnQge1xyXG5cdEdyYWQ6IERlc2NpcHRvckdyYWRpZW50O1xyXG5cdFR5cGU6IHN0cmluZztcclxuXHREdGhyPzogYm9vbGVhbjtcclxuXHRSdnJzPzogYm9vbGVhbjtcclxuXHRBbmdsPzogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0J1NjbCAnPzogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0QWxnbj86IGJvb2xlYW47XHJcblx0T2ZzdD86IHsgSHJ6bjogRGVzY3JpcHRvclVuaXRzVmFsdWU7IFZydGM6IERlc2NyaXB0b3JVbml0c1ZhbHVlOyB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERlc2NyaXB0b3JQYXR0ZXJuQ29udGVudCB7XHJcblx0UHRybjogRGVzY2lwdG9yUGF0dGVybjtcclxuXHRMbmtkPzogYm9vbGVhbjtcclxuXHRwaGFzZT86IHsgSHJ6bjogbnVtYmVyOyBWcnRjOiBudW1iZXI7IH07XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIERlc2NyaXB0b3JWZWN0b3JDb250ZW50ID0gRGVzY3JpcHRvckNvbG9yQ29udGVudCB8IERlc2NyaXB0b3JHcmFkaWVudENvbnRlbnQgfCBEZXNjcmlwdG9yUGF0dGVybkNvbnRlbnQ7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFN0cm9rZURlc2NyaXB0b3Ige1xyXG5cdHN0cm9rZVN0eWxlVmVyc2lvbjogbnVtYmVyO1xyXG5cdHN0cm9rZUVuYWJsZWQ6IGJvb2xlYW47XHJcblx0ZmlsbEVuYWJsZWQ6IGJvb2xlYW47XHJcblx0c3Ryb2tlU3R5bGVMaW5lV2lkdGg6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdHN0cm9rZVN0eWxlTGluZURhc2hPZmZzZXQ6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdHN0cm9rZVN0eWxlTWl0ZXJMaW1pdDogbnVtYmVyO1xyXG5cdHN0cm9rZVN0eWxlTGluZUNhcFR5cGU6IHN0cmluZztcclxuXHRzdHJva2VTdHlsZUxpbmVKb2luVHlwZTogc3RyaW5nO1xyXG5cdHN0cm9rZVN0eWxlTGluZUFsaWdubWVudDogc3RyaW5nO1xyXG5cdHN0cm9rZVN0eWxlU2NhbGVMb2NrOiBib29sZWFuO1xyXG5cdHN0cm9rZVN0eWxlU3Ryb2tlQWRqdXN0OiBib29sZWFuO1xyXG5cdHN0cm9rZVN0eWxlTGluZURhc2hTZXQ6IERlc2NyaXB0b3JVbml0c1ZhbHVlW107XHJcblx0c3Ryb2tlU3R5bGVCbGVuZE1vZGU6IHN0cmluZztcclxuXHRzdHJva2VTdHlsZU9wYWNpdHk6IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdHN0cm9rZVN0eWxlQ29udGVudDogRGVzY3JpcHRvclZlY3RvckNvbnRlbnQ7XHJcblx0c3Ryb2tlU3R5bGVSZXNvbHV0aW9uOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGV4dERlc2NyaXB0b3Ige1xyXG5cdCdUeHQgJzogc3RyaW5nO1xyXG5cdHRleHRHcmlkZGluZzogc3RyaW5nO1xyXG5cdE9ybnQ6IHN0cmluZztcclxuXHRBbnRBOiBzdHJpbmc7XHJcblx0VGV4dEluZGV4OiBudW1iZXI7XHJcblx0RW5naW5lRGF0YT86IFVpbnQ4QXJyYXk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2FycERlc2NyaXB0b3Ige1xyXG5cdHdhcnBTdHlsZTogc3RyaW5nO1xyXG5cdHdhcnBWYWx1ZTogbnVtYmVyO1xyXG5cdHdhcnBQZXJzcGVjdGl2ZTogbnVtYmVyO1xyXG5cdHdhcnBQZXJzcGVjdGl2ZU90aGVyOiBudW1iZXI7XHJcblx0d2FycFJvdGF0ZTogc3RyaW5nO1xyXG5cdGJvdW5kcz86IHtcclxuXHRcdCdUb3AgJzogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0XHRMZWZ0OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHRcdEJ0b206IERlc2NyaXB0b3JVbml0c1ZhbHVlO1xyXG5cdFx0UmdodDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcblx0fTtcclxuXHR1T3JkZXI6IG51bWJlcjtcclxuXHR2T3JkZXI6IG51bWJlcjtcclxuXHRjdXN0b21FbnZlbG9wZVdhcnA/OiB7XHJcblx0XHRtZXNoUG9pbnRzOiB7XHJcblx0XHRcdHR5cGU6ICdIcnpuJyB8ICdWcnRjJztcclxuXHRcdFx0dmFsdWVzOiBudW1iZXJbXTtcclxuXHRcdH1bXTtcclxuXHR9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFF1aWx0V2FycERlc2NyaXB0b3IgZXh0ZW5kcyBXYXJwRGVzY3JpcHRvciB7XHJcblx0ZGVmb3JtTnVtUm93czogbnVtYmVyO1xyXG5cdGRlZm9ybU51bUNvbHM6IG51bWJlcjtcclxuXHRjdXN0b21FbnZlbG9wZVdhcnA6IHtcclxuXHRcdHF1aWx0U2xpY2VYOiB7XHJcblx0XHRcdHR5cGU6ICdxdWlsdFNsaWNlWCc7XHJcblx0XHRcdHZhbHVlczogbnVtYmVyW107XHJcblx0XHR9W107XHJcblx0XHRxdWlsdFNsaWNlWToge1xyXG5cdFx0XHR0eXBlOiAncXVpbHRTbGljZVknO1xyXG5cdFx0XHR2YWx1ZXM6IG51bWJlcltdO1xyXG5cdFx0fVtdO1xyXG5cdFx0bWVzaFBvaW50czoge1xyXG5cdFx0XHR0eXBlOiAnSHJ6bicgfCAnVnJ0Yyc7XHJcblx0XHRcdHZhbHVlczogbnVtYmVyW107XHJcblx0XHR9W107XHJcblx0fTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGcmFjdGlvbkRlc2NyaXB0b3Ige1xyXG5cdG51bWVyYXRvcjogbnVtYmVyO1xyXG5cdGRlbm9taW5hdG9yOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSHJ6blZydGNEZXNjcmlwdG9yIHtcclxuXHRIcnpuOiBudW1iZXI7XHJcblx0VnJ0YzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZyYW1lRGVzY3JpcHRvciB7XHJcblx0RnJMczogbnVtYmVyW107XHJcblx0ZW5hYj86IGJvb2xlYW47XHJcblx0SU1zaz86IHsgT2ZzdDogSHJ6blZydGNEZXNjcmlwdG9yIH07XHJcblx0Vk1zaz86IHsgT2ZzdDogSHJ6blZydGNEZXNjcmlwdG9yIH07XHJcblx0T2ZzdD86IEhyem5WcnRjRGVzY3JpcHRvcjtcclxuXHRGWFJmPzogSHJ6blZydGNEZXNjcmlwdG9yO1xyXG5cdExlZng/OiBMZngyRGVzY3JpcHRvcjtcclxuXHRibGVuZE9wdGlvbnM/OiB7IE9wY3Q6IERlc2NyaXB0b3JVbml0c1ZhbHVlOyB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZyYW1lTGlzdERlc2NyaXB0b3Ige1xyXG5cdExhSUQ6IG51bWJlcjsgLy8gbGF5ZXIgSURcclxuXHRMYVN0OiBGcmFtZURlc2NyaXB0b3JbXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGhvcnpWcnRjVG9YWShodjogSHJ6blZydGNEZXNjcmlwdG9yKTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB7XHJcblx0cmV0dXJuIHsgeDogaHYuSHJ6biwgeTogaHYuVnJ0YyB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24geHlUb0hvcnpWcnRjKHh5OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9KTogSHJ6blZydGNEZXNjcmlwdG9yIHtcclxuXHRyZXR1cm4geyBIcnpuOiB4eS54LCBWcnRjOiB4eS55IH07XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIFRpbWVsaW5lQW5pbUtleURlc2NyaXB0b3IgPSB7XHJcblx0VHlwZTogJ2tleVR5cGUuT3BjdCc7XHJcblx0T3BjdDogRGVzY3JpcHRvclVuaXRzVmFsdWU7XHJcbn0gfCB7XHJcblx0VHlwZTogJ2tleVR5cGUuVHJuZic7XHJcblx0J1NjbCAnOiBIcnpuVnJ0Y0Rlc2NyaXB0b3I7XHJcblx0U2tldzogSHJ6blZydGNEZXNjcmlwdG9yO1xyXG5cdHJvdGF0aW9uOiBudW1iZXI7XHJcblx0dHJhbnNsYXRpb246IEhyem5WcnRjRGVzY3JpcHRvcjtcclxufSB8IHtcclxuXHRUeXBlOiAna2V5VHlwZS5Qc3RuJztcclxuXHRIcnpuOiBudW1iZXI7XHJcblx0VnJ0YzogbnVtYmVyO1xyXG59IHwge1xyXG5cdFR5cGU6ICdrZXlUeXBlLnNoZWV0U3R5bGUnO1xyXG5cdHNoZWV0U3R5bGU6IHtcclxuXHRcdFZyc246IG51bWJlcjtcclxuXHRcdExlZng/OiBMZngyRGVzY3JpcHRvcjtcclxuXHRcdGJsZW5kT3B0aW9uczoge307XHJcblx0fTtcclxufSB8IHtcclxuXHRUeXBlOiAna2V5VHlwZS5nbG9iYWxMaWdodGluZyc7XHJcblx0Z2JsQTogbnVtYmVyO1xyXG5cdGdsb2JhbEFsdGl0dWRlOiBudW1iZXI7XHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lS2V5RGVzY3JpcHRvciB7XHJcblx0VnJzbjogMTtcclxuXHRhbmltSW50ZXJwU3R5bGU6ICdhbmltSW50ZXJwU3R5bGUuTG5yICcgfCAnYW5pbUludGVycFN0eWxlLmhvbGQnO1xyXG5cdHRpbWU6IEZyYWN0aW9uRGVzY3JpcHRvcjtcclxuXHRhbmltS2V5OiBUaW1lbGluZUFuaW1LZXlEZXNjcmlwdG9yO1xyXG5cdHNlbGVjdGVkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVsaW5lVHJhY2tEZXNjcmlwdG9yIHtcclxuXHR0cmFja0lEOiAnc3RkVHJhY2tJRC5nbG9iYWxMaWdodGluZ1RyYWNrJyB8ICdzdGRUcmFja0lELm9wYWNpdHlUcmFjaycgfCAnc3RkVHJhY2tJRC5zdHlsZVRyYWNrJyB8ICdzdGRUcmFja0lELnNoZWV0VHJhbnNmb3JtVHJhY2snIHwgJ3N0ZFRyYWNrSUQuc2hlZXRQb3NpdGlvblRyYWNrJztcclxuXHRWcnNuOiAxO1xyXG5cdGVuYWI6IGJvb2xlYW47XHJcblx0RWZmYzogYm9vbGVhbjtcclxuXHRlZmZlY3RQYXJhbXM/OiB7XHJcblx0XHRrZXlMaXN0OiBUaW1lbGluZUtleURlc2NyaXB0b3JbXTtcclxuXHRcdGZpbGxDYW52YXM6IGJvb2xlYW47XHJcblx0XHR6b29tT3JpZ2luOiBudW1iZXI7XHJcblx0fTtcclxuXHRrZXlMaXN0OiBUaW1lbGluZUtleURlc2NyaXB0b3JbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lU2NvcGVEZXNjcmlwdG9yIHtcclxuXHRWcnNuOiAxO1xyXG5cdFN0cnQ6IEZyYWN0aW9uRGVzY3JpcHRvcjtcclxuXHRkdXJhdGlvbjogRnJhY3Rpb25EZXNjcmlwdG9yO1xyXG5cdGluVGltZTogRnJhY3Rpb25EZXNjcmlwdG9yO1xyXG5cdG91dFRpbWU6IEZyYWN0aW9uRGVzY3JpcHRvcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZURlc2NyaXB0b3Ige1xyXG5cdFZyc246IDE7XHJcblx0dGltZVNjb3BlOiBUaW1lU2NvcGVEZXNjcmlwdG9yO1xyXG5cdGF1dG9TY29wZTogYm9vbGVhbjtcclxuXHRhdWRpb0xldmVsOiBudW1iZXI7XHJcblx0THlySTogbnVtYmVyO1xyXG5cdHRyYWNrTGlzdD86IFRpbWVsaW5lVHJhY2tEZXNjcmlwdG9yW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRWZmZWN0RGVzY3JpcHRvciBleHRlbmRzIFBhcnRpYWw8RGVzY3JpcHRvckdyYWRpZW50Q29udGVudD4sIFBhcnRpYWw8RGVzY3JpcHRvclBhdHRlcm5Db250ZW50PiB7XHJcblx0ZW5hYj86IGJvb2xlYW47XHJcblx0U3R5bDogc3RyaW5nO1xyXG5cdFBudFQ/OiBzdHJpbmc7XHJcblx0J01kICAnPzogc3RyaW5nO1xyXG5cdE9wY3Q/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHQnU3ogICc/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHQnQ2xyICc/OiBEZXNjcmlwdG9yQ29sb3I7XHJcblx0cHJlc2VudD86IGJvb2xlYW47XHJcblx0c2hvd0luRGlhbG9nPzogYm9vbGVhbjtcclxuXHRvdmVycHJpbnQ/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExmeDJEZXNjcmlwdG9yIHtcclxuXHQnU2NsICc/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHRtYXN0ZXJGWFN3aXRjaD86IGJvb2xlYW47XHJcblx0RHJTaD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0SXJTaD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0T3JHbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0SXJHbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0ZWJibD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0U29GaT86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0cGF0dGVybkZpbGw/OiBFZmZlY3REZXNjcmlwdG9yO1xyXG5cdEdyRmw/OiBFZmZlY3REZXNjcmlwdG9yO1xyXG5cdENoRlg/OiBFZmZlY3REZXNjcmlwdG9yO1xyXG5cdEZyRlg/OiBFZmZlY3REZXNjcmlwdG9yO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExtZnhEZXNjcmlwdG9yIHtcclxuXHQnU2NsICc/OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZTtcclxuXHRtYXN0ZXJGWFN3aXRjaD86IGJvb2xlYW47XHJcblx0bnVtTW9kaWZ5aW5nRlg/OiBudW1iZXI7XHJcblx0T3JHbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0SXJHbD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0ZWJibD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0Q2hGWD86IEVmZmVjdERlc2NyaXB0b3I7XHJcblx0ZHJvcFNoYWRvd011bHRpPzogRWZmZWN0RGVzY3JpcHRvcltdO1xyXG5cdGlubmVyU2hhZG93TXVsdGk/OiBFZmZlY3REZXNjcmlwdG9yW107XHJcblx0c29saWRGaWxsTXVsdGk/OiBFZmZlY3REZXNjcmlwdG9yW107XHJcblx0Z3JhZGllbnRGaWxsTXVsdGk/OiBFZmZlY3REZXNjcmlwdG9yW107XHJcblx0ZnJhbWVGWE11bHRpPzogRWZmZWN0RGVzY3JpcHRvcltdO1xyXG5cdHBhdHRlcm5GaWxsPzogRWZmZWN0RGVzY3JpcHRvcjsgLy8gPz8/XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlRnhPYmplY3QoZng6IEVmZmVjdERlc2NyaXB0b3IpIHtcclxuXHRjb25zdCBzdHJva2U6IExheWVyRWZmZWN0U3Ryb2tlID0ge1xyXG5cdFx0ZW5hYmxlZDogISFmeC5lbmFiLFxyXG5cdFx0cG9zaXRpb246IEZTdGwuZGVjb2RlKGZ4LlN0eWwpLFxyXG5cdFx0ZmlsbFR5cGU6IEZyRmwuZGVjb2RlKGZ4LlBudFQhKSxcclxuXHRcdGJsZW5kTW9kZTogQmxuTS5kZWNvZGUoZnhbJ01kICAnXSEpLFxyXG5cdFx0b3BhY2l0eTogcGFyc2VQZXJjZW50KGZ4Lk9wY3QpLFxyXG5cdFx0c2l6ZTogcGFyc2VVbml0cyhmeFsnU3ogICddISksXHJcblx0fTtcclxuXHJcblx0aWYgKGZ4LnByZXNlbnQgIT09IHVuZGVmaW5lZCkgc3Ryb2tlLnByZXNlbnQgPSBmeC5wcmVzZW50O1xyXG5cdGlmIChmeC5zaG93SW5EaWFsb2cgIT09IHVuZGVmaW5lZCkgc3Ryb2tlLnNob3dJbkRpYWxvZyA9IGZ4LnNob3dJbkRpYWxvZztcclxuXHRpZiAoZngub3ZlcnByaW50ICE9PSB1bmRlZmluZWQpIHN0cm9rZS5vdmVycHJpbnQgPSBmeC5vdmVycHJpbnQ7XHJcblx0aWYgKGZ4WydDbHIgJ10pIHN0cm9rZS5jb2xvciA9IHBhcnNlQ29sb3IoZnhbJ0NsciAnXSk7XHJcblx0aWYgKGZ4LkdyYWQpIHN0cm9rZS5ncmFkaWVudCA9IHBhcnNlR3JhZGllbnRDb250ZW50KGZ4IGFzIGFueSk7XHJcblx0aWYgKGZ4LlB0cm4pIHN0cm9rZS5wYXR0ZXJuID0gcGFyc2VQYXR0ZXJuQ29udGVudChmeCBhcyBhbnkpO1xyXG5cclxuXHRyZXR1cm4gc3Ryb2tlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVGeE9iamVjdChzdHJva2U6IExheWVyRWZmZWN0U3Ryb2tlKSB7XHJcblx0bGV0IEZyRlg6IEVmZmVjdERlc2NyaXB0b3IgPSB7fSBhcyBhbnk7XHJcblx0RnJGWC5lbmFiID0gISFzdHJva2UuZW5hYmxlZDtcclxuXHRpZiAoc3Ryb2tlLnByZXNlbnQgIT09IHVuZGVmaW5lZCkgRnJGWC5wcmVzZW50ID0gISFzdHJva2UucHJlc2VudDtcclxuXHRpZiAoc3Ryb2tlLnNob3dJbkRpYWxvZyAhPT0gdW5kZWZpbmVkKSBGckZYLnNob3dJbkRpYWxvZyA9ICEhc3Ryb2tlLnNob3dJbkRpYWxvZztcclxuXHRGckZYLlN0eWwgPSBGU3RsLmVuY29kZShzdHJva2UucG9zaXRpb24pO1xyXG5cdEZyRlguUG50VCA9IEZyRmwuZW5jb2RlKHN0cm9rZS5maWxsVHlwZSk7XHJcblx0RnJGWFsnTWQgICddID0gQmxuTS5lbmNvZGUoc3Ryb2tlLmJsZW5kTW9kZSk7XHJcblx0RnJGWC5PcGN0ID0gdW5pdHNQZXJjZW50KHN0cm9rZS5vcGFjaXR5KTtcclxuXHRGckZYWydTeiAgJ10gPSB1bml0c1ZhbHVlKHN0cm9rZS5zaXplLCAnc2l6ZScpO1xyXG5cdGlmIChzdHJva2UuY29sb3IpIEZyRlhbJ0NsciAnXSA9IHNlcmlhbGl6ZUNvbG9yKHN0cm9rZS5jb2xvcik7XHJcblx0aWYgKHN0cm9rZS5ncmFkaWVudCkgRnJGWCA9IHsgLi4uRnJGWCwgLi4uc2VyaWFsaXplR3JhZGllbnRDb250ZW50KHN0cm9rZS5ncmFkaWVudCkgfTtcclxuXHRpZiAoc3Ryb2tlLnBhdHRlcm4pIEZyRlggPSB7IC4uLkZyRlgsIC4uLnNlcmlhbGl6ZVBhdHRlcm5Db250ZW50KHN0cm9rZS5wYXR0ZXJuKSB9O1xyXG5cdGlmIChzdHJva2Uub3ZlcnByaW50ICE9PSB1bmRlZmluZWQpIEZyRlgub3ZlcnByaW50ID0gISFzdHJva2Uub3ZlcnByaW50O1xyXG5cdHJldHVybiBGckZYO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplRWZmZWN0cyhlOiBMYXllckVmZmVjdHNJbmZvLCBsb2c6IGJvb2xlYW4sIG11bHRpOiBib29sZWFuKSB7XHJcblx0Y29uc3QgaW5mbzogTGZ4MkRlc2NyaXB0b3IgJiBMbWZ4RGVzY3JpcHRvciA9IG11bHRpID8ge1xyXG5cdFx0J1NjbCAnOiB1bml0c1BlcmNlbnQoZS5zY2FsZSA/PyAxKSxcclxuXHRcdG1hc3RlckZYU3dpdGNoOiAhZS5kaXNhYmxlZCxcclxuXHR9IDoge1xyXG5cdFx0bWFzdGVyRlhTd2l0Y2g6ICFlLmRpc2FibGVkLFxyXG5cdFx0J1NjbCAnOiB1bml0c1BlcmNlbnQoZS5zY2FsZSA/PyAxKSxcclxuXHR9O1xyXG5cclxuXHRjb25zdCBhcnJheUtleXM6IChrZXlvZiBMYXllckVmZmVjdHNJbmZvKVtdID0gWydkcm9wU2hhZG93JywgJ2lubmVyU2hhZG93JywgJ3NvbGlkRmlsbCcsICdncmFkaWVudE92ZXJsYXknLCAnc3Ryb2tlJ107XHJcblx0Zm9yIChjb25zdCBrZXkgb2YgYXJyYXlLZXlzKSB7XHJcblx0XHRpZiAoZVtrZXldICYmICFBcnJheS5pc0FycmF5KGVba2V5XSkpIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IHNob3VsZCBiZSBhbiBhcnJheWApO1xyXG5cdH1cclxuXHJcblx0aWYgKGUuZHJvcFNoYWRvdz8uWzBdICYmICFtdWx0aSkgaW5mby5EclNoID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuZHJvcFNoYWRvd1swXSwgJ2Ryb3BTaGFkb3cnLCBsb2cpO1xyXG5cdGlmIChlLmRyb3BTaGFkb3c/LlswXSAmJiBtdWx0aSkgaW5mby5kcm9wU2hhZG93TXVsdGkgPSBlLmRyb3BTaGFkb3cubWFwKGkgPT4gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGksICdkcm9wU2hhZG93JywgbG9nKSk7XHJcblx0aWYgKGUuaW5uZXJTaGFkb3c/LlswXSAmJiAhbXVsdGkpIGluZm8uSXJTaCA9IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChlLmlubmVyU2hhZG93WzBdLCAnaW5uZXJTaGFkb3cnLCBsb2cpO1xyXG5cdGlmIChlLmlubmVyU2hhZG93Py5bMF0gJiYgbXVsdGkpIGluZm8uaW5uZXJTaGFkb3dNdWx0aSA9IGUuaW5uZXJTaGFkb3cubWFwKGkgPT4gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGksICdpbm5lclNoYWRvdycsIGxvZykpO1xyXG5cdGlmIChlLm91dGVyR2xvdykgaW5mby5PckdsID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUub3V0ZXJHbG93LCAnb3V0ZXJHbG93JywgbG9nKTtcclxuXHRpZiAoZS5zb2xpZEZpbGw/LlswXSAmJiBtdWx0aSkgaW5mby5zb2xpZEZpbGxNdWx0aSA9IGUuc29saWRGaWxsLm1hcChpID0+IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChpLCAnc29saWRGaWxsJywgbG9nKSk7XHJcblx0aWYgKGUuZ3JhZGllbnRPdmVybGF5Py5bMF0gJiYgbXVsdGkpIGluZm8uZ3JhZGllbnRGaWxsTXVsdGkgPSBlLmdyYWRpZW50T3ZlcmxheS5tYXAoaSA9PiBzZXJpYWxpemVFZmZlY3RPYmplY3QoaSwgJ2dyYWRpZW50T3ZlcmxheScsIGxvZykpO1xyXG5cdGlmIChlLnN0cm9rZT8uWzBdICYmIG11bHRpKSBpbmZvLmZyYW1lRlhNdWx0aSA9IGUuc3Ryb2tlLm1hcChpID0+IHNlcmlhbGl6ZUZ4T2JqZWN0KGkpKTtcclxuXHRpZiAoZS5pbm5lckdsb3cpIGluZm8uSXJHbCA9IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChlLmlubmVyR2xvdywgJ2lubmVyR2xvdycsIGxvZyk7XHJcblx0aWYgKGUuYmV2ZWwpIGluZm8uZWJibCA9IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChlLmJldmVsLCAnYmV2ZWwnLCBsb2cpO1xyXG5cdGlmIChlLnNvbGlkRmlsbD8uWzBdICYmICFtdWx0aSkgaW5mby5Tb0ZpID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuc29saWRGaWxsWzBdLCAnc29saWRGaWxsJywgbG9nKTtcclxuXHRpZiAoZS5wYXR0ZXJuT3ZlcmxheSkgaW5mby5wYXR0ZXJuRmlsbCA9IHNlcmlhbGl6ZUVmZmVjdE9iamVjdChlLnBhdHRlcm5PdmVybGF5LCAncGF0dGVybk92ZXJsYXknLCBsb2cpO1xyXG5cdGlmIChlLmdyYWRpZW50T3ZlcmxheT8uWzBdICYmICFtdWx0aSkgaW5mby5HckZsID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuZ3JhZGllbnRPdmVybGF5WzBdLCAnZ3JhZGllbnRPdmVybGF5JywgbG9nKTtcclxuXHRpZiAoZS5zYXRpbikgaW5mby5DaEZYID0gc2VyaWFsaXplRWZmZWN0T2JqZWN0KGUuc2F0aW4sICdzYXRpbicsIGxvZyk7XHJcblx0aWYgKGUuc3Ryb2tlPy5bMF0gJiYgIW11bHRpKSBpbmZvLkZyRlggPSBzZXJpYWxpemVGeE9iamVjdChlLnN0cm9rZT8uWzBdKTtcclxuXHJcblx0aWYgKG11bHRpKSB7XHJcblx0XHRpbmZvLm51bU1vZGlmeWluZ0ZYID0gMDtcclxuXHJcblx0XHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlKSkge1xyXG5cdFx0XHRjb25zdCB2YWx1ZSA9IChlIGFzIGFueSlba2V5XTtcclxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcblx0XHRcdFx0Zm9yIChjb25zdCBlZmZlY3Qgb2YgdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlmIChlZmZlY3QuZW5hYmxlZCkgaW5mby5udW1Nb2RpZnlpbmdGWCsrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGluZm87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVmZmVjdHMoaW5mbzogTGZ4MkRlc2NyaXB0b3IgJiBMbWZ4RGVzY3JpcHRvciwgbG9nOiBib29sZWFuKSB7XHJcblx0Y29uc3QgZWZmZWN0czogTGF5ZXJFZmZlY3RzSW5mbyA9IHt9O1xyXG5cdGlmICghaW5mby5tYXN0ZXJGWFN3aXRjaCkgZWZmZWN0cy5kaXNhYmxlZCA9IHRydWU7XHJcblx0aWYgKGluZm9bJ1NjbCAnXSkgZWZmZWN0cy5zY2FsZSA9IHBhcnNlUGVyY2VudChpbmZvWydTY2wgJ10pO1xyXG5cdGlmIChpbmZvLkRyU2gpIGVmZmVjdHMuZHJvcFNoYWRvdyA9IFtwYXJzZUVmZmVjdE9iamVjdChpbmZvLkRyU2gsIGxvZyldO1xyXG5cdGlmIChpbmZvLmRyb3BTaGFkb3dNdWx0aSkgZWZmZWN0cy5kcm9wU2hhZG93ID0gaW5mby5kcm9wU2hhZG93TXVsdGkubWFwKGkgPT4gcGFyc2VFZmZlY3RPYmplY3QoaSwgbG9nKSk7XHJcblx0aWYgKGluZm8uSXJTaCkgZWZmZWN0cy5pbm5lclNoYWRvdyA9IFtwYXJzZUVmZmVjdE9iamVjdChpbmZvLklyU2gsIGxvZyldO1xyXG5cdGlmIChpbmZvLmlubmVyU2hhZG93TXVsdGkpIGVmZmVjdHMuaW5uZXJTaGFkb3cgPSBpbmZvLmlubmVyU2hhZG93TXVsdGkubWFwKGkgPT4gcGFyc2VFZmZlY3RPYmplY3QoaSwgbG9nKSk7XHJcblx0aWYgKGluZm8uT3JHbCkgZWZmZWN0cy5vdXRlckdsb3cgPSBwYXJzZUVmZmVjdE9iamVjdChpbmZvLk9yR2wsIGxvZyk7XHJcblx0aWYgKGluZm8uSXJHbCkgZWZmZWN0cy5pbm5lckdsb3cgPSBwYXJzZUVmZmVjdE9iamVjdChpbmZvLklyR2wsIGxvZyk7XHJcblx0aWYgKGluZm8uZWJibCkgZWZmZWN0cy5iZXZlbCA9IHBhcnNlRWZmZWN0T2JqZWN0KGluZm8uZWJibCwgbG9nKTtcclxuXHRpZiAoaW5mby5Tb0ZpKSBlZmZlY3RzLnNvbGlkRmlsbCA9IFtwYXJzZUVmZmVjdE9iamVjdChpbmZvLlNvRmksIGxvZyldO1xyXG5cdGlmIChpbmZvLnNvbGlkRmlsbE11bHRpKSBlZmZlY3RzLnNvbGlkRmlsbCA9IGluZm8uc29saWRGaWxsTXVsdGkubWFwKGkgPT4gcGFyc2VFZmZlY3RPYmplY3QoaSwgbG9nKSk7XHJcblx0aWYgKGluZm8ucGF0dGVybkZpbGwpIGVmZmVjdHMucGF0dGVybk92ZXJsYXkgPSBwYXJzZUVmZmVjdE9iamVjdChpbmZvLnBhdHRlcm5GaWxsLCBsb2cpO1xyXG5cdGlmIChpbmZvLkdyRmwpIGVmZmVjdHMuZ3JhZGllbnRPdmVybGF5ID0gW3BhcnNlRWZmZWN0T2JqZWN0KGluZm8uR3JGbCwgbG9nKV07XHJcblx0aWYgKGluZm8uZ3JhZGllbnRGaWxsTXVsdGkpIGVmZmVjdHMuZ3JhZGllbnRPdmVybGF5ID0gaW5mby5ncmFkaWVudEZpbGxNdWx0aS5tYXAoaSA9PiBwYXJzZUVmZmVjdE9iamVjdChpLCBsb2cpKTtcclxuXHRpZiAoaW5mby5DaEZYKSBlZmZlY3RzLnNhdGluID0gcGFyc2VFZmZlY3RPYmplY3QoaW5mby5DaEZYLCBsb2cpO1xyXG5cdGlmIChpbmZvLkZyRlgpIGVmZmVjdHMuc3Ryb2tlID0gW3BhcnNlRnhPYmplY3QoaW5mby5GckZYKV07XHJcblx0aWYgKGluZm8uZnJhbWVGWE11bHRpKSBlZmZlY3RzLnN0cm9rZSA9IGluZm8uZnJhbWVGWE11bHRpLm1hcChpID0+IHBhcnNlRnhPYmplY3QoaSkpO1xyXG5cdHJldHVybiBlZmZlY3RzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUtleUxpc3Qoa2V5TGlzdDogVGltZWxpbmVLZXlEZXNjcmlwdG9yW10sIGxvZ01pc3NpbmdGZWF0dXJlczogYm9vbGVhbikge1xyXG5cdGNvbnN0IGtleXM6IFRpbWVsaW5lS2V5W10gPSBbXTtcclxuXHJcblx0Zm9yIChsZXQgaiA9IDA7IGogPCBrZXlMaXN0Lmxlbmd0aDsgaisrKSB7XHJcblx0XHRjb25zdCBrZXkgPSBrZXlMaXN0W2pdO1xyXG5cdFx0Y29uc3QgeyB0aW1lLCBzZWxlY3RlZCwgYW5pbUtleSB9ID0ga2V5O1xyXG5cdFx0Y29uc3QgaW50ZXJwb2xhdGlvbiA9IGFuaW1JbnRlcnBTdHlsZUVudW0uZGVjb2RlKGtleS5hbmltSW50ZXJwU3R5bGUpO1xyXG5cclxuXHRcdHN3aXRjaCAoYW5pbUtleS5UeXBlKSB7XHJcblx0XHRcdGNhc2UgJ2tleVR5cGUuT3BjdCc6XHJcblx0XHRcdFx0a2V5cy5wdXNoKHsgaW50ZXJwb2xhdGlvbiwgdGltZSwgc2VsZWN0ZWQsIHR5cGU6ICdvcGFjaXR5JywgdmFsdWU6IHBhcnNlUGVyY2VudChhbmltS2V5Lk9wY3QpIH0pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdrZXlUeXBlLlBzdG4nOlxyXG5cdFx0XHRcdGtleXMucHVzaCh7IGludGVycG9sYXRpb24sIHRpbWUsIHNlbGVjdGVkLCB0eXBlOiAncG9zaXRpb24nLCB4OiBhbmltS2V5Lkhyem4sIHk6IGFuaW1LZXkuVnJ0YyB9KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAna2V5VHlwZS5Ucm5mJzpcclxuXHRcdFx0XHRrZXlzLnB1c2goe1xyXG5cdFx0XHRcdFx0aW50ZXJwb2xhdGlvbiwgdGltZSwgc2VsZWN0ZWQsIHR5cGU6ICd0cmFuc2Zvcm0nLFxyXG5cdFx0XHRcdFx0c2NhbGU6IGhvcnpWcnRjVG9YWShhbmltS2V5WydTY2wgJ10pLCBza2V3OiBob3J6VnJ0Y1RvWFkoYW5pbUtleS5Ta2V3KSwgcm90YXRpb246IGFuaW1LZXkucm90YXRpb24sIHRyYW5zbGF0aW9uOiBob3J6VnJ0Y1RvWFkoYW5pbUtleS50cmFuc2xhdGlvbilcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAna2V5VHlwZS5zaGVldFN0eWxlJzoge1xyXG5cdFx0XHRcdGNvbnN0IGtleTogVGltZWxpbmVLZXkgPSB7IGludGVycG9sYXRpb24sIHRpbWUsIHNlbGVjdGVkLCB0eXBlOiAnc3R5bGUnIH07XHJcblx0XHRcdFx0aWYgKGFuaW1LZXkuc2hlZXRTdHlsZS5MZWZ4KSBrZXkuc3R5bGUgPSBwYXJzZUVmZmVjdHMoYW5pbUtleS5zaGVldFN0eWxlLkxlZngsIGxvZ01pc3NpbmdGZWF0dXJlcyk7XHJcblx0XHRcdFx0a2V5cy5wdXNoKGtleSk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0Y2FzZSAna2V5VHlwZS5nbG9iYWxMaWdodGluZyc6IHtcclxuXHRcdFx0XHRrZXlzLnB1c2goe1xyXG5cdFx0XHRcdFx0aW50ZXJwb2xhdGlvbiwgdGltZSwgc2VsZWN0ZWQsIHR5cGU6ICdnbG9iYWxMaWdodGluZycsXHJcblx0XHRcdFx0XHRnbG9iYWxBbmdsZTogYW5pbUtleS5nYmxBLCBnbG9iYWxBbHRpdHVkZTogYW5pbUtleS5nbG9iYWxBbHRpdHVkZVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQga2V5VHlwZSB2YWx1ZWApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGtleXM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNlcmlhbGl6ZUtleUxpc3Qoa2V5czogVGltZWxpbmVLZXlbXSk6IFRpbWVsaW5lS2V5RGVzY3JpcHRvcltdIHtcclxuXHRjb25zdCBrZXlMaXN0OiBUaW1lbGluZUtleURlc2NyaXB0b3JbXSA9IFtdO1xyXG5cclxuXHRmb3IgKGxldCBqID0gMDsgaiA8IGtleXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdGNvbnN0IGtleSA9IGtleXNbal07XHJcblx0XHRjb25zdCB7IHRpbWUsIHNlbGVjdGVkID0gZmFsc2UsIGludGVycG9sYXRpb24gfSA9IGtleTtcclxuXHRcdGNvbnN0IGFuaW1JbnRlcnBTdHlsZSA9IGFuaW1JbnRlcnBTdHlsZUVudW0uZW5jb2RlKGludGVycG9sYXRpb24pIGFzICdhbmltSW50ZXJwU3R5bGUuTG5yICcgfCAnYW5pbUludGVycFN0eWxlLmhvbGQnO1xyXG5cdFx0bGV0IGFuaW1LZXk6IFRpbWVsaW5lQW5pbUtleURlc2NyaXB0b3I7XHJcblxyXG5cdFx0c3dpdGNoIChrZXkudHlwZSkge1xyXG5cdFx0XHRjYXNlICdvcGFjaXR5JzpcclxuXHRcdFx0XHRhbmltS2V5ID0geyBUeXBlOiAna2V5VHlwZS5PcGN0JywgT3BjdDogdW5pdHNQZXJjZW50KGtleS52YWx1ZSkgfTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAncG9zaXRpb24nOlxyXG5cdFx0XHRcdGFuaW1LZXkgPSB7IFR5cGU6ICdrZXlUeXBlLlBzdG4nLCBIcnpuOiBrZXkueCwgVnJ0Yzoga2V5LnkgfTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAndHJhbnNmb3JtJzpcclxuXHRcdFx0XHRhbmltS2V5ID0geyBUeXBlOiAna2V5VHlwZS5Ucm5mJywgJ1NjbCAnOiB4eVRvSG9yelZydGMoa2V5LnNjYWxlKSwgU2tldzogeHlUb0hvcnpWcnRjKGtleS5za2V3KSwgcm90YXRpb246IGtleS5yb3RhdGlvbiwgdHJhbnNsYXRpb246IHh5VG9Ib3J6VnJ0YyhrZXkudHJhbnNsYXRpb24pIH07XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ3N0eWxlJzpcclxuXHRcdFx0XHRhbmltS2V5ID0geyBUeXBlOiAna2V5VHlwZS5zaGVldFN0eWxlJywgc2hlZXRTdHlsZTogeyBWcnNuOiAxLCBibGVuZE9wdGlvbnM6IHt9IH0gfTtcclxuXHRcdFx0XHRpZiAoa2V5LnN0eWxlKSBhbmltS2V5LnNoZWV0U3R5bGUgPSB7IFZyc246IDEsIExlZng6IHNlcmlhbGl6ZUVmZmVjdHMoa2V5LnN0eWxlLCBmYWxzZSwgZmFsc2UpLCBibGVuZE9wdGlvbnM6IHt9IH07XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2dsb2JhbExpZ2h0aW5nJzoge1xyXG5cdFx0XHRcdGFuaW1LZXkgPSB7IFR5cGU6ICdrZXlUeXBlLmdsb2JhbExpZ2h0aW5nJywgZ2JsQToga2V5Lmdsb2JhbEFuZ2xlLCBnbG9iYWxBbHRpdHVkZToga2V5Lmdsb2JhbEFsdGl0dWRlIH07XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBrZXlUeXBlIHZhbHVlYCk7XHJcblx0XHR9XHJcblxyXG5cdFx0a2V5TGlzdC5wdXNoKHsgVnJzbjogMSwgYW5pbUludGVycFN0eWxlLCB0aW1lLCBhbmltS2V5LCBzZWxlY3RlZCB9KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiBrZXlMaXN0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmFja0xpc3QodHJhY2tMaXN0OiBUaW1lbGluZVRyYWNrRGVzY3JpcHRvcltdLCBsb2dNaXNzaW5nRmVhdHVyZXM6IGJvb2xlYW4pIHtcclxuXHRjb25zdCB0cmFja3M6IFRpbWVsaW5lVHJhY2tbXSA9IFtdO1xyXG5cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrTGlzdC5sZW5ndGg7IGkrKykge1xyXG5cdFx0Y29uc3QgdHIgPSB0cmFja0xpc3RbaV07XHJcblx0XHRjb25zdCB0cmFjazogVGltZWxpbmVUcmFjayA9IHtcclxuXHRcdFx0dHlwZTogc3RkVHJhY2tJRC5kZWNvZGUodHIudHJhY2tJRCksXHJcblx0XHRcdGVuYWJsZWQ6IHRyLmVuYWIsXHJcblx0XHRcdGtleXM6IHBhcnNlS2V5TGlzdCh0ci5rZXlMaXN0LCBsb2dNaXNzaW5nRmVhdHVyZXMpLFxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAodHIuZWZmZWN0UGFyYW1zKSB7XHJcblx0XHRcdHRyYWNrLmVmZmVjdFBhcmFtcyA9IHtcclxuXHRcdFx0XHRmaWxsQ2FudmFzOiB0ci5lZmZlY3RQYXJhbXMuZmlsbENhbnZhcyxcclxuXHRcdFx0XHR6b29tT3JpZ2luOiB0ci5lZmZlY3RQYXJhbXMuem9vbU9yaWdpbixcclxuXHRcdFx0XHRrZXlzOiBwYXJzZUtleUxpc3QodHIuZWZmZWN0UGFyYW1zLmtleUxpc3QsIGxvZ01pc3NpbmdGZWF0dXJlcyksXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0dHJhY2tzLnB1c2godHJhY2spO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRyYWNrcztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVRyYWNrTGlzdCh0cmFja3M6IFRpbWVsaW5lVHJhY2tbXSk6IFRpbWVsaW5lVHJhY2tEZXNjcmlwdG9yW10ge1xyXG5cdGNvbnN0IHRyYWNrTGlzdDogVGltZWxpbmVUcmFja0Rlc2NyaXB0b3JbXSA9IFtdO1xyXG5cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xyXG5cdFx0Y29uc3QgdCA9IHRyYWNrc1tpXTtcclxuXHRcdHRyYWNrTGlzdC5wdXNoKHtcclxuXHRcdFx0dHJhY2tJRDogc3RkVHJhY2tJRC5lbmNvZGUodC50eXBlKSBhcyBhbnksXHJcblx0XHRcdFZyc246IDEsXHJcblx0XHRcdGVuYWI6ICEhdC5lbmFibGVkLFxyXG5cdFx0XHRFZmZjOiAhIXQuZWZmZWN0UGFyYW1zLFxyXG5cdFx0XHQuLi4odC5lZmZlY3RQYXJhbXMgPyB7XHJcblx0XHRcdFx0ZWZmZWN0UGFyYW1zOiB7XHJcblx0XHRcdFx0XHRrZXlMaXN0OiBzZXJpYWxpemVLZXlMaXN0KHQua2V5cyksXHJcblx0XHRcdFx0XHRmaWxsQ2FudmFzOiB0LmVmZmVjdFBhcmFtcy5maWxsQ2FudmFzLFxyXG5cdFx0XHRcdFx0em9vbU9yaWdpbjogdC5lZmZlY3RQYXJhbXMuem9vbU9yaWdpbixcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gOiB7fSksXHJcblx0XHRcdGtleUxpc3Q6IHNlcmlhbGl6ZUtleUxpc3QodC5rZXlzKSxcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRyYWNrTGlzdDtcclxufVxyXG5cclxudHlwZSBBbGxFZmZlY3RzID0gTGF5ZXJFZmZlY3RTaGFkb3cgJiBMYXllckVmZmVjdHNPdXRlckdsb3cgJiBMYXllckVmZmVjdFN0cm9rZSAmXHJcblx0TGF5ZXJFZmZlY3RJbm5lckdsb3cgJiBMYXllckVmZmVjdEJldmVsICYgTGF5ZXJFZmZlY3RTb2xpZEZpbGwgJlxyXG5cdExheWVyRWZmZWN0UGF0dGVybk92ZXJsYXkgJiBMYXllckVmZmVjdFNhdGluICYgTGF5ZXJFZmZlY3RHcmFkaWVudE92ZXJsYXk7XHJcblxyXG5mdW5jdGlvbiBwYXJzZUVmZmVjdE9iamVjdChvYmo6IGFueSwgcmVwb3J0RXJyb3JzOiBib29sZWFuKSB7XHJcblx0Y29uc3QgcmVzdWx0OiBBbGxFZmZlY3RzID0ge30gYXMgYW55O1xyXG5cclxuXHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XHJcblx0XHRjb25zdCB2YWwgPSBvYmpba2V5XTtcclxuXHJcblx0XHRzd2l0Y2ggKGtleSkge1xyXG5cdFx0XHRjYXNlICdlbmFiJzogcmVzdWx0LmVuYWJsZWQgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3VnbGcnOiByZXN1bHQudXNlR2xvYmFsTGlnaHQgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0FudEEnOiByZXN1bHQuYW50aWFsaWFzZWQgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0FsZ24nOiByZXN1bHQuYWxpZ24gPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0R0aHInOiByZXN1bHQuZGl0aGVyID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdJbnZyJzogcmVzdWx0LmludmVydCA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnUnZycyc6IHJlc3VsdC5yZXZlcnNlID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdDbHIgJzogcmVzdWx0LmNvbG9yID0gcGFyc2VDb2xvcih2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGdsQyc6IHJlc3VsdC5oaWdobGlnaHRDb2xvciA9IHBhcnNlQ29sb3IodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3Nkd0MnOiByZXN1bHQuc2hhZG93Q29sb3IgPSBwYXJzZUNvbG9yKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdTdHlsJzogcmVzdWx0LnBvc2l0aW9uID0gRlN0bC5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ01kICAnOiByZXN1bHQuYmxlbmRNb2RlID0gQmxuTS5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2hnbE0nOiByZXN1bHQuaGlnaGxpZ2h0QmxlbmRNb2RlID0gQmxuTS5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3Nkd00nOiByZXN1bHQuc2hhZG93QmxlbmRNb2RlID0gQmxuTS5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2J2bFMnOiByZXN1bHQuc3R5bGUgPSBCRVNsLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYnZsRCc6IHJlc3VsdC5kaXJlY3Rpb24gPSBCRVNzLmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYnZsVCc6IHJlc3VsdC50ZWNobmlxdWUgPSBidmxULmRlY29kZSh2YWwpIGFzIGFueTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ0dsd1QnOiByZXN1bHQudGVjaG5pcXVlID0gQkVURS5kZWNvZGUodmFsKSBhcyBhbnk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdnbHdTJzogcmVzdWx0LnNvdXJjZSA9IElHU3IuZGVjb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdUeXBlJzogcmVzdWx0LnR5cGUgPSBHcmRULmRlY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnZ3M5OSc6IHJlc3VsdC5pbnRlcnBvbGF0aW9uTWV0aG9kID0gZ3JhZGllbnRJbnRlcnBvbGF0aW9uTWV0aG9kVHlwZS5kZWNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ09wY3QnOiByZXN1bHQub3BhY2l0eSA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGdsTyc6IHJlc3VsdC5oaWdobGlnaHRPcGFjaXR5ID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzZHdPJzogcmVzdWx0LnNoYWRvd09wYWNpdHkgPSBwYXJzZVBlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2xhZ2wnOiByZXN1bHQuYW5nbGUgPSBwYXJzZUFuZ2xlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdBbmdsJzogcmVzdWx0LmFuZ2xlID0gcGFyc2VBbmdsZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnTGFsZCc6IHJlc3VsdC5hbHRpdHVkZSA9IHBhcnNlQW5nbGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ1NmdG4nOiByZXN1bHQuc29mdGVuID0gcGFyc2VVbml0cyh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc3JnUic6IHJlc3VsdC5zdHJlbmd0aCA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnYmx1cic6IHJlc3VsdC5zaXplID0gcGFyc2VVbml0cyh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnTm9zZSc6IHJlc3VsdC5ub2lzZSA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnSW5wcic6IHJlc3VsdC5yYW5nZSA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnQ2ttdCc6IHJlc3VsdC5jaG9rZSA9IHBhcnNlVW5pdHModmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ1NoZE4nOiByZXN1bHQuaml0dGVyID0gcGFyc2VQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdEc3RuJzogcmVzdWx0LmRpc3RhbmNlID0gcGFyc2VVbml0cyh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnU2NsICc6IHJlc3VsdC5zY2FsZSA9IHBhcnNlUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnUHRybic6IHJlc3VsdC5wYXR0ZXJuID0geyBuYW1lOiB2YWxbJ05tICAnXSwgaWQ6IHZhbC5JZG50IH07IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdwaGFzZSc6IHJlc3VsdC5waGFzZSA9IHsgeDogdmFsLkhyem4sIHk6IHZhbC5WcnRjIH07IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdPZnN0JzogcmVzdWx0Lm9mZnNldCA9IHsgeDogcGFyc2VQZXJjZW50KHZhbC5IcnpuKSwgeTogcGFyc2VQZXJjZW50KHZhbC5WcnRjKSB9OyBicmVhaztcclxuXHRcdFx0Y2FzZSAnTXBnUyc6XHJcblx0XHRcdGNhc2UgJ1RyblMnOlxyXG5cdFx0XHRcdHJlc3VsdC5jb250b3VyID0ge1xyXG5cdFx0XHRcdFx0bmFtZTogdmFsWydObSAgJ10sXHJcblx0XHRcdFx0XHRjdXJ2ZTogKHZhbFsnQ3J2ICddIGFzIGFueVtdKS5tYXAocCA9PiAoeyB4OiBwLkhyem4sIHk6IHAuVnJ0YyB9KSksXHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAnR3JhZCc6IHJlc3VsdC5ncmFkaWVudCA9IHBhcnNlR3JhZGllbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3VzZVRleHR1cmUnOlxyXG5cdFx0XHRjYXNlICd1c2VTaGFwZSc6XHJcblx0XHRcdGNhc2UgJ2xheWVyQ29uY2VhbHMnOlxyXG5cdFx0XHRjYXNlICdwcmVzZW50JzpcclxuXHRcdFx0Y2FzZSAnc2hvd0luRGlhbG9nJzpcclxuXHRcdFx0Y2FzZSAnYW50aWFsaWFzR2xvc3MnOiByZXN1bHRba2V5XSA9IHZhbDsgYnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmVwb3J0RXJyb3JzICYmIGNvbnNvbGUubG9nKGBJbnZhbGlkIGVmZmVjdCBrZXk6ICcke2tleX0nLCB2YWx1ZTpgLCB2YWwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplRWZmZWN0T2JqZWN0KG9iajogYW55LCBvYmpOYW1lOiBzdHJpbmcsIHJlcG9ydEVycm9yczogYm9vbGVhbikge1xyXG5cdGNvbnN0IHJlc3VsdDogYW55ID0ge307XHJcblxyXG5cdGZvciAoY29uc3Qgb2JqS2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcclxuXHRcdGNvbnN0IGtleToga2V5b2YgQWxsRWZmZWN0cyA9IG9iaktleSBhcyBhbnk7XHJcblx0XHRjb25zdCB2YWwgPSBvYmpba2V5XTtcclxuXHJcblx0XHRzd2l0Y2ggKGtleSkge1xyXG5cdFx0XHRjYXNlICdlbmFibGVkJzogcmVzdWx0LmVuYWIgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3VzZUdsb2JhbExpZ2h0JzogcmVzdWx0LnVnbGcgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2FudGlhbGlhc2VkJzogcmVzdWx0LkFudEEgPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2FsaWduJzogcmVzdWx0LkFsZ24gPSAhIXZhbDsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2RpdGhlcic6IHJlc3VsdC5EdGhyID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdpbnZlcnQnOiByZXN1bHQuSW52ciA9ICEhdmFsOyBicmVhaztcclxuXHRcdFx0Y2FzZSAncmV2ZXJzZSc6IHJlc3VsdC5SdnJzID0gISF2YWw7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdjb2xvcic6IHJlc3VsdFsnQ2xyICddID0gc2VyaWFsaXplQ29sb3IodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2hpZ2hsaWdodENvbG9yJzogcmVzdWx0LmhnbEMgPSBzZXJpYWxpemVDb2xvcih2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2hhZG93Q29sb3InOiByZXN1bHQuc2R3QyA9IHNlcmlhbGl6ZUNvbG9yKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdwb3NpdGlvbic6IHJlc3VsdC5TdHlsID0gRlN0bC5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2JsZW5kTW9kZSc6IHJlc3VsdFsnTWQgICddID0gQmxuTS5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2hpZ2hsaWdodEJsZW5kTW9kZSc6IHJlc3VsdC5oZ2xNID0gQmxuTS5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3NoYWRvd0JsZW5kTW9kZSc6IHJlc3VsdC5zZHdNID0gQmxuTS5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3N0eWxlJzogcmVzdWx0LmJ2bFMgPSBCRVNsLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnZGlyZWN0aW9uJzogcmVzdWx0LmJ2bEQgPSBCRVNzLmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAndGVjaG5pcXVlJzpcclxuXHRcdFx0XHRpZiAob2JqTmFtZSA9PT0gJ2JldmVsJykge1xyXG5cdFx0XHRcdFx0cmVzdWx0LmJ2bFQgPSBidmxULmVuY29kZSh2YWwpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQuR2x3VCA9IEJFVEUuZW5jb2RlKHZhbCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzb3VyY2UnOiByZXN1bHQuZ2x3UyA9IElHU3IuZW5jb2RlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICd0eXBlJzogcmVzdWx0LlR5cGUgPSBHcmRULmVuY29kZSh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaW50ZXJwb2xhdGlvbk1ldGhvZCc6IHJlc3VsdC5nczk5ID0gZ3JhZGllbnRJbnRlcnBvbGF0aW9uTWV0aG9kVHlwZS5lbmNvZGUodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ29wYWNpdHknOiByZXN1bHQuT3BjdCA9IHVuaXRzUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnaGlnaGxpZ2h0T3BhY2l0eSc6IHJlc3VsdC5oZ2xPID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzaGFkb3dPcGFjaXR5JzogcmVzdWx0LnNkd08gPSB1bml0c1BlcmNlbnQodmFsKTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ2FuZ2xlJzpcclxuXHRcdFx0XHRpZiAob2JqTmFtZSA9PT0gJ2dyYWRpZW50T3ZlcmxheScpIHtcclxuXHRcdFx0XHRcdHJlc3VsdC5BbmdsID0gdW5pdHNBbmdsZSh2YWwpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXN1bHQubGFnbCA9IHVuaXRzQW5nbGUodmFsKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2FsdGl0dWRlJzogcmVzdWx0LkxhbGQgPSB1bml0c0FuZ2xlKHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdzb2Z0ZW4nOiByZXN1bHQuU2Z0biA9IHVuaXRzVmFsdWUodmFsLCBrZXkpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc3RyZW5ndGgnOiByZXN1bHQuc3JnUiA9IHVuaXRzUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2l6ZSc6IHJlc3VsdC5ibHVyID0gdW5pdHNWYWx1ZSh2YWwsIGtleSk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdub2lzZSc6IHJlc3VsdC5Ob3NlID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdyYW5nZSc6IHJlc3VsdC5JbnByID0gdW5pdHNQZXJjZW50KHZhbCk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdjaG9rZSc6IHJlc3VsdC5Da210ID0gdW5pdHNWYWx1ZSh2YWwsIGtleSk7IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdqaXR0ZXInOiByZXN1bHQuU2hkTiA9IHVuaXRzUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOiByZXN1bHQuRHN0biA9IHVuaXRzVmFsdWUodmFsLCBrZXkpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAnc2NhbGUnOiByZXN1bHRbJ1NjbCAnXSA9IHVuaXRzUGVyY2VudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAncGF0dGVybic6IHJlc3VsdC5QdHJuID0geyAnTm0gICc6IHZhbC5uYW1lLCBJZG50OiB2YWwuaWQgfTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ3BoYXNlJzogcmVzdWx0LnBoYXNlID0geyBIcnpuOiB2YWwueCwgVnJ0YzogdmFsLnkgfTsgYnJlYWs7XHJcblx0XHRcdGNhc2UgJ29mZnNldCc6IHJlc3VsdC5PZnN0ID0geyBIcnpuOiB1bml0c1BlcmNlbnQodmFsLngpLCBWcnRjOiB1bml0c1BlcmNlbnQodmFsLnkpIH07IGJyZWFrO1xyXG5cdFx0XHRjYXNlICdjb250b3VyJzoge1xyXG5cdFx0XHRcdHJlc3VsdFtvYmpOYW1lID09PSAnc2F0aW4nID8gJ01wZ1MnIDogJ1RyblMnXSA9IHtcclxuXHRcdFx0XHRcdCdObSAgJzogKHZhbCBhcyBFZmZlY3RDb250b3VyKS5uYW1lLFxyXG5cdFx0XHRcdFx0J0NydiAnOiAodmFsIGFzIEVmZmVjdENvbnRvdXIpLmN1cnZlLm1hcChwID0+ICh7IEhyem46IHAueCwgVnJ0YzogcC55IH0pKSxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdGNhc2UgJ2dyYWRpZW50JzogcmVzdWx0LkdyYWQgPSBzZXJpYWxpemVHcmFkaWVudCh2YWwpOyBicmVhaztcclxuXHRcdFx0Y2FzZSAndXNlVGV4dHVyZSc6XHJcblx0XHRcdGNhc2UgJ3VzZVNoYXBlJzpcclxuXHRcdFx0Y2FzZSAnbGF5ZXJDb25jZWFscyc6XHJcblx0XHRcdGNhc2UgJ3ByZXNlbnQnOlxyXG5cdFx0XHRjYXNlICdzaG93SW5EaWFsb2cnOlxyXG5cdFx0XHRjYXNlICdhbnRpYWxpYXNHbG9zcyc6XHJcblx0XHRcdFx0cmVzdWx0W2tleV0gPSB2YWw7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0cmVwb3J0RXJyb3JzICYmIGNvbnNvbGUubG9nKGBJbnZhbGlkIGVmZmVjdCBrZXk6ICcke2tleX0nLCB2YWx1ZTpgLCB2YWwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VHcmFkaWVudChncmFkOiBEZXNjaXB0b3JHcmFkaWVudCk6IEVmZmVjdFNvbGlkR3JhZGllbnQgfCBFZmZlY3ROb2lzZUdyYWRpZW50IHtcclxuXHRpZiAoZ3JhZC5HcmRGID09PSAnR3JkRi5Dc3RTJykge1xyXG5cdFx0Y29uc3Qgc2FtcGxlczogbnVtYmVyID0gZ3JhZC5JbnRyIHx8IDQwOTY7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dHlwZTogJ3NvbGlkJyxcclxuXHRcdFx0bmFtZTogZ3JhZFsnTm0gICddLFxyXG5cdFx0XHRzbW9vdGhuZXNzOiBncmFkLkludHIgLyA0MDk2LFxyXG5cdFx0XHRjb2xvclN0b3BzOiBncmFkLkNscnMubWFwKHMgPT4gKHtcclxuXHRcdFx0XHRjb2xvcjogcGFyc2VDb2xvcihzWydDbHIgJ10pLFxyXG5cdFx0XHRcdGxvY2F0aW9uOiBzLkxjdG4gLyBzYW1wbGVzLFxyXG5cdFx0XHRcdG1pZHBvaW50OiBzLk1kcG4gLyAxMDAsXHJcblx0XHRcdH0pKSxcclxuXHRcdFx0b3BhY2l0eVN0b3BzOiBncmFkLlRybnMubWFwKHMgPT4gKHtcclxuXHRcdFx0XHRvcGFjaXR5OiBwYXJzZVBlcmNlbnQocy5PcGN0KSxcclxuXHRcdFx0XHRsb2NhdGlvbjogcy5MY3RuIC8gc2FtcGxlcyxcclxuXHRcdFx0XHRtaWRwb2ludDogcy5NZHBuIC8gMTAwLFxyXG5cdFx0XHR9KSksXHJcblx0XHR9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0eXBlOiAnbm9pc2UnLFxyXG5cdFx0XHRuYW1lOiBncmFkWydObSAgJ10sXHJcblx0XHRcdHJvdWdobmVzczogZ3JhZC5TbXRoIC8gNDA5NixcclxuXHRcdFx0Y29sb3JNb2RlbDogQ2xyUy5kZWNvZGUoZ3JhZC5DbHJTKSxcclxuXHRcdFx0cmFuZG9tU2VlZDogZ3JhZC5SbmRTLFxyXG5cdFx0XHRyZXN0cmljdENvbG9yczogISFncmFkLlZjdEMsXHJcblx0XHRcdGFkZFRyYW5zcGFyZW5jeTogISFncmFkLlNoVHIsXHJcblx0XHRcdG1pbjogZ3JhZFsnTW5tICddLm1hcCh4ID0+IHggLyAxMDApLFxyXG5cdFx0XHRtYXg6IGdyYWRbJ014bSAnXS5tYXAoeCA9PiB4IC8gMTAwKSxcclxuXHRcdH07XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBzZXJpYWxpemVHcmFkaWVudChncmFkOiBFZmZlY3RTb2xpZEdyYWRpZW50IHwgRWZmZWN0Tm9pc2VHcmFkaWVudCk6IERlc2NpcHRvckdyYWRpZW50IHtcclxuXHRpZiAoZ3JhZC50eXBlID09PSAnc29saWQnKSB7XHJcblx0XHRjb25zdCBzYW1wbGVzID0gTWF0aC5yb3VuZCgoZ3JhZC5zbW9vdGhuZXNzID8/IDEpICogNDA5Nik7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHQnTm0gICc6IGdyYWQubmFtZSB8fCAnJyxcclxuXHRcdFx0R3JkRjogJ0dyZEYuQ3N0UycsXHJcblx0XHRcdEludHI6IHNhbXBsZXMsXHJcblx0XHRcdENscnM6IGdyYWQuY29sb3JTdG9wcy5tYXAocyA9PiAoe1xyXG5cdFx0XHRcdCdDbHIgJzogc2VyaWFsaXplQ29sb3Iocy5jb2xvciksXHJcblx0XHRcdFx0VHlwZTogJ0NscnkuVXNyUycsXHJcblx0XHRcdFx0TGN0bjogTWF0aC5yb3VuZChzLmxvY2F0aW9uICogc2FtcGxlcyksXHJcblx0XHRcdFx0TWRwbjogTWF0aC5yb3VuZCgocy5taWRwb2ludCA/PyAwLjUpICogMTAwKSxcclxuXHRcdFx0fSkpLFxyXG5cdFx0XHRUcm5zOiBncmFkLm9wYWNpdHlTdG9wcy5tYXAocyA9PiAoe1xyXG5cdFx0XHRcdE9wY3Q6IHVuaXRzUGVyY2VudChzLm9wYWNpdHkpLFxyXG5cdFx0XHRcdExjdG46IE1hdGgucm91bmQocy5sb2NhdGlvbiAqIHNhbXBsZXMpLFxyXG5cdFx0XHRcdE1kcG46IE1hdGgucm91bmQoKHMubWlkcG9pbnQgPz8gMC41KSAqIDEwMCksXHJcblx0XHRcdH0pKSxcclxuXHRcdH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdEdyZEY6ICdHcmRGLkNsTnMnLFxyXG5cdFx0XHQnTm0gICc6IGdyYWQubmFtZSB8fCAnJyxcclxuXHRcdFx0U2hUcjogISFncmFkLmFkZFRyYW5zcGFyZW5jeSxcclxuXHRcdFx0VmN0QzogISFncmFkLnJlc3RyaWN0Q29sb3JzLFxyXG5cdFx0XHRDbHJTOiBDbHJTLmVuY29kZShncmFkLmNvbG9yTW9kZWwpLFxyXG5cdFx0XHRSbmRTOiBncmFkLnJhbmRvbVNlZWQgfHwgMCxcclxuXHRcdFx0U210aDogTWF0aC5yb3VuZCgoZ3JhZC5yb3VnaG5lc3MgPz8gMSkgKiA0MDk2KSxcclxuXHRcdFx0J01ubSAnOiAoZ3JhZC5taW4gfHwgWzAsIDAsIDAsIDBdKS5tYXAoeCA9PiB4ICogMTAwKSxcclxuXHRcdFx0J014bSAnOiAoZ3JhZC5tYXggfHwgWzEsIDEsIDEsIDFdKS5tYXAoeCA9PiB4ICogMTAwKSxcclxuXHRcdH07XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZUdyYWRpZW50Q29udGVudChkZXNjcmlwdG9yOiBEZXNjcmlwdG9yR3JhZGllbnRDb250ZW50KSB7XHJcblx0Y29uc3QgcmVzdWx0ID0gcGFyc2VHcmFkaWVudChkZXNjcmlwdG9yLkdyYWQpIGFzIChFZmZlY3RTb2xpZEdyYWRpZW50IHwgRWZmZWN0Tm9pc2VHcmFkaWVudCkgJiBFeHRyYUdyYWRpZW50SW5mbztcclxuXHRyZXN1bHQuc3R5bGUgPSBHcmRULmRlY29kZShkZXNjcmlwdG9yLlR5cGUpO1xyXG5cdGlmIChkZXNjcmlwdG9yLkR0aHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0LmRpdGhlciA9IGRlc2NyaXB0b3IuRHRocjtcclxuXHRpZiAoZGVzY3JpcHRvci5SdnJzICE9PSB1bmRlZmluZWQpIHJlc3VsdC5yZXZlcnNlID0gZGVzY3JpcHRvci5SdnJzO1xyXG5cdGlmIChkZXNjcmlwdG9yLkFuZ2wgIT09IHVuZGVmaW5lZCkgcmVzdWx0LmFuZ2xlID0gcGFyc2VBbmdsZShkZXNjcmlwdG9yLkFuZ2wpO1xyXG5cdGlmIChkZXNjcmlwdG9yWydTY2wgJ10gIT09IHVuZGVmaW5lZCkgcmVzdWx0LnNjYWxlID0gcGFyc2VQZXJjZW50KGRlc2NyaXB0b3JbJ1NjbCAnXSk7XHJcblx0aWYgKGRlc2NyaXB0b3IuQWxnbiAhPT0gdW5kZWZpbmVkKSByZXN1bHQuYWxpZ24gPSBkZXNjcmlwdG9yLkFsZ247XHJcblx0aWYgKGRlc2NyaXB0b3IuT2ZzdCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXN1bHQub2Zmc2V0ID0ge1xyXG5cdFx0XHR4OiBwYXJzZVBlcmNlbnQoZGVzY3JpcHRvci5PZnN0Lkhyem4pLFxyXG5cdFx0XHR5OiBwYXJzZVBlcmNlbnQoZGVzY3JpcHRvci5PZnN0LlZydGMpXHJcblx0XHR9O1xyXG5cdH1cclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwYXJzZVBhdHRlcm5Db250ZW50KGRlc2NyaXB0b3I6IERlc2NyaXB0b3JQYXR0ZXJuQ29udGVudCkge1xyXG5cdGNvbnN0IHJlc3VsdDogRWZmZWN0UGF0dGVybiAmIEV4dHJhUGF0dGVybkluZm8gPSB7XHJcblx0XHRuYW1lOiBkZXNjcmlwdG9yLlB0cm5bJ05tICAnXSxcclxuXHRcdGlkOiBkZXNjcmlwdG9yLlB0cm4uSWRudCxcclxuXHR9O1xyXG5cdGlmIChkZXNjcmlwdG9yLkxua2QgIT09IHVuZGVmaW5lZCkgcmVzdWx0LmxpbmtlZCA9IGRlc2NyaXB0b3IuTG5rZDtcclxuXHRpZiAoZGVzY3JpcHRvci5waGFzZSAhPT0gdW5kZWZpbmVkKSByZXN1bHQucGhhc2UgPSB7IHg6IGRlc2NyaXB0b3IucGhhc2UuSHJ6biwgeTogZGVzY3JpcHRvci5waGFzZS5WcnRjIH07XHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZlY3RvckNvbnRlbnQoZGVzY3JpcHRvcjogRGVzY3JpcHRvclZlY3RvckNvbnRlbnQpOiBWZWN0b3JDb250ZW50IHtcclxuXHRpZiAoJ0dyYWQnIGluIGRlc2NyaXB0b3IpIHtcclxuXHRcdHJldHVybiBwYXJzZUdyYWRpZW50Q29udGVudChkZXNjcmlwdG9yKTtcclxuXHR9IGVsc2UgaWYgKCdQdHJuJyBpbiBkZXNjcmlwdG9yKSB7XHJcblx0XHRyZXR1cm4geyB0eXBlOiAncGF0dGVybicsIC4uLnBhcnNlUGF0dGVybkNvbnRlbnQoZGVzY3JpcHRvcikgfTtcclxuXHR9IGVsc2UgaWYgKCdDbHIgJyBpbiBkZXNjcmlwdG9yKSB7XHJcblx0XHRyZXR1cm4geyB0eXBlOiAnY29sb3InLCBjb2xvcjogcGFyc2VDb2xvcihkZXNjcmlwdG9yWydDbHIgJ10pIH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2ZWN0b3IgY29udGVudCcpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplR3JhZGllbnRDb250ZW50KGNvbnRlbnQ6IChFZmZlY3RTb2xpZEdyYWRpZW50IHwgRWZmZWN0Tm9pc2VHcmFkaWVudCkgJiBFeHRyYUdyYWRpZW50SW5mbykge1xyXG5cdGNvbnN0IHJlc3VsdDogRGVzY3JpcHRvckdyYWRpZW50Q29udGVudCA9IHt9IGFzIGFueTtcclxuXHRpZiAoY29udGVudC5kaXRoZXIgIT09IHVuZGVmaW5lZCkgcmVzdWx0LkR0aHIgPSBjb250ZW50LmRpdGhlcjtcclxuXHRpZiAoY29udGVudC5yZXZlcnNlICE9PSB1bmRlZmluZWQpIHJlc3VsdC5SdnJzID0gY29udGVudC5yZXZlcnNlO1xyXG5cdGlmIChjb250ZW50LmFuZ2xlICE9PSB1bmRlZmluZWQpIHJlc3VsdC5BbmdsID0gdW5pdHNBbmdsZShjb250ZW50LmFuZ2xlKTtcclxuXHRyZXN1bHQuVHlwZSA9IEdyZFQuZW5jb2RlKGNvbnRlbnQuc3R5bGUpO1xyXG5cdGlmIChjb250ZW50LmFsaWduICE9PSB1bmRlZmluZWQpIHJlc3VsdC5BbGduID0gY29udGVudC5hbGlnbjtcclxuXHRpZiAoY29udGVudC5zY2FsZSAhPT0gdW5kZWZpbmVkKSByZXN1bHRbJ1NjbCAnXSA9IHVuaXRzUGVyY2VudChjb250ZW50LnNjYWxlKTtcclxuXHRpZiAoY29udGVudC5vZmZzZXQpIHtcclxuXHRcdHJlc3VsdC5PZnN0ID0ge1xyXG5cdFx0XHRIcnpuOiB1bml0c1BlcmNlbnQoY29udGVudC5vZmZzZXQueCksXHJcblx0XHRcdFZydGM6IHVuaXRzUGVyY2VudChjb250ZW50Lm9mZnNldC55KSxcclxuXHRcdH07XHJcblx0fVxyXG5cdHJlc3VsdC5HcmFkID0gc2VyaWFsaXplR3JhZGllbnQoY29udGVudCk7XHJcblx0cmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2VyaWFsaXplUGF0dGVybkNvbnRlbnQoY29udGVudDogRWZmZWN0UGF0dGVybiAmIEV4dHJhUGF0dGVybkluZm8pIHtcclxuXHRjb25zdCByZXN1bHQ6IERlc2NyaXB0b3JQYXR0ZXJuQ29udGVudCA9IHtcclxuXHRcdFB0cm46IHtcclxuXHRcdFx0J05tICAnOiBjb250ZW50Lm5hbWUgfHwgJycsXHJcblx0XHRcdElkbnQ6IGNvbnRlbnQuaWQgfHwgJycsXHJcblx0XHR9XHJcblx0fTtcclxuXHRpZiAoY29udGVudC5saW5rZWQgIT09IHVuZGVmaW5lZCkgcmVzdWx0Lkxua2QgPSAhIWNvbnRlbnQubGlua2VkO1xyXG5cdGlmIChjb250ZW50LnBoYXNlICE9PSB1bmRlZmluZWQpIHJlc3VsdC5waGFzZSA9IHsgSHJ6bjogY29udGVudC5waGFzZS54LCBWcnRjOiBjb250ZW50LnBoYXNlLnkgfTtcclxuXHRyZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmVjdG9yQ29udGVudChjb250ZW50OiBWZWN0b3JDb250ZW50KTogeyBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yVmVjdG9yQ29udGVudDsga2V5OiBzdHJpbmc7IH0ge1xyXG5cdGlmIChjb250ZW50LnR5cGUgPT09ICdjb2xvcicpIHtcclxuXHRcdHJldHVybiB7IGtleTogJ1NvQ28nLCBkZXNjcmlwdG9yOiB7ICdDbHIgJzogc2VyaWFsaXplQ29sb3IoY29udGVudC5jb2xvcikgfSB9O1xyXG5cdH0gZWxzZSBpZiAoY29udGVudC50eXBlID09PSAncGF0dGVybicpIHtcclxuXHRcdHJldHVybiB7IGtleTogJ1B0RmwnLCBkZXNjcmlwdG9yOiBzZXJpYWxpemVQYXR0ZXJuQ29udGVudChjb250ZW50KSB9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHRyZXR1cm4geyBrZXk6ICdHZEZsJywgZGVzY3JpcHRvcjogc2VyaWFsaXplR3JhZGllbnRDb250ZW50KGNvbnRlbnQpIH07XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb2xvcihjb2xvcjogRGVzY3JpcHRvckNvbG9yKTogQ29sb3Ige1xyXG5cdGlmICgnSCAgICcgaW4gY29sb3IpIHtcclxuXHRcdHJldHVybiB7IGg6IHBhcnNlUGVyY2VudE9yQW5nbGUoY29sb3JbJ0ggICAnXSksIHM6IGNvbG9yLlN0cnQsIGI6IGNvbG9yLkJyZ2ggfTtcclxuXHR9IGVsc2UgaWYgKCdSZCAgJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgcjogY29sb3JbJ1JkICAnXSwgZzogY29sb3JbJ0dybiAnXSwgYjogY29sb3JbJ0JsICAnXSB9O1xyXG5cdH0gZWxzZSBpZiAoJ0N5biAnIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyBjOiBjb2xvclsnQ3luICddLCBtOiBjb2xvci5NZ250LCB5OiBjb2xvclsnWWx3ICddLCBrOiBjb2xvci5CbGNrIH07XHJcblx0fSBlbHNlIGlmICgnR3J5ICcgaW4gY29sb3IpIHtcclxuXHRcdHJldHVybiB7IGs6IGNvbG9yWydHcnkgJ10gfTtcclxuXHR9IGVsc2UgaWYgKCdMbW5jJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgbDogY29sb3IuTG1uYywgYTogY29sb3JbJ0EgICAnXSwgYjogY29sb3JbJ0IgICAnXSB9O1xyXG5cdH0gZWxzZSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbG9yIGRlc2NyaXB0b3InKTtcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb2xvcihjb2xvcjogQ29sb3IgfCB1bmRlZmluZWQpOiBEZXNjcmlwdG9yQ29sb3Ige1xyXG5cdGlmICghY29sb3IpIHtcclxuXHRcdHJldHVybiB7ICdSZCAgJzogMCwgJ0dybiAnOiAwLCAnQmwgICc6IDAgfTtcclxuXHR9IGVsc2UgaWYgKCdyJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgJ1JkICAnOiBjb2xvci5yIHx8IDAsICdHcm4gJzogY29sb3IuZyB8fCAwLCAnQmwgICc6IGNvbG9yLmIgfHwgMCB9O1xyXG5cdH0gZWxzZSBpZiAoJ2gnIGluIGNvbG9yKSB7XHJcblx0XHRyZXR1cm4geyAnSCAgICc6IHVuaXRzQW5nbGUoY29sb3IuaCAqIDM2MCksIFN0cnQ6IGNvbG9yLnMgfHwgMCwgQnJnaDogY29sb3IuYiB8fCAwIH07XHJcblx0fSBlbHNlIGlmICgnYycgaW4gY29sb3IpIHtcclxuXHRcdHJldHVybiB7ICdDeW4gJzogY29sb3IuYyB8fCAwLCBNZ250OiBjb2xvci5tIHx8IDAsICdZbHcgJzogY29sb3IueSB8fCAwLCBCbGNrOiBjb2xvci5rIHx8IDAgfTtcclxuXHR9IGVsc2UgaWYgKCdsJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgTG1uYzogY29sb3IubCB8fCAwLCAnQSAgICc6IGNvbG9yLmEgfHwgMCwgJ0IgICAnOiBjb2xvci5iIHx8IDAgfTtcclxuXHR9IGVsc2UgaWYgKCdrJyBpbiBjb2xvcikge1xyXG5cdFx0cmV0dXJuIHsgJ0dyeSAnOiBjb2xvci5rIH07XHJcblx0fSBlbHNlIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2xvciB2YWx1ZScpO1xyXG5cdH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQW5nbGUoeDogRGVzY3JpcHRvclVuaXRzVmFsdWUpIHtcclxuXHRpZiAoeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMDtcclxuXHRpZiAoeC51bml0cyAhPT0gJ0FuZ2xlJykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke3gudW5pdHN9YCk7XHJcblx0cmV0dXJuIHgudmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBlcmNlbnQoeDogRGVzY3JpcHRvclVuaXRzVmFsdWUgfCB1bmRlZmluZWQpIHtcclxuXHRpZiAoeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcclxuXHRpZiAoeC51bml0cyAhPT0gJ1BlcmNlbnQnKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHM6ICR7eC51bml0c31gKTtcclxuXHRyZXR1cm4geC52YWx1ZSAvIDEwMDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGVyY2VudE9yQW5nbGUoeDogRGVzY3JpcHRvclVuaXRzVmFsdWUgfCB1bmRlZmluZWQpIHtcclxuXHRpZiAoeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gMTtcclxuXHRpZiAoeC51bml0cyA9PT0gJ1BlcmNlbnQnKSByZXR1cm4geC52YWx1ZSAvIDEwMDtcclxuXHRpZiAoeC51bml0cyA9PT0gJ0FuZ2xlJykgcmV0dXJuIHgudmFsdWUgLyAzNjA7XHJcblx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke3gudW5pdHN9YCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRzKHsgdW5pdHMsIHZhbHVlIH06IERlc2NyaXB0b3JVbml0c1ZhbHVlKTogVW5pdHNWYWx1ZSB7XHJcblx0aWYgKFxyXG5cdFx0dW5pdHMgIT09ICdQaXhlbHMnICYmIHVuaXRzICE9PSAnTWlsbGltZXRlcnMnICYmIHVuaXRzICE9PSAnUG9pbnRzJyAmJiB1bml0cyAhPT0gJ05vbmUnICYmXHJcblx0XHR1bml0cyAhPT0gJ1BpY2FzJyAmJiB1bml0cyAhPT0gJ0luY2hlcycgJiYgdW5pdHMgIT09ICdDZW50aW1ldGVycycgJiYgdW5pdHMgIT09ICdEZW5zaXR5J1xyXG5cdCkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHVuaXRzOiAke0pTT04uc3RyaW5naWZ5KHsgdW5pdHMsIHZhbHVlIH0pfWApO1xyXG5cdH1cclxuXHRyZXR1cm4geyB2YWx1ZSwgdW5pdHMgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pdHNPck51bWJlcih2YWx1ZTogRGVzY3JpcHRvclVuaXRzVmFsdWUgfCBudW1iZXIsIHVuaXRzOiBVbml0cyA9ICdQaXhlbHMnKTogVW5pdHNWYWx1ZSB7XHJcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiB7IHZhbHVlLCB1bml0cyB9O1xyXG5cdHJldHVybiBwYXJzZVVuaXRzKHZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pdHNUb051bWJlcih7IHVuaXRzLCB2YWx1ZSB9OiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSwgZXhwZWN0ZWRVbml0czogc3RyaW5nKTogbnVtYmVyIHtcclxuXHRpZiAodW5pdHMgIT09IGV4cGVjdGVkVW5pdHMpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bml0czogJHtKU09OLnN0cmluZ2lmeSh7IHVuaXRzLCB2YWx1ZSB9KX1gKTtcclxuXHRyZXR1cm4gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bml0c0FuZ2xlKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpOiBEZXNjcmlwdG9yVW5pdHNWYWx1ZSB7XHJcblx0cmV0dXJuIHsgdW5pdHM6ICdBbmdsZScsIHZhbHVlOiB2YWx1ZSB8fCAwIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bml0c1BlcmNlbnQodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IERlc2NyaXB0b3JVbml0c1ZhbHVlIHtcclxuXHRyZXR1cm4geyB1bml0czogJ1BlcmNlbnQnLCB2YWx1ZTogTWF0aC5yb3VuZCgodmFsdWUgfHwgMCkgKiAxMDApIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1bml0c1ZhbHVlKHg6IFVuaXRzVmFsdWUgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogRGVzY3JpcHRvclVuaXRzVmFsdWUge1xyXG5cdGlmICh4ID09IG51bGwpIHJldHVybiB7IHVuaXRzOiAnUGl4ZWxzJywgdmFsdWU6IDAgfTtcclxuXHJcblx0aWYgKHR5cGVvZiB4ICE9PSAnb2JqZWN0JylcclxuXHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh4KX0gKGtleTogJHtrZXl9KSAoc2hvdWxkIGhhdmUgdmFsdWUgYW5kIHVuaXRzKWApO1xyXG5cclxuXHRjb25zdCB7IHVuaXRzLCB2YWx1ZSB9ID0geDtcclxuXHJcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicpXHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdmFsdWUgaW4gJHtKU09OLnN0cmluZ2lmeSh4KX0gKGtleTogJHtrZXl9KWApO1xyXG5cclxuXHRpZiAoXHJcblx0XHR1bml0cyAhPT0gJ1BpeGVscycgJiYgdW5pdHMgIT09ICdNaWxsaW1ldGVycycgJiYgdW5pdHMgIT09ICdQb2ludHMnICYmIHVuaXRzICE9PSAnTm9uZScgJiZcclxuXHRcdHVuaXRzICE9PSAnUGljYXMnICYmIHVuaXRzICE9PSAnSW5jaGVzJyAmJiB1bml0cyAhPT0gJ0NlbnRpbWV0ZXJzJyAmJiB1bml0cyAhPT0gJ0RlbnNpdHknXHJcblx0KSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdW5pdHMgaW4gJHtKU09OLnN0cmluZ2lmeSh4KX0gKGtleTogJHtrZXl9KWApO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHsgdW5pdHMsIHZhbHVlIH07XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB0ZXh0R3JpZGRpbmcgPSBjcmVhdGVFbnVtPFRleHRHcmlkZGluZz4oJ3RleHRHcmlkZGluZycsICdub25lJywge1xyXG5cdG5vbmU6ICdOb25lJyxcclxuXHRyb3VuZDogJ1JuZCAnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBPcm50ID0gY3JlYXRlRW51bTxPcmllbnRhdGlvbj4oJ09ybnQnLCAnaG9yaXpvbnRhbCcsIHtcclxuXHRob3Jpem9udGFsOiAnSHJ6bicsXHJcblx0dmVydGljYWw6ICdWcnRjJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgQW5udCA9IGNyZWF0ZUVudW08QW50aUFsaWFzPignQW5udCcsICdzaGFycCcsIHtcclxuXHRub25lOiAnQW5ubycsXHJcblx0c2hhcnA6ICdhbnRpQWxpYXNTaGFycCcsXHJcblx0Y3Jpc3A6ICdBbkNyJyxcclxuXHRzdHJvbmc6ICdBblN0JyxcclxuXHRzbW9vdGg6ICdBblNtJyxcclxuXHRwbGF0Zm9ybTogJ2FudGlBbGlhc1BsYXRmb3JtR3JheScsXHJcblx0cGxhdGZvcm1MQ0Q6ICdhbnRpQWxpYXNQbGF0Zm9ybUxDRCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHdhcnBTdHlsZSA9IGNyZWF0ZUVudW08V2FycFN0eWxlPignd2FycFN0eWxlJywgJ25vbmUnLCB7XHJcblx0bm9uZTogJ3dhcnBOb25lJyxcclxuXHRhcmM6ICd3YXJwQXJjJyxcclxuXHRhcmNMb3dlcjogJ3dhcnBBcmNMb3dlcicsXHJcblx0YXJjVXBwZXI6ICd3YXJwQXJjVXBwZXInLFxyXG5cdGFyY2g6ICd3YXJwQXJjaCcsXHJcblx0YnVsZ2U6ICd3YXJwQnVsZ2UnLFxyXG5cdHNoZWxsTG93ZXI6ICd3YXJwU2hlbGxMb3dlcicsXHJcblx0c2hlbGxVcHBlcjogJ3dhcnBTaGVsbFVwcGVyJyxcclxuXHRmbGFnOiAnd2FycEZsYWcnLFxyXG5cdHdhdmU6ICd3YXJwV2F2ZScsXHJcblx0ZmlzaDogJ3dhcnBGaXNoJyxcclxuXHRyaXNlOiAnd2FycFJpc2UnLFxyXG5cdGZpc2hleWU6ICd3YXJwRmlzaGV5ZScsXHJcblx0aW5mbGF0ZTogJ3dhcnBJbmZsYXRlJyxcclxuXHRzcXVlZXplOiAnd2FycFNxdWVlemUnLFxyXG5cdHR3aXN0OiAnd2FycFR3aXN0JyxcclxuXHRjdXN0b206ICd3YXJwQ3VzdG9tJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgQmxuTSA9IGNyZWF0ZUVudW08QmxlbmRNb2RlPignQmxuTScsICdub3JtYWwnLCB7XHJcblx0J25vcm1hbCc6ICdOcm1sJyxcclxuXHQnZGlzc29sdmUnOiAnRHNsdicsXHJcblx0J2Rhcmtlbic6ICdEcmtuJyxcclxuXHQnbXVsdGlwbHknOiAnTWx0cCcsXHJcblx0J2NvbG9yIGJ1cm4nOiAnQ0JybicsXHJcblx0J2xpbmVhciBidXJuJzogJ2xpbmVhckJ1cm4nLFxyXG5cdCdkYXJrZXIgY29sb3InOiAnZGFya2VyQ29sb3InLFxyXG5cdCdsaWdodGVuJzogJ0xnaG4nLFxyXG5cdCdzY3JlZW4nOiAnU2NybicsXHJcblx0J2NvbG9yIGRvZGdlJzogJ0NEZGcnLFxyXG5cdCdsaW5lYXIgZG9kZ2UnOiAnbGluZWFyRG9kZ2UnLFxyXG5cdCdsaWdodGVyIGNvbG9yJzogJ2xpZ2h0ZXJDb2xvcicsXHJcblx0J292ZXJsYXknOiAnT3ZybCcsXHJcblx0J3NvZnQgbGlnaHQnOiAnU2Z0TCcsXHJcblx0J2hhcmQgbGlnaHQnOiAnSHJkTCcsXHJcblx0J3ZpdmlkIGxpZ2h0JzogJ3ZpdmlkTGlnaHQnLFxyXG5cdCdsaW5lYXIgbGlnaHQnOiAnbGluZWFyTGlnaHQnLFxyXG5cdCdwaW4gbGlnaHQnOiAncGluTGlnaHQnLFxyXG5cdCdoYXJkIG1peCc6ICdoYXJkTWl4JyxcclxuXHQnZGlmZmVyZW5jZSc6ICdEZnJuJyxcclxuXHQnZXhjbHVzaW9uJzogJ1hjbHUnLFxyXG5cdCdzdWJ0cmFjdCc6ICdibGVuZFN1YnRyYWN0aW9uJyxcclxuXHQnZGl2aWRlJzogJ2JsZW5kRGl2aWRlJyxcclxuXHQnaHVlJzogJ0ggICAnLFxyXG5cdCdzYXR1cmF0aW9uJzogJ1N0cnQnLFxyXG5cdCdjb2xvcic6ICdDbHIgJyxcclxuXHQnbHVtaW5vc2l0eSc6ICdMbW5zJyxcclxuXHQvLyB1c2VkIGluIEFCUlxyXG5cdCdsaW5lYXIgaGVpZ2h0JzogJ2xpbmVhckhlaWdodCcsXHJcblx0J2hlaWdodCc6ICdIZ2h0JyxcclxuXHQnc3VidHJhY3Rpb24nOiAnU2J0cicsIC8vIDJuZCB2ZXJzaW9uIG9mIHN1YnRyYWN0ID9cclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgQkVTbCA9IGNyZWF0ZUVudW08QmV2ZWxTdHlsZT4oJ0JFU2wnLCAnaW5uZXIgYmV2ZWwnLCB7XHJcblx0J2lubmVyIGJldmVsJzogJ0luckInLFxyXG5cdCdvdXRlciBiZXZlbCc6ICdPdHJCJyxcclxuXHQnZW1ib3NzJzogJ0VtYnMnLFxyXG5cdCdwaWxsb3cgZW1ib3NzJzogJ1BsRWInLFxyXG5cdCdzdHJva2UgZW1ib3NzJzogJ3N0cm9rZUVtYm9zcycsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJ2bFQgPSBjcmVhdGVFbnVtPEJldmVsVGVjaG5pcXVlPignYnZsVCcsICdzbW9vdGgnLCB7XHJcblx0J3Ntb290aCc6ICdTZkJMJyxcclxuXHQnY2hpc2VsIGhhcmQnOiAnUHJCTCcsXHJcblx0J2NoaXNlbCBzb2Z0JzogJ1NsbXQnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBCRVNzID0gY3JlYXRlRW51bTxCZXZlbERpcmVjdGlvbj4oJ0JFU3MnLCAndXAnLCB7XHJcblx0dXA6ICdJbiAgJyxcclxuXHRkb3duOiAnT3V0ICcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJFVEUgPSBjcmVhdGVFbnVtPEdsb3dUZWNobmlxdWU+KCdCRVRFJywgJ3NvZnRlcicsIHtcclxuXHRzb2Z0ZXI6ICdTZkJMJyxcclxuXHRwcmVjaXNlOiAnUHJCTCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IElHU3IgPSBjcmVhdGVFbnVtPEdsb3dTb3VyY2U+KCdJR1NyJywgJ2VkZ2UnLCB7XHJcblx0ZWRnZTogJ1NyY0UnLFxyXG5cdGNlbnRlcjogJ1NyY0MnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBHcmRUID0gY3JlYXRlRW51bTxHcmFkaWVudFN0eWxlPignR3JkVCcsICdsaW5lYXInLCB7XHJcblx0bGluZWFyOiAnTG5yICcsXHJcblx0cmFkaWFsOiAnUmRsICcsXHJcblx0YW5nbGU6ICdBbmdsJyxcclxuXHRyZWZsZWN0ZWQ6ICdSZmxjJyxcclxuXHRkaWFtb25kOiAnRG1uZCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGFuaW1JbnRlcnBTdHlsZUVudW0gPSBjcmVhdGVFbnVtPFRpbWVsaW5lS2V5SW50ZXJwb2xhdGlvbj4oJ2FuaW1JbnRlcnBTdHlsZScsICdsaW5lYXInLCB7XHJcblx0bGluZWFyOiAnTG5yICcsXHJcblx0aG9sZDogJ2hvbGQnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBzdGRUcmFja0lEID0gY3JlYXRlRW51bTxUaW1lbGluZVRyYWNrVHlwZT4oJ3N0ZFRyYWNrSUQnLCAnb3BhY2l0eScsIHtcclxuXHRvcGFjaXR5OiAnb3BhY2l0eVRyYWNrJyxcclxuXHRzdHlsZTogJ3N0eWxlVHJhY2snLFxyXG5cdHNoZWV0VHJhbnNmb3JtOiAnc2hlZXRUcmFuc2Zvcm1UcmFjaycsXHJcblx0c2hlZXRQb3NpdGlvbjogJ3NoZWV0UG9zaXRpb25UcmFjaycsXHJcblx0Z2xvYmFsTGlnaHRpbmc6ICdnbG9iYWxMaWdodGluZ1RyYWNrJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3QgZ3JhZGllbnRJbnRlcnBvbGF0aW9uTWV0aG9kVHlwZSA9IGNyZWF0ZUVudW08SW50ZXJwb2xhdGlvbk1ldGhvZD4oJ2dyYWRpZW50SW50ZXJwb2xhdGlvbk1ldGhvZFR5cGUnLCAncGVyY2VwdHVhbCcsIHtcclxuXHRwZXJjZXB0dWFsOiAnUGVyYycsXHJcblx0bGluZWFyOiAnTG5yJyxcclxuXHRjbGFzc2ljOiAnR2NscycsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IENsclMgPSBjcmVhdGVFbnVtPCdyZ2InIHwgJ2hzYicgfCAnbGFiJz4oJ0NsclMnLCAncmdiJywge1xyXG5cdHJnYjogJ1JHQkMnLFxyXG5cdGhzYjogJ0hTQmwnLFxyXG5cdGxhYjogJ0xiQ2wnLFxyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBGU3RsID0gY3JlYXRlRW51bTwnaW5zaWRlJyB8ICdjZW50ZXInIHwgJ291dHNpZGUnPignRlN0bCcsICdvdXRzaWRlJywge1xyXG5cdG91dHNpZGU6ICdPdXRGJyxcclxuXHRjZW50ZXI6ICdDdHJGJyxcclxuXHRpbnNpZGU6ICdJbnNGJ1xyXG59KTtcclxuXHJcbmV4cG9ydCBjb25zdCBGckZsID0gY3JlYXRlRW51bTwnY29sb3InIHwgJ2dyYWRpZW50JyB8ICdwYXR0ZXJuJz4oJ0ZyRmwnLCAnY29sb3InLCB7XHJcblx0Y29sb3I6ICdTQ2xyJyxcclxuXHRncmFkaWVudDogJ0dyRmwnLFxyXG5cdHBhdHRlcm46ICdQdHJuJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3Qgc3Ryb2tlU3R5bGVMaW5lQ2FwVHlwZSA9IGNyZWF0ZUVudW08TGluZUNhcFR5cGU+KCdzdHJva2VTdHlsZUxpbmVDYXBUeXBlJywgJ2J1dHQnLCB7XHJcblx0YnV0dDogJ3N0cm9rZVN0eWxlQnV0dENhcCcsXHJcblx0cm91bmQ6ICdzdHJva2VTdHlsZVJvdW5kQ2FwJyxcclxuXHRzcXVhcmU6ICdzdHJva2VTdHlsZVNxdWFyZUNhcCcsXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IHN0cm9rZVN0eWxlTGluZUpvaW5UeXBlID0gY3JlYXRlRW51bTxMaW5lSm9pblR5cGU+KCdzdHJva2VTdHlsZUxpbmVKb2luVHlwZScsICdtaXRlcicsIHtcclxuXHRtaXRlcjogJ3N0cm9rZVN0eWxlTWl0ZXJKb2luJyxcclxuXHRyb3VuZDogJ3N0cm9rZVN0eWxlUm91bmRKb2luJyxcclxuXHRiZXZlbDogJ3N0cm9rZVN0eWxlQmV2ZWxKb2luJyxcclxufSk7XHJcblxyXG5leHBvcnQgY29uc3Qgc3Ryb2tlU3R5bGVMaW5lQWxpZ25tZW50ID0gY3JlYXRlRW51bTxMaW5lQWxpZ25tZW50Pignc3Ryb2tlU3R5bGVMaW5lQWxpZ25tZW50JywgJ2luc2lkZScsIHtcclxuXHRpbnNpZGU6ICdzdHJva2VTdHlsZUFsaWduSW5zaWRlJyxcclxuXHRjZW50ZXI6ICdzdHJva2VTdHlsZUFsaWduQ2VudGVyJyxcclxuXHRvdXRzaWRlOiAnc3Ryb2tlU3R5bGVBbGlnbk91dHNpZGUnLFxyXG59KTtcclxuIl0sInNvdXJjZVJvb3QiOiJDOlxcUHJvamVjdHNcXGdpdGh1YlxcYWctcHNkXFxzcmMifQ==
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.strokeStyleLineAlignment = exports.strokeStyleLineJoinType = exports.strokeStyleLineCapType = exports.ESliceBGColorType = exports.ESliceOrigin = exports.ESliceVertAlign = exports.ESliceHorzAlign = exports.ESliceType = exports.FrFl = exports.FStl = exports.ClrS = exports.gradientInterpolationMethodType = exports.stdTrackID = exports.animInterpStyleEnum = exports.GrdT = exports.IGSr = exports.BETE = exports.BESs = exports.bvlT = exports.BESl = exports.BlnM = exports.warpStyle = exports.Annt = exports.Ornt = exports.textGridding = exports.unitsValue = exports.unitsPercent = exports.unitsAngle = exports.parseUnitsToNumber = exports.parseUnitsOrNumber = exports.parseUnits = exports.parsePercentOrAngle = exports.parsePercent = exports.parseAngle = exports.serializeColor = exports.parseColor = exports.serializeVectorContent = exports.parseVectorContent = exports.serializeTrackList = exports.parseTrackList = exports.parseEffects = exports.serializeEffects = exports.xyToHorzVrtc = exports.horzVrtcToXY = exports.writeVersionAndDescriptor = exports.readVersionAndDescriptor = exports.writeDescriptorStructure = exports.readDescriptorStructure = exports.readAsciiStringOrClassId = exports.setLogErrors = void 0;
15
+ var helpers_1 = require("./helpers");
16
+ var psdReader_1 = require("./psdReader");
17
+ var psdWriter_1 = require("./psdWriter");
18
+ function revMap(map) {
19
+ var result = {};
20
+ Object.keys(map).forEach(function (key) { return result[map[key]] = key; });
21
+ return result;
22
+ }
23
+ var unitsMap = {
24
+ '#Ang': 'Angle',
25
+ '#Rsl': 'Density',
26
+ '#Rlt': 'Distance',
27
+ '#Nne': 'None',
28
+ '#Prc': 'Percent',
29
+ '#Pxl': 'Pixels',
30
+ '#Mlm': 'Millimeters',
31
+ '#Pnt': 'Points',
32
+ 'RrPi': 'Picas',
33
+ 'RrIn': 'Inches',
34
+ 'RrCm': 'Centimeters',
35
+ };
36
+ var unitsMapRev = revMap(unitsMap);
37
+ var logErrors = false;
38
+ function setLogErrors(value) {
39
+ logErrors = value;
40
+ }
41
+ exports.setLogErrors = setLogErrors;
42
+ function makeType(name, classID) {
43
+ return { name: name, classID: classID };
44
+ }
45
+ var nullType = makeType('', 'null');
46
+ var fieldToExtType = {
47
+ strokeStyleContent: makeType('', 'solidColorLayer'),
48
+ // printProofSetup: makeType('校样设置', 'proofSetup'), // TESTING
49
+ printProofSetup: makeType('Proof Setup', 'proofSetup'),
50
+ patternFill: makeType('', 'patternFill'),
51
+ Grad: makeType('Gradient', 'Grdn'),
52
+ ebbl: makeType('', 'ebbl'),
53
+ SoFi: makeType('', 'SoFi'),
54
+ GrFl: makeType('', 'GrFl'),
55
+ sdwC: makeType('', 'RGBC'),
56
+ hglC: makeType('', 'RGBC'),
57
+ 'Clr ': makeType('', 'RGBC'),
58
+ 'tintColor': makeType('', 'RGBC'),
59
+ Ofst: makeType('', 'Pnt '),
60
+ ChFX: makeType('', 'ChFX'),
61
+ MpgS: makeType('', 'ShpC'),
62
+ DrSh: makeType('', 'DrSh'),
63
+ IrSh: makeType('', 'IrSh'),
64
+ OrGl: makeType('', 'OrGl'),
65
+ IrGl: makeType('', 'IrGl'),
66
+ TrnS: makeType('', 'ShpC'),
67
+ Ptrn: makeType('', 'Ptrn'),
68
+ FrFX: makeType('', 'FrFX'),
69
+ phase: makeType('', 'Pnt '),
70
+ frameStep: nullType,
71
+ duration: nullType,
72
+ workInTime: nullType,
73
+ workOutTime: nullType,
74
+ audioClipGroupList: nullType,
75
+ bounds: makeType('', 'Rctn'),
76
+ customEnvelopeWarp: makeType('', 'customEnvelopeWarp'),
77
+ warp: makeType('', 'warp'),
78
+ 'Sz ': makeType('', 'Pnt '),
79
+ origin: makeType('', 'Pnt '),
80
+ autoExpandOffset: makeType('', 'Pnt '),
81
+ keyOriginShapeBBox: makeType('', 'unitRect'),
82
+ Vrsn: nullType,
83
+ psVersion: nullType,
84
+ docDefaultNewArtboardBackgroundColor: makeType('', 'RGBC'),
85
+ artboardRect: makeType('', 'classFloatRect'),
86
+ keyOriginRRectRadii: makeType('', 'radii'),
87
+ keyOriginBoxCorners: nullType,
88
+ rectangleCornerA: makeType('', 'Pnt '),
89
+ rectangleCornerB: makeType('', 'Pnt '),
90
+ rectangleCornerC: makeType('', 'Pnt '),
91
+ rectangleCornerD: makeType('', 'Pnt '),
92
+ compInfo: nullType,
93
+ Trnf: makeType('Transform', 'Trnf'),
94
+ quiltWarp: makeType('', 'quiltWarp'),
95
+ generatorSettings: nullType,
96
+ crema: nullType,
97
+ FrIn: nullType,
98
+ blendOptions: nullType,
99
+ FXRf: nullType,
100
+ Lefx: nullType,
101
+ time: nullType,
102
+ animKey: nullType,
103
+ timeScope: nullType,
104
+ inTime: nullType,
105
+ outTime: nullType,
106
+ sheetStyle: nullType,
107
+ translation: nullType,
108
+ Skew: nullType,
109
+ 'Lnk ': makeType('', 'ExternalFileLink'),
110
+ frameReader: makeType('', 'FrameReader'),
111
+ effectParams: makeType('', 'motionTrackEffectParams'),
112
+ };
113
+ var fieldToArrayExtType = {
114
+ 'Crv ': makeType('', 'CrPt'),
115
+ Clrs: makeType('', 'Clrt'),
116
+ Trns: makeType('', 'TrnS'),
117
+ keyDescriptorList: nullType,
118
+ solidFillMulti: makeType('', 'SoFi'),
119
+ gradientFillMulti: makeType('', 'GrFl'),
120
+ dropShadowMulti: makeType('', 'DrSh'),
121
+ innerShadowMulti: makeType('', 'IrSh'),
122
+ frameFXMulti: makeType('', 'FrFX'),
123
+ FrIn: nullType,
124
+ FSts: nullType,
125
+ LaSt: nullType,
126
+ sheetTimelineOptions: nullType,
127
+ trackList: makeType('', 'animationTrack'),
128
+ globalTrackList: makeType('', 'animationTrack'),
129
+ keyList: nullType,
130
+ audioClipGroupList: nullType,
131
+ audioClipList: nullType,
132
+ countObjectList: makeType('', 'countObject'),
133
+ countGroupList: makeType('', 'countGroup'),
134
+ slices: makeType('', 'slice'),
135
+ };
136
+ var typeToField = {
137
+ 'TEXT': [
138
+ 'Txt ', 'printerName', 'Nm ', 'Idnt', 'blackAndWhitePresetFileName', 'LUT3DFileName',
139
+ 'presetFileName', 'curvesPresetFileName', 'mixerPresetFileName', 'placed', 'description', 'reason',
140
+ 'artboardPresetName', 'json', 'clipID', 'relPath', 'fullPath', 'mediaDescriptor', 'Msge',
141
+ 'altTag', 'url', 'cellText',
142
+ ],
143
+ 'tdta': ['EngineData', 'LUT3DFileData'],
144
+ 'long': [
145
+ 'TextIndex', 'RndS', 'Mdpn', 'Smth', 'Lctn', 'strokeStyleVersion', 'LaID', 'Vrsn', 'Cnt ',
146
+ 'Brgh', 'Cntr', 'means', 'vibrance', 'Strt', 'bwPresetKind', 'presetKind', 'comp', 'compID', 'originalCompID',
147
+ 'curvesPresetKind', 'mixerPresetKind', 'uOrder', 'vOrder', 'PgNm', 'totalPages', 'Crop',
148
+ 'numerator', 'denominator', 'frameCount', 'Annt', 'keyOriginType', 'unitValueQuadVersion',
149
+ 'keyOriginIndex', 'major', 'minor', 'fix', 'docDefaultNewArtboardBackgroundType', 'artboardBackgroundType',
150
+ 'numModifyingFX', 'deformNumRows', 'deformNumCols', 'FrID', 'FrDl', 'FsID', 'LCnt', 'AFrm', 'AFSt',
151
+ 'numBefore', 'numAfter', 'Spcn', 'minOpacity', 'maxOpacity', 'BlnM', 'sheetID', 'gblA', 'globalAltitude',
152
+ 'descVersion', 'frameReaderType', 'LyrI', 'zoomOrigin', 'fontSize', 'Rds ', 'sliceID',
153
+ 'topOutset', 'leftOutset', 'bottomOutset', 'rightOutset',
154
+ ],
155
+ 'enum': [
156
+ 'textGridding', 'Ornt', 'warpStyle', 'warpRotate', 'Inte', 'Bltn', 'ClrS',
157
+ 'sdwM', 'hglM', 'bvlT', 'bvlS', 'bvlD', 'Md ', 'glwS', 'GrdF', 'GlwT',
158
+ 'strokeStyleLineCapType', 'strokeStyleLineJoinType', 'strokeStyleLineAlignment',
159
+ 'strokeStyleBlendMode', 'PntT', 'Styl', 'lookupType', 'LUTFormat', 'dataOrder',
160
+ 'tableOrder', 'enableCompCore', 'enableCompCoreGPU', 'compCoreSupport', 'compCoreGPUSupport', 'Engn',
161
+ 'enableCompCoreThreads', 'gs99', 'FrDs', 'trackID', 'animInterpStyle', 'horzAlign',
162
+ 'vertAlign', 'bgColorType',
163
+ ],
164
+ 'bool': [
165
+ 'PstS', 'printSixteenBit', 'masterFXSwitch', 'enab', 'uglg', 'antialiasGloss',
166
+ 'useShape', 'useTexture', 'uglg', 'antialiasGloss', 'useShape', 'Vsbl',
167
+ 'useTexture', 'Algn', 'Rvrs', 'Dthr', 'Invr', 'VctC', 'ShTr', 'layerConceals',
168
+ 'strokeEnabled', 'fillEnabled', 'strokeStyleScaleLock', 'strokeStyleStrokeAdjust',
169
+ 'hardProof', 'MpBl', 'paperWhite', 'useLegacy', 'Auto', 'Lab ', 'useTint', 'keyShapeInvalidated',
170
+ 'autoExpandEnabled', 'autoNestEnabled', 'autoPositionEnabled', 'shrinkwrapOnSaveEnabled',
171
+ 'present', 'showInDialog', 'overprint', 'sheetDisclosed', 'lightsDisclosed', 'meshesDisclosed',
172
+ 'materialsDisclosed', 'hasMotion', 'muted', 'Effc', 'selected', 'autoScope', 'fillCanvas',
173
+ 'cellTextIsHTML',
174
+ ],
175
+ 'doub': [
176
+ 'warpValue', 'warpPerspective', 'warpPerspectiveOther', 'Intr', 'Wdth', 'Hght',
177
+ 'strokeStyleMiterLimit', 'strokeStyleResolution', 'layerTime', 'keyOriginResolution',
178
+ 'xx', 'xy', 'yx', 'yy', 'tx', 'ty', 'FrGA', 'frameRate', 'audioLevel', 'rotation',
179
+ 'X ', 'Y ',
180
+ ],
181
+ 'UntF': [
182
+ 'Scl ', 'sdwO', 'hglO', 'lagl', 'Lald', 'srgR', 'blur', 'Sftn', 'Opct', 'Dstn', 'Angl',
183
+ 'Ckmt', 'Nose', 'Inpr', 'ShdN', 'strokeStyleLineWidth', 'strokeStyleLineDashOffset',
184
+ 'strokeStyleOpacity', 'H ', 'Top ', 'Left', 'Btom', 'Rght', 'Rslt',
185
+ 'topRight', 'topLeft', 'bottomLeft', 'bottomRight',
186
+ ],
187
+ 'VlLs': [
188
+ 'Crv ', 'Clrs', 'Mnm ', 'Mxm ', 'Trns', 'pathList', 'strokeStyleLineDashSet', 'FrLs', 'slices',
189
+ 'LaSt', 'Trnf', 'nonAffineTransform', 'keyDescriptorList', 'guideIndeces', 'gradientFillMulti',
190
+ 'solidFillMulti', 'frameFXMulti', 'innerShadowMulti', 'dropShadowMulti', 'FrIn', 'FSts', 'FsFr',
191
+ 'sheetTimelineOptions', 'audioClipList', 'trackList', 'globalTrackList', 'keyList', 'audioClipList',
192
+ 'warpValues',
193
+ ],
194
+ 'ObAr': ['meshPoints', 'quiltSliceX', 'quiltSliceY'],
195
+ 'obj ': ['null'],
196
+ };
197
+ var channels = [
198
+ 'Rd ', 'Grn ', 'Bl ', 'Yllw', 'Ylw ', 'Cyn ', 'Mgnt', 'Blck', 'Gry ', 'Lmnc', 'A ', 'B ',
199
+ ];
200
+ var fieldToArrayType = {
201
+ 'Mnm ': 'long',
202
+ 'Mxm ': 'long',
203
+ 'FrLs': 'long',
204
+ 'strokeStyleLineDashSet': 'UntF',
205
+ 'Trnf': 'doub',
206
+ 'nonAffineTransform': 'doub',
207
+ 'keyDescriptorList': 'Objc',
208
+ 'gradientFillMulti': 'Objc',
209
+ 'solidFillMulti': 'Objc',
210
+ 'frameFXMulti': 'Objc',
211
+ 'innerShadowMulti': 'Objc',
212
+ 'dropShadowMulti': 'Objc',
213
+ 'LaSt': 'Objc',
214
+ 'FrIn': 'Objc',
215
+ 'FSts': 'Objc',
216
+ 'FsFr': 'long',
217
+ 'blendOptions': 'Objc',
218
+ 'sheetTimelineOptions': 'Objc',
219
+ 'keyList': 'Objc',
220
+ 'warpValues': 'doub',
221
+ };
222
+ var fieldToType = {};
223
+ for (var _i = 0, _a = Object.keys(typeToField); _i < _a.length; _i++) {
224
+ var type = _a[_i];
225
+ for (var _b = 0, _c = typeToField[type]; _b < _c.length; _b++) {
226
+ var field = _c[_b];
227
+ fieldToType[field] = type;
228
+ }
229
+ }
230
+ for (var _d = 0, _e = Object.keys(fieldToExtType); _d < _e.length; _d++) {
231
+ var field = _e[_d];
232
+ if (!fieldToType[field])
233
+ fieldToType[field] = 'Objc';
234
+ }
235
+ for (var _f = 0, _g = Object.keys(fieldToArrayExtType); _f < _g.length; _f++) {
236
+ var field = _g[_f];
237
+ fieldToArrayType[field] = 'Objc';
238
+ }
239
+ function getTypeByKey(key, value, root, parent) {
240
+ if (key === 'null' && root === 'slices') {
241
+ return 'TEXT';
242
+ }
243
+ else if (key === 'groupID') {
244
+ return root === 'slices' ? 'long' : 'TEXT';
245
+ }
246
+ else if (key === 'Sz ') {
247
+ return ('Wdth' in value) ? 'Objc' : (('units' in value) ? 'UntF' : 'doub');
248
+ }
249
+ else if (key === 'Type') {
250
+ return typeof value === 'string' ? 'enum' : 'long';
251
+ }
252
+ else if (key === 'AntA') {
253
+ return typeof value === 'string' ? 'enum' : 'bool';
254
+ }
255
+ else if ((key === 'Hrzn' || key === 'Vrtc') && parent.Type === 'keyType.Pstn') {
256
+ return 'long';
257
+ }
258
+ else if (key === 'Hrzn' || key === 'Vrtc' || key === 'Top ' || key === 'Left' || key === 'Btom' || key === 'Rght') {
259
+ if (root === 'slices')
260
+ return 'long';
261
+ return typeof value === 'number' ? 'doub' : 'UntF';
262
+ }
263
+ else if (key === 'Vrsn') {
264
+ return typeof value === 'number' ? 'long' : 'Objc';
265
+ }
266
+ else if (key === 'Rd ' || key === 'Grn ' || key === 'Bl ') {
267
+ return root === 'artd' ? 'long' : 'doub';
268
+ }
269
+ else if (key === 'Trnf') {
270
+ return Array.isArray(value) ? 'VlLs' : 'Objc';
271
+ }
272
+ else {
273
+ return fieldToType[key];
274
+ }
275
+ }
276
+ function readAsciiStringOrClassId(reader) {
277
+ var length = (0, psdReader_1.readInt32)(reader);
278
+ return (0, psdReader_1.readAsciiString)(reader, length || 4);
279
+ }
280
+ exports.readAsciiStringOrClassId = readAsciiStringOrClassId;
281
+ function writeAsciiStringOrClassId(writer, value) {
282
+ if (value.length === 4 && value !== 'warp' && value !== 'time' && value !== 'hold') {
283
+ // write classId
284
+ (0, psdWriter_1.writeInt32)(writer, 0);
285
+ (0, psdWriter_1.writeSignature)(writer, value);
286
+ }
287
+ else {
288
+ // write ascii string
289
+ (0, psdWriter_1.writeInt32)(writer, value.length);
290
+ for (var i = 0; i < value.length; i++) {
291
+ (0, psdWriter_1.writeUint8)(writer, value.charCodeAt(i));
292
+ }
293
+ }
294
+ }
295
+ function readDescriptorStructure(reader) {
296
+ var object = {};
297
+ // object.__struct =
298
+ readClassStructure(reader);
299
+ var itemsCount = (0, psdReader_1.readUint32)(reader);
300
+ // console.log('//', object.__struct);
301
+ for (var i = 0; i < itemsCount; i++) {
302
+ var key = readAsciiStringOrClassId(reader);
303
+ var type = (0, psdReader_1.readSignature)(reader);
304
+ // console.log(`> '${key}' '${type}'`);
305
+ var data = readOSType(reader, type);
306
+ // if (!getTypeByKey(key, data)) console.log(`> '${key}' '${type}'`, data);
307
+ object[key] = data;
308
+ }
309
+ return object;
310
+ }
311
+ exports.readDescriptorStructure = readDescriptorStructure;
312
+ function writeDescriptorStructure(writer, name, classId, value, root) {
313
+ if (logErrors && !classId)
314
+ console.log('Missing classId for: ', name, classId, value);
315
+ // write class structure
316
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, name);
317
+ writeAsciiStringOrClassId(writer, classId);
318
+ var keys = Object.keys(value);
319
+ (0, psdWriter_1.writeUint32)(writer, keys.length);
320
+ for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
321
+ var key = keys_1[_i];
322
+ var type = getTypeByKey(key, value[key], root, value);
323
+ var extType = fieldToExtType[key];
324
+ if (key === 'origin') {
325
+ type = root === 'slices' ? 'enum' : 'Objc';
326
+ }
327
+ else if (key === 'bounds' && root === 'slices') {
328
+ type = 'Objc';
329
+ extType = makeType('', 'Rct1');
330
+ }
331
+ else if (key === 'Scl ' && 'Hrzn' in value[key]) {
332
+ type = 'Objc';
333
+ extType = nullType;
334
+ }
335
+ else if (key === 'audioClipGroupList' && keys.length === 1) {
336
+ type = 'VlLs';
337
+ }
338
+ else if ((key === 'Strt' || key === 'Brgh') && 'H ' in value) {
339
+ type = 'doub';
340
+ }
341
+ else if (key === 'Strt') {
342
+ type = 'Objc';
343
+ extType = nullType;
344
+ }
345
+ else if (channels.indexOf(key) !== -1) {
346
+ type = (classId === 'RGBC' && root !== 'artd') ? 'doub' : 'long';
347
+ }
348
+ else if (key === 'profile') {
349
+ type = classId === 'printOutput' ? 'TEXT' : 'tdta';
350
+ }
351
+ else if (key === 'strokeStyleContent') {
352
+ if (value[key]['Clr ']) {
353
+ extType = makeType('', 'solidColorLayer');
354
+ }
355
+ else if (value[key].Grad) {
356
+ extType = makeType('', 'gradientLayer');
357
+ }
358
+ else if (value[key].Ptrn) {
359
+ extType = makeType('', 'patternLayer');
360
+ }
361
+ else {
362
+ logErrors && console.log('Invalid strokeStyleContent value', value[key]);
363
+ }
364
+ }
365
+ else if (key === 'bounds' && root === 'quiltWarp') {
366
+ extType = makeType('', 'classFloatRect');
367
+ }
368
+ if (extType && extType.classID === 'RGBC') {
369
+ if ('H ' in value[key])
370
+ extType = { classID: 'HSBC', name: '' };
371
+ // TODO: other color spaces
372
+ }
373
+ writeAsciiStringOrClassId(writer, key);
374
+ (0, psdWriter_1.writeSignature)(writer, type || 'long');
375
+ writeOSType(writer, type || 'long', value[key], key, extType, root);
376
+ if (logErrors && !type)
377
+ console.log("Missing descriptor field type for: '".concat(key, "' in"), value);
378
+ }
379
+ }
380
+ exports.writeDescriptorStructure = writeDescriptorStructure;
381
+ function readOSType(reader, type) {
382
+ switch (type) {
383
+ case 'obj ': // Reference
384
+ return readReferenceStructure(reader);
385
+ case 'Objc': // Descriptor
386
+ case 'GlbO': // GlobalObject same as Descriptor
387
+ return readDescriptorStructure(reader);
388
+ case 'VlLs': { // List
389
+ var length_1 = (0, psdReader_1.readInt32)(reader);
390
+ var items = [];
391
+ for (var i = 0; i < length_1; i++) {
392
+ var type_1 = (0, psdReader_1.readSignature)(reader);
393
+ // console.log(' >', type);
394
+ items.push(readOSType(reader, type_1));
395
+ }
396
+ return items;
397
+ }
398
+ case 'doub': // Double
399
+ return (0, psdReader_1.readFloat64)(reader);
400
+ case 'UntF': { // Unit double
401
+ var units = (0, psdReader_1.readSignature)(reader);
402
+ var value = (0, psdReader_1.readFloat64)(reader);
403
+ if (!unitsMap[units])
404
+ throw new Error("Invalid units: ".concat(units));
405
+ return { units: unitsMap[units], value: value };
406
+ }
407
+ case 'UnFl': { // Unit float
408
+ var units = (0, psdReader_1.readSignature)(reader);
409
+ var value = (0, psdReader_1.readFloat32)(reader);
410
+ if (!unitsMap[units])
411
+ throw new Error("Invalid units: ".concat(units));
412
+ return { units: unitsMap[units], value: value };
413
+ }
414
+ case 'TEXT': // String
415
+ return (0, psdReader_1.readUnicodeString)(reader);
416
+ case 'enum': { // Enumerated
417
+ var type_2 = readAsciiStringOrClassId(reader);
418
+ var value = readAsciiStringOrClassId(reader);
419
+ return "".concat(type_2, ".").concat(value);
420
+ }
421
+ case 'long': // Integer
422
+ return (0, psdReader_1.readInt32)(reader);
423
+ case 'comp': { // Large Integer
424
+ var low = (0, psdReader_1.readUint32)(reader);
425
+ var high = (0, psdReader_1.readUint32)(reader);
426
+ return { low: low, high: high };
427
+ }
428
+ case 'bool': // Boolean
429
+ return !!(0, psdReader_1.readUint8)(reader);
430
+ case 'type': // Class
431
+ case 'GlbC': // Class
432
+ return readClassStructure(reader);
433
+ case 'alis': { // Alias
434
+ var length_2 = (0, psdReader_1.readInt32)(reader);
435
+ return (0, psdReader_1.readAsciiString)(reader, length_2);
436
+ }
437
+ case 'tdta': { // Raw Data
438
+ var length_3 = (0, psdReader_1.readInt32)(reader);
439
+ return (0, psdReader_1.readBytes)(reader, length_3);
440
+ }
441
+ case 'ObAr': { // Object array
442
+ (0, psdReader_1.readInt32)(reader); // version: 16
443
+ (0, psdReader_1.readUnicodeString)(reader); // name: ''
444
+ readAsciiStringOrClassId(reader); // 'rationalPoint'
445
+ var length_4 = (0, psdReader_1.readInt32)(reader);
446
+ var items = [];
447
+ for (var i = 0; i < length_4; i++) {
448
+ var type1 = readAsciiStringOrClassId(reader); // type Hrzn | Vrtc
449
+ (0, psdReader_1.readSignature)(reader); // UnFl
450
+ (0, psdReader_1.readSignature)(reader); // units ? '#Pxl'
451
+ var valuesCount = (0, psdReader_1.readInt32)(reader);
452
+ var values = [];
453
+ for (var j = 0; j < valuesCount; j++) {
454
+ values.push((0, psdReader_1.readFloat64)(reader));
455
+ }
456
+ items.push({ type: type1, values: values });
457
+ }
458
+ return items;
459
+ }
460
+ case 'Pth ': { // File path
461
+ /*const length =*/ (0, psdReader_1.readInt32)(reader);
462
+ var sig = (0, psdReader_1.readSignature)(reader);
463
+ /*const pathSize =*/ (0, psdReader_1.readInt32LE)(reader);
464
+ var charsCount = (0, psdReader_1.readInt32LE)(reader);
465
+ var path = (0, psdReader_1.readUnicodeStringWithLength)(reader, charsCount);
466
+ return { sig: sig, path: path };
467
+ }
468
+ default:
469
+ throw new Error("Invalid TySh descriptor OSType: ".concat(type, " at ").concat(reader.offset.toString(16)));
470
+ }
471
+ }
472
+ var ObArTypes = {
473
+ meshPoints: 'rationalPoint',
474
+ quiltSliceX: 'UntF',
475
+ quiltSliceY: 'UntF',
476
+ };
477
+ function writeOSType(writer, type, value, key, extType, root) {
478
+ switch (type) {
479
+ case 'obj ': // Reference
480
+ writeReferenceStructure(writer, key, value);
481
+ break;
482
+ case 'Objc': // Descriptor
483
+ case 'GlbO': // GlobalObject same as Descriptor
484
+ if (!extType)
485
+ throw new Error("Missing ext type for: '".concat(key, "' (").concat(JSON.stringify(value), ")"));
486
+ writeDescriptorStructure(writer, extType.name, extType.classID, value, root);
487
+ break;
488
+ case 'VlLs': // List
489
+ (0, psdWriter_1.writeInt32)(writer, value.length);
490
+ for (var i = 0; i < value.length; i++) {
491
+ var type_3 = fieldToArrayType[key];
492
+ (0, psdWriter_1.writeSignature)(writer, type_3 || 'long');
493
+ writeOSType(writer, type_3 || 'long', value[i], '', fieldToArrayExtType[key], root);
494
+ if (logErrors && !type_3)
495
+ console.log("Missing descriptor array type for: '".concat(key, "' in"), value);
496
+ }
497
+ break;
498
+ case 'doub': // Double
499
+ (0, psdWriter_1.writeFloat64)(writer, value);
500
+ break;
501
+ case 'UntF': // Unit double
502
+ if (!unitsMapRev[value.units])
503
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
504
+ (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
505
+ (0, psdWriter_1.writeFloat64)(writer, value.value);
506
+ break;
507
+ case 'UnFl': // Unit float
508
+ if (!unitsMapRev[value.units])
509
+ throw new Error("Invalid units: ".concat(value.units, " in ").concat(key));
510
+ (0, psdWriter_1.writeSignature)(writer, unitsMapRev[value.units]);
511
+ (0, psdWriter_1.writeFloat32)(writer, value.value);
512
+ break;
513
+ case 'TEXT': // String
514
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, value);
515
+ break;
516
+ case 'enum': { // Enumerated
517
+ var _a = value.split('.'), _type = _a[0], val = _a[1];
518
+ writeAsciiStringOrClassId(writer, _type);
519
+ writeAsciiStringOrClassId(writer, val);
520
+ break;
521
+ }
522
+ case 'long': // Integer
523
+ (0, psdWriter_1.writeInt32)(writer, value);
524
+ break;
525
+ // case 'comp': // Large Integer
526
+ // writeLargeInteger(reader);
527
+ case 'bool': // Boolean
528
+ (0, psdWriter_1.writeUint8)(writer, value ? 1 : 0);
529
+ break;
530
+ // case 'type': // Class
531
+ // case 'GlbC': // Class
532
+ // writeClassStructure(reader);
533
+ // case 'alis': // Alias
534
+ // writeAliasStructure(reader);
535
+ case 'tdta': // Raw Data
536
+ (0, psdWriter_1.writeInt32)(writer, value.byteLength);
537
+ (0, psdWriter_1.writeBytes)(writer, value);
538
+ break;
539
+ case 'ObAr': { // Object array
540
+ (0, psdWriter_1.writeInt32)(writer, 16); // version
541
+ (0, psdWriter_1.writeUnicodeStringWithPadding)(writer, ''); // name
542
+ var type_4 = ObArTypes[key];
543
+ if (!type_4)
544
+ throw new Error("Not implemented ObArType for: ".concat(key));
545
+ writeAsciiStringOrClassId(writer, type_4);
546
+ (0, psdWriter_1.writeInt32)(writer, value.length);
547
+ for (var i = 0; i < value.length; i++) {
548
+ writeAsciiStringOrClassId(writer, value[i].type); // Hrzn | Vrtc
549
+ (0, psdWriter_1.writeSignature)(writer, 'UnFl');
550
+ (0, psdWriter_1.writeSignature)(writer, '#Pxl');
551
+ (0, psdWriter_1.writeInt32)(writer, value[i].values.length);
552
+ for (var j = 0; j < value[i].values.length; j++) {
553
+ (0, psdWriter_1.writeFloat64)(writer, value[i].values[j]);
554
+ }
555
+ }
556
+ break;
557
+ }
558
+ // case 'Pth ': // File path
559
+ // writeFilePath(reader);
560
+ default:
561
+ throw new Error("Not implemented descriptor OSType: ".concat(type));
562
+ }
563
+ }
564
+ function readReferenceStructure(reader) {
565
+ var itemsCount = (0, psdReader_1.readInt32)(reader);
566
+ var items = [];
567
+ for (var i = 0; i < itemsCount; i++) {
568
+ var type = (0, psdReader_1.readSignature)(reader);
569
+ switch (type) {
570
+ case 'prop': { // Property
571
+ readClassStructure(reader);
572
+ var keyID = readAsciiStringOrClassId(reader);
573
+ items.push(keyID);
574
+ break;
575
+ }
576
+ case 'Clss': // Class
577
+ items.push(readClassStructure(reader));
578
+ break;
579
+ case 'Enmr': { // Enumerated Reference
580
+ readClassStructure(reader);
581
+ var typeID = readAsciiStringOrClassId(reader);
582
+ var value = readAsciiStringOrClassId(reader);
583
+ items.push("".concat(typeID, ".").concat(value));
584
+ break;
585
+ }
586
+ case 'rele': { // Offset
587
+ // const { name, classID } =
588
+ readClassStructure(reader);
589
+ items.push((0, psdReader_1.readUint32)(reader));
590
+ break;
591
+ }
592
+ case 'Idnt': // Identifier
593
+ items.push((0, psdReader_1.readInt32)(reader));
594
+ break;
595
+ case 'indx': // Index
596
+ items.push((0, psdReader_1.readInt32)(reader));
597
+ break;
598
+ case 'name': { // Name
599
+ readClassStructure(reader);
600
+ items.push((0, psdReader_1.readUnicodeString)(reader));
601
+ break;
602
+ }
603
+ default:
604
+ throw new Error("Invalid descriptor reference type: ".concat(type));
605
+ }
606
+ }
607
+ return items;
608
+ }
609
+ function writeReferenceStructure(writer, _key, items) {
610
+ (0, psdWriter_1.writeInt32)(writer, items.length);
611
+ for (var i = 0; i < items.length; i++) {
612
+ var value = items[i];
613
+ var type = 'unknown';
614
+ if (typeof value === 'string') {
615
+ if (/^[a-z]+\.[a-z]+$/i.test(value)) {
616
+ type = 'Enmr';
617
+ }
618
+ else {
619
+ type = 'name';
620
+ }
621
+ }
622
+ (0, psdWriter_1.writeSignature)(writer, type);
623
+ switch (type) {
624
+ // case 'prop': // Property
625
+ // case 'Clss': // Class
626
+ case 'Enmr': { // Enumerated Reference
627
+ var _a = value.split('.'), typeID = _a[0], enumValue = _a[1];
628
+ writeClassStructure(writer, '\0', typeID);
629
+ writeAsciiStringOrClassId(writer, typeID);
630
+ writeAsciiStringOrClassId(writer, enumValue);
631
+ break;
632
+ }
633
+ // case 'rele': // Offset
634
+ // case 'Idnt': // Identifier
635
+ // case 'indx': // Index
636
+ case 'name': { // Name
637
+ writeClassStructure(writer, '\0', 'Lyr ');
638
+ (0, psdWriter_1.writeUnicodeString)(writer, value + '\0');
639
+ break;
640
+ }
641
+ default:
642
+ throw new Error("Invalid descriptor reference type: ".concat(type));
643
+ }
644
+ }
645
+ return items;
646
+ }
647
+ function readClassStructure(reader) {
648
+ var name = (0, psdReader_1.readUnicodeString)(reader);
649
+ var classID = readAsciiStringOrClassId(reader);
650
+ // console.log({ name, classID });
651
+ return { name: name, classID: classID };
652
+ }
653
+ function writeClassStructure(writer, name, classID) {
654
+ (0, psdWriter_1.writeUnicodeString)(writer, name);
655
+ writeAsciiStringOrClassId(writer, classID);
656
+ }
657
+ function readVersionAndDescriptor(reader) {
658
+ var version = (0, psdReader_1.readUint32)(reader);
659
+ if (version !== 16)
660
+ throw new Error("Invalid descriptor version: ".concat(version));
661
+ var desc = readDescriptorStructure(reader);
662
+ // console.log(require('util').inspect(desc, false, 99, true));
663
+ return desc;
664
+ }
665
+ exports.readVersionAndDescriptor = readVersionAndDescriptor;
666
+ function writeVersionAndDescriptor(writer, name, classID, descriptor, root) {
667
+ if (root === void 0) { root = ''; }
668
+ (0, psdWriter_1.writeUint32)(writer, 16); // version
669
+ writeDescriptorStructure(writer, name, classID, descriptor, root);
670
+ }
671
+ exports.writeVersionAndDescriptor = writeVersionAndDescriptor;
672
+ function horzVrtcToXY(hv) {
673
+ return { x: hv.Hrzn, y: hv.Vrtc };
674
+ }
675
+ exports.horzVrtcToXY = horzVrtcToXY;
676
+ function xyToHorzVrtc(xy) {
677
+ return { Hrzn: xy.x, Vrtc: xy.y };
678
+ }
679
+ exports.xyToHorzVrtc = xyToHorzVrtc;
680
+ function parseFxObject(fx) {
681
+ var stroke = {
682
+ enabled: !!fx.enab,
683
+ position: exports.FStl.decode(fx.Styl),
684
+ fillType: exports.FrFl.decode(fx.PntT),
685
+ blendMode: exports.BlnM.decode(fx['Md ']),
686
+ opacity: parsePercent(fx.Opct),
687
+ size: parseUnits(fx['Sz ']),
688
+ };
689
+ if (fx.present !== undefined)
690
+ stroke.present = fx.present;
691
+ if (fx.showInDialog !== undefined)
692
+ stroke.showInDialog = fx.showInDialog;
693
+ if (fx.overprint !== undefined)
694
+ stroke.overprint = fx.overprint;
695
+ if (fx['Clr '])
696
+ stroke.color = parseColor(fx['Clr ']);
697
+ if (fx.Grad)
698
+ stroke.gradient = parseGradientContent(fx);
699
+ if (fx.Ptrn)
700
+ stroke.pattern = parsePatternContent(fx);
701
+ return stroke;
702
+ }
703
+ function serializeFxObject(stroke) {
704
+ var FrFX = {};
705
+ FrFX.enab = !!stroke.enabled;
706
+ if (stroke.present !== undefined)
707
+ FrFX.present = !!stroke.present;
708
+ if (stroke.showInDialog !== undefined)
709
+ FrFX.showInDialog = !!stroke.showInDialog;
710
+ FrFX.Styl = exports.FStl.encode(stroke.position);
711
+ FrFX.PntT = exports.FrFl.encode(stroke.fillType);
712
+ FrFX['Md '] = exports.BlnM.encode(stroke.blendMode);
713
+ FrFX.Opct = unitsPercent(stroke.opacity);
714
+ FrFX['Sz '] = unitsValue(stroke.size, 'size');
715
+ if (stroke.color)
716
+ FrFX['Clr '] = serializeColor(stroke.color);
717
+ if (stroke.gradient)
718
+ FrFX = __assign(__assign({}, FrFX), serializeGradientContent(stroke.gradient));
719
+ if (stroke.pattern)
720
+ FrFX = __assign(__assign({}, FrFX), serializePatternContent(stroke.pattern));
721
+ if (stroke.overprint !== undefined)
722
+ FrFX.overprint = !!stroke.overprint;
723
+ return FrFX;
724
+ }
725
+ function serializeEffects(e, log, multi) {
726
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
727
+ var info = multi ? {
728
+ 'Scl ': unitsPercent((_a = e.scale) !== null && _a !== void 0 ? _a : 1),
729
+ masterFXSwitch: !e.disabled,
730
+ } : {
731
+ masterFXSwitch: !e.disabled,
732
+ 'Scl ': unitsPercent((_b = e.scale) !== null && _b !== void 0 ? _b : 1),
733
+ };
734
+ var arrayKeys = ['dropShadow', 'innerShadow', 'solidFill', 'gradientOverlay', 'stroke'];
735
+ for (var _i = 0, arrayKeys_1 = arrayKeys; _i < arrayKeys_1.length; _i++) {
736
+ var key = arrayKeys_1[_i];
737
+ if (e[key] && !Array.isArray(e[key]))
738
+ throw new Error("".concat(key, " should be an array"));
739
+ }
740
+ if (((_c = e.dropShadow) === null || _c === void 0 ? void 0 : _c[0]) && !multi)
741
+ info.DrSh = serializeEffectObject(e.dropShadow[0], 'dropShadow', log);
742
+ if (((_d = e.dropShadow) === null || _d === void 0 ? void 0 : _d[0]) && multi)
743
+ info.dropShadowMulti = e.dropShadow.map(function (i) { return serializeEffectObject(i, 'dropShadow', log); });
744
+ if (((_e = e.innerShadow) === null || _e === void 0 ? void 0 : _e[0]) && !multi)
745
+ info.IrSh = serializeEffectObject(e.innerShadow[0], 'innerShadow', log);
746
+ if (((_f = e.innerShadow) === null || _f === void 0 ? void 0 : _f[0]) && multi)
747
+ info.innerShadowMulti = e.innerShadow.map(function (i) { return serializeEffectObject(i, 'innerShadow', log); });
748
+ if (e.outerGlow)
749
+ info.OrGl = serializeEffectObject(e.outerGlow, 'outerGlow', log);
750
+ if (((_g = e.solidFill) === null || _g === void 0 ? void 0 : _g[0]) && multi)
751
+ info.solidFillMulti = e.solidFill.map(function (i) { return serializeEffectObject(i, 'solidFill', log); });
752
+ if (((_h = e.gradientOverlay) === null || _h === void 0 ? void 0 : _h[0]) && multi)
753
+ info.gradientFillMulti = e.gradientOverlay.map(function (i) { return serializeEffectObject(i, 'gradientOverlay', log); });
754
+ if (((_j = e.stroke) === null || _j === void 0 ? void 0 : _j[0]) && multi)
755
+ info.frameFXMulti = e.stroke.map(function (i) { return serializeFxObject(i); });
756
+ if (e.innerGlow)
757
+ info.IrGl = serializeEffectObject(e.innerGlow, 'innerGlow', log);
758
+ if (e.bevel)
759
+ info.ebbl = serializeEffectObject(e.bevel, 'bevel', log);
760
+ if (((_k = e.solidFill) === null || _k === void 0 ? void 0 : _k[0]) && !multi)
761
+ info.SoFi = serializeEffectObject(e.solidFill[0], 'solidFill', log);
762
+ if (e.patternOverlay)
763
+ info.patternFill = serializeEffectObject(e.patternOverlay, 'patternOverlay', log);
764
+ if (((_l = e.gradientOverlay) === null || _l === void 0 ? void 0 : _l[0]) && !multi)
765
+ info.GrFl = serializeEffectObject(e.gradientOverlay[0], 'gradientOverlay', log);
766
+ if (e.satin)
767
+ info.ChFX = serializeEffectObject(e.satin, 'satin', log);
768
+ if (((_m = e.stroke) === null || _m === void 0 ? void 0 : _m[0]) && !multi)
769
+ info.FrFX = serializeFxObject((_o = e.stroke) === null || _o === void 0 ? void 0 : _o[0]);
770
+ if (multi) {
771
+ info.numModifyingFX = 0;
772
+ for (var _p = 0, _q = Object.keys(e); _p < _q.length; _p++) {
773
+ var key = _q[_p];
774
+ var value = e[key];
775
+ if (Array.isArray(value)) {
776
+ for (var _r = 0, value_1 = value; _r < value_1.length; _r++) {
777
+ var effect = value_1[_r];
778
+ if (effect.enabled)
779
+ info.numModifyingFX++;
780
+ }
781
+ }
782
+ }
783
+ }
784
+ return info;
785
+ }
786
+ exports.serializeEffects = serializeEffects;
787
+ function parseEffects(info, log) {
788
+ var effects = {};
789
+ if (!info.masterFXSwitch)
790
+ effects.disabled = true;
791
+ if (info['Scl '])
792
+ effects.scale = parsePercent(info['Scl ']);
793
+ if (info.DrSh)
794
+ effects.dropShadow = [parseEffectObject(info.DrSh, log)];
795
+ if (info.dropShadowMulti)
796
+ effects.dropShadow = info.dropShadowMulti.map(function (i) { return parseEffectObject(i, log); });
797
+ if (info.IrSh)
798
+ effects.innerShadow = [parseEffectObject(info.IrSh, log)];
799
+ if (info.innerShadowMulti)
800
+ effects.innerShadow = info.innerShadowMulti.map(function (i) { return parseEffectObject(i, log); });
801
+ if (info.OrGl)
802
+ effects.outerGlow = parseEffectObject(info.OrGl, log);
803
+ if (info.IrGl)
804
+ effects.innerGlow = parseEffectObject(info.IrGl, log);
805
+ if (info.ebbl)
806
+ effects.bevel = parseEffectObject(info.ebbl, log);
807
+ if (info.SoFi)
808
+ effects.solidFill = [parseEffectObject(info.SoFi, log)];
809
+ if (info.solidFillMulti)
810
+ effects.solidFill = info.solidFillMulti.map(function (i) { return parseEffectObject(i, log); });
811
+ if (info.patternFill)
812
+ effects.patternOverlay = parseEffectObject(info.patternFill, log);
813
+ if (info.GrFl)
814
+ effects.gradientOverlay = [parseEffectObject(info.GrFl, log)];
815
+ if (info.gradientFillMulti)
816
+ effects.gradientOverlay = info.gradientFillMulti.map(function (i) { return parseEffectObject(i, log); });
817
+ if (info.ChFX)
818
+ effects.satin = parseEffectObject(info.ChFX, log);
819
+ if (info.FrFX)
820
+ effects.stroke = [parseFxObject(info.FrFX)];
821
+ if (info.frameFXMulti)
822
+ effects.stroke = info.frameFXMulti.map(function (i) { return parseFxObject(i); });
823
+ return effects;
824
+ }
825
+ exports.parseEffects = parseEffects;
826
+ function parseKeyList(keyList, logMissingFeatures) {
827
+ var keys = [];
828
+ for (var j = 0; j < keyList.length; j++) {
829
+ var key = keyList[j];
830
+ var time = key.time, selected = key.selected, animKey = key.animKey;
831
+ var interpolation = exports.animInterpStyleEnum.decode(key.animInterpStyle);
832
+ switch (animKey.Type) {
833
+ case 'keyType.Opct':
834
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'opacity', value: parsePercent(animKey.Opct) });
835
+ break;
836
+ case 'keyType.Pstn':
837
+ keys.push({ interpolation: interpolation, time: time, selected: selected, type: 'position', x: animKey.Hrzn, y: animKey.Vrtc });
838
+ break;
839
+ case 'keyType.Trnf':
840
+ keys.push({
841
+ interpolation: interpolation,
842
+ time: time,
843
+ selected: selected,
844
+ type: 'transform',
845
+ scale: horzVrtcToXY(animKey['Scl ']), skew: horzVrtcToXY(animKey.Skew), rotation: animKey.rotation, translation: horzVrtcToXY(animKey.translation)
846
+ });
847
+ break;
848
+ case 'keyType.sheetStyle': {
849
+ var key_1 = { interpolation: interpolation, time: time, selected: selected, type: 'style' };
850
+ if (animKey.sheetStyle.Lefx)
851
+ key_1.style = parseEffects(animKey.sheetStyle.Lefx, logMissingFeatures);
852
+ keys.push(key_1);
853
+ break;
854
+ }
855
+ case 'keyType.globalLighting': {
856
+ keys.push({
857
+ interpolation: interpolation,
858
+ time: time,
859
+ selected: selected,
860
+ type: 'globalLighting',
861
+ globalAngle: animKey.gblA, globalAltitude: animKey.globalAltitude
862
+ });
863
+ break;
864
+ }
865
+ default: throw new Error("Unsupported keyType value");
866
+ }
867
+ }
868
+ return keys;
869
+ }
870
+ function serializeKeyList(keys) {
871
+ var keyList = [];
872
+ for (var j = 0; j < keys.length; j++) {
873
+ var key = keys[j];
874
+ var time = key.time, _a = key.selected, selected = _a === void 0 ? false : _a, interpolation = key.interpolation;
875
+ var animInterpStyle = exports.animInterpStyleEnum.encode(interpolation);
876
+ var animKey = void 0;
877
+ switch (key.type) {
878
+ case 'opacity':
879
+ animKey = { Type: 'keyType.Opct', Opct: unitsPercent(key.value) };
880
+ break;
881
+ case 'position':
882
+ animKey = { Type: 'keyType.Pstn', Hrzn: key.x, Vrtc: key.y };
883
+ break;
884
+ case 'transform':
885
+ animKey = { Type: 'keyType.Trnf', 'Scl ': xyToHorzVrtc(key.scale), Skew: xyToHorzVrtc(key.skew), rotation: key.rotation, translation: xyToHorzVrtc(key.translation) };
886
+ break;
887
+ case 'style':
888
+ animKey = { Type: 'keyType.sheetStyle', sheetStyle: { Vrsn: 1, blendOptions: {} } };
889
+ if (key.style)
890
+ animKey.sheetStyle = { Vrsn: 1, Lefx: serializeEffects(key.style, false, false), blendOptions: {} };
891
+ break;
892
+ case 'globalLighting': {
893
+ animKey = { Type: 'keyType.globalLighting', gblA: key.globalAngle, globalAltitude: key.globalAltitude };
894
+ break;
895
+ }
896
+ default: throw new Error("Unsupported keyType value");
897
+ }
898
+ keyList.push({ Vrsn: 1, animInterpStyle: animInterpStyle, time: time, animKey: animKey, selected: selected });
899
+ }
900
+ return keyList;
901
+ }
902
+ function parseTrackList(trackList, logMissingFeatures) {
903
+ var tracks = [];
904
+ for (var i = 0; i < trackList.length; i++) {
905
+ var tr = trackList[i];
906
+ var track = {
907
+ type: exports.stdTrackID.decode(tr.trackID),
908
+ enabled: tr.enab,
909
+ keys: parseKeyList(tr.keyList, logMissingFeatures),
910
+ };
911
+ if (tr.effectParams) {
912
+ track.effectParams = {
913
+ fillCanvas: tr.effectParams.fillCanvas,
914
+ zoomOrigin: tr.effectParams.zoomOrigin,
915
+ keys: parseKeyList(tr.effectParams.keyList, logMissingFeatures),
916
+ };
917
+ }
918
+ tracks.push(track);
919
+ }
920
+ return tracks;
921
+ }
922
+ exports.parseTrackList = parseTrackList;
923
+ function serializeTrackList(tracks) {
924
+ var trackList = [];
925
+ for (var i = 0; i < tracks.length; i++) {
926
+ var t = tracks[i];
927
+ trackList.push(__assign(__assign({ trackID: exports.stdTrackID.encode(t.type), Vrsn: 1, enab: !!t.enabled, Effc: !!t.effectParams }, (t.effectParams ? {
928
+ effectParams: {
929
+ keyList: serializeKeyList(t.keys),
930
+ fillCanvas: t.effectParams.fillCanvas,
931
+ zoomOrigin: t.effectParams.zoomOrigin,
932
+ }
933
+ } : {})), { keyList: serializeKeyList(t.keys) }));
934
+ }
935
+ return trackList;
936
+ }
937
+ exports.serializeTrackList = serializeTrackList;
938
+ function parseEffectObject(obj, reportErrors) {
939
+ var result = {};
940
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
941
+ var key = _a[_i];
942
+ var val = obj[key];
943
+ switch (key) {
944
+ case 'enab':
945
+ result.enabled = !!val;
946
+ break;
947
+ case 'uglg':
948
+ result.useGlobalLight = !!val;
949
+ break;
950
+ case 'AntA':
951
+ result.antialiased = !!val;
952
+ break;
953
+ case 'Algn':
954
+ result.align = !!val;
955
+ break;
956
+ case 'Dthr':
957
+ result.dither = !!val;
958
+ break;
959
+ case 'Invr':
960
+ result.invert = !!val;
961
+ break;
962
+ case 'Rvrs':
963
+ result.reverse = !!val;
964
+ break;
965
+ case 'Clr ':
966
+ result.color = parseColor(val);
967
+ break;
968
+ case 'hglC':
969
+ result.highlightColor = parseColor(val);
970
+ break;
971
+ case 'sdwC':
972
+ result.shadowColor = parseColor(val);
973
+ break;
974
+ case 'Styl':
975
+ result.position = exports.FStl.decode(val);
976
+ break;
977
+ case 'Md ':
978
+ result.blendMode = exports.BlnM.decode(val);
979
+ break;
980
+ case 'hglM':
981
+ result.highlightBlendMode = exports.BlnM.decode(val);
982
+ break;
983
+ case 'sdwM':
984
+ result.shadowBlendMode = exports.BlnM.decode(val);
985
+ break;
986
+ case 'bvlS':
987
+ result.style = exports.BESl.decode(val);
988
+ break;
989
+ case 'bvlD':
990
+ result.direction = exports.BESs.decode(val);
991
+ break;
992
+ case 'bvlT':
993
+ result.technique = exports.bvlT.decode(val);
994
+ break;
995
+ case 'GlwT':
996
+ result.technique = exports.BETE.decode(val);
997
+ break;
998
+ case 'glwS':
999
+ result.source = exports.IGSr.decode(val);
1000
+ break;
1001
+ case 'Type':
1002
+ result.type = exports.GrdT.decode(val);
1003
+ break;
1004
+ case 'gs99':
1005
+ result.interpolationMethod = exports.gradientInterpolationMethodType.decode(val);
1006
+ break;
1007
+ case 'Opct':
1008
+ result.opacity = parsePercent(val);
1009
+ break;
1010
+ case 'hglO':
1011
+ result.highlightOpacity = parsePercent(val);
1012
+ break;
1013
+ case 'sdwO':
1014
+ result.shadowOpacity = parsePercent(val);
1015
+ break;
1016
+ case 'lagl':
1017
+ result.angle = parseAngle(val);
1018
+ break;
1019
+ case 'Angl':
1020
+ result.angle = parseAngle(val);
1021
+ break;
1022
+ case 'Lald':
1023
+ result.altitude = parseAngle(val);
1024
+ break;
1025
+ case 'Sftn':
1026
+ result.soften = parseUnits(val);
1027
+ break;
1028
+ case 'srgR':
1029
+ result.strength = parsePercent(val);
1030
+ break;
1031
+ case 'blur':
1032
+ result.size = parseUnits(val);
1033
+ break;
1034
+ case 'Nose':
1035
+ result.noise = parsePercent(val);
1036
+ break;
1037
+ case 'Inpr':
1038
+ result.range = parsePercent(val);
1039
+ break;
1040
+ case 'Ckmt':
1041
+ result.choke = parseUnits(val);
1042
+ break;
1043
+ case 'ShdN':
1044
+ result.jitter = parsePercent(val);
1045
+ break;
1046
+ case 'Dstn':
1047
+ result.distance = parseUnits(val);
1048
+ break;
1049
+ case 'Scl ':
1050
+ result.scale = parsePercent(val);
1051
+ break;
1052
+ case 'Ptrn':
1053
+ result.pattern = { name: val['Nm '], id: val.Idnt };
1054
+ break;
1055
+ case 'phase':
1056
+ result.phase = { x: val.Hrzn, y: val.Vrtc };
1057
+ break;
1058
+ case 'Ofst':
1059
+ result.offset = { x: parsePercent(val.Hrzn), y: parsePercent(val.Vrtc) };
1060
+ break;
1061
+ case 'MpgS':
1062
+ case 'TrnS':
1063
+ result.contour = {
1064
+ name: val['Nm '],
1065
+ curve: val['Crv '].map(function (p) { return ({ x: p.Hrzn, y: p.Vrtc }); }),
1066
+ };
1067
+ break;
1068
+ case 'Grad':
1069
+ result.gradient = parseGradient(val);
1070
+ break;
1071
+ case 'useTexture':
1072
+ case 'useShape':
1073
+ case 'layerConceals':
1074
+ case 'present':
1075
+ case 'showInDialog':
1076
+ case 'antialiasGloss':
1077
+ result[key] = val;
1078
+ break;
1079
+ default:
1080
+ reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1081
+ }
1082
+ }
1083
+ return result;
1084
+ }
1085
+ function serializeEffectObject(obj, objName, reportErrors) {
1086
+ var result = {};
1087
+ for (var _i = 0, _a = Object.keys(obj); _i < _a.length; _i++) {
1088
+ var objKey = _a[_i];
1089
+ var key = objKey;
1090
+ var val = obj[key];
1091
+ switch (key) {
1092
+ case 'enabled':
1093
+ result.enab = !!val;
1094
+ break;
1095
+ case 'useGlobalLight':
1096
+ result.uglg = !!val;
1097
+ break;
1098
+ case 'antialiased':
1099
+ result.AntA = !!val;
1100
+ break;
1101
+ case 'align':
1102
+ result.Algn = !!val;
1103
+ break;
1104
+ case 'dither':
1105
+ result.Dthr = !!val;
1106
+ break;
1107
+ case 'invert':
1108
+ result.Invr = !!val;
1109
+ break;
1110
+ case 'reverse':
1111
+ result.Rvrs = !!val;
1112
+ break;
1113
+ case 'color':
1114
+ result['Clr '] = serializeColor(val);
1115
+ break;
1116
+ case 'highlightColor':
1117
+ result.hglC = serializeColor(val);
1118
+ break;
1119
+ case 'shadowColor':
1120
+ result.sdwC = serializeColor(val);
1121
+ break;
1122
+ case 'position':
1123
+ result.Styl = exports.FStl.encode(val);
1124
+ break;
1125
+ case 'blendMode':
1126
+ result['Md '] = exports.BlnM.encode(val);
1127
+ break;
1128
+ case 'highlightBlendMode':
1129
+ result.hglM = exports.BlnM.encode(val);
1130
+ break;
1131
+ case 'shadowBlendMode':
1132
+ result.sdwM = exports.BlnM.encode(val);
1133
+ break;
1134
+ case 'style':
1135
+ result.bvlS = exports.BESl.encode(val);
1136
+ break;
1137
+ case 'direction':
1138
+ result.bvlD = exports.BESs.encode(val);
1139
+ break;
1140
+ case 'technique':
1141
+ if (objName === 'bevel') {
1142
+ result.bvlT = exports.bvlT.encode(val);
1143
+ }
1144
+ else {
1145
+ result.GlwT = exports.BETE.encode(val);
1146
+ }
1147
+ break;
1148
+ case 'source':
1149
+ result.glwS = exports.IGSr.encode(val);
1150
+ break;
1151
+ case 'type':
1152
+ result.Type = exports.GrdT.encode(val);
1153
+ break;
1154
+ case 'interpolationMethod':
1155
+ result.gs99 = exports.gradientInterpolationMethodType.encode(val);
1156
+ break;
1157
+ case 'opacity':
1158
+ result.Opct = unitsPercent(val);
1159
+ break;
1160
+ case 'highlightOpacity':
1161
+ result.hglO = unitsPercent(val);
1162
+ break;
1163
+ case 'shadowOpacity':
1164
+ result.sdwO = unitsPercent(val);
1165
+ break;
1166
+ case 'angle':
1167
+ if (objName === 'gradientOverlay') {
1168
+ result.Angl = unitsAngle(val);
1169
+ }
1170
+ else {
1171
+ result.lagl = unitsAngle(val);
1172
+ }
1173
+ break;
1174
+ case 'altitude':
1175
+ result.Lald = unitsAngle(val);
1176
+ break;
1177
+ case 'soften':
1178
+ result.Sftn = unitsValue(val, key);
1179
+ break;
1180
+ case 'strength':
1181
+ result.srgR = unitsPercent(val);
1182
+ break;
1183
+ case 'size':
1184
+ result.blur = unitsValue(val, key);
1185
+ break;
1186
+ case 'noise':
1187
+ result.Nose = unitsPercent(val);
1188
+ break;
1189
+ case 'range':
1190
+ result.Inpr = unitsPercent(val);
1191
+ break;
1192
+ case 'choke':
1193
+ result.Ckmt = unitsValue(val, key);
1194
+ break;
1195
+ case 'jitter':
1196
+ result.ShdN = unitsPercent(val);
1197
+ break;
1198
+ case 'distance':
1199
+ result.Dstn = unitsValue(val, key);
1200
+ break;
1201
+ case 'scale':
1202
+ result['Scl '] = unitsPercent(val);
1203
+ break;
1204
+ case 'pattern':
1205
+ result.Ptrn = { 'Nm ': val.name, Idnt: val.id };
1206
+ break;
1207
+ case 'phase':
1208
+ result.phase = { Hrzn: val.x, Vrtc: val.y };
1209
+ break;
1210
+ case 'offset':
1211
+ result.Ofst = { Hrzn: unitsPercent(val.x), Vrtc: unitsPercent(val.y) };
1212
+ break;
1213
+ case 'contour': {
1214
+ result[objName === 'satin' ? 'MpgS' : 'TrnS'] = {
1215
+ 'Nm ': val.name,
1216
+ 'Crv ': val.curve.map(function (p) { return ({ Hrzn: p.x, Vrtc: p.y }); }),
1217
+ };
1218
+ break;
1219
+ }
1220
+ case 'gradient':
1221
+ result.Grad = serializeGradient(val);
1222
+ break;
1223
+ case 'useTexture':
1224
+ case 'useShape':
1225
+ case 'layerConceals':
1226
+ case 'present':
1227
+ case 'showInDialog':
1228
+ case 'antialiasGloss':
1229
+ result[key] = val;
1230
+ break;
1231
+ default:
1232
+ reportErrors && console.log("Invalid effect key: '".concat(key, "', value:"), val);
1233
+ }
1234
+ }
1235
+ return result;
1236
+ }
1237
+ function parseGradient(grad) {
1238
+ if (grad.GrdF === 'GrdF.CstS') {
1239
+ var samples_1 = grad.Intr || 4096;
1240
+ return {
1241
+ type: 'solid',
1242
+ name: grad['Nm '],
1243
+ smoothness: grad.Intr / 4096,
1244
+ colorStops: grad.Clrs.map(function (s) { return ({
1245
+ color: parseColor(s['Clr ']),
1246
+ location: s.Lctn / samples_1,
1247
+ midpoint: s.Mdpn / 100,
1248
+ }); }),
1249
+ opacityStops: grad.Trns.map(function (s) { return ({
1250
+ opacity: parsePercent(s.Opct),
1251
+ location: s.Lctn / samples_1,
1252
+ midpoint: s.Mdpn / 100,
1253
+ }); }),
1254
+ };
1255
+ }
1256
+ else {
1257
+ return {
1258
+ type: 'noise',
1259
+ name: grad['Nm '],
1260
+ roughness: grad.Smth / 4096,
1261
+ colorModel: exports.ClrS.decode(grad.ClrS),
1262
+ randomSeed: grad.RndS,
1263
+ restrictColors: !!grad.VctC,
1264
+ addTransparency: !!grad.ShTr,
1265
+ min: grad['Mnm '].map(function (x) { return x / 100; }),
1266
+ max: grad['Mxm '].map(function (x) { return x / 100; }),
1267
+ };
1268
+ }
1269
+ }
1270
+ function serializeGradient(grad) {
1271
+ var _a, _b;
1272
+ if (grad.type === 'solid') {
1273
+ var samples_2 = Math.round(((_a = grad.smoothness) !== null && _a !== void 0 ? _a : 1) * 4096);
1274
+ return {
1275
+ 'Nm ': grad.name || '',
1276
+ GrdF: 'GrdF.CstS',
1277
+ Intr: samples_2,
1278
+ Clrs: grad.colorStops.map(function (s) {
1279
+ var _a;
1280
+ return ({
1281
+ 'Clr ': serializeColor(s.color),
1282
+ Type: 'Clry.UsrS',
1283
+ Lctn: Math.round(s.location * samples_2),
1284
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1285
+ });
1286
+ }),
1287
+ Trns: grad.opacityStops.map(function (s) {
1288
+ var _a;
1289
+ return ({
1290
+ Opct: unitsPercent(s.opacity),
1291
+ Lctn: Math.round(s.location * samples_2),
1292
+ Mdpn: Math.round(((_a = s.midpoint) !== null && _a !== void 0 ? _a : 0.5) * 100),
1293
+ });
1294
+ }),
1295
+ };
1296
+ }
1297
+ else {
1298
+ return {
1299
+ GrdF: 'GrdF.ClNs',
1300
+ 'Nm ': grad.name || '',
1301
+ ShTr: !!grad.addTransparency,
1302
+ VctC: !!grad.restrictColors,
1303
+ ClrS: exports.ClrS.encode(grad.colorModel),
1304
+ RndS: grad.randomSeed || 0,
1305
+ Smth: Math.round(((_b = grad.roughness) !== null && _b !== void 0 ? _b : 1) * 4096),
1306
+ 'Mnm ': (grad.min || [0, 0, 0, 0]).map(function (x) { return x * 100; }),
1307
+ 'Mxm ': (grad.max || [1, 1, 1, 1]).map(function (x) { return x * 100; }),
1308
+ };
1309
+ }
1310
+ }
1311
+ function parseGradientContent(descriptor) {
1312
+ var result = parseGradient(descriptor.Grad);
1313
+ result.style = exports.GrdT.decode(descriptor.Type);
1314
+ if (descriptor.Dthr !== undefined)
1315
+ result.dither = descriptor.Dthr;
1316
+ if (descriptor.Rvrs !== undefined)
1317
+ result.reverse = descriptor.Rvrs;
1318
+ if (descriptor.Angl !== undefined)
1319
+ result.angle = parseAngle(descriptor.Angl);
1320
+ if (descriptor['Scl '] !== undefined)
1321
+ result.scale = parsePercent(descriptor['Scl ']);
1322
+ if (descriptor.Algn !== undefined)
1323
+ result.align = descriptor.Algn;
1324
+ if (descriptor.Ofst !== undefined) {
1325
+ result.offset = {
1326
+ x: parsePercent(descriptor.Ofst.Hrzn),
1327
+ y: parsePercent(descriptor.Ofst.Vrtc)
1328
+ };
1329
+ }
1330
+ return result;
1331
+ }
1332
+ function parsePatternContent(descriptor) {
1333
+ var result = {
1334
+ name: descriptor.Ptrn['Nm '],
1335
+ id: descriptor.Ptrn.Idnt,
1336
+ };
1337
+ if (descriptor.Lnkd !== undefined)
1338
+ result.linked = descriptor.Lnkd;
1339
+ if (descriptor.phase !== undefined)
1340
+ result.phase = { x: descriptor.phase.Hrzn, y: descriptor.phase.Vrtc };
1341
+ return result;
1342
+ }
1343
+ function parseVectorContent(descriptor) {
1344
+ if ('Grad' in descriptor) {
1345
+ return parseGradientContent(descriptor);
1346
+ }
1347
+ else if ('Ptrn' in descriptor) {
1348
+ return __assign({ type: 'pattern' }, parsePatternContent(descriptor));
1349
+ }
1350
+ else if ('Clr ' in descriptor) {
1351
+ return { type: 'color', color: parseColor(descriptor['Clr ']) };
1352
+ }
1353
+ else {
1354
+ throw new Error('Invalid vector content');
1355
+ }
1356
+ }
1357
+ exports.parseVectorContent = parseVectorContent;
1358
+ function serializeGradientContent(content) {
1359
+ var result = {};
1360
+ if (content.dither !== undefined)
1361
+ result.Dthr = content.dither;
1362
+ if (content.reverse !== undefined)
1363
+ result.Rvrs = content.reverse;
1364
+ if (content.angle !== undefined)
1365
+ result.Angl = unitsAngle(content.angle);
1366
+ result.Type = exports.GrdT.encode(content.style);
1367
+ if (content.align !== undefined)
1368
+ result.Algn = content.align;
1369
+ if (content.scale !== undefined)
1370
+ result['Scl '] = unitsPercent(content.scale);
1371
+ if (content.offset) {
1372
+ result.Ofst = {
1373
+ Hrzn: unitsPercent(content.offset.x),
1374
+ Vrtc: unitsPercent(content.offset.y),
1375
+ };
1376
+ }
1377
+ result.Grad = serializeGradient(content);
1378
+ return result;
1379
+ }
1380
+ function serializePatternContent(content) {
1381
+ var result = {
1382
+ Ptrn: {
1383
+ 'Nm ': content.name || '',
1384
+ Idnt: content.id || '',
1385
+ }
1386
+ };
1387
+ if (content.linked !== undefined)
1388
+ result.Lnkd = !!content.linked;
1389
+ if (content.phase !== undefined)
1390
+ result.phase = { Hrzn: content.phase.x, Vrtc: content.phase.y };
1391
+ return result;
1392
+ }
1393
+ function serializeVectorContent(content) {
1394
+ if (content.type === 'color') {
1395
+ return { key: 'SoCo', descriptor: { 'Clr ': serializeColor(content.color) } };
1396
+ }
1397
+ else if (content.type === 'pattern') {
1398
+ return { key: 'PtFl', descriptor: serializePatternContent(content) };
1399
+ }
1400
+ else {
1401
+ return { key: 'GdFl', descriptor: serializeGradientContent(content) };
1402
+ }
1403
+ }
1404
+ exports.serializeVectorContent = serializeVectorContent;
1405
+ function parseColor(color) {
1406
+ if ('H ' in color) {
1407
+ return { h: parsePercentOrAngle(color['H ']), s: color.Strt, b: color.Brgh };
1408
+ }
1409
+ else if ('Rd ' in color) {
1410
+ return { r: color['Rd '], g: color['Grn '], b: color['Bl '] };
1411
+ }
1412
+ else if ('Cyn ' in color) {
1413
+ return { c: color['Cyn '], m: color.Mgnt, y: color['Ylw '], k: color.Blck };
1414
+ }
1415
+ else if ('Gry ' in color) {
1416
+ return { k: color['Gry '] };
1417
+ }
1418
+ else if ('Lmnc' in color) {
1419
+ return { l: color.Lmnc, a: color['A '], b: color['B '] };
1420
+ }
1421
+ else {
1422
+ throw new Error('Unsupported color descriptor');
1423
+ }
1424
+ }
1425
+ exports.parseColor = parseColor;
1426
+ function serializeColor(color) {
1427
+ if (!color) {
1428
+ return { 'Rd ': 0, 'Grn ': 0, 'Bl ': 0 };
1429
+ }
1430
+ else if ('r' in color) {
1431
+ return { 'Rd ': color.r || 0, 'Grn ': color.g || 0, 'Bl ': color.b || 0 };
1432
+ }
1433
+ else if ('h' in color) {
1434
+ return { 'H ': unitsAngle(color.h * 360), Strt: color.s || 0, Brgh: color.b || 0 };
1435
+ }
1436
+ else if ('c' in color) {
1437
+ return { 'Cyn ': color.c || 0, Mgnt: color.m || 0, 'Ylw ': color.y || 0, Blck: color.k || 0 };
1438
+ }
1439
+ else if ('l' in color) {
1440
+ return { Lmnc: color.l || 0, 'A ': color.a || 0, 'B ': color.b || 0 };
1441
+ }
1442
+ else if ('k' in color) {
1443
+ return { 'Gry ': color.k };
1444
+ }
1445
+ else {
1446
+ throw new Error('Invalid color value');
1447
+ }
1448
+ }
1449
+ exports.serializeColor = serializeColor;
1450
+ function parseAngle(x) {
1451
+ if (x === undefined)
1452
+ return 0;
1453
+ if (x.units !== 'Angle')
1454
+ throw new Error("Invalid units: ".concat(x.units));
1455
+ return x.value;
1456
+ }
1457
+ exports.parseAngle = parseAngle;
1458
+ function parsePercent(x) {
1459
+ if (x === undefined)
1460
+ return 1;
1461
+ if (x.units !== 'Percent')
1462
+ throw new Error("Invalid units: ".concat(x.units));
1463
+ return x.value / 100;
1464
+ }
1465
+ exports.parsePercent = parsePercent;
1466
+ function parsePercentOrAngle(x) {
1467
+ if (x === undefined)
1468
+ return 1;
1469
+ if (x.units === 'Percent')
1470
+ return x.value / 100;
1471
+ if (x.units === 'Angle')
1472
+ return x.value / 360;
1473
+ throw new Error("Invalid units: ".concat(x.units));
1474
+ }
1475
+ exports.parsePercentOrAngle = parsePercentOrAngle;
1476
+ function parseUnits(_a) {
1477
+ var units = _a.units, value = _a.value;
1478
+ if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1479
+ units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1480
+ throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1481
+ }
1482
+ return { value: value, units: units };
1483
+ }
1484
+ exports.parseUnits = parseUnits;
1485
+ function parseUnitsOrNumber(value, units) {
1486
+ if (units === void 0) { units = 'Pixels'; }
1487
+ if (typeof value === 'number')
1488
+ return { value: value, units: units };
1489
+ return parseUnits(value);
1490
+ }
1491
+ exports.parseUnitsOrNumber = parseUnitsOrNumber;
1492
+ function parseUnitsToNumber(_a, expectedUnits) {
1493
+ var units = _a.units, value = _a.value;
1494
+ if (units !== expectedUnits)
1495
+ throw new Error("Invalid units: ".concat(JSON.stringify({ units: units, value: value })));
1496
+ return value;
1497
+ }
1498
+ exports.parseUnitsToNumber = parseUnitsToNumber;
1499
+ function unitsAngle(value) {
1500
+ return { units: 'Angle', value: value || 0 };
1501
+ }
1502
+ exports.unitsAngle = unitsAngle;
1503
+ function unitsPercent(value) {
1504
+ return { units: 'Percent', value: Math.round((value || 0) * 100) };
1505
+ }
1506
+ exports.unitsPercent = unitsPercent;
1507
+ function unitsValue(x, key) {
1508
+ if (x == null)
1509
+ return { units: 'Pixels', value: 0 };
1510
+ if (typeof x !== 'object')
1511
+ throw new Error("Invalid value: ".concat(JSON.stringify(x), " (key: ").concat(key, ") (should have value and units)"));
1512
+ var units = x.units, value = x.value;
1513
+ if (typeof value !== 'number')
1514
+ throw new Error("Invalid value in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1515
+ if (units !== 'Pixels' && units !== 'Millimeters' && units !== 'Points' && units !== 'None' &&
1516
+ units !== 'Picas' && units !== 'Inches' && units !== 'Centimeters' && units !== 'Density') {
1517
+ throw new Error("Invalid units in ".concat(JSON.stringify(x), " (key: ").concat(key, ")"));
1518
+ }
1519
+ return { units: units, value: value };
1520
+ }
1521
+ exports.unitsValue = unitsValue;
1522
+ exports.textGridding = (0, helpers_1.createEnum)('textGridding', 'none', {
1523
+ none: 'None',
1524
+ round: 'Rnd ',
1525
+ });
1526
+ exports.Ornt = (0, helpers_1.createEnum)('Ornt', 'horizontal', {
1527
+ horizontal: 'Hrzn',
1528
+ vertical: 'Vrtc',
1529
+ });
1530
+ exports.Annt = (0, helpers_1.createEnum)('Annt', 'sharp', {
1531
+ none: 'Anno',
1532
+ sharp: 'antiAliasSharp',
1533
+ crisp: 'AnCr',
1534
+ strong: 'AnSt',
1535
+ smooth: 'AnSm',
1536
+ platform: 'antiAliasPlatformGray',
1537
+ platformLCD: 'antiAliasPlatformLCD',
1538
+ });
1539
+ exports.warpStyle = (0, helpers_1.createEnum)('warpStyle', 'none', {
1540
+ none: 'warpNone',
1541
+ arc: 'warpArc',
1542
+ arcLower: 'warpArcLower',
1543
+ arcUpper: 'warpArcUpper',
1544
+ arch: 'warpArch',
1545
+ bulge: 'warpBulge',
1546
+ shellLower: 'warpShellLower',
1547
+ shellUpper: 'warpShellUpper',
1548
+ flag: 'warpFlag',
1549
+ wave: 'warpWave',
1550
+ fish: 'warpFish',
1551
+ rise: 'warpRise',
1552
+ fisheye: 'warpFisheye',
1553
+ inflate: 'warpInflate',
1554
+ squeeze: 'warpSqueeze',
1555
+ twist: 'warpTwist',
1556
+ cylinder: 'warpCylinder',
1557
+ custom: 'warpCustom',
1558
+ });
1559
+ exports.BlnM = (0, helpers_1.createEnum)('BlnM', 'normal', {
1560
+ 'normal': 'Nrml',
1561
+ 'dissolve': 'Dslv',
1562
+ 'darken': 'Drkn',
1563
+ 'multiply': 'Mltp',
1564
+ 'color burn': 'CBrn',
1565
+ 'linear burn': 'linearBurn',
1566
+ 'darker color': 'darkerColor',
1567
+ 'lighten': 'Lghn',
1568
+ 'screen': 'Scrn',
1569
+ 'color dodge': 'CDdg',
1570
+ 'linear dodge': 'linearDodge',
1571
+ 'lighter color': 'lighterColor',
1572
+ 'overlay': 'Ovrl',
1573
+ 'soft light': 'SftL',
1574
+ 'hard light': 'HrdL',
1575
+ 'vivid light': 'vividLight',
1576
+ 'linear light': 'linearLight',
1577
+ 'pin light': 'pinLight',
1578
+ 'hard mix': 'hardMix',
1579
+ 'difference': 'Dfrn',
1580
+ 'exclusion': 'Xclu',
1581
+ 'subtract': 'blendSubtraction',
1582
+ 'divide': 'blendDivide',
1583
+ 'hue': 'H ',
1584
+ 'saturation': 'Strt',
1585
+ 'color': 'Clr ',
1586
+ 'luminosity': 'Lmns',
1587
+ // used in ABR
1588
+ 'linear height': 'linearHeight',
1589
+ 'height': 'Hght',
1590
+ 'subtraction': 'Sbtr', // 2nd version of subtract ?
1591
+ });
1592
+ exports.BESl = (0, helpers_1.createEnum)('BESl', 'inner bevel', {
1593
+ 'inner bevel': 'InrB',
1594
+ 'outer bevel': 'OtrB',
1595
+ 'emboss': 'Embs',
1596
+ 'pillow emboss': 'PlEb',
1597
+ 'stroke emboss': 'strokeEmboss',
1598
+ });
1599
+ exports.bvlT = (0, helpers_1.createEnum)('bvlT', 'smooth', {
1600
+ 'smooth': 'SfBL',
1601
+ 'chisel hard': 'PrBL',
1602
+ 'chisel soft': 'Slmt',
1603
+ });
1604
+ exports.BESs = (0, helpers_1.createEnum)('BESs', 'up', {
1605
+ up: 'In ',
1606
+ down: 'Out ',
1607
+ });
1608
+ exports.BETE = (0, helpers_1.createEnum)('BETE', 'softer', {
1609
+ softer: 'SfBL',
1610
+ precise: 'PrBL',
1611
+ });
1612
+ exports.IGSr = (0, helpers_1.createEnum)('IGSr', 'edge', {
1613
+ edge: 'SrcE',
1614
+ center: 'SrcC',
1615
+ });
1616
+ exports.GrdT = (0, helpers_1.createEnum)('GrdT', 'linear', {
1617
+ linear: 'Lnr ',
1618
+ radial: 'Rdl ',
1619
+ angle: 'Angl',
1620
+ reflected: 'Rflc',
1621
+ diamond: 'Dmnd',
1622
+ });
1623
+ exports.animInterpStyleEnum = (0, helpers_1.createEnum)('animInterpStyle', 'linear', {
1624
+ linear: 'Lnr ',
1625
+ hold: 'hold',
1626
+ });
1627
+ exports.stdTrackID = (0, helpers_1.createEnum)('stdTrackID', 'opacity', {
1628
+ opacity: 'opacityTrack',
1629
+ style: 'styleTrack',
1630
+ sheetTransform: 'sheetTransformTrack',
1631
+ sheetPosition: 'sheetPositionTrack',
1632
+ globalLighting: 'globalLightingTrack',
1633
+ });
1634
+ exports.gradientInterpolationMethodType = (0, helpers_1.createEnum)('gradientInterpolationMethodType', 'perceptual', {
1635
+ perceptual: 'Perc',
1636
+ linear: 'Lnr',
1637
+ classic: 'Gcls',
1638
+ });
1639
+ exports.ClrS = (0, helpers_1.createEnum)('ClrS', 'rgb', {
1640
+ rgb: 'RGBC',
1641
+ hsb: 'HSBl',
1642
+ lab: 'LbCl',
1643
+ });
1644
+ exports.FStl = (0, helpers_1.createEnum)('FStl', 'outside', {
1645
+ outside: 'OutF',
1646
+ center: 'CtrF',
1647
+ inside: 'InsF'
1648
+ });
1649
+ exports.FrFl = (0, helpers_1.createEnum)('FrFl', 'color', {
1650
+ color: 'SClr',
1651
+ gradient: 'GrFl',
1652
+ pattern: 'Ptrn',
1653
+ });
1654
+ exports.ESliceType = (0, helpers_1.createEnum)('ESliceType', 'image', {
1655
+ image: 'Img ',
1656
+ noImage: 'noImage',
1657
+ });
1658
+ exports.ESliceHorzAlign = (0, helpers_1.createEnum)('ESliceHorzAlign', 'default', {
1659
+ default: 'default',
1660
+ });
1661
+ exports.ESliceVertAlign = (0, helpers_1.createEnum)('ESliceVertAlign', 'default', {
1662
+ default: 'default',
1663
+ });
1664
+ exports.ESliceOrigin = (0, helpers_1.createEnum)('ESliceOrigin', 'userGenerated', {
1665
+ userGenerated: 'userGenerated',
1666
+ autoGenerated: 'autoGenerated',
1667
+ layer: 'layer',
1668
+ });
1669
+ exports.ESliceBGColorType = (0, helpers_1.createEnum)('ESliceBGColorType', 'none', {
1670
+ none: 'None',
1671
+ matte: 'matte',
1672
+ color: 'Clr ',
1673
+ });
1674
+ exports.strokeStyleLineCapType = (0, helpers_1.createEnum)('strokeStyleLineCapType', 'butt', {
1675
+ butt: 'strokeStyleButtCap',
1676
+ round: 'strokeStyleRoundCap',
1677
+ square: 'strokeStyleSquareCap',
1678
+ });
1679
+ exports.strokeStyleLineJoinType = (0, helpers_1.createEnum)('strokeStyleLineJoinType', 'miter', {
1680
+ miter: 'strokeStyleMiterJoin',
1681
+ round: 'strokeStyleRoundJoin',
1682
+ bevel: 'strokeStyleBevelJoin',
1683
+ });
1684
+ exports.strokeStyleLineAlignment = (0, helpers_1.createEnum)('strokeStyleLineAlignment', 'inside', {
1685
+ inside: 'strokeStyleAlignInside',
1686
+ center: 'strokeStyleAlignCenter',
1687
+ outside: 'strokeStyleAlignOutside',
1688
+ });
1689
+ //# sourceMappingURL=descriptor.js.map