@esotericsoftware/spine-core 4.2.115 → 4.3.0
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.
- package/dist/Animation.d.ts +426 -274
- package/dist/Animation.js +1174 -1210
- package/dist/AnimationState.d.ts +246 -201
- package/dist/AnimationState.js +508 -471
- package/dist/AnimationStateData.d.ts +12 -10
- package/dist/AnimationStateData.js +19 -20
- package/dist/AssetManagerBase.d.ts +29 -23
- package/dist/AssetManagerBase.js +67 -43
- package/dist/AtlasAttachmentLoader.d.ts +18 -12
- package/dist/AtlasAttachmentLoader.js +28 -39
- package/dist/Bone.d.ts +15 -109
- package/dist/Bone.js +22 -362
- package/dist/BoneData.d.ts +13 -28
- package/dist/BoneData.js +20 -29
- package/dist/BonePose.d.ts +130 -0
- package/dist/BonePose.js +426 -0
- package/dist/Constraint.d.ts +41 -0
- package/dist/Constraint.js +38 -0
- package/dist/ConstraintData.d.ts +7 -5
- package/dist/ConstraintData.js +5 -9
- package/dist/DrawOrder.d.ts +48 -0
- package/dist/DrawOrder.js +64 -0
- package/dist/Event.d.ts +11 -6
- package/dist/Event.js +10 -5
- package/dist/EventData.d.ts +10 -6
- package/dist/EventData.js +18 -7
- package/dist/IkConstraint.d.ts +22 -28
- package/dist/IkConstraint.js +115 -117
- package/dist/IkConstraintData.d.ts +23 -18
- package/dist/IkConstraintData.js +32 -22
- package/dist/IkConstraintPose.d.ts +49 -0
- package/dist/IkConstraintPose.js +55 -0
- package/dist/PathConstraint.d.ts +18 -22
- package/dist/PathConstraint.js +160 -136
- package/dist/PathConstraintData.d.ts +11 -14
- package/dist/PathConstraintData.js +14 -16
- package/dist/PathConstraintPose.d.ts +43 -0
- package/dist/PathConstraintPose.js +49 -0
- package/dist/Physics.d.ts +39 -0
- package/dist/Physics.js +41 -0
- package/dist/PhysicsConstraint.d.ts +26 -30
- package/dist/PhysicsConstraint.js +102 -94
- package/dist/PhysicsConstraintData.d.ts +22 -12
- package/dist/PhysicsConstraintData.js +23 -12
- package/dist/PhysicsConstraintPose.d.ts +47 -0
- package/dist/PhysicsConstraintPose.js +55 -0
- package/dist/Pose.d.ts +33 -0
- package/dist/Pose.js +30 -0
- package/dist/Posed.d.ts +58 -0
- package/dist/Posed.js +78 -0
- package/dist/PosedActive.d.ts +41 -0
- package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
- package/dist/PosedData.d.ts +40 -0
- package/dist/PosedData.js +45 -0
- package/dist/Skeleton.d.ts +110 -99
- package/dist/Skeleton.js +271 -449
- package/dist/SkeletonBinary.d.ts +2 -2
- package/dist/SkeletonBinary.js +644 -466
- package/dist/SkeletonBounds.d.ts +4 -4
- package/dist/SkeletonBounds.js +45 -46
- package/dist/SkeletonClipping.d.ts +26 -22
- package/dist/SkeletonClipping.js +654 -340
- package/dist/SkeletonData.d.ts +18 -35
- package/dist/SkeletonData.js +57 -97
- package/dist/SkeletonJson.d.ts +8 -6
- package/dist/SkeletonJson.js +892 -641
- package/dist/SkeletonRendererCore.d.ts +58 -0
- package/dist/SkeletonRendererCore.js +310 -0
- package/dist/Skin.d.ts +20 -16
- package/dist/Skin.js +58 -53
- package/dist/Slider.d.ts +46 -0
- package/dist/Slider.js +115 -0
- package/dist/SliderData.d.ts +58 -0
- package/dist/SliderData.js +59 -0
- package/dist/SliderPose.d.ts +37 -0
- package/dist/SliderPose.js +40 -0
- package/dist/Slot.d.ts +16 -38
- package/dist/Slot.js +37 -60
- package/dist/SlotData.d.ts +5 -12
- package/dist/SlotData.js +7 -15
- package/dist/SlotPose.d.ts +59 -0
- package/dist/SlotPose.js +81 -0
- package/dist/Texture.d.ts +1 -0
- package/dist/Texture.js +2 -1
- package/dist/TextureAtlas.d.ts +3 -3
- package/dist/TextureAtlas.js +49 -49
- package/dist/TransformConstraint.d.ts +16 -28
- package/dist/TransformConstraint.js +72 -209
- package/dist/TransformConstraintData.d.ts +108 -20
- package/dist/TransformConstraintData.js +274 -24
- package/dist/TransformConstraintPose.d.ts +45 -0
- package/dist/TransformConstraintPose.js +52 -0
- package/dist/Triangulator.d.ts +1 -1
- package/dist/Triangulator.js +91 -107
- package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
- package/dist/Update.js +30 -0
- package/dist/Utils.d.ts +13 -4
- package/dist/Utils.js +78 -37
- package/dist/attachments/Attachment.d.ts +27 -19
- package/dist/attachments/Attachment.js +59 -35
- package/dist/attachments/AttachmentLoader.d.ts +14 -14
- package/dist/attachments/AttachmentLoader.js +1 -1
- package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
- package/dist/attachments/BoundingBoxAttachment.js +2 -2
- package/dist/attachments/ClippingAttachment.d.ts +10 -3
- package/dist/attachments/ClippingAttachment.js +12 -3
- package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
- package/dist/attachments/HasSequence.js +30 -0
- package/dist/attachments/MeshAttachment.d.ts +28 -35
- package/dist/attachments/MeshAttachment.js +85 -97
- package/dist/attachments/PathAttachment.d.ts +3 -3
- package/dist/attachments/PathAttachment.js +6 -6
- package/dist/attachments/PointAttachment.d.ts +11 -6
- package/dist/attachments/PointAttachment.js +8 -3
- package/dist/attachments/RegionAttachment.d.ts +25 -27
- package/dist/attachments/RegionAttachment.js +101 -113
- package/dist/attachments/Sequence.d.ts +31 -6
- package/dist/attachments/Sequence.js +79 -13
- package/dist/esm/spine-core.min.mjs +2 -2
- package/dist/esm/spine-core.mjs +7651 -6090
- package/dist/esm/spine-core.mjs.map +4 -4
- package/dist/iife/spine-core.js +7651 -6090
- package/dist/iife/spine-core.js.map +4 -4
- package/dist/iife/spine-core.min.js +2 -2
- package/dist/index.d.ts +32 -11
- package/dist/index.js +33 -12
- package/dist/polyfills.js +4 -5
- package/package.json +1 -1
- package/dist/Updatable.js +0 -30
package/dist/SkeletonJson.js
CHANGED
|
@@ -26,20 +26,20 @@
|
|
|
26
26
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
27
27
|
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
28
28
|
*****************************************************************************/
|
|
29
|
-
import {
|
|
29
|
+
import { AlphaTimeline, Animation, AttachmentTimeline, DeformTimeline, DrawOrderFolderTimeline, DrawOrderTimeline, EventTimeline, IkConstraintTimeline, InheritTimeline, PathConstraintMixTimeline, PathConstraintPositionTimeline, PathConstraintSpacingTimeline, PhysicsConstraintDampingTimeline, PhysicsConstraintGravityTimeline, PhysicsConstraintInertiaTimeline, PhysicsConstraintMassTimeline, PhysicsConstraintMixTimeline, PhysicsConstraintResetTimeline, PhysicsConstraintStrengthTimeline, PhysicsConstraintWindTimeline, RGB2Timeline, RGBA2Timeline, RGBATimeline, RGBTimeline, RotateTimeline, ScaleTimeline, ScaleXTimeline, ScaleYTimeline, SequenceTimeline, ShearTimeline, ShearXTimeline, ShearYTimeline, SliderMixTimeline, SliderTimeline, TransformConstraintTimeline, TranslateTimeline, TranslateXTimeline, TranslateYTimeline } from "./Animation.js";
|
|
30
|
+
import { Sequence, SequenceMode } from "./attachments/Sequence.js";
|
|
30
31
|
import { BoneData, Inherit } from "./BoneData.js";
|
|
31
|
-
import { EventData } from "./EventData.js";
|
|
32
32
|
import { Event } from "./Event.js";
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
33
|
+
import { EventData } from "./EventData.js";
|
|
34
|
+
import { IkConstraintData, ScaleYMode } from "./IkConstraintData.js";
|
|
35
|
+
import { PathConstraintData, PositionMode, RotateMode, SpacingMode } from "./PathConstraintData.js";
|
|
36
|
+
import { PhysicsConstraintData } from "./PhysicsConstraintData.js";
|
|
35
37
|
import { SkeletonData } from "./SkeletonData.js";
|
|
36
38
|
import { Skin } from "./Skin.js";
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
41
|
-
import { SequenceTimeline } from "./Animation.js";
|
|
42
|
-
import { PhysicsConstraintData } from "./PhysicsConstraintData.js";
|
|
39
|
+
import { SliderData } from "./SliderData.js";
|
|
40
|
+
import { BlendMode, SlotData } from "./SlotData.js";
|
|
41
|
+
import { FromRotate, FromScaleX, FromScaleY, FromShearY, FromX, FromY, ToRotate, ToScaleX, ToScaleY, ToShearY, ToX, ToY, TransformConstraintData } from "./TransformConstraintData.js";
|
|
42
|
+
import { Color, Utils } from "./Utils.js";
|
|
43
43
|
/** Loads skeleton data in the Spine JSON format.
|
|
44
44
|
*
|
|
45
45
|
* See [Spine JSON format](http://esotericsoftware.com/spine-json-format) and
|
|
@@ -52,16 +52,17 @@ export class SkeletonJson {
|
|
|
52
52
|
*
|
|
53
53
|
* See [Scaling](http://esotericsoftware.com/spine-loading-skeleton-data#Scaling) in the Spine Runtimes Guide. */
|
|
54
54
|
scale = 1;
|
|
55
|
-
linkedMeshes =
|
|
55
|
+
linkedMeshes = [];
|
|
56
56
|
constructor(attachmentLoader) {
|
|
57
57
|
this.attachmentLoader = attachmentLoader;
|
|
58
58
|
}
|
|
59
|
+
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
|
|
59
60
|
readSkeletonData(json) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
61
|
+
const scale = this.scale;
|
|
62
|
+
const skeletonData = new SkeletonData();
|
|
63
|
+
const root = typeof (json) === "string" ? JSON.parse(json) : json;
|
|
63
64
|
// Skeleton
|
|
64
|
-
|
|
65
|
+
const skeletonMap = root.skeleton;
|
|
65
66
|
if (skeletonMap) {
|
|
66
67
|
skeletonData.hash = skeletonMap.hash;
|
|
67
68
|
skeletonData.version = skeletonMap.spine;
|
|
@@ -77,192 +78,279 @@ export class SkeletonJson {
|
|
|
77
78
|
// Bones
|
|
78
79
|
if (root.bones) {
|
|
79
80
|
for (let i = 0; i < root.bones.length; i++) {
|
|
80
|
-
|
|
81
|
+
const boneMap = root.bones[i];
|
|
81
82
|
let parent = null;
|
|
82
|
-
|
|
83
|
+
const parentName = getValue(boneMap, "parent", null);
|
|
83
84
|
if (parentName)
|
|
84
85
|
parent = skeletonData.findBone(parentName);
|
|
85
|
-
|
|
86
|
+
const data = new BoneData(skeletonData.bones.length, boneMap.name, parent);
|
|
86
87
|
data.length = getValue(boneMap, "length", 0) * scale;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
88
|
+
const setup = data.setupPose;
|
|
89
|
+
setup.x = getValue(boneMap, "x", 0) * scale;
|
|
90
|
+
setup.y = getValue(boneMap, "y", 0) * scale;
|
|
91
|
+
setup.rotation = getValue(boneMap, "rotation", 0);
|
|
92
|
+
setup.scaleX = getValue(boneMap, "scaleX", 1);
|
|
93
|
+
setup.scaleY = getValue(boneMap, "scaleY", 1);
|
|
94
|
+
setup.shearX = getValue(boneMap, "shearX", 0);
|
|
95
|
+
setup.shearY = getValue(boneMap, "shearY", 0);
|
|
96
|
+
setup.inherit = Utils.enumValue(Inherit, getValue(boneMap, "inherit", "Normal"));
|
|
95
97
|
data.skinRequired = getValue(boneMap, "skin", false);
|
|
96
|
-
|
|
98
|
+
const color = getValue(boneMap, "color", null);
|
|
97
99
|
if (color)
|
|
98
100
|
data.color.setFromString(color);
|
|
101
|
+
data.icon = getValue(boneMap, "icon", undefined);
|
|
102
|
+
data.iconSize = getValue(boneMap, "iconSize", 1);
|
|
103
|
+
data.iconRotation = getValue(boneMap, "iconRotation", 0);
|
|
99
104
|
skeletonData.bones.push(data);
|
|
100
105
|
}
|
|
101
106
|
}
|
|
102
107
|
// Slots.
|
|
103
108
|
if (root.slots) {
|
|
104
109
|
for (let i = 0; i < root.slots.length; i++) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
110
|
+
const slotMap = root.slots[i];
|
|
111
|
+
const slotName = slotMap.name;
|
|
112
|
+
const boneData = skeletonData.findBone(slotMap.bone);
|
|
108
113
|
if (!boneData)
|
|
109
114
|
throw new Error(`Couldn't find bone ${slotMap.bone} for slot ${slotName}`);
|
|
110
|
-
|
|
111
|
-
|
|
115
|
+
const data = new SlotData(skeletonData.slots.length, slotName, boneData);
|
|
116
|
+
const color = getValue(slotMap, "color", null);
|
|
112
117
|
if (color)
|
|
113
|
-
data.color.setFromString(color);
|
|
114
|
-
|
|
118
|
+
data.setupPose.color.setFromString(color);
|
|
119
|
+
const dark = getValue(slotMap, "dark", null);
|
|
115
120
|
if (dark)
|
|
116
|
-
data.darkColor = Color.fromString(dark);
|
|
121
|
+
data.setupPose.darkColor = Color.fromString(dark);
|
|
117
122
|
data.attachmentName = getValue(slotMap, "attachment", null);
|
|
118
123
|
data.blendMode = Utils.enumValue(BlendMode, getValue(slotMap, "blend", "normal"));
|
|
119
124
|
data.visible = getValue(slotMap, "visible", true);
|
|
120
125
|
skeletonData.slots.push(data);
|
|
121
126
|
}
|
|
122
127
|
}
|
|
123
|
-
//
|
|
124
|
-
if (root.
|
|
125
|
-
for (
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
128
|
+
// Constraints.
|
|
129
|
+
if (root.constraints) {
|
|
130
|
+
for (const constraintMap of root.constraints) {
|
|
131
|
+
const name = constraintMap.name;
|
|
132
|
+
const skinRequired = getValue(constraintMap, "skin", false);
|
|
133
|
+
switch (getValue(constraintMap, "type", false)) {
|
|
134
|
+
case "ik": {
|
|
135
|
+
const data = new IkConstraintData(name);
|
|
136
|
+
data.skinRequired = skinRequired;
|
|
137
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
|
|
138
|
+
const bone = skeletonData.findBone(constraintMap.bones[ii]);
|
|
139
|
+
if (!bone)
|
|
140
|
+
throw new Error(`Couldn't find bone ${constraintMap.bones[ii]} for IK constraint ${name}.`);
|
|
141
|
+
data.bones.push(bone);
|
|
142
|
+
}
|
|
143
|
+
const targetName = constraintMap.target;
|
|
144
|
+
const target = skeletonData.findBone(targetName);
|
|
145
|
+
if (!target)
|
|
146
|
+
throw new Error(`Couldn't find target bone ${targetName} for IK constraint ${name}.`);
|
|
147
|
+
data.target = target;
|
|
148
|
+
const scaleY = getValue(constraintMap, "scaleY", null);
|
|
149
|
+
if (scaleY != null)
|
|
150
|
+
data.scaleYMode = Utils.enumValue(ScaleYMode, scaleY);
|
|
151
|
+
const setup = data.setupPose;
|
|
152
|
+
setup.mix = getValue(constraintMap, "mix", 1);
|
|
153
|
+
setup.softness = getValue(constraintMap, "softness", 0) * scale;
|
|
154
|
+
setup.bendDirection = getValue(constraintMap, "bendPositive", true) ? 1 : -1;
|
|
155
|
+
setup.compress = getValue(constraintMap, "compress", false);
|
|
156
|
+
setup.stretch = getValue(constraintMap, "stretch", false);
|
|
157
|
+
skeletonData.constraints.push(data);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
case "transform": {
|
|
161
|
+
const data = new TransformConstraintData(name);
|
|
162
|
+
data.skinRequired = skinRequired;
|
|
163
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
|
|
164
|
+
const boneName = constraintMap.bones[ii];
|
|
165
|
+
const bone = skeletonData.findBone(boneName);
|
|
166
|
+
if (!bone)
|
|
167
|
+
throw new Error(`Couldn't find bone ${boneName} for transform constraint ${constraintMap.name}.`);
|
|
168
|
+
data.bones.push(bone);
|
|
169
|
+
}
|
|
170
|
+
const sourceName = constraintMap.source;
|
|
171
|
+
const source = skeletonData.findBone(sourceName);
|
|
172
|
+
if (!source)
|
|
173
|
+
throw new Error(`Couldn't find source bone ${sourceName} for transform constraint ${constraintMap.name}.`);
|
|
174
|
+
data.source = source;
|
|
175
|
+
data.localSource = getValue(constraintMap, "localSource", false);
|
|
176
|
+
data.localTarget = getValue(constraintMap, "localTarget", false);
|
|
177
|
+
data.additive = getValue(constraintMap, "additive", false);
|
|
178
|
+
data.clamp = getValue(constraintMap, "clamp", false);
|
|
179
|
+
let rotate = false, x = false, y = false, scaleX = false, scaleY = false, shearY = false;
|
|
180
|
+
const fromEntries = Object.entries(getValue(constraintMap, "properties", {}));
|
|
181
|
+
for (const [name, fromEntry] of fromEntries) {
|
|
182
|
+
const from = this.fromProperty(name);
|
|
183
|
+
const fromScale = this.propertyScale(name, scale);
|
|
184
|
+
from.offset = getValue(fromEntry, "offset", 0) * fromScale;
|
|
185
|
+
const toEntries = Object.entries(getValue(fromEntry, "to", {}));
|
|
186
|
+
for (const [name, toEntry] of toEntries) {
|
|
187
|
+
let toScale = 1;
|
|
188
|
+
let to;
|
|
189
|
+
switch (name) {
|
|
190
|
+
case "rotate": {
|
|
191
|
+
rotate = true;
|
|
192
|
+
to = new ToRotate();
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case "x": {
|
|
196
|
+
x = true;
|
|
197
|
+
to = new ToX();
|
|
198
|
+
toScale = scale;
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
case "y": {
|
|
202
|
+
y = true;
|
|
203
|
+
to = new ToY();
|
|
204
|
+
toScale = scale;
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case "scaleX": {
|
|
208
|
+
scaleX = true;
|
|
209
|
+
to = new ToScaleX();
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
case "scaleY": {
|
|
213
|
+
scaleY = true;
|
|
214
|
+
to = new ToScaleY();
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
case "shearY": {
|
|
218
|
+
shearY = true;
|
|
219
|
+
to = new ToShearY();
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
default: throw new Error(`Invalid transform constraint to property: ${name}`);
|
|
223
|
+
}
|
|
224
|
+
to.offset = getValue(toEntry, "offset", 0) * toScale;
|
|
225
|
+
to.max = getValue(toEntry, "max", 1) * toScale;
|
|
226
|
+
to.scale = getValue(toEntry, "scale", 1) * toScale / fromScale;
|
|
227
|
+
from.to.push(to);
|
|
228
|
+
}
|
|
229
|
+
if (from.to.length > 0)
|
|
230
|
+
data.properties.push(from);
|
|
231
|
+
}
|
|
232
|
+
data.offsets[TransformConstraintData.ROTATION] = getValue(constraintMap, "rotation", 0);
|
|
233
|
+
data.offsets[TransformConstraintData.X] = getValue(constraintMap, "x", 0) * scale;
|
|
234
|
+
data.offsets[TransformConstraintData.Y] = getValue(constraintMap, "y", 0) * scale;
|
|
235
|
+
data.offsets[TransformConstraintData.SCALEX] = getValue(constraintMap, "scaleX", 0);
|
|
236
|
+
data.offsets[TransformConstraintData.SCALEY] = getValue(constraintMap, "scaleY", 0);
|
|
237
|
+
data.offsets[TransformConstraintData.SHEARY] = getValue(constraintMap, "shearY", 0);
|
|
238
|
+
const setup = data.setupPose;
|
|
239
|
+
if (rotate)
|
|
240
|
+
setup.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
241
|
+
if (x)
|
|
242
|
+
setup.mixX = getValue(constraintMap, "mixX", 1);
|
|
243
|
+
if (y)
|
|
244
|
+
setup.mixY = getValue(constraintMap, "mixY", setup.mixX);
|
|
245
|
+
if (scaleX)
|
|
246
|
+
setup.mixScaleX = getValue(constraintMap, "mixScaleX", 1);
|
|
247
|
+
if (scaleY)
|
|
248
|
+
setup.mixScaleY = getValue(constraintMap, "mixScaleY", setup.mixScaleX);
|
|
249
|
+
if (shearY)
|
|
250
|
+
setup.mixShearY = getValue(constraintMap, "mixShearY", 1);
|
|
251
|
+
skeletonData.constraints.push(data);
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
case "path": {
|
|
255
|
+
const data = new PathConstraintData(name);
|
|
256
|
+
data.skinRequired = skinRequired;
|
|
257
|
+
for (let ii = 0; ii < constraintMap.bones.length; ii++) {
|
|
258
|
+
const boneName = constraintMap.bones[ii];
|
|
259
|
+
const bone = skeletonData.findBone(boneName);
|
|
260
|
+
if (!bone)
|
|
261
|
+
throw new Error(`Couldn't find bone ${boneName} for path constraint ${constraintMap.name}.`);
|
|
262
|
+
data.bones.push(bone);
|
|
263
|
+
}
|
|
264
|
+
const slotName = constraintMap.slot;
|
|
265
|
+
const slot = skeletonData.findSlot(slotName);
|
|
266
|
+
if (!slot)
|
|
267
|
+
throw new Error(`Couldn't find slot ${slotName} for path constraint ${constraintMap.name}.`);
|
|
268
|
+
data.slot = slot;
|
|
269
|
+
data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
|
|
270
|
+
data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
|
|
271
|
+
data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
|
|
272
|
+
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
273
|
+
const setup = data.setupPose;
|
|
274
|
+
setup.position = getValue(constraintMap, "position", 0);
|
|
275
|
+
if (data.positionMode === PositionMode.Fixed)
|
|
276
|
+
setup.position *= scale;
|
|
277
|
+
setup.spacing = getValue(constraintMap, "spacing", 0);
|
|
278
|
+
if (data.spacingMode === SpacingMode.Length || data.spacingMode === SpacingMode.Fixed)
|
|
279
|
+
setup.spacing *= scale;
|
|
280
|
+
setup.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
281
|
+
setup.mixX = getValue(constraintMap, "mixX", 1);
|
|
282
|
+
setup.mixY = getValue(constraintMap, "mixY", setup.mixX);
|
|
283
|
+
skeletonData.constraints.push(data);
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
case "physics": {
|
|
287
|
+
const data = new PhysicsConstraintData(name);
|
|
288
|
+
data.skinRequired = skinRequired;
|
|
289
|
+
const boneName = constraintMap.bone;
|
|
290
|
+
const bone = skeletonData.findBone(boneName);
|
|
291
|
+
if (bone == null)
|
|
292
|
+
throw new Error(`Physics bone not found: ${boneName}`);
|
|
293
|
+
data.bone = bone;
|
|
294
|
+
data.x = getValue(constraintMap, "x", 0);
|
|
295
|
+
data.y = getValue(constraintMap, "y", 0);
|
|
296
|
+
data.rotate = getValue(constraintMap, "rotate", 0);
|
|
297
|
+
data.scaleX = getValue(constraintMap, "scaleX", 0);
|
|
298
|
+
data.shearX = getValue(constraintMap, "shearX", 0);
|
|
299
|
+
data.limit = getValue(constraintMap, "limit", 5000) * scale;
|
|
300
|
+
data.step = 1 / getValue(constraintMap, "fps", 60);
|
|
301
|
+
const setup = data.setupPose;
|
|
302
|
+
setup.inertia = getValue(constraintMap, "inertia", 0.5);
|
|
303
|
+
setup.strength = getValue(constraintMap, "strength", 100);
|
|
304
|
+
setup.damping = getValue(constraintMap, "damping", 0.85);
|
|
305
|
+
setup.massInverse = 1 / getValue(constraintMap, "mass", 1);
|
|
306
|
+
setup.wind = getValue(constraintMap, "wind", 0);
|
|
307
|
+
setup.gravity = getValue(constraintMap, "gravity", 0);
|
|
308
|
+
setup.mix = getValue(constraintMap, "mix", 1);
|
|
309
|
+
data.inertiaGlobal = getValue(constraintMap, "inertiaGlobal", false);
|
|
310
|
+
data.strengthGlobal = getValue(constraintMap, "strengthGlobal", false);
|
|
311
|
+
data.dampingGlobal = getValue(constraintMap, "dampingGlobal", false);
|
|
312
|
+
data.massGlobal = getValue(constraintMap, "massGlobal", false);
|
|
313
|
+
data.windGlobal = getValue(constraintMap, "windGlobal", false);
|
|
314
|
+
data.gravityGlobal = getValue(constraintMap, "gravityGlobal", false);
|
|
315
|
+
data.mixGlobal = getValue(constraintMap, "mixGlobal", false);
|
|
316
|
+
skeletonData.constraints.push(data);
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
case "slider": {
|
|
320
|
+
const data = new SliderData(name);
|
|
321
|
+
data.skinRequired = skinRequired;
|
|
322
|
+
data.additive = getValue(constraintMap, "additive", false);
|
|
323
|
+
data.loop = getValue(constraintMap, "loop", false);
|
|
324
|
+
data.setupPose.time = getValue(constraintMap, "time", 0);
|
|
325
|
+
data.setupPose.mix = getValue(constraintMap, "mix", 1);
|
|
326
|
+
const boneName = constraintMap.bone;
|
|
327
|
+
if (boneName) {
|
|
328
|
+
data.bone = skeletonData.findBone(boneName);
|
|
329
|
+
if (!data.bone)
|
|
330
|
+
throw new Error(`Slider bone not found: ${boneName}`);
|
|
331
|
+
const property = constraintMap.property;
|
|
332
|
+
data.property = this.fromProperty(property);
|
|
333
|
+
const propertyScale = this.propertyScale(property, scale);
|
|
334
|
+
data.property.offset = getValue(constraintMap, "from", 0) * propertyScale;
|
|
335
|
+
data.offset = getValue(constraintMap, "to", 0);
|
|
336
|
+
data.scale = getValue(constraintMap, "scale", 1) / propertyScale;
|
|
337
|
+
data.local = getValue(constraintMap, "local", false);
|
|
338
|
+
}
|
|
339
|
+
skeletonData.constraints.push(data);
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
199
342
|
}
|
|
200
|
-
let targetName = constraintMap.target;
|
|
201
|
-
let target = skeletonData.findSlot(targetName);
|
|
202
|
-
if (!target)
|
|
203
|
-
throw new Error(`Couldn't find target slot ${targetName} for path constraint ${constraintMap.name}.`);
|
|
204
|
-
data.target = target;
|
|
205
|
-
data.positionMode = Utils.enumValue(PositionMode, getValue(constraintMap, "positionMode", "Percent"));
|
|
206
|
-
data.spacingMode = Utils.enumValue(SpacingMode, getValue(constraintMap, "spacingMode", "Length"));
|
|
207
|
-
data.rotateMode = Utils.enumValue(RotateMode, getValue(constraintMap, "rotateMode", "Tangent"));
|
|
208
|
-
data.offsetRotation = getValue(constraintMap, "rotation", 0);
|
|
209
|
-
data.position = getValue(constraintMap, "position", 0);
|
|
210
|
-
if (data.positionMode == PositionMode.Fixed)
|
|
211
|
-
data.position *= scale;
|
|
212
|
-
data.spacing = getValue(constraintMap, "spacing", 0);
|
|
213
|
-
if (data.spacingMode == SpacingMode.Length || data.spacingMode == SpacingMode.Fixed)
|
|
214
|
-
data.spacing *= scale;
|
|
215
|
-
data.mixRotate = getValue(constraintMap, "mixRotate", 1);
|
|
216
|
-
data.mixX = getValue(constraintMap, "mixX", 1);
|
|
217
|
-
data.mixY = getValue(constraintMap, "mixY", data.mixX);
|
|
218
|
-
skeletonData.pathConstraints.push(data);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
// Physics constraints.
|
|
222
|
-
if (root.physics) {
|
|
223
|
-
for (let i = 0; i < root.physics.length; i++) {
|
|
224
|
-
const constraintMap = root.physics[i];
|
|
225
|
-
const data = new PhysicsConstraintData(constraintMap.name);
|
|
226
|
-
data.order = getValue(constraintMap, "order", 0);
|
|
227
|
-
data.skinRequired = getValue(constraintMap, "skin", false);
|
|
228
|
-
const boneName = constraintMap.bone;
|
|
229
|
-
const bone = skeletonData.findBone(boneName);
|
|
230
|
-
if (bone == null)
|
|
231
|
-
throw new Error("Physics bone not found: " + boneName);
|
|
232
|
-
data.bone = bone;
|
|
233
|
-
data.x = getValue(constraintMap, "x", 0);
|
|
234
|
-
data.y = getValue(constraintMap, "y", 0);
|
|
235
|
-
data.rotate = getValue(constraintMap, "rotate", 0);
|
|
236
|
-
data.scaleX = getValue(constraintMap, "scaleX", 0);
|
|
237
|
-
data.shearX = getValue(constraintMap, "shearX", 0);
|
|
238
|
-
data.limit = getValue(constraintMap, "limit", 5000) * scale;
|
|
239
|
-
data.step = 1 / getValue(constraintMap, "fps", 60);
|
|
240
|
-
data.inertia = getValue(constraintMap, "inertia", 1);
|
|
241
|
-
data.strength = getValue(constraintMap, "strength", 100);
|
|
242
|
-
data.damping = getValue(constraintMap, "damping", 1);
|
|
243
|
-
data.massInverse = 1 / getValue(constraintMap, "mass", 1);
|
|
244
|
-
data.wind = getValue(constraintMap, "wind", 0);
|
|
245
|
-
data.gravity = getValue(constraintMap, "gravity", 0);
|
|
246
|
-
data.mix = getValue(constraintMap, "mix", 1);
|
|
247
|
-
data.inertiaGlobal = getValue(constraintMap, "inertiaGlobal", false);
|
|
248
|
-
data.strengthGlobal = getValue(constraintMap, "strengthGlobal", false);
|
|
249
|
-
data.dampingGlobal = getValue(constraintMap, "dampingGlobal", false);
|
|
250
|
-
data.massGlobal = getValue(constraintMap, "massGlobal", false);
|
|
251
|
-
data.windGlobal = getValue(constraintMap, "windGlobal", false);
|
|
252
|
-
data.gravityGlobal = getValue(constraintMap, "gravityGlobal", false);
|
|
253
|
-
data.mixGlobal = getValue(constraintMap, "mixGlobal", false);
|
|
254
|
-
skeletonData.physicsConstraints.push(data);
|
|
255
343
|
}
|
|
256
344
|
}
|
|
257
345
|
// Skins.
|
|
258
346
|
if (root.skins) {
|
|
259
347
|
for (let i = 0; i < root.skins.length; i++) {
|
|
260
|
-
|
|
261
|
-
|
|
348
|
+
const skinMap = root.skins[i];
|
|
349
|
+
const skin = new Skin(skinMap.name);
|
|
262
350
|
if (skinMap.bones) {
|
|
263
351
|
for (let ii = 0; ii < skinMap.bones.length; ii++) {
|
|
264
|
-
|
|
265
|
-
|
|
352
|
+
const boneName = skinMap.bones[ii];
|
|
353
|
+
const bone = skeletonData.findBone(boneName);
|
|
266
354
|
if (!bone)
|
|
267
355
|
throw new Error(`Couldn't find bone ${boneName} for skin ${skinMap.name}.`);
|
|
268
356
|
skin.bones.push(bone);
|
|
@@ -270,8 +358,8 @@ export class SkeletonJson {
|
|
|
270
358
|
}
|
|
271
359
|
if (skinMap.ik) {
|
|
272
360
|
for (let ii = 0; ii < skinMap.ik.length; ii++) {
|
|
273
|
-
|
|
274
|
-
|
|
361
|
+
const constraintName = skinMap.ik[ii];
|
|
362
|
+
const constraint = skeletonData.findConstraint(constraintName, IkConstraintData);
|
|
275
363
|
if (!constraint)
|
|
276
364
|
throw new Error(`Couldn't find IK constraint ${constraintName} for skin ${skinMap.name}.`);
|
|
277
365
|
skin.constraints.push(constraint);
|
|
@@ -279,8 +367,8 @@ export class SkeletonJson {
|
|
|
279
367
|
}
|
|
280
368
|
if (skinMap.transform) {
|
|
281
369
|
for (let ii = 0; ii < skinMap.transform.length; ii++) {
|
|
282
|
-
|
|
283
|
-
|
|
370
|
+
const constraintName = skinMap.transform[ii];
|
|
371
|
+
const constraint = skeletonData.findConstraint(constraintName, TransformConstraintData);
|
|
284
372
|
if (!constraint)
|
|
285
373
|
throw new Error(`Couldn't find transform constraint ${constraintName} for skin ${skinMap.name}.`);
|
|
286
374
|
skin.constraints.push(constraint);
|
|
@@ -288,8 +376,8 @@ export class SkeletonJson {
|
|
|
288
376
|
}
|
|
289
377
|
if (skinMap.path) {
|
|
290
378
|
for (let ii = 0; ii < skinMap.path.length; ii++) {
|
|
291
|
-
|
|
292
|
-
|
|
379
|
+
const constraintName = skinMap.path[ii];
|
|
380
|
+
const constraint = skeletonData.findConstraint(constraintName, PathConstraintData);
|
|
293
381
|
if (!constraint)
|
|
294
382
|
throw new Error(`Couldn't find path constraint ${constraintName} for skin ${skinMap.name}.`);
|
|
295
383
|
skin.constraints.push(constraint);
|
|
@@ -297,77 +385,144 @@ export class SkeletonJson {
|
|
|
297
385
|
}
|
|
298
386
|
if (skinMap.physics) {
|
|
299
387
|
for (let ii = 0; ii < skinMap.physics.length; ii++) {
|
|
300
|
-
|
|
301
|
-
|
|
388
|
+
const constraintName = skinMap.physics[ii];
|
|
389
|
+
const constraint = skeletonData.findConstraint(constraintName, PhysicsConstraintData);
|
|
302
390
|
if (!constraint)
|
|
303
391
|
throw new Error(`Couldn't find physics constraint ${constraintName} for skin ${skinMap.name}.`);
|
|
304
392
|
skin.constraints.push(constraint);
|
|
305
393
|
}
|
|
306
394
|
}
|
|
307
|
-
|
|
308
|
-
let
|
|
395
|
+
if (skinMap.slider) {
|
|
396
|
+
for (let ii = 0; ii < skinMap.slider.length; ii++) {
|
|
397
|
+
const constraintName = skinMap.slider[ii];
|
|
398
|
+
const constraint = skeletonData.findConstraint(constraintName, SliderData);
|
|
399
|
+
if (!constraint)
|
|
400
|
+
throw new Error(`Couldn't find slider constraint ${constraintName} for skin ${skinMap.name}.`);
|
|
401
|
+
skin.constraints.push(constraint);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
for (const slotName in skinMap.attachments) {
|
|
405
|
+
const slot = skeletonData.findSlot(slotName);
|
|
309
406
|
if (!slot)
|
|
310
|
-
throw new Error(`Couldn't find slot ${slotName} for skin ${skinMap.name}.`);
|
|
311
|
-
|
|
312
|
-
for (
|
|
313
|
-
|
|
407
|
+
throw new Error(`Couldn't find skin slot ${slotName} for skin ${skinMap.name}.`);
|
|
408
|
+
const slotMap = skinMap.attachments[slotName];
|
|
409
|
+
for (const entryName in slotMap) {
|
|
410
|
+
const attachment = this.readAttachment(slotMap[entryName], skin, slot.index, entryName, skeletonData);
|
|
314
411
|
if (attachment)
|
|
315
412
|
skin.setAttachment(slot.index, entryName, attachment);
|
|
316
413
|
}
|
|
317
414
|
}
|
|
318
415
|
skeletonData.skins.push(skin);
|
|
319
|
-
if (skin.name
|
|
416
|
+
if (skin.name === "default")
|
|
320
417
|
skeletonData.defaultSkin = skin;
|
|
321
418
|
}
|
|
322
419
|
}
|
|
323
420
|
// Linked meshes.
|
|
324
421
|
for (let i = 0, n = this.linkedMeshes.length; i < n; i++) {
|
|
325
|
-
|
|
326
|
-
|
|
422
|
+
const linkedMesh = this.linkedMeshes[i];
|
|
423
|
+
const skin = !linkedMesh.skin ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin);
|
|
327
424
|
if (!skin)
|
|
328
425
|
throw new Error(`Skin not found: ${linkedMesh.skin}`);
|
|
329
|
-
|
|
330
|
-
if (!
|
|
331
|
-
throw new Error(`
|
|
332
|
-
linkedMesh.mesh.timelineAttachment = linkedMesh.
|
|
333
|
-
linkedMesh.mesh.
|
|
334
|
-
|
|
335
|
-
|
|
426
|
+
const source = skin.getAttachment(linkedMesh.sourceIndex, linkedMesh.source);
|
|
427
|
+
if (!source)
|
|
428
|
+
throw new Error(`Source mesh not found: ${linkedMesh.source}`);
|
|
429
|
+
linkedMesh.mesh.timelineAttachment = linkedMesh.inheritTimelines ? source : linkedMesh.mesh;
|
|
430
|
+
linkedMesh.mesh.setSourceMesh(source);
|
|
431
|
+
linkedMesh.mesh.updateSequence();
|
|
432
|
+
// biome-ignore lint/suspicious/noConfusingLabels: reference runtime
|
|
433
|
+
outer: if (linkedMesh.inheritTimelines && linkedMesh.slotIndex !== linkedMesh.sourceIndex) {
|
|
434
|
+
const slots = source.timelineSlots;
|
|
435
|
+
for (const existing of slots)
|
|
436
|
+
if (existing === linkedMesh.slotIndex)
|
|
437
|
+
break outer;
|
|
438
|
+
const newSlots = [...slots];
|
|
439
|
+
newSlots[slots.length] = linkedMesh.slotIndex;
|
|
440
|
+
source.timelineSlots = newSlots;
|
|
441
|
+
}
|
|
336
442
|
}
|
|
337
443
|
this.linkedMeshes.length = 0;
|
|
338
444
|
// Events.
|
|
339
445
|
if (root.events) {
|
|
340
|
-
for (
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
446
|
+
for (const eventName in root.events) {
|
|
447
|
+
const eventMap = root.events[eventName];
|
|
448
|
+
const data = new EventData(eventName);
|
|
449
|
+
const setup = data.setupPose;
|
|
450
|
+
setup.intValue = getValue(eventMap, "int", 0);
|
|
451
|
+
setup.floatValue = getValue(eventMap, "float", 0);
|
|
452
|
+
setup.stringValue = getValue(eventMap, "string", "");
|
|
453
|
+
data._audioPath = getValue(eventMap, "audio", null);
|
|
347
454
|
if (data.audioPath) {
|
|
348
|
-
|
|
349
|
-
|
|
455
|
+
setup.volume = getValue(eventMap, "volume", setup.volume);
|
|
456
|
+
setup.balance = getValue(eventMap, "balance", setup.balance);
|
|
350
457
|
}
|
|
351
458
|
skeletonData.events.push(data);
|
|
352
459
|
}
|
|
353
460
|
}
|
|
354
461
|
// Animations.
|
|
355
462
|
if (root.animations) {
|
|
356
|
-
for (
|
|
357
|
-
|
|
463
|
+
for (const animationName in root.animations) {
|
|
464
|
+
const animationMap = root.animations[animationName];
|
|
358
465
|
this.readAnimation(animationMap, animationName, skeletonData);
|
|
359
466
|
}
|
|
360
467
|
}
|
|
468
|
+
// Slider animations.
|
|
469
|
+
if (root.constraints) {
|
|
470
|
+
for (const animationName in root.constraints) {
|
|
471
|
+
const animationMap = root.constraints[animationName];
|
|
472
|
+
if (animationMap.type === "slider") {
|
|
473
|
+
const data = skeletonData.findConstraint(animationMap.name, SliderData);
|
|
474
|
+
const animationName = animationMap.animation;
|
|
475
|
+
const animation = skeletonData.findAnimation(animationName);
|
|
476
|
+
if (!animation)
|
|
477
|
+
throw new Error(`Slider animation not found: ${animationName}`);
|
|
478
|
+
// biome-ignore lint/style/noNonNullAssertion: reference runtime
|
|
479
|
+
data.animation = animation;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
361
483
|
return skeletonData;
|
|
362
484
|
}
|
|
363
|
-
|
|
364
|
-
let
|
|
365
|
-
|
|
485
|
+
fromProperty(type) {
|
|
486
|
+
let from;
|
|
487
|
+
switch (type) {
|
|
488
|
+
case "rotate":
|
|
489
|
+
from = new FromRotate();
|
|
490
|
+
break;
|
|
491
|
+
case "x":
|
|
492
|
+
from = new FromX();
|
|
493
|
+
break;
|
|
494
|
+
case "y":
|
|
495
|
+
from = new FromY();
|
|
496
|
+
break;
|
|
497
|
+
case "scaleX":
|
|
498
|
+
from = new FromScaleX();
|
|
499
|
+
break;
|
|
500
|
+
case "scaleY":
|
|
501
|
+
from = new FromScaleY();
|
|
502
|
+
break;
|
|
503
|
+
case "shearY":
|
|
504
|
+
from = new FromShearY();
|
|
505
|
+
break;
|
|
506
|
+
default: throw new Error(`Invalid transform constraint from property: ${type}`);
|
|
507
|
+
}
|
|
508
|
+
return from;
|
|
509
|
+
}
|
|
510
|
+
propertyScale(type, scale) {
|
|
511
|
+
switch (type) {
|
|
512
|
+
case "x":
|
|
513
|
+
case "y": return scale;
|
|
514
|
+
default: return 1;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
|
|
518
|
+
readAttachment(map, skin, slotIndex, placeholder, skeletonData) {
|
|
519
|
+
const scale = this.scale;
|
|
520
|
+
const name = getValue(map, "name", placeholder);
|
|
366
521
|
switch (getValue(map, "type", "region")) {
|
|
367
522
|
case "region": {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
523
|
+
const path = getValue(map, "path", name);
|
|
524
|
+
const sequence = this.readSequence(getValue(map, "sequence", null));
|
|
525
|
+
const region = this.attachmentLoader.newRegionAttachment(skin, placeholder, name, path, sequence);
|
|
371
526
|
if (!region)
|
|
372
527
|
return null;
|
|
373
528
|
region.path = path;
|
|
@@ -378,92 +533,98 @@ export class SkeletonJson {
|
|
|
378
533
|
region.rotation = getValue(map, "rotation", 0);
|
|
379
534
|
region.width = map.width * scale;
|
|
380
535
|
region.height = map.height * scale;
|
|
381
|
-
|
|
382
|
-
let color = getValue(map, "color", null);
|
|
536
|
+
const color = getValue(map, "color", null);
|
|
383
537
|
if (color)
|
|
384
538
|
region.color.setFromString(color);
|
|
385
|
-
|
|
386
|
-
region.updateRegion();
|
|
539
|
+
region.updateSequence();
|
|
387
540
|
return region;
|
|
388
541
|
}
|
|
389
542
|
case "boundingbox": {
|
|
390
|
-
|
|
543
|
+
const box = this.attachmentLoader.newBoundingBoxAttachment(skin, placeholder, name);
|
|
391
544
|
if (!box)
|
|
392
545
|
return null;
|
|
393
546
|
this.readVertices(map, box, map.vertexCount << 1);
|
|
394
|
-
|
|
547
|
+
const color = getValue(map, "color", null);
|
|
395
548
|
if (color)
|
|
396
549
|
box.color.setFromString(color);
|
|
397
550
|
return box;
|
|
398
551
|
}
|
|
399
552
|
case "mesh":
|
|
400
553
|
case "linkedmesh": {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
554
|
+
const path = getValue(map, "path", name);
|
|
555
|
+
const sequence = this.readSequence(getValue(map, "sequence", null));
|
|
556
|
+
const mesh = this.attachmentLoader.newMeshAttachment(skin, placeholder, name, path, sequence);
|
|
404
557
|
if (!mesh)
|
|
405
558
|
return null;
|
|
406
559
|
mesh.path = path;
|
|
407
|
-
|
|
560
|
+
const color = getValue(map, "color", null);
|
|
408
561
|
if (color)
|
|
409
562
|
mesh.color.setFromString(color);
|
|
410
563
|
mesh.width = getValue(map, "width", 0) * scale;
|
|
411
564
|
mesh.height = getValue(map, "height", 0) * scale;
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
565
|
+
const source = getValue(map, "source", null);
|
|
566
|
+
if (source) {
|
|
567
|
+
let sourceIndex = slotIndex;
|
|
568
|
+
const slot = getValue(map, "slot", null);
|
|
569
|
+
if (slot) {
|
|
570
|
+
const sourceSlot = skeletonData.findSlot(slot);
|
|
571
|
+
if (!sourceSlot)
|
|
572
|
+
throw new Error(`Source mesh slot not found: ${slot}`);
|
|
573
|
+
sourceIndex = sourceSlot.index;
|
|
574
|
+
}
|
|
575
|
+
this.linkedMeshes.push(new LinkedMesh(mesh, getValue(map, "skin", null), slotIndex, sourceIndex, source, getValue(map, "timelines", true)));
|
|
416
576
|
return mesh;
|
|
417
577
|
}
|
|
418
|
-
|
|
578
|
+
const uvs = map.uvs;
|
|
419
579
|
this.readVertices(map, mesh, uvs.length);
|
|
420
580
|
mesh.triangles = map.triangles;
|
|
421
581
|
mesh.regionUVs = uvs;
|
|
422
|
-
if (mesh.region != null)
|
|
423
|
-
mesh.updateRegion();
|
|
424
582
|
mesh.edges = getValue(map, "edges", null);
|
|
425
583
|
mesh.hullLength = getValue(map, "hull", 0) * 2;
|
|
584
|
+
mesh.updateSequence();
|
|
426
585
|
return mesh;
|
|
427
586
|
}
|
|
428
587
|
case "path": {
|
|
429
|
-
|
|
588
|
+
const path = this.attachmentLoader.newPathAttachment(skin, placeholder, name);
|
|
430
589
|
if (!path)
|
|
431
590
|
return null;
|
|
432
591
|
path.closed = getValue(map, "closed", false);
|
|
433
592
|
path.constantSpeed = getValue(map, "constantSpeed", true);
|
|
434
|
-
|
|
593
|
+
const vertexCount = map.vertexCount;
|
|
435
594
|
this.readVertices(map, path, vertexCount << 1);
|
|
436
|
-
|
|
595
|
+
const lengths = Utils.newArray(vertexCount / 3, 0);
|
|
437
596
|
for (let i = 0; i < map.lengths.length; i++)
|
|
438
597
|
lengths[i] = map.lengths[i] * scale;
|
|
439
598
|
path.lengths = lengths;
|
|
440
|
-
|
|
599
|
+
const color = getValue(map, "color", null);
|
|
441
600
|
if (color)
|
|
442
601
|
path.color.setFromString(color);
|
|
443
602
|
return path;
|
|
444
603
|
}
|
|
445
604
|
case "point": {
|
|
446
|
-
|
|
605
|
+
const point = this.attachmentLoader.newPointAttachment(skin, placeholder, name);
|
|
447
606
|
if (!point)
|
|
448
607
|
return null;
|
|
449
608
|
point.x = getValue(map, "x", 0) * scale;
|
|
450
609
|
point.y = getValue(map, "y", 0) * scale;
|
|
451
610
|
point.rotation = getValue(map, "rotation", 0);
|
|
452
|
-
|
|
611
|
+
const color = getValue(map, "color", null);
|
|
453
612
|
if (color)
|
|
454
613
|
point.color.setFromString(color);
|
|
455
614
|
return point;
|
|
456
615
|
}
|
|
457
616
|
case "clipping": {
|
|
458
|
-
|
|
617
|
+
const clip = this.attachmentLoader.newClippingAttachment(skin, placeholder, name);
|
|
459
618
|
if (!clip)
|
|
460
619
|
return null;
|
|
461
|
-
|
|
620
|
+
const end = getValue(map, "end", null);
|
|
462
621
|
if (end)
|
|
463
622
|
clip.endSlot = skeletonData.findSlot(end);
|
|
464
|
-
|
|
623
|
+
clip.convex = getValue(map, "convex", false);
|
|
624
|
+
clip.inverse = getValue(map, "inverse", false);
|
|
625
|
+
const vertexCount = map.vertexCount;
|
|
465
626
|
this.readVertices(map, clip, vertexCount << 1);
|
|
466
|
-
|
|
627
|
+
const color = getValue(map, "color", null);
|
|
467
628
|
if (color)
|
|
468
629
|
clip.color.setFromString(color);
|
|
469
630
|
return clip;
|
|
@@ -473,30 +634,31 @@ export class SkeletonJson {
|
|
|
473
634
|
}
|
|
474
635
|
readSequence(map) {
|
|
475
636
|
if (map == null)
|
|
476
|
-
return
|
|
477
|
-
|
|
637
|
+
return new Sequence(1, false);
|
|
638
|
+
const sequence = new Sequence(getValue(map, "count", 0), true);
|
|
478
639
|
sequence.start = getValue(map, "start", 1);
|
|
479
640
|
sequence.digits = getValue(map, "digits", 0);
|
|
480
641
|
sequence.setupIndex = getValue(map, "setup", 0);
|
|
481
642
|
return sequence;
|
|
482
643
|
}
|
|
644
|
+
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
|
|
483
645
|
readVertices(map, attachment, verticesLength) {
|
|
484
|
-
|
|
646
|
+
const scale = this.scale;
|
|
485
647
|
attachment.worldVerticesLength = verticesLength;
|
|
486
|
-
|
|
487
|
-
if (verticesLength
|
|
488
|
-
|
|
489
|
-
if (scale
|
|
648
|
+
const vertices = map.vertices;
|
|
649
|
+
if (verticesLength === vertices.length) {
|
|
650
|
+
const scaledVertices = Utils.toFloatArray(vertices);
|
|
651
|
+
if (scale !== 1) {
|
|
490
652
|
for (let i = 0, n = vertices.length; i < n; i++)
|
|
491
653
|
scaledVertices[i] *= scale;
|
|
492
654
|
}
|
|
493
655
|
attachment.vertices = scaledVertices;
|
|
494
656
|
return;
|
|
495
657
|
}
|
|
496
|
-
|
|
497
|
-
|
|
658
|
+
const weights = [];
|
|
659
|
+
const bones = [];
|
|
498
660
|
for (let i = 0, n = vertices.length; i < n;) {
|
|
499
|
-
|
|
661
|
+
const boneCount = vertices[i++];
|
|
500
662
|
bones.push(boneCount);
|
|
501
663
|
for (let nn = i + boneCount * 4; i < nn; i += 4) {
|
|
502
664
|
bones.push(vertices[i]);
|
|
@@ -508,243 +670,249 @@ export class SkeletonJson {
|
|
|
508
670
|
attachment.bones = bones;
|
|
509
671
|
attachment.vertices = Utils.toFloatArray(weights);
|
|
510
672
|
}
|
|
673
|
+
// biome-ignore lint/suspicious/noExplicitAny: it is any untile we define a schema
|
|
511
674
|
readAnimation(map, name, skeletonData) {
|
|
512
|
-
|
|
513
|
-
|
|
675
|
+
const scale = this.scale;
|
|
676
|
+
const timelines = [];
|
|
514
677
|
// Slot timelines.
|
|
515
678
|
if (map.slots) {
|
|
516
|
-
for (
|
|
517
|
-
|
|
518
|
-
|
|
679
|
+
for (const slotName in map.slots) {
|
|
680
|
+
const slotMap = map.slots[slotName];
|
|
681
|
+
const slot = skeletonData.findSlot(slotName);
|
|
519
682
|
if (!slot)
|
|
520
|
-
throw new Error(
|
|
521
|
-
|
|
522
|
-
for (
|
|
523
|
-
|
|
683
|
+
throw new Error(`Slot not found: ${slotName}`);
|
|
684
|
+
const slotIndex = slot.index;
|
|
685
|
+
for (const timelineName in slotMap) {
|
|
686
|
+
const timelineMap = slotMap[timelineName];
|
|
524
687
|
if (!timelineMap)
|
|
525
688
|
continue;
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
let
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
timelines.push(timeline);
|
|
534
|
-
}
|
|
535
|
-
else if (timelineName == "rgba") {
|
|
536
|
-
let timeline = new RGBATimeline(frames, frames << 2, slotIndex);
|
|
537
|
-
let keyMap = timelineMap[0];
|
|
538
|
-
let time = getValue(keyMap, "time", 0);
|
|
539
|
-
let color = Color.fromString(keyMap.color);
|
|
540
|
-
for (let frame = 0, bezier = 0;; frame++) {
|
|
541
|
-
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
|
|
542
|
-
let nextMap = timelineMap[frame + 1];
|
|
543
|
-
if (!nextMap) {
|
|
544
|
-
timeline.shrink(bezier);
|
|
545
|
-
break;
|
|
689
|
+
const frames = timelineMap.length;
|
|
690
|
+
switch (timelineName) {
|
|
691
|
+
case "attachment": {
|
|
692
|
+
const timeline = new AttachmentTimeline(frames, slotIndex);
|
|
693
|
+
for (let frame = 0; frame < frames; frame++) {
|
|
694
|
+
const keyMap = timelineMap[frame];
|
|
695
|
+
timeline.setFrame(frame, getValue(keyMap, "time", 0), getValue(keyMap, "name", null));
|
|
546
696
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
let curve = keyMap.curve;
|
|
550
|
-
if (curve) {
|
|
551
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
552
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
553
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
554
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
555
|
-
}
|
|
556
|
-
time = time2;
|
|
557
|
-
color = newColor;
|
|
558
|
-
keyMap = nextMap;
|
|
697
|
+
timelines.push(timeline);
|
|
698
|
+
break;
|
|
559
699
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
700
|
+
case "rgba": {
|
|
701
|
+
const timeline = new RGBATimeline(frames, frames << 2, slotIndex);
|
|
702
|
+
let keyMap = timelineMap[0];
|
|
703
|
+
let time = getValue(keyMap, "time", 0);
|
|
704
|
+
let color = Color.fromString(keyMap.color);
|
|
705
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
706
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a);
|
|
707
|
+
const nextMap = timelineMap[frame + 1];
|
|
708
|
+
if (!nextMap) {
|
|
709
|
+
timeline.shrink(bezier);
|
|
710
|
+
break;
|
|
711
|
+
}
|
|
712
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
713
|
+
const newColor = Color.fromString(nextMap.color);
|
|
714
|
+
const curve = keyMap.curve;
|
|
715
|
+
if (curve) {
|
|
716
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
717
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
718
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
719
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
720
|
+
}
|
|
721
|
+
time = time2;
|
|
722
|
+
color = newColor;
|
|
723
|
+
keyMap = nextMap;
|
|
581
724
|
}
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
keyMap = nextMap;
|
|
725
|
+
timelines.push(timeline);
|
|
726
|
+
break;
|
|
585
727
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
610
|
-
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
611
|
-
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
612
|
-
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
613
|
-
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
|
|
614
|
-
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
|
|
615
|
-
bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
|
|
728
|
+
case "rgb": {
|
|
729
|
+
const timeline = new RGBTimeline(frames, frames * 3, slotIndex);
|
|
730
|
+
let keyMap = timelineMap[0];
|
|
731
|
+
let time = getValue(keyMap, "time", 0);
|
|
732
|
+
let color = Color.fromString(keyMap.color);
|
|
733
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
734
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b);
|
|
735
|
+
const nextMap = timelineMap[frame + 1];
|
|
736
|
+
if (!nextMap) {
|
|
737
|
+
timeline.shrink(bezier);
|
|
738
|
+
break;
|
|
739
|
+
}
|
|
740
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
741
|
+
const newColor = Color.fromString(nextMap.color);
|
|
742
|
+
const curve = keyMap.curve;
|
|
743
|
+
if (curve) {
|
|
744
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
745
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
746
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
747
|
+
}
|
|
748
|
+
time = time2;
|
|
749
|
+
color = newColor;
|
|
750
|
+
keyMap = nextMap;
|
|
616
751
|
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
color2 = newColor2;
|
|
620
|
-
keyMap = nextMap;
|
|
752
|
+
timelines.push(timeline);
|
|
753
|
+
break;
|
|
621
754
|
}
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
let
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
755
|
+
case "alpha": {
|
|
756
|
+
readTimeline1(timelines, timelineMap, new AlphaTimeline(frames, frames, slotIndex), 0, 1);
|
|
757
|
+
break;
|
|
758
|
+
}
|
|
759
|
+
case "rgba2": {
|
|
760
|
+
const timeline = new RGBA2Timeline(frames, frames * 7, slotIndex);
|
|
761
|
+
let keyMap = timelineMap[0];
|
|
762
|
+
let time = getValue(keyMap, "time", 0);
|
|
763
|
+
let color = Color.fromString(keyMap.light);
|
|
764
|
+
let color2 = Color.fromString(keyMap.dark);
|
|
765
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
766
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color.a, color2.r, color2.g, color2.b);
|
|
767
|
+
const nextMap = timelineMap[frame + 1];
|
|
768
|
+
if (!nextMap) {
|
|
769
|
+
timeline.shrink(bezier);
|
|
770
|
+
break;
|
|
771
|
+
}
|
|
772
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
773
|
+
const newColor = Color.fromString(nextMap.light);
|
|
774
|
+
const newColor2 = Color.fromString(nextMap.dark);
|
|
775
|
+
const curve = keyMap.curve;
|
|
776
|
+
if (curve) {
|
|
777
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
778
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
779
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
780
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color.a, newColor.a, 1);
|
|
781
|
+
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.r, newColor2.r, 1);
|
|
782
|
+
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.g, newColor2.g, 1);
|
|
783
|
+
bezier = readCurve(curve, timeline, bezier, frame, 6, time, time2, color2.b, newColor2.b, 1);
|
|
784
|
+
}
|
|
785
|
+
time = time2;
|
|
786
|
+
color = newColor;
|
|
787
|
+
color2 = newColor2;
|
|
788
|
+
keyMap = nextMap;
|
|
636
789
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
790
|
+
timelines.push(timeline);
|
|
791
|
+
break;
|
|
792
|
+
}
|
|
793
|
+
case "rgb2": {
|
|
794
|
+
const timeline = new RGB2Timeline(frames, frames * 6, slotIndex);
|
|
795
|
+
let keyMap = timelineMap[0];
|
|
796
|
+
let time = getValue(keyMap, "time", 0);
|
|
797
|
+
let color = Color.fromString(keyMap.light);
|
|
798
|
+
let color2 = Color.fromString(keyMap.dark);
|
|
799
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
800
|
+
timeline.setFrame(frame, time, color.r, color.g, color.b, color2.r, color2.g, color2.b);
|
|
801
|
+
const nextMap = timelineMap[frame + 1];
|
|
802
|
+
if (!nextMap) {
|
|
803
|
+
timeline.shrink(bezier);
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
807
|
+
const newColor = Color.fromString(nextMap.light);
|
|
808
|
+
const newColor2 = Color.fromString(nextMap.dark);
|
|
809
|
+
const curve = keyMap.curve;
|
|
810
|
+
if (curve) {
|
|
811
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, color.r, newColor.r, 1);
|
|
812
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, color.g, newColor.g, 1);
|
|
813
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, color.b, newColor.b, 1);
|
|
814
|
+
bezier = readCurve(curve, timeline, bezier, frame, 3, time, time2, color2.r, newColor2.r, 1);
|
|
815
|
+
bezier = readCurve(curve, timeline, bezier, frame, 4, time, time2, color2.g, newColor2.g, 1);
|
|
816
|
+
bezier = readCurve(curve, timeline, bezier, frame, 5, time, time2, color2.b, newColor2.b, 1);
|
|
817
|
+
}
|
|
818
|
+
time = time2;
|
|
819
|
+
color = newColor;
|
|
820
|
+
color2 = newColor2;
|
|
821
|
+
keyMap = nextMap;
|
|
648
822
|
}
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
color2 = newColor2;
|
|
652
|
-
keyMap = nextMap;
|
|
823
|
+
timelines.push(timeline);
|
|
824
|
+
break;
|
|
653
825
|
}
|
|
654
|
-
|
|
826
|
+
default:
|
|
827
|
+
throw new Error(`Invalid timeline type for a slot: ${timelineMap.name} (${slotMap.name})`);
|
|
655
828
|
}
|
|
656
829
|
}
|
|
657
830
|
}
|
|
658
831
|
}
|
|
659
832
|
// Bone timelines.
|
|
660
833
|
if (map.bones) {
|
|
661
|
-
for (
|
|
662
|
-
|
|
663
|
-
|
|
834
|
+
for (const boneName in map.bones) {
|
|
835
|
+
const boneMap = map.bones[boneName];
|
|
836
|
+
const bone = skeletonData.findBone(boneName);
|
|
664
837
|
if (!bone)
|
|
665
|
-
throw new Error(
|
|
666
|
-
|
|
667
|
-
for (
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
if (frames
|
|
838
|
+
throw new Error(`Bone not found: ${boneName}`);
|
|
839
|
+
const boneIndex = bone.index;
|
|
840
|
+
for (const timelineName in boneMap) {
|
|
841
|
+
const timelineMap = boneMap[timelineName];
|
|
842
|
+
const frames = timelineMap.length;
|
|
843
|
+
if (frames === 0)
|
|
671
844
|
continue;
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
else if (timelineName === "inherit") {
|
|
712
|
-
let timeline = new InheritTimeline(frames, bone.index);
|
|
713
|
-
for (let frame = 0; frame < timelineMap.length; frame++) {
|
|
714
|
-
let aFrame = timelineMap[frame];
|
|
715
|
-
timeline.setFrame(frame, getValue(aFrame, "time", 0), Utils.enumValue(Inherit, getValue(aFrame, "inherit", "Normal")));
|
|
845
|
+
switch (timelineName) {
|
|
846
|
+
case "rotate":
|
|
847
|
+
readTimeline1(timelines, timelineMap, new RotateTimeline(frames, frames, boneIndex), 0, 1);
|
|
848
|
+
break;
|
|
849
|
+
case "translate":
|
|
850
|
+
readTimeline2(timelines, timelineMap, new TranslateTimeline(frames, frames << 1, boneIndex), "x", "y", 0, scale);
|
|
851
|
+
break;
|
|
852
|
+
case "translatex":
|
|
853
|
+
readTimeline1(timelines, timelineMap, new TranslateXTimeline(frames, frames, boneIndex), 0, scale);
|
|
854
|
+
break;
|
|
855
|
+
case "translatey":
|
|
856
|
+
readTimeline1(timelines, timelineMap, new TranslateYTimeline(frames, frames, boneIndex), 0, scale);
|
|
857
|
+
break;
|
|
858
|
+
case "scale":
|
|
859
|
+
readTimeline2(timelines, timelineMap, new ScaleTimeline(frames, frames << 1, boneIndex), "x", "y", 1, 1);
|
|
860
|
+
break;
|
|
861
|
+
case "scalex":
|
|
862
|
+
readTimeline1(timelines, timelineMap, new ScaleXTimeline(frames, frames, boneIndex), 1, 1);
|
|
863
|
+
break;
|
|
864
|
+
case "scaley":
|
|
865
|
+
readTimeline1(timelines, timelineMap, new ScaleYTimeline(frames, frames, boneIndex), 1, 1);
|
|
866
|
+
break;
|
|
867
|
+
case "shear":
|
|
868
|
+
readTimeline2(timelines, timelineMap, new ShearTimeline(frames, frames << 1, boneIndex), "x", "y", 0, 1);
|
|
869
|
+
break;
|
|
870
|
+
case "shearx":
|
|
871
|
+
readTimeline1(timelines, timelineMap, new ShearXTimeline(frames, frames, boneIndex), 0, 1);
|
|
872
|
+
break;
|
|
873
|
+
case "sheary":
|
|
874
|
+
readTimeline1(timelines, timelineMap, new ShearYTimeline(frames, frames, boneIndex), 0, 1);
|
|
875
|
+
break;
|
|
876
|
+
case "inherit": {
|
|
877
|
+
const timeline = new InheritTimeline(frames, bone.index);
|
|
878
|
+
for (let frame = 0; frame < timelineMap.length; frame++) {
|
|
879
|
+
const aFrame = timelineMap[frame];
|
|
880
|
+
timeline.setFrame(frame, getValue(aFrame, "time", 0), Utils.enumValue(Inherit, getValue(aFrame, "inherit", "Normal")));
|
|
881
|
+
}
|
|
882
|
+
timelines.push(timeline);
|
|
883
|
+
break;
|
|
716
884
|
}
|
|
717
|
-
|
|
885
|
+
default:
|
|
886
|
+
throw new Error(`Invalid timeline type for a bone: ${timelineMap.name} (${boneMap.name})`);
|
|
718
887
|
}
|
|
719
888
|
}
|
|
720
889
|
}
|
|
721
890
|
}
|
|
722
891
|
// IK constraint timelines.
|
|
723
892
|
if (map.ik) {
|
|
724
|
-
for (
|
|
725
|
-
|
|
893
|
+
for (const constraintName in map.ik) {
|
|
894
|
+
const constraintMap = map.ik[constraintName];
|
|
726
895
|
let keyMap = constraintMap[0];
|
|
727
896
|
if (!keyMap)
|
|
728
897
|
continue;
|
|
729
|
-
|
|
898
|
+
const constraint = skeletonData.findConstraint(constraintName, IkConstraintData);
|
|
730
899
|
if (!constraint)
|
|
731
|
-
throw new Error(
|
|
732
|
-
|
|
733
|
-
let timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, constraintIndex);
|
|
900
|
+
throw new Error(`IK Constraint not found: ${constraintName}`);
|
|
901
|
+
const timeline = new IkConstraintTimeline(constraintMap.length, constraintMap.length << 1, skeletonData.constraints.indexOf(constraint));
|
|
734
902
|
let time = getValue(keyMap, "time", 0);
|
|
735
903
|
let mix = getValue(keyMap, "mix", 1);
|
|
736
904
|
let softness = getValue(keyMap, "softness", 0) * scale;
|
|
737
905
|
for (let frame = 0, bezier = 0;; frame++) {
|
|
738
906
|
timeline.setFrame(frame, time, mix, softness, getValue(keyMap, "bendPositive", true) ? 1 : -1, getValue(keyMap, "compress", false), getValue(keyMap, "stretch", false));
|
|
739
|
-
|
|
907
|
+
const nextMap = constraintMap[frame + 1];
|
|
740
908
|
if (!nextMap) {
|
|
741
909
|
timeline.shrink(bezier);
|
|
742
910
|
break;
|
|
743
911
|
}
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
912
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
913
|
+
const mix2 = getValue(nextMap, "mix", 1);
|
|
914
|
+
const softness2 = getValue(nextMap, "softness", 0) * scale;
|
|
915
|
+
const curve = keyMap.curve;
|
|
748
916
|
if (curve) {
|
|
749
917
|
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mix, mix2, 1);
|
|
750
918
|
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, softness, softness2, scale);
|
|
@@ -759,38 +927,33 @@ export class SkeletonJson {
|
|
|
759
927
|
}
|
|
760
928
|
// Transform constraint timelines.
|
|
761
929
|
if (map.transform) {
|
|
762
|
-
for (
|
|
763
|
-
|
|
930
|
+
for (const constraintName in map.transform) {
|
|
931
|
+
const timelineMap = map.transform[constraintName];
|
|
764
932
|
let keyMap = timelineMap[0];
|
|
765
933
|
if (!keyMap)
|
|
766
934
|
continue;
|
|
767
|
-
|
|
935
|
+
const constraint = skeletonData.findConstraint(constraintName, TransformConstraintData);
|
|
768
936
|
if (!constraint)
|
|
769
|
-
throw new Error(
|
|
770
|
-
|
|
771
|
-
let timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, constraintIndex);
|
|
937
|
+
throw new Error(`Transform constraint not found: ${constraintName}`);
|
|
938
|
+
const timeline = new TransformConstraintTimeline(timelineMap.length, timelineMap.length * 6, skeletonData.constraints.indexOf(constraint));
|
|
772
939
|
let time = getValue(keyMap, "time", 0);
|
|
773
940
|
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
774
|
-
let mixX = getValue(keyMap, "mixX", 1);
|
|
775
|
-
let
|
|
776
|
-
|
|
777
|
-
let mixScaleY = getValue(keyMap, "mixScaleY", mixScaleX);
|
|
778
|
-
let mixShearY = getValue(keyMap, "mixShearY", 1);
|
|
941
|
+
let mixX = getValue(keyMap, "mixX", 1), mixY = getValue(keyMap, "mixY", mixX);
|
|
942
|
+
let mixScaleX = getValue(keyMap, "mixScaleX", 1), mixScaleY = getValue(keyMap, "mixScaleY", 1);
|
|
943
|
+
const mixShearY = getValue(keyMap, "mixShearY", 1);
|
|
779
944
|
for (let frame = 0, bezier = 0;; frame++) {
|
|
780
945
|
timeline.setFrame(frame, time, mixRotate, mixX, mixY, mixScaleX, mixScaleY, mixShearY);
|
|
781
|
-
|
|
946
|
+
const nextMap = timelineMap[frame + 1];
|
|
782
947
|
if (!nextMap) {
|
|
783
948
|
timeline.shrink(bezier);
|
|
784
949
|
break;
|
|
785
950
|
}
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
let mixShearY2 = getValue(nextMap, "mixShearY", 1);
|
|
793
|
-
let curve = keyMap.curve;
|
|
951
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
952
|
+
const mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
953
|
+
const mixX2 = getValue(nextMap, "mixX", 1), mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
954
|
+
const mixScaleX2 = getValue(nextMap, "mixScaleX", 1), mixScaleY2 = getValue(nextMap, "mixScaleY", 1);
|
|
955
|
+
const mixShearY2 = getValue(nextMap, "mixShearY", 1);
|
|
956
|
+
const curve = keyMap.curve;
|
|
794
957
|
if (curve) {
|
|
795
958
|
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
796
959
|
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
@@ -813,142 +976,185 @@ export class SkeletonJson {
|
|
|
813
976
|
}
|
|
814
977
|
// Path constraint timelines.
|
|
815
978
|
if (map.path) {
|
|
816
|
-
for (
|
|
817
|
-
|
|
818
|
-
|
|
979
|
+
for (const constraintName in map.path) {
|
|
980
|
+
const constraintMap = map.path[constraintName];
|
|
981
|
+
const constraint = skeletonData.findConstraint(constraintName, PathConstraintData);
|
|
819
982
|
if (!constraint)
|
|
820
|
-
throw new Error(
|
|
821
|
-
|
|
822
|
-
for (
|
|
823
|
-
|
|
983
|
+
throw new Error(`Path constraint not found: ${constraintName}`);
|
|
984
|
+
const index = skeletonData.constraints.indexOf(constraint);
|
|
985
|
+
for (const timelineName in constraintMap) {
|
|
986
|
+
const timelineMap = constraintMap[timelineName];
|
|
824
987
|
let keyMap = timelineMap[0];
|
|
825
988
|
if (!keyMap)
|
|
826
989
|
continue;
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
let
|
|
845
|
-
|
|
846
|
-
timeline.
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
990
|
+
const frames = timelineMap.length;
|
|
991
|
+
switch (timelineName) {
|
|
992
|
+
case "position": {
|
|
993
|
+
const timeline = new PathConstraintPositionTimeline(frames, frames, index);
|
|
994
|
+
readTimeline1(timelines, timelineMap, timeline, 0, constraint.positionMode === PositionMode.Fixed ? scale : 1);
|
|
995
|
+
break;
|
|
996
|
+
}
|
|
997
|
+
case "spacing": {
|
|
998
|
+
const timeline = new PathConstraintSpacingTimeline(frames, frames, index);
|
|
999
|
+
readTimeline1(timelines, timelineMap, timeline, 0, constraint.spacingMode === SpacingMode.Length || constraint.spacingMode === SpacingMode.Fixed ? scale : 1);
|
|
1000
|
+
break;
|
|
1001
|
+
}
|
|
1002
|
+
case "mix": {
|
|
1003
|
+
const timeline = new PathConstraintMixTimeline(frames, frames * 3, index);
|
|
1004
|
+
let time = getValue(keyMap, "time", 0);
|
|
1005
|
+
let mixRotate = getValue(keyMap, "mixRotate", 1);
|
|
1006
|
+
let mixX = getValue(keyMap, "mixX", 1);
|
|
1007
|
+
let mixY = getValue(keyMap, "mixY", mixX);
|
|
1008
|
+
for (let frame = 0, bezier = 0;; frame++) {
|
|
1009
|
+
timeline.setFrame(frame, time, mixRotate, mixX, mixY);
|
|
1010
|
+
const nextMap = timelineMap[frame + 1];
|
|
1011
|
+
if (!nextMap) {
|
|
1012
|
+
timeline.shrink(bezier);
|
|
1013
|
+
break;
|
|
1014
|
+
}
|
|
1015
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
1016
|
+
const mixRotate2 = getValue(nextMap, "mixRotate", 1);
|
|
1017
|
+
const mixX2 = getValue(nextMap, "mixX", 1);
|
|
1018
|
+
const mixY2 = getValue(nextMap, "mixY", mixX2);
|
|
1019
|
+
const curve = keyMap.curve;
|
|
1020
|
+
if (curve) {
|
|
1021
|
+
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, mixRotate, mixRotate2, 1);
|
|
1022
|
+
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, mixX, mixX2, 1);
|
|
1023
|
+
bezier = readCurve(curve, timeline, bezier, frame, 2, time, time2, mixY, mixY2, 1);
|
|
1024
|
+
}
|
|
1025
|
+
time = time2;
|
|
1026
|
+
mixRotate = mixRotate2;
|
|
1027
|
+
mixX = mixX2;
|
|
1028
|
+
mixY = mixY2;
|
|
1029
|
+
keyMap = nextMap;
|
|
858
1030
|
}
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
mixX = mixX2;
|
|
862
|
-
mixY = mixY2;
|
|
863
|
-
keyMap = nextMap;
|
|
1031
|
+
timelines.push(timeline);
|
|
1032
|
+
break;
|
|
864
1033
|
}
|
|
865
|
-
timelines.push(timeline);
|
|
866
1034
|
}
|
|
867
1035
|
}
|
|
868
1036
|
}
|
|
869
1037
|
}
|
|
870
1038
|
// Physics constraint timelines.
|
|
871
1039
|
if (map.physics) {
|
|
872
|
-
for (
|
|
873
|
-
|
|
874
|
-
let
|
|
1040
|
+
for (const constraintName in map.physics) {
|
|
1041
|
+
const constraintMap = map.physics[constraintName];
|
|
1042
|
+
let index = -1;
|
|
875
1043
|
if (constraintName.length > 0) {
|
|
876
|
-
|
|
1044
|
+
const constraint = skeletonData.findConstraint(constraintName, PhysicsConstraintData);
|
|
877
1045
|
if (!constraint)
|
|
878
|
-
throw new Error(
|
|
879
|
-
|
|
1046
|
+
throw new Error(`Physics constraint not found: ${constraintName}`);
|
|
1047
|
+
index = skeletonData.constraints.indexOf(constraint);
|
|
880
1048
|
}
|
|
881
|
-
for (
|
|
882
|
-
|
|
1049
|
+
for (const timelineName in constraintMap) {
|
|
1050
|
+
const timelineMap = constraintMap[timelineName];
|
|
883
1051
|
let keyMap = timelineMap[0];
|
|
884
1052
|
if (!keyMap)
|
|
885
1053
|
continue;
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
1054
|
+
const frames = timelineMap.length;
|
|
1055
|
+
let timeline;
|
|
1056
|
+
let defaultValue = 0;
|
|
1057
|
+
if (timelineName === "reset") {
|
|
1058
|
+
const resetTimeline = new PhysicsConstraintResetTimeline(frames, index);
|
|
889
1059
|
for (let frame = 0; keyMap != null; keyMap = timelineMap[frame + 1], frame++)
|
|
890
|
-
|
|
891
|
-
timelines.push(
|
|
1060
|
+
resetTimeline.setFrame(frame, getValue(keyMap, "time", 0));
|
|
1061
|
+
timelines.push(resetTimeline);
|
|
892
1062
|
continue;
|
|
893
1063
|
}
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
1064
|
+
switch (timelineName) {
|
|
1065
|
+
case "inertia":
|
|
1066
|
+
timeline = new PhysicsConstraintInertiaTimeline(frames, frames, index);
|
|
1067
|
+
break;
|
|
1068
|
+
case "strength":
|
|
1069
|
+
timeline = new PhysicsConstraintStrengthTimeline(frames, frames, index);
|
|
1070
|
+
break;
|
|
1071
|
+
case "damping":
|
|
1072
|
+
timeline = new PhysicsConstraintDampingTimeline(frames, frames, index);
|
|
1073
|
+
break;
|
|
1074
|
+
case "mass":
|
|
1075
|
+
timeline = new PhysicsConstraintMassTimeline(frames, frames, index);
|
|
1076
|
+
break;
|
|
1077
|
+
case "wind":
|
|
1078
|
+
timeline = new PhysicsConstraintWindTimeline(frames, frames, index);
|
|
1079
|
+
break;
|
|
1080
|
+
case "gravity":
|
|
1081
|
+
timeline = new PhysicsConstraintGravityTimeline(frames, frames, index);
|
|
1082
|
+
break;
|
|
1083
|
+
case "mix": {
|
|
1084
|
+
defaultValue = 1;
|
|
1085
|
+
timeline = new PhysicsConstraintMixTimeline(frames, frames, index);
|
|
1086
|
+
break;
|
|
1087
|
+
}
|
|
1088
|
+
default: continue;
|
|
1089
|
+
}
|
|
1090
|
+
readTimeline1(timelines, timelineMap, timeline, defaultValue, 1);
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
// Slider timelines.
|
|
1095
|
+
if (map.slider) {
|
|
1096
|
+
for (const constraintName in map.slider) {
|
|
1097
|
+
const constraintMap = map.slider[constraintName];
|
|
1098
|
+
const constraint = skeletonData.findConstraint(constraintName, SliderData);
|
|
1099
|
+
if (!constraint)
|
|
1100
|
+
throw new Error(`Slider not found: ${constraintName}`);
|
|
1101
|
+
const index = skeletonData.constraints.indexOf(constraint);
|
|
1102
|
+
for (const timelineName in constraintMap) {
|
|
1103
|
+
const timelineMap = constraintMap[timelineName];
|
|
1104
|
+
const keyMap = timelineMap[0];
|
|
1105
|
+
if (!keyMap)
|
|
910
1106
|
continue;
|
|
911
|
-
|
|
1107
|
+
const frames = timelineMap.length;
|
|
1108
|
+
switch (timelineName) {
|
|
1109
|
+
case "time":
|
|
1110
|
+
readTimeline1(timelines, timelineMap, new SliderTimeline(frames, frames, index), 1, 1);
|
|
1111
|
+
break;
|
|
1112
|
+
case "mix":
|
|
1113
|
+
readTimeline1(timelines, timelineMap, new SliderMixTimeline(frames, frames, index), 1, 1);
|
|
1114
|
+
break;
|
|
1115
|
+
}
|
|
912
1116
|
}
|
|
913
1117
|
}
|
|
914
1118
|
}
|
|
915
1119
|
// Attachment timelines.
|
|
916
1120
|
if (map.attachments) {
|
|
917
|
-
for (
|
|
918
|
-
|
|
919
|
-
|
|
1121
|
+
for (const attachmentsName in map.attachments) {
|
|
1122
|
+
const attachmentsMap = map.attachments[attachmentsName];
|
|
1123
|
+
const skin = skeletonData.findSkin(attachmentsName);
|
|
920
1124
|
if (!skin)
|
|
921
|
-
throw new Error(
|
|
922
|
-
for (
|
|
923
|
-
|
|
924
|
-
|
|
1125
|
+
throw new Error(`Skin not found: ${attachmentsName}`);
|
|
1126
|
+
for (const slotMapName in attachmentsMap) {
|
|
1127
|
+
const slotMap = attachmentsMap[slotMapName];
|
|
1128
|
+
const slot = skeletonData.findSlot(slotMapName);
|
|
925
1129
|
if (!slot)
|
|
926
|
-
throw new Error(
|
|
927
|
-
|
|
928
|
-
for (
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
1130
|
+
throw new Error(`Attachment slot not found: ${slotMapName}`);
|
|
1131
|
+
const slotIndex = slot.index;
|
|
1132
|
+
for (const attachmentMapName in slotMap) {
|
|
1133
|
+
const attachmentMap = slotMap[attachmentMapName];
|
|
1134
|
+
const attachment = skin.getAttachment(slotIndex, attachmentMapName);
|
|
1135
|
+
if (!attachment)
|
|
1136
|
+
throw new Error(`Timeline attachment not found: ${attachmentMapName}`);
|
|
1137
|
+
for (const timelineMapName in attachmentMap) {
|
|
1138
|
+
const timelineMap = attachmentMap[timelineMapName];
|
|
933
1139
|
let keyMap = timelineMap[0];
|
|
934
1140
|
if (!keyMap)
|
|
935
1141
|
continue;
|
|
936
|
-
if (timelineMapName
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
1142
|
+
if (timelineMapName === "deform") {
|
|
1143
|
+
const weighted = attachment.bones;
|
|
1144
|
+
const vertices = attachment.vertices;
|
|
1145
|
+
const deformLength = weighted ? vertices.length / 3 * 2 : vertices.length;
|
|
1146
|
+
const timeline = new DeformTimeline(timelineMap.length, timelineMap.length, slotIndex, attachment);
|
|
941
1147
|
let time = getValue(keyMap, "time", 0);
|
|
942
1148
|
for (let frame = 0, bezier = 0;; frame++) {
|
|
943
1149
|
let deform;
|
|
944
|
-
|
|
1150
|
+
const verticesValue = getValue(keyMap, "vertices", null);
|
|
945
1151
|
if (!verticesValue)
|
|
946
1152
|
deform = weighted ? Utils.newFloatArray(deformLength) : vertices;
|
|
947
1153
|
else {
|
|
948
1154
|
deform = Utils.newFloatArray(deformLength);
|
|
949
|
-
|
|
1155
|
+
const start = getValue(keyMap, "offset", 0);
|
|
950
1156
|
Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length);
|
|
951
|
-
if (scale
|
|
1157
|
+
if (scale !== 1) {
|
|
952
1158
|
for (let i = start, n = i + verticesValue.length; i < n; i++)
|
|
953
1159
|
deform[i] *= scale;
|
|
954
1160
|
}
|
|
@@ -958,13 +1164,13 @@ export class SkeletonJson {
|
|
|
958
1164
|
}
|
|
959
1165
|
}
|
|
960
1166
|
timeline.setFrame(frame, time, deform);
|
|
961
|
-
|
|
1167
|
+
const nextMap = timelineMap[frame + 1];
|
|
962
1168
|
if (!nextMap) {
|
|
963
1169
|
timeline.shrink(bezier);
|
|
964
1170
|
break;
|
|
965
1171
|
}
|
|
966
|
-
|
|
967
|
-
|
|
1172
|
+
const time2 = getValue(nextMap, "time", 0);
|
|
1173
|
+
const curve = keyMap.curve;
|
|
968
1174
|
if (curve)
|
|
969
1175
|
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, 0, 1, 1);
|
|
970
1176
|
time = time2;
|
|
@@ -972,14 +1178,14 @@ export class SkeletonJson {
|
|
|
972
1178
|
}
|
|
973
1179
|
timelines.push(timeline);
|
|
974
1180
|
}
|
|
975
|
-
else if (timelineMapName
|
|
976
|
-
|
|
1181
|
+
else if (timelineMapName === "sequence") {
|
|
1182
|
+
const timeline = new SequenceTimeline(timelineMap.length, slotIndex, attachment);
|
|
977
1183
|
let lastDelay = 0;
|
|
978
1184
|
for (let frame = 0; frame < timelineMap.length; frame++) {
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
1185
|
+
const delay = getValue(keyMap, "delay", lastDelay);
|
|
1186
|
+
const time = getValue(keyMap, "time", 0);
|
|
1187
|
+
const mode = SequenceMode[getValue(keyMap, "mode", "hold")];
|
|
1188
|
+
const index = getValue(keyMap, "index", 0);
|
|
983
1189
|
timeline.setFrame(frame, time, mode, index, delay);
|
|
984
1190
|
lastDelay = delay;
|
|
985
1191
|
keyMap = timelineMap[frame + 1];
|
|
@@ -991,59 +1197,54 @@ export class SkeletonJson {
|
|
|
991
1197
|
}
|
|
992
1198
|
}
|
|
993
1199
|
}
|
|
994
|
-
// Draw order
|
|
1200
|
+
// Draw order timeline.
|
|
995
1201
|
if (map.drawOrder) {
|
|
996
|
-
|
|
997
|
-
|
|
1202
|
+
const timeline = new DrawOrderTimeline(map.drawOrder.length);
|
|
1203
|
+
const slotCount = skeletonData.slots.length;
|
|
998
1204
|
let frame = 0;
|
|
999
|
-
for (
|
|
1000
|
-
|
|
1001
|
-
let drawOrder = null;
|
|
1002
|
-
let offsets = getValue(drawOrderMap, "offsets", null);
|
|
1003
|
-
if (offsets) {
|
|
1004
|
-
drawOrder = Utils.newArray(slotCount, -1);
|
|
1005
|
-
let unchanged = Utils.newArray(slotCount - offsets.length, 0);
|
|
1006
|
-
let originalIndex = 0, unchangedIndex = 0;
|
|
1007
|
-
for (let ii = 0; ii < offsets.length; ii++) {
|
|
1008
|
-
let offsetMap = offsets[ii];
|
|
1009
|
-
let slot = skeletonData.findSlot(offsetMap.slot);
|
|
1010
|
-
if (!slot)
|
|
1011
|
-
throw new Error("Slot not found: " + slot);
|
|
1012
|
-
let slotIndex = slot.index;
|
|
1013
|
-
// Collect unchanged items.
|
|
1014
|
-
while (originalIndex != slotIndex)
|
|
1015
|
-
unchanged[unchangedIndex++] = originalIndex++;
|
|
1016
|
-
// Set changed items.
|
|
1017
|
-
drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
|
|
1018
|
-
}
|
|
1019
|
-
// Collect remaining unchanged items.
|
|
1020
|
-
while (originalIndex < slotCount)
|
|
1021
|
-
unchanged[unchangedIndex++] = originalIndex++;
|
|
1022
|
-
// Fill in unchanged items.
|
|
1023
|
-
for (let ii = slotCount - 1; ii >= 0; ii--)
|
|
1024
|
-
if (drawOrder[ii] == -1)
|
|
1025
|
-
drawOrder[ii] = unchanged[--unchangedIndex];
|
|
1026
|
-
}
|
|
1027
|
-
timeline.setFrame(frame, getValue(drawOrderMap, "time", 0), drawOrder);
|
|
1205
|
+
for (const drawOrderMap of map.drawOrder) {
|
|
1206
|
+
timeline.setFrame(frame++, getValue(drawOrderMap, "time", 0), readDrawOrder(skeletonData, drawOrderMap, slotCount, null));
|
|
1028
1207
|
}
|
|
1029
1208
|
timelines.push(timeline);
|
|
1030
1209
|
}
|
|
1031
|
-
//
|
|
1210
|
+
// Draw order folder timelines.
|
|
1211
|
+
if (map.drawOrderFolder) {
|
|
1212
|
+
for (const timelineMap of map.drawOrderFolder) {
|
|
1213
|
+
const slotEntries = getValue(timelineMap, "slots", []);
|
|
1214
|
+
const folderSlots = new Array(slotEntries.length);
|
|
1215
|
+
let ii = 0;
|
|
1216
|
+
for (const slotEntry of slotEntries) {
|
|
1217
|
+
const slot = skeletonData.findSlot(slotEntry);
|
|
1218
|
+
if (!slot)
|
|
1219
|
+
throw new Error(`Draw order folder slot not found: ${slotEntry}`);
|
|
1220
|
+
folderSlots[ii++] = slot.index;
|
|
1221
|
+
}
|
|
1222
|
+
const drawOrderFolderEntries = getValue(timelineMap, "keys", []);
|
|
1223
|
+
const timeline = new DrawOrderFolderTimeline(drawOrderFolderEntries.length, folderSlots, skeletonData.slots.length);
|
|
1224
|
+
let frame = 0;
|
|
1225
|
+
for (const drawOrderFolderMap of drawOrderFolderEntries) {
|
|
1226
|
+
timeline.setFrame(frame++, getValue(drawOrderFolderMap, "time", 0), readDrawOrder(skeletonData, drawOrderFolderMap, folderSlots.length, folderSlots));
|
|
1227
|
+
}
|
|
1228
|
+
timelines.push(timeline);
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
// Event timeline.
|
|
1032
1232
|
if (map.events) {
|
|
1033
|
-
|
|
1233
|
+
const timeline = new EventTimeline(map.events.length);
|
|
1034
1234
|
let frame = 0;
|
|
1035
1235
|
for (let i = 0; i < map.events.length; i++, frame++) {
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
if (!
|
|
1039
|
-
throw new Error(
|
|
1040
|
-
|
|
1041
|
-
event
|
|
1042
|
-
event.
|
|
1043
|
-
event.
|
|
1236
|
+
const eventMap = map.events[i];
|
|
1237
|
+
const data = skeletonData.findEvent(eventMap.name);
|
|
1238
|
+
if (!data)
|
|
1239
|
+
throw new Error(`Event not found: ${eventMap.name}`);
|
|
1240
|
+
const setup = data.setupPose;
|
|
1241
|
+
const event = new Event(Utils.toSinglePrecision(getValue(eventMap, "time", 0)), data);
|
|
1242
|
+
event.intValue = getValue(eventMap, "int", setup.intValue);
|
|
1243
|
+
event.floatValue = getValue(eventMap, "float", setup.floatValue);
|
|
1244
|
+
event.stringValue = getValue(eventMap, "string", setup.stringValue);
|
|
1044
1245
|
if (event.data.audioPath) {
|
|
1045
|
-
event.volume = getValue(eventMap, "volume",
|
|
1046
|
-
event.balance = getValue(eventMap, "balance",
|
|
1246
|
+
event.volume = getValue(eventMap, "volume", setup.volume);
|
|
1247
|
+
event.balance = getValue(eventMap, "balance", setup.volume);
|
|
1047
1248
|
}
|
|
1048
1249
|
timeline.setFrame(frame, event);
|
|
1049
1250
|
}
|
|
@@ -1052,37 +1253,44 @@ export class SkeletonJson {
|
|
|
1052
1253
|
let duration = 0;
|
|
1053
1254
|
for (let i = 0, n = timelines.length; i < n; i++)
|
|
1054
1255
|
duration = Math.max(duration, timelines[i].getDuration());
|
|
1055
|
-
|
|
1256
|
+
const animation = new Animation(name, timelines, duration);
|
|
1257
|
+
const color = getValue(map, "color", null);
|
|
1258
|
+
if (color !== null)
|
|
1259
|
+
animation.color.setFromString(color);
|
|
1260
|
+
skeletonData.animations.push(animation);
|
|
1056
1261
|
}
|
|
1057
1262
|
}
|
|
1058
1263
|
class LinkedMesh {
|
|
1059
|
-
|
|
1264
|
+
source;
|
|
1060
1265
|
skin;
|
|
1061
1266
|
slotIndex;
|
|
1267
|
+
sourceIndex;
|
|
1062
1268
|
mesh;
|
|
1063
|
-
|
|
1064
|
-
constructor(mesh, skin, slotIndex,
|
|
1269
|
+
inheritTimelines;
|
|
1270
|
+
constructor(mesh, skin, slotIndex, sourceIndex, source, inheritTimelines) {
|
|
1065
1271
|
this.mesh = mesh;
|
|
1066
1272
|
this.skin = skin;
|
|
1067
1273
|
this.slotIndex = slotIndex;
|
|
1068
|
-
this.
|
|
1069
|
-
this.
|
|
1274
|
+
this.sourceIndex = sourceIndex;
|
|
1275
|
+
this.source = source;
|
|
1276
|
+
this.inheritTimelines = inheritTimelines;
|
|
1070
1277
|
}
|
|
1071
1278
|
}
|
|
1072
|
-
function readTimeline1(keys, timeline, defaultValue, scale) {
|
|
1279
|
+
function readTimeline1(timelines, keys, timeline, defaultValue, scale) {
|
|
1073
1280
|
let keyMap = keys[0];
|
|
1074
|
-
let time =
|
|
1075
|
-
let value =
|
|
1281
|
+
let time = keyMap.time ?? 0;
|
|
1282
|
+
let value = (keyMap.value ?? defaultValue) * scale;
|
|
1076
1283
|
let bezier = 0;
|
|
1077
1284
|
for (let frame = 0;; frame++) {
|
|
1078
1285
|
timeline.setFrame(frame, time, value);
|
|
1079
|
-
|
|
1286
|
+
const nextMap = keys[frame + 1];
|
|
1080
1287
|
if (!nextMap) {
|
|
1081
1288
|
timeline.shrink(bezier);
|
|
1082
|
-
|
|
1289
|
+
timelines.push(timeline);
|
|
1290
|
+
return;
|
|
1083
1291
|
}
|
|
1084
|
-
|
|
1085
|
-
|
|
1292
|
+
const time2 = nextMap.time ?? 0;
|
|
1293
|
+
const value2 = (nextMap.value ?? defaultValue) * scale;
|
|
1086
1294
|
if (keyMap.curve)
|
|
1087
1295
|
bezier = readCurve(keyMap.curve, timeline, bezier, frame, 0, time, time2, value, value2, scale);
|
|
1088
1296
|
time = time2;
|
|
@@ -1090,23 +1298,24 @@ function readTimeline1(keys, timeline, defaultValue, scale) {
|
|
|
1090
1298
|
keyMap = nextMap;
|
|
1091
1299
|
}
|
|
1092
1300
|
}
|
|
1093
|
-
function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
|
|
1301
|
+
function readTimeline2(timelines, keys, timeline, name1, name2, defaultValue, scale) {
|
|
1094
1302
|
let keyMap = keys[0];
|
|
1095
|
-
let time =
|
|
1096
|
-
let value1 =
|
|
1097
|
-
let value2 =
|
|
1303
|
+
let time = keyMap.time ?? 0;
|
|
1304
|
+
let value1 = (keyMap[name1] ?? defaultValue) * scale;
|
|
1305
|
+
let value2 = (keyMap[name2] ?? defaultValue) * scale;
|
|
1098
1306
|
let bezier = 0;
|
|
1099
1307
|
for (let frame = 0;; frame++) {
|
|
1100
1308
|
timeline.setFrame(frame, time, value1, value2);
|
|
1101
|
-
|
|
1309
|
+
const nextMap = keys[frame + 1];
|
|
1102
1310
|
if (!nextMap) {
|
|
1103
1311
|
timeline.shrink(bezier);
|
|
1104
|
-
|
|
1312
|
+
timelines.push(timeline);
|
|
1313
|
+
return;
|
|
1105
1314
|
}
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1315
|
+
const time2 = nextMap.time ?? 0;
|
|
1316
|
+
const nvalue1 = (nextMap[name1] ?? defaultValue) * scale;
|
|
1317
|
+
const nvalue2 = (nextMap[name2] ?? defaultValue) * scale;
|
|
1318
|
+
const curve = keyMap.curve;
|
|
1110
1319
|
if (curve) {
|
|
1111
1320
|
bezier = readCurve(curve, timeline, bezier, frame, 0, time, time2, value1, nvalue1, scale);
|
|
1112
1321
|
bezier = readCurve(curve, timeline, bezier, frame, 1, time, time2, value2, nvalue2, scale);
|
|
@@ -1117,20 +1326,62 @@ function readTimeline2(keys, timeline, name1, name2, defaultValue, scale) {
|
|
|
1117
1326
|
keyMap = nextMap;
|
|
1118
1327
|
}
|
|
1119
1328
|
}
|
|
1329
|
+
/** @param folderSlots Slot names are resolved to positions within this array. If null, slot indices are used as positions. */
|
|
1330
|
+
function readDrawOrder(skeletonData, keys, slotCount, folderSlots) {
|
|
1331
|
+
const changes = keys.offsets;
|
|
1332
|
+
if (!changes)
|
|
1333
|
+
return null; // Setup draw order.
|
|
1334
|
+
const drawOrder = new Array(slotCount).fill(-1);
|
|
1335
|
+
const unchanged = new Array(slotCount - changes.length);
|
|
1336
|
+
let originalIndex = 0, unchangedIndex = 0;
|
|
1337
|
+
for (const offsetMap of changes) {
|
|
1338
|
+
const slot = skeletonData.findSlot(offsetMap.slot);
|
|
1339
|
+
if (slot == null)
|
|
1340
|
+
throw new Error(`Draw order slot not found: ${offsetMap.slot}`);
|
|
1341
|
+
let index = 0;
|
|
1342
|
+
if (!folderSlots)
|
|
1343
|
+
index = slot.index;
|
|
1344
|
+
else {
|
|
1345
|
+
index = -1;
|
|
1346
|
+
for (let i = 0; i < slotCount; i++) {
|
|
1347
|
+
if (folderSlots[i] === slot.index) {
|
|
1348
|
+
index = i;
|
|
1349
|
+
break;
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
if (index === -1)
|
|
1353
|
+
throw new Error(`Slot not in folder: ${offsetMap.slot}`);
|
|
1354
|
+
}
|
|
1355
|
+
// Collect unchanged items.
|
|
1356
|
+
while (originalIndex !== index)
|
|
1357
|
+
unchanged[unchangedIndex++] = originalIndex++;
|
|
1358
|
+
// Set changed items.
|
|
1359
|
+
drawOrder[originalIndex + offsetMap.offset] = originalIndex++;
|
|
1360
|
+
}
|
|
1361
|
+
// Collect remaining unchanged items.
|
|
1362
|
+
while (originalIndex < slotCount)
|
|
1363
|
+
unchanged[unchangedIndex++] = originalIndex++;
|
|
1364
|
+
// Fill in unchanged items.
|
|
1365
|
+
for (let i = slotCount - 1; i >= 0; i--)
|
|
1366
|
+
if (drawOrder[i] === -1)
|
|
1367
|
+
drawOrder[i] = unchanged[--unchangedIndex];
|
|
1368
|
+
return drawOrder;
|
|
1369
|
+
}
|
|
1120
1370
|
function readCurve(curve, timeline, bezier, frame, value, time1, time2, value1, value2, scale) {
|
|
1121
|
-
if (curve
|
|
1371
|
+
if (curve === "stepped") {
|
|
1122
1372
|
timeline.setStepped(frame);
|
|
1123
1373
|
return bezier;
|
|
1124
1374
|
}
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1375
|
+
const i = value << 2;
|
|
1376
|
+
const cx1 = curve[i];
|
|
1377
|
+
const cy1 = curve[i + 1] * scale;
|
|
1378
|
+
const cx2 = curve[i + 2];
|
|
1379
|
+
const cy2 = curve[i + 3] * scale;
|
|
1130
1380
|
timeline.setBezier(bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
|
|
1131
1381
|
return bezier + 1;
|
|
1132
1382
|
}
|
|
1383
|
+
// biome-ignore lint/suspicious/noExplicitAny: it is any until we define a schema
|
|
1133
1384
|
function getValue(map, property, defaultValue) {
|
|
1134
1385
|
return map[property] !== undefined ? map[property] : defaultValue;
|
|
1135
1386
|
}
|
|
1136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Kc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLFNBQVMsRUFBWSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsMkJBQTJCLEVBQUUsOEJBQThCLEVBQUUsNkJBQTZCLEVBQUUseUJBQXlCLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBaUQsOEJBQThCLEVBQUUsZ0NBQWdDLEVBQUUsaUNBQWlDLEVBQUUsZ0NBQWdDLEVBQUUsNkJBQTZCLEVBQUUsNkJBQTZCLEVBQUUsZ0NBQWdDLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk3ekIsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFbkU7Ozs7cUJBSXFCO0FBQ3JCLE1BQU0sT0FBTyxZQUFZO0lBQ3hCLGdCQUFnQixDQUFtQjtJQUVuQzs7O3FIQUdpSDtJQUNqSCxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ0YsWUFBWSxHQUFHLElBQUksS0FBSyxFQUFjLENBQUM7SUFFL0MsWUFBYSxnQkFBa0M7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzFDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBRSxJQUFrQjtRQUNuQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLElBQUksWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdEMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRWhFLFdBQVc7UUFDWCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ3JDLFlBQVksQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN6QyxZQUFZLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDL0IsWUFBWSxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQy9CLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUN2QyxZQUFZLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDekMsWUFBWSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNuRixZQUFZLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUM7WUFDbkMsWUFBWSxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztZQUNyRCxZQUFZLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDO1FBQ3BELENBQUM7UUFFRCxRQUFRO1FBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTVCLElBQUksTUFBTSxHQUFvQixJQUFJLENBQUM7Z0JBQ25DLElBQUksVUFBVSxHQUFXLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLFVBQVU7b0JBQUUsTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNELElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDM0MsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDaEYsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFckQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksS0FBSztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0MsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNGLENBQUM7UUFFRCxTQUFTO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBRTVCLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsUUFBUTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixPQUFPLENBQUMsSUFBSSxhQUFhLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzFGLElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdkUsSUFBSSxLQUFLLEdBQVcsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3JELElBQUksS0FBSztvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0MsSUFBSSxJQUFJLEdBQVcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELElBQUksSUFBSTtvQkFBRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRWxELElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNGLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxJQUFJLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTNELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUN4RCxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLElBQUk7d0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsc0JBQXNCLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO29CQUNySCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsQ0FBQztnQkFFRCxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFBQSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsTUFBTTtvQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixhQUFhLENBQUMsTUFBTSxzQkFBc0IsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQzNILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUVyQixJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFekQsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkMsQ0FBQztRQUNGLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLElBQUksSUFBSSxHQUFHLElBQUksdUJBQXVCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUUzRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxRQUFRLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxDQUFDLElBQUk7d0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsUUFBUSw2QkFBNkIsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQzdHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QixDQUFDO2dCQUVELElBQUksVUFBVSxHQUFXLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQzlDLElBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxNQUFNO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFVBQVUsNkJBQTZCLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUN4SCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztnQkFFckIsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUV6RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3RFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRXpELFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNGLENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakMsSUFBSSxJQUFJLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTNELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUN4RCxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2QyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsSUFBSTt3QkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixRQUFRLHdCQUF3QixhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDeEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLENBQUM7Z0JBRUQsSUFBSSxVQUFVLEdBQVcsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLE1BQU07b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSx3QkFBd0IsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ25ILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUVyQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RHLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEcsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNoRyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDLEtBQUs7b0JBQUUsSUFBSSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7Z0JBQ3BFLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDLEtBQUs7b0JBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUM7Z0JBQzNHLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUV2RCxZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxDQUFDO1FBQ0YsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRTNELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLElBQUksSUFBSSxJQUFJLElBQUk7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxRQUFRLENBQUMsQ0FBQztnQkFDekUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBRWpCLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFF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Q0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDM0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0NBQzNGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQ0FDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUM3RixNQUFNLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzlGLENBQUM7NEJBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQzs0QkFDYixLQUFLLEdBQUcsUUFBUSxDQUFDOzRCQUNqQixNQUFNLEdBQUcsU0FBUyxDQUFD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d0JBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVELENBQUM7eUJBQU0sSUFBSSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVELENBQUM7eUJBQU0sSUFBSSxZQUFZLEtBQUssT0FBTyxFQUFFLENBQUM7d0JBQ3JDLElBQUksUUFBUSxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUNqRSxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RFLENBQUM7eUJBQU0sSUFBSSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVELENBQUM7eUJBQU0sSUFBSSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RDLElBQUksUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7d0JBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcs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RUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDbkYsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDbkYsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDN0YsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDOUYsQ0FBQztvQkFFRCxJQUFJLEdBQUcsS0FBSyxDQUFDO29CQUNiLFNBQVMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZCLElBQUksR0FBRyxLQUFLLENBQUM7b0JBQ2IsSUFBSSxHQUFHLEtBQUssQ0FBQztvQkFDYixTQUFTLEdBQUcsVUFBVSxDQUFDO29CQUN2QixTQUFTLEdBQUcsVUFBVSxDQUFDO29CQUN2QixTQUFTLEdBQUcsVUFB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QUMsQ0FBQztJQUNuQixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDL0IsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMvQixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFFLEdBQVEsRUFBRSxRQUFnQixFQUFFLFlBQWlCO0lBQy9ELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQW5pbWF0aW9uLCBUaW1lbGluZSwgSW5oZXJpdFRpbWVsaW5lLCBBdHRhY2htZW50VGltZWxpbmUsIFJHQkFUaW1lbGluZSwgUkdCVGltZWxpbmUsIEFscGhhVGltZWxpbmUsIFJHQkEyVGltZWxpbmUsIFJHQjJUaW1lbGluZSwgUm90YXRlVGltZWxpbmUsIFRyYW5zbGF0ZVRpbWVsaW5lLCBUcmFuc2xhdGVYVGltZWxpbmUsIFRyYW5zbGF0ZVlUaW1lbGluZSwgU2NhbGVUaW1lbGluZSwgU2NhbGVYVGltZWxpbmUsIFNjYWxlWVRpbWVsaW5lLCBTaGVhclRpbWVsaW5lLCBTaGVhclhUaW1lbGluZSwgU2hlYXJZVGltZWxpbmUsIElrQ29uc3RyYWludFRpbWVsaW5lLCBUcmFuc2Zvcm1Db25zdHJhaW50VGltZWxpbmUsIFBhdGhDb25zdHJhaW50UG9zaXRpb25UaW1lbGluZSwgUGF0aENvbnN0cmFpbnRTcGFjaW5nVGltZWxpbmUsIFBhdGhDb25zdHJhaW50TWl4VGltZWxpbmUsIERlZm9ybVRpbWVsaW5lLCBEcmF3T3JkZXJUaW1lbGluZSwgRXZlbnRUaW1lbGluZSwgQ3VydmVUaW1lbGluZTEsIEN1cnZlVGltZWxpbmUyLCBDdXJ2ZVRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludFJlc2V0VGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50SW5lcnRpYVRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50RGFtcGluZ1RpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludE1hc3NUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnRXaW5kVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50R3Jhdml0eVRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludE1peFRpbWVsaW5lIH0gZnJvbSBcIi4vQW5pbWF0aW9uLmpzXCI7XG5pbXBvcnQgeyBWZXJ0ZXhBdHRhY2htZW50LCBBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgQXR0YWNobWVudExvYWRlciB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRMb2FkZXIuanNcIjtcbmltcG9ydCB7IE1lc2hBdHRhY2htZW50IH0gZnJvbSBcIi4vYXR0YWNobWVudHMvTWVzaEF0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB7IEJvbmVEYXRhLCBJbmhlcml0IH0gZnJvbSBcIi4vQm9uZURhdGEuanNcIjtcbmltcG9ydCB7IEV2ZW50RGF0YSB9IGZyb20gXCIuL0V2ZW50RGF0YS5qc1wiO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwiLi9FdmVudC5qc1wiO1xuaW1wb3J0IHsgSWtDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL0lrQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBhdGhDb25zdHJhaW50RGF0YSwgUG9zaXRpb25Nb2RlLCBTcGFjaW5nTW9kZSwgUm90YXRlTW9kZSB9IGZyb20gXCIuL1BhdGhDb25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHsgU2tlbGV0b25EYXRhIH0gZnJvbSBcIi4vU2tlbGV0b25EYXRhLmpzXCI7XG5pbXBvcnQgeyBTa2luIH0gZnJvbSBcIi4vU2tpbi5qc1wiO1xuaW1wb3J0IHsgU2xvdERhdGEsIEJsZW5kTW9kZSB9IGZyb20gXCIuL1Nsb3REYXRhLmpzXCI7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Db25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgeyBVdGlscywgQ29sb3IsIE51bWJlckFycmF5TGlrZSB9IGZyb20gXCIuL1V0aWxzLmpzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSwgU2VxdWVuY2VNb2RlIH0gZnJvbSBcIi4vYXR0YWNobWVudHMvU2VxdWVuY2UuanNcIjtcbmltcG9ydCB7IFNlcXVlbmNlVGltZWxpbmUgfSBmcm9tIFwiLi9BbmltYXRpb24uanNcIjtcbmltcG9ydCB7IEhhc1RleHR1cmVSZWdpb24gfSBmcm9tIFwiLi9hdHRhY2htZW50cy9IYXNUZXh0dXJlUmVnaW9uLmpzXCI7XG5pbXBvcnQgeyBQaHlzaWNzQ29uc3RyYWludERhdGEgfSBmcm9tIFwiLi9QaHlzaWNzQ29uc3RyYWludERhdGEuanNcIjtcblxuLyoqIExvYWRzIHNrZWxldG9uIGRhdGEgaW4gdGhlIFNwaW5lIEpTT04gZm9ybWF0LlxuICpcbiAqIFNlZSBbU3BpbmUgSlNPTiBmb3JtYXRdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1qc29uLWZvcm1hdCkgYW5kXG4gKiBbSlNPTiBhbmQgYmluYXJ5IGRhdGFdKGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1sb2FkaW5nLXNrZWxldG9uLWRhdGEjSlNPTi1hbmQtYmluYXJ5LWRhdGEpIGluIHRoZSBTcGluZVxuICogUnVudGltZXMgR3VpZGUuICovXG5leHBvcnQgY2xhc3MgU2tlbGV0b25Kc29uIHtcblx0YXR0YWNobWVudExvYWRlcjogQXR0YWNobWVudExvYWRlcjtcblxuXHQvKiogU2NhbGVzIGJvbmUgcG9zaXRpb25zLCBpbWFnZSBzaXplcywgYW5kIHRyYW5zbGF0aW9ucyBhcyB0aGV5IGFyZSBsb2FkZWQuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBzaXplIGltYWdlcyB0byBiZSB1c2VkIGF0XG5cdCAqIHJ1bnRpbWUgdGhhbiB3ZXJlIHVzZWQgaW4gU3BpbmUuXG5cdCAqXG5cdCAqIFNlZSBbU2NhbGluZ10oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWxvYWRpbmctc2tlbGV0b24tZGF0YSNTY2FsaW5nKSBpbiB0aGUgU3BpbmUgUnVudGltZXMgR3VpZGUuICovXG5cdHNjYWxlID0gMTtcblx0cHJpdmF0ZSBsaW5rZWRNZXNoZXMgPSBuZXcgQXJyYXk8TGlua2VkTWVzaD4oKTtcblxuXHRjb25zdHJ1Y3RvciAoYXR0YWNobWVudExvYWRlcjogQXR0YWNobWVudExvYWRlcikge1xuXHRcdHRoaXMuYXR0YWNobWVudExvYWRlciA9IGF0dGFjaG1lbnRMb2FkZXI7XG5cdH1cblxuXHRyZWFkU2tlbGV0b25EYXRhIChqc29uOiBzdHJpbmcgfCBhbnkpOiBTa2VsZXRvbkRhdGEge1xuXHRcdGxldCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0bGV0IHNrZWxldG9uRGF0YSA9IG5ldyBTa2VsZXRvbkRhdGEoKTtcblx0XHRsZXQgcm9vdCA9IHR5cGVvZiAoanNvbikgPT09IFwic3RyaW5nXCIgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcblxuXHRcdC8vIFNrZWxldG9uXG5cdFx0bGV0IHNrZWxldG9uTWFwID0gcm9vdC5za2VsZXRvbjtcblx0XHRpZiAoc2tlbGV0b25NYXApIHtcblx0XHRcdHNrZWxldG9uRGF0YS5oYXNoID0gc2tlbGV0b25NYXAuaGFzaDtcblx0XHRcdHNrZWxldG9uRGF0YS52ZXJzaW9uID0gc2tlbGV0b25NYXAuc3BpbmU7XG5cdFx0XHRza2VsZXRvbkRhdGEueCA9IHNrZWxldG9uTWFwLng7XG5cdFx0XHRza2VsZXRvbkRhdGEueSA9IHNrZWxldG9uTWFwLnk7XG5cdFx0XHRza2VsZXRvbkRhdGEud2lkdGggPSBza2VsZXRvbk1hcC53aWR0aDtcblx0XHRcdHNrZWxldG9uRGF0YS5oZWlnaHQgPSBza2VsZXRvbk1hcC5oZWlnaHQ7XG5cdFx0XHRza2VsZXRvbkRhdGEucmVmZXJlbmNlU2NhbGUgPSBnZXRWYWx1ZShza2VsZXRvbk1hcCwgXCJyZWZlcmVuY2VTY2FsZVwiLCAxMDApICogc2NhbGU7XG5cdFx0XHRza2VsZXRvbkRhdGEuZnBzID0gc2tlbGV0b25NYXAuZnBzO1xuXHRcdFx0c2tlbGV0b25EYXRhLmltYWdlc1BhdGggPSBza2VsZXRvbk1hcC5pbWFnZXMgPz8gbnVsbDtcblx0XHRcdHNrZWxldG9uRGF0YS5hdWRpb1BhdGggPSBza2VsZXRvbk1hcC5hdWRpbyA/PyBudWxsO1xuXHRcdH1cblxuXHRcdC8vIEJvbmVzXG5cdFx0aWYgKHJvb3QuYm9uZXMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5ib25lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgYm9uZU1hcCA9IHJvb3QuYm9uZXNbaV07XG5cblx0XHRcdFx0bGV0IHBhcmVudDogQm9uZURhdGEgfCBudWxsID0gbnVsbDtcblx0XHRcdFx0bGV0IHBhcmVudE5hbWU6IHN0cmluZyA9IGdldFZhbHVlKGJvbmVNYXAsIFwicGFyZW50XCIsIG51bGwpO1xuXHRcdFx0XHRpZiAocGFyZW50TmFtZSkgcGFyZW50ID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKHBhcmVudE5hbWUpO1xuXHRcdFx0XHRsZXQgZGF0YSA9IG5ldyBCb25lRGF0YShza2VsZXRvbkRhdGEuYm9uZXMubGVuZ3RoLCBib25lTWFwLm5hbWUsIHBhcmVudCk7XG5cdFx0XHRcdGRhdGEubGVuZ3RoID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJsZW5ndGhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0ZGF0YS54ID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJ4XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdGRhdGEueSA9IGdldFZhbHVlKGJvbmVNYXAsIFwieVwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRkYXRhLnJvdGF0aW9uID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0ZGF0YS5zY2FsZVggPSBnZXRWYWx1ZShib25lTWFwLCBcInNjYWxlWFwiLCAxKTtcblx0XHRcdFx0ZGF0YS5zY2FsZVkgPSBnZXRWYWx1ZShib25lTWFwLCBcInNjYWxlWVwiLCAxKTtcblx0XHRcdFx0ZGF0YS5zaGVhclggPSBnZXRWYWx1ZShib25lTWFwLCBcInNoZWFyWFwiLCAwKTtcblx0XHRcdFx0ZGF0YS5zaGVhclkgPSBnZXRWYWx1ZShib25lTWFwLCBcInNoZWFyWVwiLCAwKTtcblx0XHRcdFx0ZGF0YS5pbmhlcml0ID0gVXRpbHMuZW51bVZhbHVlKEluaGVyaXQsIGdldFZhbHVlKGJvbmVNYXAsIFwiaW5oZXJpdFwiLCBcIk5vcm1hbFwiKSk7XG5cdFx0XHRcdGRhdGEuc2tpblJlcXVpcmVkID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJza2luXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRsZXQgY29sb3IgPSBnZXRWYWx1ZShib25lTWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIGRhdGEuY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cblx0XHRcdFx0c2tlbGV0b25EYXRhLmJvbmVzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2xvdHMuXG5cdFx0aWYgKHJvb3Quc2xvdHMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5zbG90cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgc2xvdE1hcCA9IHJvb3Quc2xvdHNbaV07XG5cdFx0XHRcdGxldCBzbG90TmFtZSA9IHNsb3RNYXAubmFtZTtcblxuXHRcdFx0XHRsZXQgYm9uZURhdGEgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoc2xvdE1hcC5ib25lKTtcblx0XHRcdFx0aWYgKCFib25lRGF0YSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtzbG90TWFwLmJvbmV9IGZvciBzbG90ICR7c2xvdE5hbWV9YCk7XG5cdFx0XHRcdGxldCBkYXRhID0gbmV3IFNsb3REYXRhKHNrZWxldG9uRGF0YS5zbG90cy5sZW5ndGgsIHNsb3ROYW1lLCBib25lRGF0YSk7XG5cblx0XHRcdFx0bGV0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShzbG90TWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIGRhdGEuY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cblx0XHRcdFx0bGV0IGRhcms6IHN0cmluZyA9IGdldFZhbHVlKHNsb3RNYXAsIFwiZGFya1wiLCBudWxsKTtcblx0XHRcdFx0aWYgKGRhcmspIGRhdGEuZGFya0NvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhkYXJrKTtcblxuXHRcdFx0XHRkYXRhLmF0dGFjaG1lbnROYW1lID0gZ2V0VmFsdWUoc2xvdE1hcCwgXCJhdHRhY2htZW50XCIsIG51bGwpO1xuXHRcdFx0XHRkYXRhLmJsZW5kTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShCbGVuZE1vZGUsIGdldFZhbHVlKHNsb3RNYXAsIFwiYmxlbmRcIiwgXCJub3JtYWxcIikpO1xuXHRcdFx0XHRkYXRhLnZpc2libGUgPSBnZXRWYWx1ZShzbG90TWFwLCBcInZpc2libGVcIiwgdHJ1ZSk7XG5cdFx0XHRcdHNrZWxldG9uRGF0YS5zbG90cy5wdXNoKGRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElLIGNvbnN0cmFpbnRzXG5cdFx0aWYgKHJvb3QuaWspIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5pay5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgY29uc3RyYWludE1hcCA9IHJvb3QuaWtbaV07XG5cdFx0XHRcdGxldCBkYXRhID0gbmV3IElrQ29uc3RyYWludERhdGEoY29uc3RyYWludE1hcC5uYW1lKTtcblx0XHRcdFx0ZGF0YS5vcmRlciA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwib3JkZXJcIiwgMCk7XG5cdFx0XHRcdGRhdGEuc2tpblJlcXVpcmVkID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJza2luXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgY29uc3RyYWludE1hcC5ib25lcy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRsZXQgYm9uZSA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShjb25zdHJhaW50TWFwLmJvbmVzW2lpXSk7XG5cdFx0XHRcdFx0aWYgKCFib25lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYm9uZSAke2NvbnN0cmFpbnRNYXAuYm9uZXNbaWldfSBmb3IgSUsgY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0ZGF0YS5ib25lcy5wdXNoKGJvbmUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGV0IHRhcmdldCA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShjb25zdHJhaW50TWFwLnRhcmdldCk7O1xuXHRcdFx0XHRpZiAoIXRhcmdldCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRhcmdldCBib25lICR7Y29uc3RyYWludE1hcC50YXJnZXR9IGZvciBJSyBjb25zdHJhaW50ICR7Y29uc3RyYWludE1hcC5uYW1lfS5gKTtcblx0XHRcdFx0ZGF0YS50YXJnZXQgPSB0YXJnZXQ7XG5cblx0XHRcdFx0ZGF0YS5taXggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFwiLCAxKTtcblx0XHRcdFx0ZGF0YS5zb2Z0bmVzcyA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic29mdG5lc3NcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0ZGF0YS5iZW5kRGlyZWN0aW9uID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJiZW5kUG9zaXRpdmVcIiwgdHJ1ZSkgPyAxIDogLTE7XG5cdFx0XHRcdGRhdGEuY29tcHJlc3MgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImNvbXByZXNzXCIsIGZhbHNlKTtcblx0XHRcdFx0ZGF0YS5zdHJldGNoID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJldGNoXCIsIGZhbHNlKTtcblx0XHRcdFx0ZGF0YS51bmlmb3JtID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ1bmlmb3JtXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRza2VsZXRvbkRhdGEuaWtDb25zdHJhaW50cy5wdXNoKGRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRyYW5zZm9ybSBjb25zdHJhaW50cy5cblx0XHRpZiAocm9vdC50cmFuc2Zvcm0pIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC50cmFuc2Zvcm0ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IGNvbnN0cmFpbnRNYXAgPSByb290LnRyYW5zZm9ybVtpXTtcblx0XHRcdFx0bGV0IGRhdGEgPSBuZXcgVHJhbnNmb3JtQ29uc3RyYWludERhdGEoY29uc3RyYWludE1hcC5uYW1lKTtcblx0XHRcdFx0ZGF0YS5vcmRlciA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwib3JkZXJcIiwgMCk7XG5cdFx0XHRcdGRhdGEuc2tpblJlcXVpcmVkID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJza2luXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgY29uc3RyYWludE1hcC5ib25lcy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRsZXQgYm9uZU5hbWUgPSBjb25zdHJhaW50TWFwLmJvbmVzW2lpXTtcblx0XHRcdFx0XHRsZXQgYm9uZSA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShib25lTmFtZSk7XG5cdFx0XHRcdFx0aWYgKCFib25lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYm9uZSAke2JvbmVOYW1lfSBmb3IgdHJhbnNmb3JtIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdGRhdGEuYm9uZXMucHVzaChib25lKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0YXJnZXROYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLnRhcmdldDtcblx0XHRcdFx0bGV0IHRhcmdldCA9IHNrZWxldG9uRGF0YS5maW5kQm9uZSh0YXJnZXROYW1lKTtcblx0XHRcdFx0aWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0YXJnZXQgYm9uZSAke3RhcmdldE5hbWV9IGZvciB0cmFuc2Zvcm0gY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdGRhdGEudGFyZ2V0ID0gdGFyZ2V0O1xuXG5cdFx0XHRcdGRhdGEubG9jYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImxvY2FsXCIsIGZhbHNlKTtcblx0XHRcdFx0ZGF0YS5yZWxhdGl2ZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwicmVsYXRpdmVcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLm9mZnNldFJvdGF0aW9uID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0ZGF0YS5vZmZzZXRYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ4XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdGRhdGEub2Zmc2V0WSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwieVwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRkYXRhLm9mZnNldFNjYWxlWCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2NhbGVYXCIsIDApO1xuXHRcdFx0XHRkYXRhLm9mZnNldFNjYWxlWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2NhbGVZXCIsIDApO1xuXHRcdFx0XHRkYXRhLm9mZnNldFNoZWFyWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2hlYXJZXCIsIDApO1xuXG5cdFx0XHRcdGRhdGEubWl4Um90YXRlID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdGRhdGEubWl4WCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4WFwiLCAxKTtcblx0XHRcdFx0ZGF0YS5taXhZID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhZXCIsIGRhdGEubWl4WCk7XG5cdFx0XHRcdGRhdGEubWl4U2NhbGVYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhTY2FsZVhcIiwgMSk7XG5cdFx0XHRcdGRhdGEubWl4U2NhbGVZID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhTY2FsZVlcIiwgZGF0YS5taXhTY2FsZVgpO1xuXHRcdFx0XHRkYXRhLm1peFNoZWFyWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4U2hlYXJZXCIsIDEpO1xuXG5cdFx0XHRcdHNrZWxldG9uRGF0YS50cmFuc2Zvcm1Db25zdHJhaW50cy5wdXNoKGRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFBhdGggY29uc3RyYWludHMuXG5cdFx0aWYgKHJvb3QucGF0aCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByb290LnBhdGgubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0bGV0IGNvbnN0cmFpbnRNYXAgPSByb290LnBhdGhbaV07XG5cdFx0XHRcdGxldCBkYXRhID0gbmV3IFBhdGhDb25zdHJhaW50RGF0YShjb25zdHJhaW50TWFwLm5hbWUpO1xuXHRcdFx0XHRkYXRhLm9yZGVyID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJvcmRlclwiLCAwKTtcblx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNraW5cIiwgZmFsc2UpO1xuXG5cdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjb25zdHJhaW50TWFwLmJvbmVzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdGxldCBib25lTmFtZSA9IGNvbnN0cmFpbnRNYXAuYm9uZXNbaWldO1xuXHRcdFx0XHRcdGxldCBib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Ym9uZU5hbWV9IGZvciBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdGRhdGEuYm9uZXMucHVzaChib25lKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0YXJnZXROYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLnRhcmdldDtcblx0XHRcdFx0bGV0IHRhcmdldCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdCh0YXJnZXROYW1lKTtcblx0XHRcdFx0aWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0YXJnZXQgc2xvdCAke3RhcmdldE5hbWV9IGZvciBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRkYXRhLnRhcmdldCA9IHRhcmdldDtcblxuXHRcdFx0XHRkYXRhLnBvc2l0aW9uTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShQb3NpdGlvbk1vZGUsIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwicG9zaXRpb25Nb2RlXCIsIFwiUGVyY2VudFwiKSk7XG5cdFx0XHRcdGRhdGEuc3BhY2luZ01vZGUgPSBVdGlscy5lbnVtVmFsdWUoU3BhY2luZ01vZGUsIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic3BhY2luZ01vZGVcIiwgXCJMZW5ndGhcIikpO1xuXHRcdFx0XHRkYXRhLnJvdGF0ZU1vZGUgPSBVdGlscy5lbnVtVmFsdWUoUm90YXRlTW9kZSwgZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJyb3RhdGVNb2RlXCIsIFwiVGFuZ2VudFwiKSk7XG5cdFx0XHRcdGRhdGEub2Zmc2V0Um90YXRpb24gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0aW9uXCIsIDApO1xuXHRcdFx0XHRkYXRhLnBvc2l0aW9uID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJwb3NpdGlvblwiLCAwKTtcblx0XHRcdFx0aWYgKGRhdGEucG9zaXRpb25Nb2RlID09IFBvc2l0aW9uTW9kZS5GaXhlZCkgZGF0YS5wb3NpdGlvbiAqPSBzY2FsZTtcblx0XHRcdFx0ZGF0YS5zcGFjaW5nID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzcGFjaW5nXCIsIDApO1xuXHRcdFx0XHRpZiAoZGF0YS5zcGFjaW5nTW9kZSA9PSBTcGFjaW5nTW9kZS5MZW5ndGggfHwgZGF0YS5zcGFjaW5nTW9kZSA9PSBTcGFjaW5nTW9kZS5GaXhlZCkgZGF0YS5zcGFjaW5nICo9IHNjYWxlO1xuXHRcdFx0XHRkYXRhLm1peFJvdGF0ZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRkYXRhLm1peFggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFhcIiwgMSk7XG5cdFx0XHRcdGRhdGEubWl4WSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4WVwiLCBkYXRhLm1peFgpO1xuXG5cdFx0XHRcdHNrZWxldG9uRGF0YS5wYXRoQ29uc3RyYWludHMucHVzaChkYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQaHlzaWNzIGNvbnN0cmFpbnRzLlxuXHRcdGlmIChyb290LnBoeXNpY3MpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5waHlzaWNzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnRNYXAgPSByb290LnBoeXNpY3NbaV07XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnREYXRhKGNvbnN0cmFpbnRNYXAubmFtZSk7XG5cdFx0XHRcdGRhdGEub3JkZXIgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm9yZGVyXCIsIDApO1xuXHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2tpblwiLCBmYWxzZSk7XG5cblx0XHRcdFx0Y29uc3QgYm9uZU5hbWUgPSBjb25zdHJhaW50TWFwLmJvbmU7XG5cdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRpZiAoYm9uZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJQaHlzaWNzIGJvbmUgbm90IGZvdW5kOiBcIiArIGJvbmVOYW1lKTtcblx0XHRcdFx0ZGF0YS5ib25lID0gYm9uZTtcblxuXHRcdFx0XHRkYXRhLnggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInhcIiwgMCk7XG5cdFx0XHRcdGRhdGEueSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwieVwiLCAwKTtcblx0XHRcdFx0ZGF0YS5yb3RhdGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0ZVwiLCAwKTtcblx0XHRcdFx0ZGF0YS5zY2FsZVggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNjYWxlWFwiLCAwKTtcblx0XHRcdFx0ZGF0YS5zaGVhclggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNoZWFyWFwiLCAwKTtcblx0XHRcdFx0ZGF0YS5saW1pdCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibGltaXRcIiwgNTAwMCkgKiBzY2FsZTtcblx0XHRcdFx0ZGF0YS5zdGVwID0gMSAvIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiZnBzXCIsIDYwKTtcblx0XHRcdFx0ZGF0YS5pbmVydGlhID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJpbmVydGlhXCIsIDEpO1xuXHRcdFx0XHRkYXRhLnN0cmVuZ3RoID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJlbmd0aFwiLCAxMDApO1xuXHRcdFx0XHRkYXRhLmRhbXBpbmcgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImRhbXBpbmdcIiwgMSk7XG5cdFx0XHRcdGRhdGEubWFzc0ludmVyc2UgPSAxIC8gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtYXNzXCIsIDEpO1xuXHRcdFx0XHRkYXRhLndpbmQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIndpbmRcIiwgMCk7XG5cdFx0XHRcdGRhdGEuZ3Jhdml0eSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiZ3Jhdml0eVwiLCAwKTtcblx0XHRcdFx0ZGF0YS5taXggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFwiLCAxKTtcblx0XHRcdFx0ZGF0YS5pbmVydGlhR2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJpbmVydGlhR2xvYmFsXCIsIGZhbHNlKTtcblx0XHRcdFx0ZGF0YS5zdHJlbmd0aEdsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic3RyZW5ndGhHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLmRhbXBpbmdHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImRhbXBpbmdHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLm1hc3NHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1hc3NHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLndpbmRHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIndpbmRHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLmdyYXZpdHlHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImdyYXZpdHlHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRkYXRhLm1peEdsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4R2xvYmFsXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRza2VsZXRvbkRhdGEucGh5c2ljc0NvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2tpbnMuXG5cdFx0aWYgKHJvb3Quc2tpbnMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5za2lucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRsZXQgc2tpbk1hcCA9IHJvb3Quc2tpbnNbaV1cblx0XHRcdFx0bGV0IHNraW4gPSBuZXcgU2tpbihza2luTWFwLm5hbWUpO1xuXG5cdFx0XHRcdGlmIChza2luTWFwLmJvbmVzKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRsZXQgYm9uZU5hbWUgPSBza2luTWFwLmJvbmVzW2lpXTtcblx0XHRcdFx0XHRcdGxldCBib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdGlmICghYm9uZSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtib25lTmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5ib25lcy5wdXNoKGJvbmUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLmlrKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAuaWsubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRsZXQgY29uc3RyYWludE5hbWUgPSBza2luTWFwLmlrW2lpXTtcblx0XHRcdFx0XHRcdGxldCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRJa0NvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgSUsgY29uc3RyYWludCAke2NvbnN0cmFpbnROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRza2luLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNraW5NYXAudHJhbnNmb3JtKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAudHJhbnNmb3JtLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0bGV0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC50cmFuc2Zvcm1baWldO1xuXHRcdFx0XHRcdFx0bGV0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZFRyYW5zZm9ybUNvbnN0cmFpbnQoY29uc3RyYWludE5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgdHJhbnNmb3JtIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLnBhdGgpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgc2tpbk1hcC5wYXRoLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0bGV0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC5wYXRoW2lpXTtcblx0XHRcdFx0XHRcdGxldCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRQYXRoQ29uc3RyYWludChjb25zdHJhaW50TmFtZSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLnBoeXNpY3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgc2tpbk1hcC5waHlzaWNzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0bGV0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC5waHlzaWNzW2lpXTtcblx0XHRcdFx0XHRcdGxldCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRQaHlzaWNzQ29uc3RyYWludChjb25zdHJhaW50TmFtZSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBwaHlzaWNzIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAobGV0IHNsb3ROYW1lIGluIHNraW5NYXAuYXR0YWNobWVudHMpIHtcblx0XHRcdFx0XHRsZXQgc2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChzbG90TmFtZSk7XG5cdFx0XHRcdFx0aWYgKCFzbG90KSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgc2xvdCAke3Nsb3ROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0bGV0IHNsb3RNYXAgPSBza2luTWFwLmF0dGFjaG1lbnRzW3Nsb3ROYW1lXTtcblx0XHRcdFx0XHRmb3IgKGxldCBlbnRyeU5hbWUgaW4gc2xvdE1hcCkge1xuXHRcdFx0XHRcdFx0bGV0IGF0dGFjaG1lbnQgPSB0aGlzLnJlYWRBdHRhY2htZW50KHNsb3RNYXBbZW50cnlOYW1lXSwgc2tpbiwgc2xvdC5pbmRleCwgZW50cnlOYW1lLCBza2VsZXRvbkRhdGEpO1xuXHRcdFx0XHRcdFx0aWYgKGF0dGFjaG1lbnQpIHNraW4uc2V0QXR0YWNobWVudChzbG90LmluZGV4LCBlbnRyeU5hbWUsIGF0dGFjaG1lbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRza2VsZXRvbkRhdGEuc2tpbnMucHVzaChza2luKTtcblx0XHRcdFx0aWYgKHNraW4ubmFtZSA9PSBcImRlZmF1bHRcIikgc2tlbGV0b25EYXRhLmRlZmF1bHRTa2luID0gc2tpbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBMaW5rZWQgbWVzaGVzLlxuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5saW5rZWRNZXNoZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRsZXQgbGlua2VkTWVzaCA9IHRoaXMubGlua2VkTWVzaGVzW2ldO1xuXHRcdFx0bGV0IHNraW4gPSAhbGlua2VkTWVzaC5za2luID8gc2tlbGV0b25EYXRhLmRlZmF1bHRTa2luIDogc2tlbGV0b25EYXRhLmZpbmRTa2luKGxpbmtlZE1lc2guc2tpbik7XG5cdFx0XHRpZiAoIXNraW4pIHRocm93IG5ldyBFcnJvcihgU2tpbiBub3QgZm91bmQ6ICR7bGlua2VkTWVzaC5za2lufWApO1xuXHRcdFx0bGV0IHBhcmVudCA9IHNraW4uZ2V0QXR0YWNobWVudChsaW5rZWRNZXNoLnNsb3RJbmRleCwgbGlua2VkTWVzaC5wYXJlbnQpO1xuXHRcdFx0aWYgKCFwYXJlbnQpIHRocm93IG5ldyBFcnJvcihgUGFyZW50IG1lc2ggbm90IGZvdW5kOiAke2xpbmtlZE1lc2gucGFyZW50fWApO1xuXHRcdFx0bGlua2VkTWVzaC5tZXNoLnRpbWVsaW5lQXR0YWNobWVudCA9IGxpbmtlZE1lc2guaW5oZXJpdFRpbWVsaW5lID8gPFZlcnRleEF0dGFjaG1lbnQ+cGFyZW50IDogPFZlcnRleEF0dGFjaG1lbnQ+bGlua2VkTWVzaC5tZXNoO1xuXHRcdFx0bGlua2VkTWVzaC5tZXNoLnNldFBhcmVudE1lc2goPE1lc2hBdHRhY2htZW50PnBhcmVudCk7XG5cdFx0XHRpZiAobGlua2VkTWVzaC5tZXNoLnJlZ2lvbiAhPSBudWxsKSBsaW5rZWRNZXNoLm1lc2gudXBkYXRlUmVnaW9uKCk7XG5cdFx0fVxuXHRcdHRoaXMubGlua2VkTWVzaGVzLmxlbmd0aCA9IDA7XG5cblx0XHQvLyBFdmVudHMuXG5cdFx0aWYgKHJvb3QuZXZlbnRzKSB7XG5cdFx0XHRmb3IgKGxldCBldmVudE5hbWUgaW4gcm9vdC5ldmVudHMpIHtcblx0XHRcdFx0bGV0IGV2ZW50TWFwID0gcm9vdC5ldmVudHNbZXZlbnROYW1lXTtcblx0XHRcdFx0bGV0IGRhdGEgPSBuZXcgRXZlbnREYXRhKGV2ZW50TmFtZSk7XG5cdFx0XHRcdGRhdGEuaW50VmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJpbnRcIiwgMCk7XG5cdFx0XHRcdGRhdGEuZmxvYXRWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImZsb2F0XCIsIDApO1xuXHRcdFx0XHRkYXRhLnN0cmluZ1ZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwic3RyaW5nXCIsIFwiXCIpO1xuXHRcdFx0XHRkYXRhLmF1ZGlvUGF0aCA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImF1ZGlvXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoZGF0YS5hdWRpb1BhdGgpIHtcblx0XHRcdFx0XHRkYXRhLnZvbHVtZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInZvbHVtZVwiLCAxKTtcblx0XHRcdFx0XHRkYXRhLmJhbGFuY2UgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJiYWxhbmNlXCIsIDApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNrZWxldG9uRGF0YS5ldmVudHMucHVzaChkYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRpb25zLlxuXHRcdGlmIChyb290LmFuaW1hdGlvbnMpIHtcblx0XHRcdGZvciAobGV0IGFuaW1hdGlvbk5hbWUgaW4gcm9vdC5hbmltYXRpb25zKSB7XG5cdFx0XHRcdGxldCBhbmltYXRpb25NYXAgPSByb290LmFuaW1hdGlvbnNbYW5pbWF0aW9uTmFtZV07XG5cdFx0XHRcdHRoaXMucmVhZEFuaW1hdGlvbihhbmltYXRpb25NYXAsIGFuaW1hdGlvbk5hbWUsIHNrZWxldG9uRGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNrZWxldG9uRGF0YTtcblx0fVxuXG5cdHJlYWRBdHRhY2htZW50IChtYXA6IGFueSwgc2tpbjogU2tpbiwgc2xvdEluZGV4OiBudW1iZXIsIG5hbWU6IHN0cmluZywgc2tlbGV0b25EYXRhOiBTa2VsZXRvbkRhdGEpOiBBdHRhY2htZW50IHwgbnVsbCB7XG5cdFx0bGV0IHNjYWxlID0gdGhpcy5zY2FsZTtcblx0XHRuYW1lID0gZ2V0VmFsdWUobWFwLCBcIm5hbWVcIiwgbmFtZSk7XG5cblx0XHRzd2l0Y2ggKGdldFZhbHVlKG1hcCwgXCJ0eXBlXCIsIFwicmVnaW9uXCIpKSB7XG5cdFx0XHRjYXNlIFwicmVnaW9uXCI6IHtcblx0XHRcdFx0bGV0IHBhdGggPSBnZXRWYWx1ZShtYXAsIFwicGF0aFwiLCBuYW1lKTtcblx0XHRcdFx0bGV0IHNlcXVlbmNlID0gdGhpcy5yZWFkU2VxdWVuY2UoZ2V0VmFsdWUobWFwLCBcInNlcXVlbmNlXCIsIG51bGwpKTtcblx0XHRcdFx0bGV0IHJlZ2lvbiA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdSZWdpb25BdHRhY2htZW50KHNraW4sIG5hbWUsIHBhdGgsIHNlcXVlbmNlKTtcblx0XHRcdFx0aWYgKCFyZWdpb24pIHJldHVybiBudWxsO1xuXHRcdFx0XHRyZWdpb24ucGF0aCA9IHBhdGg7XG5cdFx0XHRcdHJlZ2lvbi54ID0gZ2V0VmFsdWUobWFwLCBcInhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0cmVnaW9uLnkgPSBnZXRWYWx1ZShtYXAsIFwieVwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRyZWdpb24uc2NhbGVYID0gZ2V0VmFsdWUobWFwLCBcInNjYWxlWFwiLCAxKTtcblx0XHRcdFx0cmVnaW9uLnNjYWxlWSA9IGdldFZhbHVlKG1hcCwgXCJzY2FsZVlcIiwgMSk7XG5cdFx0XHRcdHJlZ2lvbi5yb3RhdGlvbiA9IGdldFZhbHVlKG1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0cmVnaW9uLndpZHRoID0gbWFwLndpZHRoICogc2NhbGU7XG5cdFx0XHRcdHJlZ2lvbi5oZWlnaHQgPSBtYXAuaGVpZ2h0ICogc2NhbGU7XG5cdFx0XHRcdHJlZ2lvbi5zZXF1ZW5jZSA9IHNlcXVlbmNlO1xuXG5cdFx0XHRcdGxldCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIHJlZ2lvbi5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblxuXHRcdFx0XHRpZiAocmVnaW9uLnJlZ2lvbiAhPSBudWxsKSByZWdpb24udXBkYXRlUmVnaW9uKCk7XG5cdFx0XHRcdHJldHVybiByZWdpb247XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiYm91bmRpbmdib3hcIjoge1xuXHRcdFx0XHRsZXQgYm94ID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld0JvdW5kaW5nQm94QXR0YWNobWVudChza2luLCBuYW1lKTtcblx0XHRcdFx0aWYgKCFib3gpIHJldHVybiBudWxsO1xuXHRcdFx0XHR0aGlzLnJlYWRWZXJ0aWNlcyhtYXAsIGJveCwgbWFwLnZlcnRleENvdW50IDw8IDEpO1xuXHRcdFx0XHRsZXQgY29sb3I6IHN0cmluZyA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBib3guY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cdFx0XHRcdHJldHVybiBib3g7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwibWVzaFwiOlxuXHRcdFx0Y2FzZSBcImxpbmtlZG1lc2hcIjoge1xuXHRcdFx0XHRsZXQgcGF0aCA9IGdldFZhbHVlKG1hcCwgXCJwYXRoXCIsIG5hbWUpO1xuXHRcdFx0XHRsZXQgc2VxdWVuY2UgPSB0aGlzLnJlYWRTZXF1ZW5jZShnZXRWYWx1ZShtYXAsIFwic2VxdWVuY2VcIiwgbnVsbCkpO1xuXHRcdFx0XHRsZXQgbWVzaCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdNZXNoQXR0YWNobWVudChza2luLCBuYW1lLCBwYXRoLCBzZXF1ZW5jZSk7XG5cdFx0XHRcdGlmICghbWVzaCkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdG1lc2gucGF0aCA9IHBhdGg7XG5cblx0XHRcdFx0bGV0IGNvbG9yID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIG1lc2guY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cblx0XHRcdFx0bWVzaC53aWR0aCA9IGdldFZhbHVlKG1hcCwgXCJ3aWR0aFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRtZXNoLmhlaWdodCA9IGdldFZhbHVlKG1hcCwgXCJoZWlnaHRcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0bWVzaC5zZXF1ZW5jZSA9IHNlcXVlbmNlO1xuXG5cdFx0XHRcdGxldCBwYXJlbnQ6IHN0cmluZyA9IGdldFZhbHVlKG1hcCwgXCJwYXJlbnRcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0XHR0aGlzLmxpbmtlZE1lc2hlcy5wdXNoKG5ldyBMaW5rZWRNZXNoKG1lc2gsIDxzdHJpbmc+Z2V0VmFsdWUobWFwLCBcInNraW5cIiwgbnVsbCksIHNsb3RJbmRleCwgcGFyZW50LCBnZXRWYWx1ZShtYXAsIFwidGltZWxpbmVzXCIsIHRydWUpKSk7XG5cdFx0XHRcdFx0cmV0dXJuIG1lc2g7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgdXZzOiBBcnJheTxudW1iZXI+ID0gbWFwLnV2cztcblx0XHRcdFx0dGhpcy5yZWFkVmVydGljZXMobWFwLCBtZXNoLCB1dnMubGVuZ3RoKTtcblx0XHRcdFx0bWVzaC50cmlhbmdsZXMgPSBtYXAudHJpYW5nbGVzO1xuXHRcdFx0XHRtZXNoLnJlZ2lvblVWcyA9IHV2cztcblx0XHRcdFx0aWYgKG1lc2gucmVnaW9uICE9IG51bGwpIG1lc2gudXBkYXRlUmVnaW9uKCk7XG5cblx0XHRcdFx0bWVzaC5lZGdlcyA9IGdldFZhbHVlKG1hcCwgXCJlZGdlc1wiLCBudWxsKTtcblx0XHRcdFx0bWVzaC5odWxsTGVuZ3RoID0gZ2V0VmFsdWUobWFwLCBcImh1bGxcIiwgMCkgKiAyO1xuXHRcdFx0XHRyZXR1cm4gbWVzaDtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwYXRoXCI6IHtcblx0XHRcdFx0bGV0IHBhdGggPSB0aGlzLmF0dGFjaG1lbnRMb2FkZXIubmV3UGF0aEF0dGFjaG1lbnQoc2tpbiwgbmFtZSk7XG5cdFx0XHRcdGlmICghcGF0aCkgcmV0dXJuIG51bGw7XG5cdFx0XHRcdHBhdGguY2xvc2VkID0gZ2V0VmFsdWUobWFwLCBcImNsb3NlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdHBhdGguY29uc3RhbnRTcGVlZCA9IGdldFZhbHVlKG1hcCwgXCJjb25zdGFudFNwZWVkXCIsIHRydWUpO1xuXG5cdFx0XHRcdGxldCB2ZXJ0ZXhDb3VudCA9IG1hcC52ZXJ0ZXhDb3VudDtcblx0XHRcdFx0dGhpcy5yZWFkVmVydGljZXMobWFwLCBwYXRoLCB2ZXJ0ZXhDb3VudCA8PCAxKTtcblxuXHRcdFx0XHRsZXQgbGVuZ3RoczogQXJyYXk8bnVtYmVyPiA9IFV0aWxzLm5ld0FycmF5KHZlcnRleENvdW50IC8gMywgMCk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLmxlbmd0aHMubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0bGVuZ3Roc1tpXSA9IG1hcC5sZW5ndGhzW2ldICogc2NhbGU7XG5cdFx0XHRcdHBhdGgubGVuZ3RocyA9IGxlbmd0aHM7XG5cblx0XHRcdFx0bGV0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgcGF0aC5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblx0XHRcdFx0cmV0dXJuIHBhdGg7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwicG9pbnRcIjoge1xuXHRcdFx0XHRsZXQgcG9pbnQgPSB0aGlzLmF0dGFjaG1lbnRMb2FkZXIubmV3UG9pbnRBdHRhY2htZW50KHNraW4sIG5hbWUpO1xuXHRcdFx0XHRpZiAoIXBvaW50KSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cG9pbnQueCA9IGdldFZhbHVlKG1hcCwgXCJ4XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHBvaW50LnkgPSBnZXRWYWx1ZShtYXAsIFwieVwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRwb2ludC5yb3RhdGlvbiA9IGdldFZhbHVlKG1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblxuXHRcdFx0XHRsZXQgY29sb3IgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgcG9pbnQuY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cdFx0XHRcdHJldHVybiBwb2ludDtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJjbGlwcGluZ1wiOiB7XG5cdFx0XHRcdGxldCBjbGlwID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld0NsaXBwaW5nQXR0YWNobWVudChza2luLCBuYW1lKTtcblx0XHRcdFx0aWYgKCFjbGlwKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0XHRsZXQgZW5kID0gZ2V0VmFsdWUobWFwLCBcImVuZFwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGVuZCkgY2xpcC5lbmRTbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KGVuZCk7XG5cblx0XHRcdFx0bGV0IHZlcnRleENvdW50ID0gbWFwLnZlcnRleENvdW50O1xuXHRcdFx0XHR0aGlzLnJlYWRWZXJ0aWNlcyhtYXAsIGNsaXAsIHZlcnRleENvdW50IDw8IDEpO1xuXG5cdFx0XHRcdGxldCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIGNsaXAuY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cdFx0XHRcdHJldHVybiBjbGlwO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHJlYWRTZXF1ZW5jZSAobWFwOiBhbnkpIHtcblx0XHRpZiAobWFwID09IG51bGwpIHJldHVybiBudWxsO1xuXHRcdGxldCBzZXF1ZW5jZSA9IG5ldyBTZXF1ZW5jZShnZXRWYWx1ZShtYXAsIFwiY291bnRcIiwgMCkpO1xuXHRcdHNlcXVlbmNlLnN0YXJ0ID0gZ2V0VmFsdWUobWFwLCBcInN0YXJ0XCIsIDEpO1xuXHRcdHNlcXVlbmNlLmRpZ2l0cyA9IGdldFZhbHVlKG1hcCwgXCJkaWdpdHNcIiwgMCk7XG5cdFx0c2VxdWVuY2Uuc2V0dXBJbmRleCA9IGdldFZhbHVlKG1hcCwgXCJzZXR1cFwiLCAwKTtcblx0XHRyZXR1cm4gc2VxdWVuY2U7XG5cdH1cblxuXHRyZWFkVmVydGljZXMgKG1hcDogYW55LCBhdHRhY2htZW50OiBWZXJ0ZXhBdHRhY2htZW50LCB2ZXJ0aWNlc0xlbmd0aDogbnVtYmVyKSB7XG5cdFx0bGV0IHNjYWxlID0gdGhpcy5zY2FsZTtcblx0XHRhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGggPSB2ZXJ0aWNlc0xlbmd0aDtcblx0XHRsZXQgdmVydGljZXM6IEFycmF5PG51bWJlcj4gPSBtYXAudmVydGljZXM7XG5cdFx0aWYgKHZlcnRpY2VzTGVuZ3RoID09IHZlcnRpY2VzLmxlbmd0aCkge1xuXHRcdFx0bGV0IHNjYWxlZFZlcnRpY2VzID0gVXRpbHMudG9GbG9hdEFycmF5KHZlcnRpY2VzKTtcblx0XHRcdGlmIChzY2FsZSAhPSAxKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwLCBuID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHRcdHNjYWxlZFZlcnRpY2VzW2ldICo9IHNjYWxlO1xuXHRcdFx0fVxuXHRcdFx0YXR0YWNobWVudC52ZXJ0aWNlcyA9IHNjYWxlZFZlcnRpY2VzO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRsZXQgd2VpZ2h0cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdFx0bGV0IGJvbmVzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IG47KSB7XG5cdFx0XHRsZXQgYm9uZUNvdW50ID0gdmVydGljZXNbaSsrXTtcblx0XHRcdGJvbmVzLnB1c2goYm9uZUNvdW50KTtcblx0XHRcdGZvciAobGV0IG5uID0gaSArIGJvbmVDb3VudCAqIDQ7IGkgPCBubjsgaSArPSA0KSB7XG5cdFx0XHRcdGJvbmVzLnB1c2godmVydGljZXNbaV0pO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDFdICogc2NhbGUpO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDJdICogc2NhbGUpO1xuXHRcdFx0XHR3ZWlnaHRzLnB1c2godmVydGljZXNbaSArIDNdKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0YXR0YWNobWVudC5ib25lcyA9IGJvbmVzO1xuXHRcdGF0dGFjaG1lbnQudmVydGljZXMgPSBVdGlscy50b0Zsb2F0QXJyYXkod2VpZ2h0cyk7XG5cdH1cblxuXHRyZWFkQW5pbWF0aW9uIChtYXA6IGFueSwgbmFtZTogc3RyaW5nLCBza2VsZXRvbkRhdGE6IFNrZWxldG9uRGF0YSkge1xuXHRcdGxldCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0bGV0IHRpbWVsaW5lcyA9IG5ldyBBcnJheTxUaW1lbGluZT4oKTtcblxuXHRcdC8vIFNsb3QgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuc2xvdHMpIHtcblx0XHRcdGZvciAobGV0IHNsb3ROYW1lIGluIG1hcC5zbG90cykge1xuXHRcdFx0XHRsZXQgc2xvdE1hcCA9IG1hcC5zbG90c1tzbG90TmFtZV07XG5cdFx0XHRcdGxldCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRcdFx0aWYgKCFzbG90KSB0aHJvdyBuZXcgRXJyb3IoXCJTbG90IG5vdCBmb3VuZDogXCIgKyBzbG90TmFtZSk7XG5cdFx0XHRcdGxldCBzbG90SW5kZXggPSBzbG90LmluZGV4O1xuXHRcdFx0XHRmb3IgKGxldCB0aW1lbGluZU5hbWUgaW4gc2xvdE1hcCkge1xuXHRcdFx0XHRcdGxldCB0aW1lbGluZU1hcCA9IHNsb3RNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRpZiAoIXRpbWVsaW5lTWFwKSBjb250aW51ZTtcblx0XHRcdFx0XHRsZXQgZnJhbWVzID0gdGltZWxpbmVNYXAubGVuZ3RoO1xuXHRcdFx0XHRcdGlmICh0aW1lbGluZU5hbWUgPT0gXCJhdHRhY2htZW50XCIpIHtcblx0XHRcdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBBdHRhY2htZW50VGltZWxpbmUoZnJhbWVzLCBzbG90SW5kZXgpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbZnJhbWVdO1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCksIGdldFZhbHVlKGtleU1hcCwgXCJuYW1lXCIsIG51bGwpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwicmdiYVwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgUkdCQVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzIDw8IDIsIHNsb3RJbmRleCk7XG5cdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuY29sb3IpO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3IuYSk7XG5cdFx0XHRcdFx0XHRcdGxldCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAuY29sb3IpO1xuXHRcdFx0XHRcdFx0XHRsZXQgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgY29sb3IuZywgbmV3Q29sb3IuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBjb2xvci5hLCBuZXdDb2xvci5hLCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdGNvbG9yID0gbmV3Q29sb3I7XG5cdFx0XHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwicmdiXCIpIHtcblx0XHRcdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBSR0JUaW1lbGluZShmcmFtZXMsIGZyYW1lcyAqIDMsIHNsb3RJbmRleCk7XG5cdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuY29sb3IpO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYik7XG5cdFx0XHRcdFx0XHRcdGxldCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAuY29sb3IpO1xuXHRcdFx0XHRcdFx0XHRsZXQgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgY29sb3IuZywgbmV3Q29sb3IuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT0gXCJhbHBoYVwiKSB7XG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaChyZWFkVGltZWxpbmUxKHRpbWVsaW5lTWFwLCBuZXcgQWxwaGFUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgc2xvdEluZGV4KSwgMCwgMSkpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwicmdiYTJcIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IFJHQkEyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgKiA3LCBzbG90SW5kZXgpO1xuXG5cdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yMiA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmRhcmspO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3IuYSwgY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYik7XG5cdFx0XHRcdFx0XHRcdGxldCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmRhcmspO1xuXHRcdFx0XHRcdFx0XHRsZXQgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgY29sb3IuZywgbmV3Q29sb3IuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBjb2xvci5hLCBuZXdDb2xvci5hLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA0LCB0aW1lLCB0aW1lMiwgY29sb3IyLnIsIG5ld0NvbG9yMi5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA1LCB0aW1lLCB0aW1lMiwgY29sb3IyLmcsIG5ld0NvbG9yMi5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA2LCB0aW1lLCB0aW1lMiwgY29sb3IyLmIsIG5ld0NvbG9yMi5iLCAxKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdGNvbG9yID0gbmV3Q29sb3I7XG5cdFx0XHRcdFx0XHRcdGNvbG9yMiA9IG5ld0NvbG9yMjtcblx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT0gXCJyZ2IyXCIpIHtcblx0XHRcdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBSR0IyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgKiA2LCBzbG90SW5kZXgpO1xuXG5cdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0bGV0IGNvbG9yMiA9IENvbG9yLmZyb21TdHJpbmcoa2V5TWFwLmRhcmspO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYik7XG5cdFx0XHRcdFx0XHRcdGxldCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0XHRsZXQgbmV3Q29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmRhcmspO1xuXHRcdFx0XHRcdFx0XHRsZXQgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBjb2xvci5yLCBuZXdDb2xvci5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgY29sb3IuZywgbmV3Q29sb3IuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBjb2xvcjIuciwgbmV3Q29sb3IyLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDQsIHRpbWUsIHRpbWUyLCBjb2xvcjIuZywgbmV3Q29sb3IyLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDUsIHRpbWUsIHRpbWUyLCBjb2xvcjIuYiwgbmV3Q29sb3IyLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0Y29sb3IyID0gbmV3Q29sb3IyO1xuXHRcdFx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQm9uZSB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5ib25lcykge1xuXHRcdFx0Zm9yIChsZXQgYm9uZU5hbWUgaW4gbWFwLmJvbmVzKSB7XG5cdFx0XHRcdGxldCBib25lTWFwID0gbWFwLmJvbmVzW2JvbmVOYW1lXTtcblx0XHRcdFx0bGV0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihcIkJvbmUgbm90IGZvdW5kOiBcIiArIGJvbmVOYW1lKTtcblx0XHRcdFx0bGV0IGJvbmVJbmRleCA9IGJvbmUuaW5kZXg7XG5cdFx0XHRcdGZvciAobGV0IHRpbWVsaW5lTmFtZSBpbiBib25lTWFwKSB7XG5cdFx0XHRcdFx0bGV0IHRpbWVsaW5lTWFwID0gYm9uZU1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGxldCBmcmFtZXMgPSB0aW1lbGluZU1hcC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGZyYW1lcyA9PSAwKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGlmICh0aW1lbGluZU5hbWUgPT09IFwicm90YXRlXCIpIHtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTEodGltZWxpbmVNYXAsIG5ldyBSb3RhdGVUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgMSkpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09PSBcInRyYW5zbGF0ZVwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgVHJhbnNsYXRlVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgPDwgMSwgYm9uZUluZGV4KTtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTIodGltZWxpbmVNYXAsIHRpbWVsaW5lLCBcInhcIiwgXCJ5XCIsIDAsIHNjYWxlKSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT09IFwidHJhbnNsYXRleFwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgVHJhbnNsYXRlWFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVhZFRpbWVsaW5lMSh0aW1lbGluZU1hcCwgdGltZWxpbmUsIDAsIHNjYWxlKSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT09IFwidHJhbnNsYXRleVwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgVHJhbnNsYXRlWVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVhZFRpbWVsaW5lMSh0aW1lbGluZU1hcCwgdGltZWxpbmUsIDAsIHNjYWxlKSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT09IFwic2NhbGVcIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IFNjYWxlVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgPDwgMSwgYm9uZUluZGV4KTtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTIodGltZWxpbmVNYXAsIHRpbWVsaW5lLCBcInhcIiwgXCJ5XCIsIDEsIDEpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTmFtZSA9PT0gXCJzY2FsZXhcIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IFNjYWxlWFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVhZFRpbWVsaW5lMSh0aW1lbGluZU1hcCwgdGltZWxpbmUsIDEsIDEpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTmFtZSA9PT0gXCJzY2FsZXlcIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IFNjYWxlWVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVhZFRpbWVsaW5lMSh0aW1lbGluZU1hcCwgdGltZWxpbmUsIDEsIDEpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTmFtZSA9PT0gXCJzaGVhclwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgU2hlYXJUaW1lbGluZShmcmFtZXMsIGZyYW1lcyA8PCAxLCBib25lSW5kZXgpO1xuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2gocmVhZFRpbWVsaW5lMih0aW1lbGluZU1hcCwgdGltZWxpbmUsIFwieFwiLCBcInlcIiwgMCwgMSkpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09PSBcInNoZWFyeFwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgU2hlYXJYVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCk7XG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaChyZWFkVGltZWxpbmUxKHRpbWVsaW5lTWFwLCB0aW1lbGluZSwgMCwgMSkpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09PSBcInNoZWFyeVwiKSB7XG5cdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgU2hlYXJZVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGJvbmVJbmRleCk7XG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaChyZWFkVGltZWxpbmUxKHRpbWVsaW5lTWFwLCB0aW1lbGluZSwgMCwgMSkpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGltZWxpbmVOYW1lID09PSBcImluaGVyaXRcIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IEluaGVyaXRUaW1lbGluZShmcmFtZXMsIGJvbmUuaW5kZXgpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwOyBmcmFtZSA8IHRpbWVsaW5lTWFwLmxlbmd0aDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRsZXQgYUZyYW1lID0gdGltZWxpbmVNYXBbZnJhbWVdO1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZ2V0VmFsdWUoYUZyYW1lLCBcInRpbWVcIiwgMCksIFV0aWxzLmVudW1WYWx1ZShJbmhlcml0LCBnZXRWYWx1ZShhRnJhbWUsIFwiaW5oZXJpdFwiLCBcIk5vcm1hbFwiKSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElLIGNvbnN0cmFpbnQgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuaWspIHtcblx0XHRcdGZvciAobGV0IGNvbnN0cmFpbnROYW1lIGluIG1hcC5paykge1xuXHRcdFx0XHRsZXQgY29uc3RyYWludE1hcCA9IG1hcC5pa1tjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGxldCBrZXlNYXAgPSBjb25zdHJhaW50TWFwWzBdO1xuXHRcdFx0XHRpZiAoIWtleU1hcCkgY29udGludWU7XG5cblx0XHRcdFx0bGV0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZElrQ29uc3RyYWludChjb25zdHJhaW50TmFtZSk7XG5cdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKFwiSUsgQ29uc3RyYWludCBub3QgZm91bmQ6IFwiICsgY29uc3RyYWludE5hbWUpO1xuXHRcdFx0XHRsZXQgY29uc3RyYWludEluZGV4ID0gc2tlbGV0b25EYXRhLmlrQ29uc3RyYWludHMuaW5kZXhPZihjb25zdHJhaW50KTtcblx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IElrQ29uc3RyYWludFRpbWVsaW5lKGNvbnN0cmFpbnRNYXAubGVuZ3RoLCBjb25zdHJhaW50TWFwLmxlbmd0aCA8PCAxLCBjb25zdHJhaW50SW5kZXgpO1xuXG5cdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdGxldCBtaXggPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4XCIsIDEpO1xuXHRcdFx0XHRsZXQgc29mdG5lc3MgPSBnZXRWYWx1ZShrZXlNYXAsIFwic29mdG5lc3NcIiwgMCkgKiBzY2FsZTtcblxuXHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBtaXgsIHNvZnRuZXNzLCBnZXRWYWx1ZShrZXlNYXAsIFwiYmVuZFBvc2l0aXZlXCIsIHRydWUpID8gMSA6IC0xLCBnZXRWYWx1ZShrZXlNYXAsIFwiY29tcHJlc3NcIiwgZmFsc2UpLCBnZXRWYWx1ZShrZXlNYXAsIFwic3RyZXRjaFwiLCBmYWxzZSkpO1xuXHRcdFx0XHRcdGxldCBuZXh0TWFwID0gY29uc3RyYWludE1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsZXQgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0bGV0IG1peDIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFwiLCAxKTtcblx0XHRcdFx0XHRsZXQgc29mdG5lc3MyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJzb2Z0bmVzc1wiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRcdGxldCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBtaXgsIG1peDIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIHNvZnRuZXNzLCBzb2Z0bmVzczIsIHNjYWxlKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0bWl4ID0gbWl4Mjtcblx0XHRcdFx0XHRzb2Z0bmVzcyA9IHNvZnRuZXNzMjtcblx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBUcmFuc2Zvcm0gY29uc3RyYWludCB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC50cmFuc2Zvcm0pIHtcblx0XHRcdGZvciAobGV0IGNvbnN0cmFpbnROYW1lIGluIG1hcC50cmFuc2Zvcm0pIHtcblx0XHRcdFx0bGV0IHRpbWVsaW5lTWFwID0gbWFwLnRyYW5zZm9ybVtjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGxldCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRUcmFuc2Zvcm1Db25zdHJhaW50KGNvbnN0cmFpbnROYW1lKTtcblx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2Zvcm0gY29uc3RyYWludCBub3QgZm91bmQ6IFwiICsgY29uc3RyYWludE5hbWUpO1xuXHRcdFx0XHRsZXQgY29uc3RyYWludEluZGV4ID0gc2tlbGV0b25EYXRhLnRyYW5zZm9ybUNvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCk7XG5cdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBUcmFuc2Zvcm1Db25zdHJhaW50VGltZWxpbmUodGltZWxpbmVNYXAubGVuZ3RoLCB0aW1lbGluZU1hcC5sZW5ndGggKiA2LCBjb25zdHJhaW50SW5kZXgpO1xuXG5cdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdGxldCBtaXhSb3RhdGUgPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRsZXQgbWl4WCA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhYXCIsIDEpO1xuXHRcdFx0XHRsZXQgbWl4WSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhZXCIsIG1peFgpO1xuXHRcdFx0XHRsZXQgbWl4U2NhbGVYID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFNjYWxlWFwiLCAxKTtcblx0XHRcdFx0bGV0IG1peFNjYWxlWSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhTY2FsZVlcIiwgbWl4U2NhbGVYKTtcblx0XHRcdFx0bGV0IG1peFNoZWFyWSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhTaGVhcllcIiwgMSk7XG5cblx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbWl4Um90YXRlLCBtaXhYLCBtaXhZLCBtaXhTY2FsZVgsIG1peFNjYWxlWSwgbWl4U2hlYXJZKTtcblx0XHRcdFx0XHRsZXQgbmV4dE1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRsZXQgbWl4Um90YXRlMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRcdGxldCBtaXhYMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4WFwiLCAxKTtcblx0XHRcdFx0XHRsZXQgbWl4WTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFlcIiwgbWl4WDIpO1xuXHRcdFx0XHRcdGxldCBtaXhTY2FsZVgyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhTY2FsZVhcIiwgMSk7XG5cdFx0XHRcdFx0bGV0IG1peFNjYWxlWTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFNjYWxlWVwiLCBtaXhTY2FsZVgyKTtcblx0XHRcdFx0XHRsZXQgbWl4U2hlYXJZMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4U2hlYXJZXCIsIDEpO1xuXHRcdFx0XHRcdGxldCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRpZiAoY3VydmUpIHtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCBtaXhSb3RhdGUsIG1peFJvdGF0ZTIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIG1peFgsIG1peFgyLCAxKTtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDIsIHRpbWUsIHRpbWUyLCBtaXhZLCBtaXhZMiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAzLCB0aW1lLCB0aW1lMiwgbWl4U2NhbGVYLCBtaXhTY2FsZVgyLCAxKTtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDQsIHRpbWUsIHRpbWUyLCBtaXhTY2FsZVksIG1peFNjYWxlWTIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgNSwgdGltZSwgdGltZTIsIG1peFNoZWFyWSwgbWl4U2hlYXJZMiwgMSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdG1peFJvdGF0ZSA9IG1peFJvdGF0ZTI7XG5cdFx0XHRcdFx0bWl4WCA9IG1peFgyO1xuXHRcdFx0XHRcdG1peFkgPSBtaXhZMjtcblx0XHRcdFx0XHRtaXhTY2FsZVggPSBtaXhTY2FsZVgyO1xuXHRcdFx0XHRcdG1peFNjYWxlWSA9IG1peFNjYWxlWTI7XG5cdFx0XHRcdFx0bWl4U2NhbGVYID0gbWl4U2NhbGVYMjtcblx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQYXRoIGNvbnN0cmFpbnQgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAucGF0aCkge1xuXHRcdFx0Zm9yIChsZXQgY29uc3RyYWludE5hbWUgaW4gbWFwLnBhdGgpIHtcblx0XHRcdFx0bGV0IGNvbnN0cmFpbnRNYXAgPSBtYXAucGF0aFtjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGxldCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRQYXRoQ29uc3RyYWludChjb25zdHJhaW50TmFtZSk7XG5cdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKFwiUGF0aCBjb25zdHJhaW50IG5vdCBmb3VuZDogXCIgKyBjb25zdHJhaW50TmFtZSk7XG5cdFx0XHRcdGxldCBjb25zdHJhaW50SW5kZXggPSBza2VsZXRvbkRhdGEucGF0aENvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCk7XG5cdFx0XHRcdGZvciAobGV0IHRpbWVsaW5lTmFtZSBpbiBjb25zdHJhaW50TWFwKSB7XG5cdFx0XHRcdFx0bGV0IHRpbWVsaW5lTWFwID0gY29uc3RyYWludE1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRpZiAoIWtleU1hcCkgY29udGludWU7XG5cblx0XHRcdFx0XHRsZXQgZnJhbWVzID0gdGltZWxpbmVNYXAubGVuZ3RoO1xuXHRcdFx0XHRcdGlmICh0aW1lbGluZU5hbWUgPT09IFwicG9zaXRpb25cIikge1xuXHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lID0gbmV3IFBhdGhDb25zdHJhaW50UG9zaXRpb25UaW1lbGluZShmcmFtZXMsIGZyYW1lcywgY29uc3RyYWludEluZGV4KTtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTEodGltZWxpbmVNYXAsIHRpbWVsaW5lLCAwLCBjb25zdHJhaW50LnBvc2l0aW9uTW9kZSA9PSBQb3NpdGlvbk1vZGUuRml4ZWQgPyBzY2FsZSA6IDEpKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTmFtZSA9PT0gXCJzcGFjaW5nXCIpIHtcblx0XHRcdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBQYXRoQ29uc3RyYWludFNwYWNpbmdUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgY29uc3RyYWludEluZGV4KTtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTEodGltZWxpbmVNYXAsIHRpbWVsaW5lLCAwLCBjb25zdHJhaW50LnNwYWNpbmdNb2RlID09IFNwYWNpbmdNb2RlLkxlbmd0aCB8fCBjb25zdHJhaW50LnNwYWNpbmdNb2RlID09IFNwYWNpbmdNb2RlLkZpeGVkID8gc2NhbGUgOiAxKSk7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU5hbWUgPT09IFwibWl4XCIpIHtcblx0XHRcdFx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBQYXRoQ29uc3RyYWludE1peFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzICogMywgY29uc3RyYWludEluZGV4KTtcblx0XHRcdFx0XHRcdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRsZXQgbWl4Um90YXRlID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFJvdGF0ZVwiLCAxKTtcblx0XHRcdFx0XHRcdGxldCBtaXhYID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFhcIiwgMSk7XG5cdFx0XHRcdFx0XHRsZXQgbWl4WSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhZXCIsIG1peFgpO1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIG1peFJvdGF0ZSwgbWl4WCwgbWl4WSk7XG5cdFx0XHRcdFx0XHRcdGxldCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgbWl4Um90YXRlMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRcdFx0XHRsZXQgbWl4WDIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFhcIiwgMSk7XG5cdFx0XHRcdFx0XHRcdGxldCBtaXhZMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4WVwiLCBtaXhYMik7XG5cdFx0XHRcdFx0XHRcdGxldCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0aWYgKGN1cnZlKSB7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIG1peFJvdGF0ZSwgbWl4Um90YXRlMiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIG1peFgsIG1peFgyLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAyLCB0aW1lLCB0aW1lMiwgbWl4WSwgbWl4WTIsIDEpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRcdFx0bWl4Um90YXRlID0gbWl4Um90YXRlMjtcblx0XHRcdFx0XHRcdFx0bWl4WCA9IG1peFgyO1xuXHRcdFx0XHRcdFx0XHRtaXhZID0gbWl4WTI7XG5cdFx0XHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUGh5c2ljcyBjb25zdHJhaW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLnBoeXNpY3MpIHtcblx0XHRcdGZvciAobGV0IGNvbnN0cmFpbnROYW1lIGluIG1hcC5waHlzaWNzKSB7XG5cdFx0XHRcdGxldCBjb25zdHJhaW50TWFwID0gbWFwLnBoeXNpY3NbY29uc3RyYWludE5hbWVdO1xuXHRcdFx0XHRsZXQgY29uc3RyYWludEluZGV4ID0gLTE7XG5cdFx0XHRcdGlmIChjb25zdHJhaW50TmFtZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bGV0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZFBoeXNpY3NDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lKTtcblx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihcIlBoeXNpY3MgY29uc3RyYWludCBub3QgZm91bmQ6IFwiICsgY29uc3RyYWludE5hbWUpO1xuXHRcdFx0XHRcdGNvbnN0cmFpbnRJbmRleCA9IHNrZWxldG9uRGF0YS5waHlzaWNzQ29uc3RyYWludHMuaW5kZXhPZihjb25zdHJhaW50KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRmb3IgKGxldCB0aW1lbGluZU5hbWUgaW4gY29uc3RyYWludE1hcCkge1xuXHRcdFx0XHRcdGxldCB0aW1lbGluZU1hcCA9IGNvbnN0cmFpbnRNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0bGV0IGZyYW1lcyA9IHRpbWVsaW5lTWFwLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAodGltZWxpbmVOYW1lID09IFwicmVzZXRcIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRSZXNldFRpbWVsaW5lKGZyYW1lcywgY29uc3RyYWludEluZGV4KTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMDsga2V5TWFwICE9IG51bGw7IGtleU1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV0sIGZyYW1lKyspXG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKSk7XG5cdFx0XHRcdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRsZXQgdGltZWxpbmU7XG5cdFx0XHRcdFx0aWYgKHRpbWVsaW5lTmFtZSA9PSBcImluZXJ0aWFcIilcblx0XHRcdFx0XHRcdHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50SW5lcnRpYVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBjb25zdHJhaW50SW5kZXgpO1xuXHRcdFx0XHRcdGVsc2UgaWYgKHRpbWVsaW5lTmFtZSA9PSBcInN0cmVuZ3RoXCIpXG5cdFx0XHRcdFx0XHR0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGNvbnN0cmFpbnRJbmRleCk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwiZGFtcGluZ1wiKVxuXHRcdFx0XHRcdFx0dGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnREYW1waW5nVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGNvbnN0cmFpbnRJbmRleCk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwibWFzc1wiKVxuXHRcdFx0XHRcdFx0dGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRNYXNzVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGNvbnN0cmFpbnRJbmRleCk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwid2luZFwiKVxuXHRcdFx0XHRcdFx0dGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRXaW5kVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGNvbnN0cmFpbnRJbmRleCk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwiZ3Jhdml0eVwiKVxuXHRcdFx0XHRcdFx0dGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRHcmF2aXR5VGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGNvbnN0cmFpbnRJbmRleCk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAodGltZWxpbmVOYW1lID09IFwibWl4XCIpIC8vXG5cdFx0XHRcdFx0XHR0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludE1peFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBjb25zdHJhaW50SW5kZXgpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlYWRUaW1lbGluZTEodGltZWxpbmVNYXAsIHRpbWVsaW5lLCAwLCAxKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBdHRhY2htZW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLmF0dGFjaG1lbnRzKSB7XG5cdFx0XHRmb3IgKGxldCBhdHRhY2htZW50c05hbWUgaW4gbWFwLmF0dGFjaG1lbnRzKSB7XG5cdFx0XHRcdGxldCBhdHRhY2htZW50c01hcCA9IG1hcC5hdHRhY2htZW50c1thdHRhY2htZW50c05hbWVdO1xuXHRcdFx0XHRsZXQgc2tpbiA9IHNrZWxldG9uRGF0YS5maW5kU2tpbihhdHRhY2htZW50c05hbWUpO1xuXHRcdFx0XHRpZiAoIXNraW4pIHRocm93IG5ldyBFcnJvcihcIlNraW4gbm90IGZvdW5kOiBcIiArIGF0dGFjaG1lbnRzTmFtZSk7XG5cdFx0XHRcdGZvciAobGV0IHNsb3RNYXBOYW1lIGluIGF0dGFjaG1lbnRzTWFwKSB7XG5cdFx0XHRcdFx0bGV0IHNsb3RNYXAgPSBhdHRhY2htZW50c01hcFtzbG90TWFwTmFtZV07XG5cdFx0XHRcdFx0bGV0IHNsb3QgPSBza2VsZXRvbkRhdGEuZmluZFNsb3Qoc2xvdE1hcE5hbWUpO1xuXHRcdFx0XHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKFwiU2xvdCBub3QgZm91bmQ6IFwiICsgc2xvdE1hcE5hbWUpO1xuXHRcdFx0XHRcdGxldCBzbG90SW5kZXggPSBzbG90LmluZGV4O1xuXHRcdFx0XHRcdGZvciAobGV0IGF0dGFjaG1lbnRNYXBOYW1lIGluIHNsb3RNYXApIHtcblx0XHRcdFx0XHRcdGxldCBhdHRhY2htZW50TWFwID0gc2xvdE1hcFthdHRhY2htZW50TWFwTmFtZV07XG5cdFx0XHRcdFx0XHRsZXQgYXR0YWNobWVudCA9IDxWZXJ0ZXhBdHRhY2htZW50PnNraW4uZ2V0QXR0YWNobWVudChzbG90SW5kZXgsIGF0dGFjaG1lbnRNYXBOYW1lKTtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgdGltZWxpbmVNYXBOYW1lIGluIGF0dGFjaG1lbnRNYXApIHtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWVsaW5lTWFwID0gYXR0YWNobWVudE1hcFt0aW1lbGluZU1hcE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0XHRcdGlmICgha2V5TWFwKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGltZWxpbmVNYXBOYW1lID09IFwiZGVmb3JtXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgd2VpZ2h0ZWQgPSBhdHRhY2htZW50LmJvbmVzO1xuXHRcdFx0XHRcdFx0XHRcdGxldCB2ZXJ0aWNlcyA9IGF0dGFjaG1lbnQudmVydGljZXM7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGRlZm9ybUxlbmd0aCA9IHdlaWdodGVkID8gdmVydGljZXMubGVuZ3RoIC8gMyAqIDIgOiB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgRGVmb3JtVGltZWxpbmUodGltZWxpbmVNYXAubGVuZ3RoLCB0aW1lbGluZU1hcC5sZW5ndGgsIHNsb3RJbmRleCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IGRlZm9ybTogTnVtYmVyQXJyYXlMaWtlO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHZlcnRpY2VzVmFsdWU6IEFycmF5PE51bWJlcj4gPSBnZXRWYWx1ZShrZXlNYXAsIFwidmVydGljZXNcIiwgbnVsbCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXZlcnRpY2VzVmFsdWUpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZm9ybSA9IHdlaWdodGVkID8gVXRpbHMubmV3RmxvYXRBcnJheShkZWZvcm1MZW5ndGgpIDogdmVydGljZXM7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtID0gVXRpbHMubmV3RmxvYXRBcnJheShkZWZvcm1MZW5ndGgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgc3RhcnQgPSA8bnVtYmVyPmdldFZhbHVlKGtleU1hcCwgXCJvZmZzZXRcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFV0aWxzLmFycmF5Q29weSh2ZXJ0aWNlc1ZhbHVlLCAwLCBkZWZvcm0sIHN0YXJ0LCB2ZXJ0aWNlc1ZhbHVlLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSAhPSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IHN0YXJ0LCBuID0gaSArIHZlcnRpY2VzVmFsdWUubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICo9IHNjYWxlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICghd2VpZ2h0ZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRlZm9ybUxlbmd0aDsgaSsrKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmb3JtW2ldICs9IHZlcnRpY2VzW2ldO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBkZWZvcm0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGxldCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBjdXJ2ZSA9IGtleU1hcC5jdXJ2ZTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkgYmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIDAsIDEsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHRpbWVsaW5lTWFwTmFtZSA9PSBcInNlcXVlbmNlXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgU2VxdWVuY2VUaW1lbGluZSh0aW1lbGluZU1hcC5sZW5ndGgsIHNsb3RJbmRleCwgYXR0YWNobWVudCBhcyB1bmtub3duIGFzIEhhc1RleHR1cmVSZWdpb24pO1xuXHRcdFx0XHRcdFx0XHRcdGxldCBsYXN0RGVsYXkgPSAwO1xuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMDsgZnJhbWUgPCB0aW1lbGluZU1hcC5sZW5ndGg7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBkZWxheSA9IGdldFZhbHVlKGtleU1hcCwgXCJkZWxheVwiLCBsYXN0RGVsYXkpO1xuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBtb2RlID0gU2VxdWVuY2VNb2RlW2dldFZhbHVlKGtleU1hcCwgXCJtb2RlXCIsIFwiaG9sZFwiKV0gYXMgdW5rbm93biBhcyBudW1iZXI7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgaW5kZXggPSBnZXRWYWx1ZShrZXlNYXAsIFwiaW5kZXhcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbW9kZSwgaW5kZXgsIGRlbGF5KTtcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3REZWxheSA9IGRlbGF5O1xuXHRcdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRHJhdyBvcmRlciB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5kcmF3T3JkZXIpIHtcblx0XHRcdGxldCB0aW1lbGluZSA9IG5ldyBEcmF3T3JkZXJUaW1lbGluZShtYXAuZHJhd09yZGVyLmxlbmd0aCk7XG5cdFx0XHRsZXQgc2xvdENvdW50ID0gc2tlbGV0b25EYXRhLnNsb3RzLmxlbmd0aDtcblx0XHRcdGxldCBmcmFtZSA9IDA7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1hcC5kcmF3T3JkZXIubGVuZ3RoOyBpKyssIGZyYW1lKyspIHtcblx0XHRcdFx0bGV0IGRyYXdPcmRlck1hcCA9IG1hcC5kcmF3T3JkZXJbaV07XG5cdFx0XHRcdGxldCBkcmF3T3JkZXI6IEFycmF5PG51bWJlcj4gfCBudWxsID0gbnVsbDtcblx0XHRcdFx0bGV0IG9mZnNldHMgPSBnZXRWYWx1ZShkcmF3T3JkZXJNYXAsIFwib2Zmc2V0c1wiLCBudWxsKTtcblx0XHRcdFx0aWYgKG9mZnNldHMpIHtcblx0XHRcdFx0XHRkcmF3T3JkZXIgPSBVdGlscy5uZXdBcnJheTxudW1iZXI+KHNsb3RDb3VudCwgLTEpO1xuXHRcdFx0XHRcdGxldCB1bmNoYW5nZWQgPSBVdGlscy5uZXdBcnJheTxudW1iZXI+KHNsb3RDb3VudCAtIG9mZnNldHMubGVuZ3RoLCAwKTtcblx0XHRcdFx0XHRsZXQgb3JpZ2luYWxJbmRleCA9IDAsIHVuY2hhbmdlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgb2Zmc2V0cy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGxldCBvZmZzZXRNYXAgPSBvZmZzZXRzW2lpXTtcblx0XHRcdFx0XHRcdGxldCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KG9mZnNldE1hcC5zbG90KTtcblx0XHRcdFx0XHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKFwiU2xvdCBub3QgZm91bmQ6IFwiICsgc2xvdCk7XG5cdFx0XHRcdFx0XHRsZXQgc2xvdEluZGV4ID0gc2xvdC5pbmRleDtcblx0XHRcdFx0XHRcdC8vIENvbGxlY3QgdW5jaGFuZ2VkIGl0ZW1zLlxuXHRcdFx0XHRcdFx0d2hpbGUgKG9yaWdpbmFsSW5kZXggIT0gc2xvdEluZGV4KVxuXHRcdFx0XHRcdFx0XHR1bmNoYW5nZWRbdW5jaGFuZ2VkSW5kZXgrK10gPSBvcmlnaW5hbEluZGV4Kys7XG5cdFx0XHRcdFx0XHQvLyBTZXQgY2hhbmdlZCBpdGVtcy5cblx0XHRcdFx0XHRcdGRyYXdPcmRlcltvcmlnaW5hbEluZGV4ICsgb2Zmc2V0TWFwLm9mZnNldF0gPSBvcmlnaW5hbEluZGV4Kys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIENvbGxlY3QgcmVtYWluaW5nIHVuY2hhbmdlZCBpdGVtcy5cblx0XHRcdFx0XHR3aGlsZSAob3JpZ2luYWxJbmRleCA8IHNsb3RDb3VudClcblx0XHRcdFx0XHRcdHVuY2hhbmdlZFt1bmNoYW5nZWRJbmRleCsrXSA9IG9yaWdpbmFsSW5kZXgrKztcblx0XHRcdFx0XHQvLyBGaWxsIGluIHVuY2hhbmdlZCBpdGVtcy5cblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IHNsb3RDb3VudCAtIDE7IGlpID49IDA7IGlpLS0pXG5cdFx0XHRcdFx0XHRpZiAoZHJhd09yZGVyW2lpXSA9PSAtMSkgZHJhd09yZGVyW2lpXSA9IHVuY2hhbmdlZFstLXVuY2hhbmdlZEluZGV4XTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZ2V0VmFsdWUoZHJhd09yZGVyTWFwLCBcInRpbWVcIiwgMCksIGRyYXdPcmRlcik7XG5cdFx0XHR9XG5cdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXZlbnQgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuZXZlbnRzKSB7XG5cdFx0XHRsZXQgdGltZWxpbmUgPSBuZXcgRXZlbnRUaW1lbGluZShtYXAuZXZlbnRzLmxlbmd0aCk7XG5cdFx0XHRsZXQgZnJhbWUgPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBtYXAuZXZlbnRzLmxlbmd0aDsgaSsrLCBmcmFtZSsrKSB7XG5cdFx0XHRcdGxldCBldmVudE1hcCA9IG1hcC5ldmVudHNbaV07XG5cdFx0XHRcdGxldCBldmVudERhdGEgPSBza2VsZXRvbkRhdGEuZmluZEV2ZW50KGV2ZW50TWFwLm5hbWUpO1xuXHRcdFx0XHRpZiAoIWV2ZW50RGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiRXZlbnQgbm90IGZvdW5kOiBcIiArIGV2ZW50TWFwLm5hbWUpO1xuXHRcdFx0XHRsZXQgZXZlbnQgPSBuZXcgRXZlbnQoVXRpbHMudG9TaW5nbGVQcmVjaXNpb24oZ2V0VmFsdWUoZXZlbnRNYXAsIFwidGltZVwiLCAwKSksIGV2ZW50RGF0YSk7XG5cdFx0XHRcdGV2ZW50LmludFZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiaW50XCIsIGV2ZW50RGF0YS5pbnRWYWx1ZSk7XG5cdFx0XHRcdGV2ZW50LmZsb2F0VmFsdWUgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJmbG9hdFwiLCBldmVudERhdGEuZmxvYXRWYWx1ZSk7XG5cdFx0XHRcdGV2ZW50LnN0cmluZ1ZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwic3RyaW5nXCIsIGV2ZW50RGF0YS5zdHJpbmdWYWx1ZSk7XG5cdFx0XHRcdGlmIChldmVudC5kYXRhLmF1ZGlvUGF0aCkge1xuXHRcdFx0XHRcdGV2ZW50LnZvbHVtZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInZvbHVtZVwiLCAxKTtcblx0XHRcdFx0XHRldmVudC5iYWxhbmNlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiYmFsYW5jZVwiLCAwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgZXZlbnQpO1xuXHRcdFx0fVxuXHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdH1cblxuXHRcdGxldCBkdXJhdGlvbiA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aW1lbGluZXMubGVuZ3RoOyBpIDwgbjsgaSsrKVxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heChkdXJhdGlvbiwgdGltZWxpbmVzW2ldLmdldER1cmF0aW9uKCkpO1xuXHRcdHNrZWxldG9uRGF0YS5hbmltYXRpb25zLnB1c2gobmV3IEFuaW1hdGlvbihuYW1lLCB0aW1lbGluZXMsIGR1cmF0aW9uKSk7XG5cdH1cbn1cblxuY2xhc3MgTGlua2VkTWVzaCB7XG5cdHBhcmVudDogc3RyaW5nOyBza2luOiBzdHJpbmc7XG5cdHNsb3RJbmRleDogbnVtYmVyO1xuXHRtZXNoOiBNZXNoQXR0YWNobWVudDtcblx0aW5oZXJpdFRpbWVsaW5lOiBib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yIChtZXNoOiBNZXNoQXR0YWNobWVudCwgc2tpbjogc3RyaW5nLCBzbG90SW5kZXg6IG51bWJlciwgcGFyZW50OiBzdHJpbmcsIGluaGVyaXREZWZvcm06IGJvb2xlYW4pIHtcblx0XHR0aGlzLm1lc2ggPSBtZXNoO1xuXHRcdHRoaXMuc2tpbiA9IHNraW47XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cdFx0dGhpcy5pbmhlcml0VGltZWxpbmUgPSBpbmhlcml0RGVmb3JtO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHJlYWRUaW1lbGluZTEgKGtleXM6IGFueVtdLCB0aW1lbGluZTogQ3VydmVUaW1lbGluZTEsIGRlZmF1bHRWYWx1ZTogbnVtYmVyLCBzY2FsZTogbnVtYmVyKSB7XG5cdGxldCBrZXlNYXAgPSBrZXlzWzBdO1xuXHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRsZXQgdmFsdWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidmFsdWVcIiwgZGVmYXVsdFZhbHVlKSAqIHNjYWxlO1xuXHRsZXQgYmV6aWVyID0gMDtcblx0Zm9yIChsZXQgZnJhbWUgPSAwOyA7IGZyYW1lKyspIHtcblx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgdmFsdWUpO1xuXHRcdGxldCBuZXh0TWFwID0ga2V5c1tmcmFtZSArIDFdO1xuXHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRyZXR1cm4gdGltZWxpbmU7XG5cdFx0fVxuXHRcdGxldCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRsZXQgdmFsdWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ2YWx1ZVwiLCBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdFx0aWYgKGtleU1hcC5jdXJ2ZSkgYmV6aWVyID0gcmVhZEN1cnZlKGtleU1hcC5jdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCB2YWx1ZSwgdmFsdWUyLCBzY2FsZSk7XG5cdFx0dGltZSA9IHRpbWUyO1xuXHRcdHZhbHVlID0gdmFsdWUyO1xuXHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZFRpbWVsaW5lMiAoa2V5czogYW55W10sIHRpbWVsaW5lOiBDdXJ2ZVRpbWVsaW5lMiwgbmFtZTE6IHN0cmluZywgbmFtZTI6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpIHtcblx0bGV0IGtleU1hcCA9IGtleXNbMF07XG5cdGxldCB0aW1lID0gZ2V0VmFsdWUoa2V5TWFwLCBcInRpbWVcIiwgMCk7XG5cdGxldCB2YWx1ZTEgPSBnZXRWYWx1ZShrZXlNYXAsIG5hbWUxLCBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdGxldCB2YWx1ZTIgPSBnZXRWYWx1ZShrZXlNYXAsIG5hbWUyLCBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdGxldCBiZXppZXIgPSAwO1xuXHRmb3IgKGxldCBmcmFtZSA9IDA7IDsgZnJhbWUrKykge1xuXHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCB2YWx1ZTEsIHZhbHVlMik7XG5cdFx0bGV0IG5leHRNYXAgPSBrZXlzW2ZyYW1lICsgMV07XG5cdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdHJldHVybiB0aW1lbGluZTtcblx0XHR9XG5cdFx0bGV0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdGxldCBudmFsdWUxID0gZ2V0VmFsdWUobmV4dE1hcCwgbmFtZTEsIGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0XHRsZXQgbnZhbHVlMiA9IGdldFZhbHVlKG5leHRNYXAsIG5hbWUyLCBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdFx0bGV0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIHZhbHVlMSwgbnZhbHVlMSwgc2NhbGUpO1xuXHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIHZhbHVlMiwgbnZhbHVlMiwgc2NhbGUpO1xuXHRcdH1cblx0XHR0aW1lID0gdGltZTI7XG5cdFx0dmFsdWUxID0gbnZhbHVlMTtcblx0XHR2YWx1ZTIgPSBudmFsdWUyO1xuXHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZEN1cnZlIChjdXJ2ZTogYW55LCB0aW1lbGluZTogQ3VydmVUaW1lbGluZSwgYmV6aWVyOiBudW1iZXIsIGZyYW1lOiBudW1iZXIsIHZhbHVlOiBudW1iZXIsIHRpbWUxOiBudW1iZXIsIHRpbWUyOiBudW1iZXIsXG5cdHZhbHVlMTogbnVtYmVyLCB2YWx1ZTI6IG51bWJlciwgc2NhbGU6IG51bWJlcikge1xuXHRpZiAoY3VydmUgPT0gXCJzdGVwcGVkXCIpIHtcblx0XHR0aW1lbGluZS5zZXRTdGVwcGVkKGZyYW1lKTtcblx0XHRyZXR1cm4gYmV6aWVyO1xuXHR9XG5cdGxldCBpID0gdmFsdWUgPDwgMjtcblx0bGV0IGN4MSA9IGN1cnZlW2ldO1xuXHRsZXQgY3kxID0gY3VydmVbaSArIDFdICogc2NhbGU7XG5cdGxldCBjeDIgPSBjdXJ2ZVtpICsgMl07XG5cdGxldCBjeTIgPSBjdXJ2ZVtpICsgM10gKiBzY2FsZTtcblx0dGltZWxpbmUuc2V0QmV6aWVyKGJlemllciwgZnJhbWUsIHZhbHVlLCB0aW1lMSwgdmFsdWUxLCBjeDEsIGN5MSwgY3gyLCBjeTIsIHRpbWUyLCB2YWx1ZTIpO1xuXHRyZXR1cm4gYmV6aWVyICsgMTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUgKG1hcDogYW55LCBwcm9wZXJ0eTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSkge1xuXHRyZXR1cm4gbWFwW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkID8gbWFwW3Byb3BlcnR5XSA6IGRlZmF1bHRWYWx1ZTtcbn1cbiJdfQ==
|
|
1387
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25Kc29uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL1NrZWxldG9uSnNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytFQTJCK0U7QUFFL0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQStELGNBQWMsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLDhCQUE4QixFQUFFLDZCQUE2QixFQUFFLGdDQUFnQyxFQUFFLGdDQUFnQyxFQUFFLGdDQUFnQyxFQUFFLDZCQUE2QixFQUFFLDRCQUE0QixFQUFFLDhCQUE4QixFQUFFLGlDQUFpQyxFQUFFLDZCQUE2QixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFpQiwyQkFBMkIsRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTk1QixPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFB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Q0FBQztnQkFDN0QsSUFBSSxVQUFVO29CQUFFLE1BQU0sR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDN0IsS0FBSyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLEtBQUssQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUM1QyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRXJELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLEtBQUs7b0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBRXpELFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDRixDQUFDO1FBRUQsU0FBUztRQUNULElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUU5QixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLFFBQVE7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsT0FBTyxDQUFDLElBQUksYUFBYSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRXpFLE1BQU0sS0FBSyxHQUFXLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLEtBQUs7b0JBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVyRCxNQUFNLElBQUksR0FBVyxRQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRTVELElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDbEYsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDbEQsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsQ0FBQztRQUNGLENBQUM7UUFFRCxlQUFlO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLGFBQWEsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUM1RCxRQUFRLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ2hELEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDWCxNQUFNLElBQUksR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzt3QkFFakMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7NEJBQ3hELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUM1RCxJQUFJLENBQUMsSUFBSTtnQ0FBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsSUFBSSxHQUFHLENBQUMsQ0FBQzs0QkFDdkcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZCLENBQUM7d0JBRUQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQzt3QkFDeEMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDakQsSUFBSSxDQUFDLE1BQU07NEJBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSxzQkFBc0IsSUFBSSxHQUFHLENBQUMsQ0FBQzt3QkFDbkcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBRXJCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUN2RCxJQUFJLE1BQU0sSUFBSSxJQUFJOzRCQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7d0JBRTFFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQzdCLEtBQUssQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzlDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO3dCQUNoRSxLQUFLLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3RSxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUM1RCxLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUUxRCxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDcEMsTUFBTTtvQkFDUCxDQUFDO29CQUNELEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzt3QkFDbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7d0JBRWpDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOzRCQUN4RCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUN6QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzRCQUM3QyxJQUFJLENBQUMsSUFBSTtnQ0FBRSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixRQUFRLDZCQUE2QixhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzs0QkFDN0csSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3ZCLENBQUM7d0JBRUQsTUFBTSxVQUFVLEdBQVcsYUFBYSxDQUFDLE1BQU0sQ0FBQzt3QkFDaEQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDakQsSUFBSSxDQUFDLE1BQU07NEJBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsVUFBVSw2QkFBNkIsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7d0JBQ3hILElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO3dCQUVyQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUVyRCxJQUFJLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLEdBQUcsS0FBSyxDQUFDO3dCQUN6RixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUF1QixDQUFDO3dCQUNwRyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7NEJBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3JDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQzs0QkFDM0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBdUIsQ0FBQzs0QkFDdEYsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dDQUN6QyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7Z0NBQ2hCLElBQUksRUFBYyxDQUFDO2dDQUNuQixRQUFRLElBQUksRUFBRSxDQUFDO29DQUNkLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzt3Q0FDZixNQUFNLEdBQUcsSUFBSSxDQUFDO3dDQUNkLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO3dDQUNwQixNQUFNO29DQUNQLENBQUM7b0NBQ0QsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dDQUNWLENBQUMsR0FBRyxJQUFJLENBQUM7d0NBQ1QsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7d0NBQ2YsT0FBTyxHQUFHLEtBQUssQ0FBQzt3Q0FDaEIsTUFBTTtvQ0FDUCxDQUFDO29DQUNELEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQzt3Q0FDVixDQUFDLEdBQUcsSUFBSSxDQUFDO3dDQUNULEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO3dDQUNmLE9BQU8sR0FBRyxLQUFLLENBQUM7d0NBQ2hCLE1BQU07b0NBQ1AsQ0FBQztvQ0FDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0NBQ2YsTUFBTSxHQUFHLElBQUksQ0FBQzt3Q0FDZCxFQUFFLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQzt3Q0FDcEIsTUFBTTtvQ0FDUCxDQUFDO29DQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzt3Q0FDZixNQUFNLEdBQUcsSUFBSSxDQUFDO3dDQUNkLEVBQUUsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFDO3dDQUNwQixNQUFNO29DQUNQLENBQUM7b0NBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dDQUNmLE1BQU0sR0FBRyxJQUFJLENBQUM7d0NBQ2QsRUFBRSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7d0NBQ3BCLE1BQU07b0NBQ1AsQ0FBQztvQ0FDRCxPQUFPLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dDQUMvRSxDQUFDO2dDQUNELEVBQUUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO2dDQUNyRCxFQUFFLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQ0FDL0MsRUFBRSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDO2dDQUMvRCxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDbEIsQ0FBQzs0QkFDRCxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7Z0NBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BELENBQUM7d0JBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDeEYsSUFBSSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7d0JBQ2xGLElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO3dCQUNsRixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNwRixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNwRixJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUVwRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUM3QixJQUFJLE1BQU07NEJBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdEUsSUFBSSxDQUFDOzRCQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3ZELElBQUksQ0FBQzs0QkFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDaEUsSUFBSSxNQUFNOzRCQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3RFLElBQUksTUFBTTs0QkFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDcEYsSUFBSSxNQUFNOzRCQUFFLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRXRFLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO29CQUNQLENBQUM7b0JBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUNiLE1BQU0sSUFBSSxHQUFHLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO3dCQUVqQyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs0QkFDeEQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDekMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLElBQUk7Z0NBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsUUFBUSx3QkFBd0IsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7NEJBQ3hHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN2QixDQUFDO3dCQUVELE1BQU0sUUFBUSxHQUFXLGFBQWEsQ0FBQyxJQUFJLENBQUM7d0JBQzVDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQzdDLElBQUksQ0FBQyxJQUFJOzRCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLFFBQVEsd0JBQXdCLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3dCQUN4RyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzt3QkFFakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO3dCQUN0RyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7d0JBQ2xHLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDaEcsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDN0IsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDeEQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFlBQVksQ0FBQyxLQUFLOzRCQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDO3dCQUN0RSxLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxLQUFLOzRCQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO3dCQUM5RyxLQUFLLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUMxRCxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFFekQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BDLE1BQU07b0JBQ1AsQ0FBQztvQkFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hCLE1BQU0sSUFBSSxHQUFHLElBQUkscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO3dCQUVqQyxNQUFNLFFBQVEsR0FBVyxhQUFhLENBQUMsSUFBSSxDQUFDO3dCQUM1QyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLElBQUksSUFBSSxJQUFJOzRCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO3dCQUVqQixJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN6QyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN6QyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQzt3QkFDNUQsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQzdCLEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQ3hELEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7d0JBQzFELEtBQUssQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3pELEtBQUssQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUMzRCxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNoRCxLQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN0RCxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM5QyxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUNyRSxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3ZFLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3JFLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQy9ELElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3JFLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBRTdELFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNwQyxNQUFNO29CQUNQLENBQUM7b0JBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzt3QkFFakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ3pELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUV2RCxNQUFNLFFBQVEsR0FBVyxhQUFhLENBQUMsSUFBSSxDQUFDO3dCQUM1QyxJQUFJLFFBQVEsRUFBRSxDQUFDOzRCQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO2dDQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLFFBQVEsRUFBRSxDQUFDLENBQUM7NEJBQ3RFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7NEJBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzs0QkFDNUMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7NEJBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs0QkFDMUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7NEJBQ2pFLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7d0JBQ3RELENBQUM7d0JBRUQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQ3BDLE1BQU07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VyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNyRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUMzQixJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNYLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ25GLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ25GLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzdGLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQzlGLENBQUM7b0JBRUQs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LEVBQUUsTUFBYyxFQUFFLEtBQWEsRUFBRSxLQUFhLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFDM0ssTUFBYyxFQUFFLE1BQWMsRUFBRSxLQUFhO0lBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsT0FBTyxNQUFNLENBQUM7SUFDZixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNyQixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QixNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNqQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDbkIsQ0FBQztBQUVELGlGQUFpRjtBQUNqRixTQUFTLFFBQVEsQ0FBRSxHQUFRLEVBQUUsUUFBZ0IsRUFBRSxZQUFpQjtJQUMvRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0FBQ25FLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFscGhhVGltZWxpbmUsIEFuaW1hdGlvbiwgQXR0YWNobWVudFRpbWVsaW5lLCB0eXBlIEJvbmVUaW1lbGluZTIsIHR5cGUgQ3VydmVUaW1lbGluZSwgdHlwZSBDdXJ2ZVRpbWVsaW5lMSwgRGVmb3JtVGltZWxpbmUsIERyYXdPcmRlckZvbGRlclRpbWVsaW5lLCBEcmF3T3JkZXJUaW1lbGluZSwgRXZlbnRUaW1lbGluZSwgSWtDb25zdHJhaW50VGltZWxpbmUsIEluaGVyaXRUaW1lbGluZSwgUGF0aENvbnN0cmFpbnRNaXhUaW1lbGluZSwgUGF0aENvbnN0cmFpbnRQb3NpdGlvblRpbWVsaW5lLCBQYXRoQ29uc3RyYWludFNwYWNpbmdUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnREYW1waW5nVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50R3Jhdml0eVRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludEluZXJ0aWFUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnRNYXNzVGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50TWl4VGltZWxpbmUsIFBoeXNpY3NDb25zdHJhaW50UmVzZXRUaW1lbGluZSwgUGh5c2ljc0NvbnN0cmFpbnRTdHJlbmd0aFRpbWVsaW5lLCBQaHlzaWNzQ29uc3RyYWludFdpbmRUaW1lbGluZSwgUkdCMlRpbWVsaW5lLCBSR0JBMlRpbWVsaW5lLCBSR0JBVGltZWxpbmUsIFJHQlRpbWVsaW5lLCBSb3RhdGVUaW1lbGluZSwgU2NhbGVUaW1lbGluZSwgU2NhbGVYVGltZWxpbmUsIFNjYWxlWVRpbWVsaW5lLCBTZXF1ZW5jZVRpbWVsaW5lLCBTaGVhclRpbWVsaW5lLCBTaGVhclhUaW1lbGluZSwgU2hlYXJZVGltZWxpbmUsIFNsaWRlck1peFRpbWVsaW5lLCBTbGlkZXJUaW1lbGluZSwgdHlwZSBUaW1lbGluZSwgVHJhbnNmb3JtQ29uc3RyYWludFRpbWVsaW5lLCBUcmFuc2xhdGVUaW1lbGluZSwgVHJhbnNsYXRlWFRpbWVsaW5lLCBUcmFuc2xhdGVZVGltZWxpbmUgfSBmcm9tIFwiLi9BbmltYXRpb24uanNcIjtcbmltcG9ydCB0eXBlIHsgQXR0YWNobWVudCwgVmVydGV4QXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgQXR0YWNobWVudExvYWRlciB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0F0dGFjaG1lbnRMb2FkZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgTWVzaEF0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9NZXNoQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2UsIFNlcXVlbmNlTW9kZSB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL1NlcXVlbmNlLmpzXCI7XG5pbXBvcnQgeyBCb25lRGF0YSwgSW5oZXJpdCB9IGZyb20gXCIuL0JvbmVEYXRhLmpzXCI7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gXCIuL0V2ZW50LmpzXCI7XG5pbXBvcnQgeyBFdmVudERhdGEgfSBmcm9tIFwiLi9FdmVudERhdGEuanNcIjtcbmltcG9ydCB7IElrQ29uc3RyYWludERhdGEsIFNjYWxlWU1vZGUgfSBmcm9tIFwiLi9Ja0NvbnN0cmFpbnREYXRhLmpzXCI7XG5pbXBvcnQgeyBQYXRoQ29uc3RyYWludERhdGEsIFBvc2l0aW9uTW9kZSwgUm90YXRlTW9kZSwgU3BhY2luZ01vZGUgfSBmcm9tIFwiLi9QYXRoQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IFBoeXNpY3NDb25zdHJhaW50RGF0YSB9IGZyb20gXCIuL1BoeXNpY3NDb25zdHJhaW50RGF0YS5qc1wiO1xuaW1wb3J0IHsgU2tlbGV0b25EYXRhIH0gZnJvbSBcIi4vU2tlbGV0b25EYXRhLmpzXCI7XG5pbXBvcnQgeyBTa2luIH0gZnJvbSBcIi4vU2tpbi5qc1wiO1xuaW1wb3J0IHsgU2xpZGVyRGF0YSB9IGZyb20gXCIuL1NsaWRlckRhdGEuanNcIjtcbmltcG9ydCB7IEJsZW5kTW9kZSwgU2xvdERhdGEgfSBmcm9tIFwiLi9TbG90RGF0YS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBGcm9tUHJvcGVydHksIEZyb21Sb3RhdGUsIEZyb21TY2FsZVgsIEZyb21TY2FsZVksIEZyb21TaGVhclksIEZyb21YLCBGcm9tWSwgdHlwZSBUb1Byb3BlcnR5LCBUb1JvdGF0ZSwgVG9TY2FsZVgsIFRvU2NhbGVZLCBUb1NoZWFyWSwgVG9YLCBUb1ksIFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhIH0gZnJvbSBcIi4vVHJhbnNmb3JtQ29uc3RyYWludERhdGEuanNcIjtcbmltcG9ydCB7IENvbG9yLCB0eXBlIE51bWJlckFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG4vKiogTG9hZHMgc2tlbGV0b24gZGF0YSBpbiB0aGUgU3BpbmUgSlNPTiBmb3JtYXQuXG4gKlxuICogU2VlIFtTcGluZSBKU09OIGZvcm1hdF0oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWpzb24tZm9ybWF0KSBhbmRcbiAqIFtKU09OIGFuZCBiaW5hcnkgZGF0YV0oaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWxvYWRpbmctc2tlbGV0b24tZGF0YSNKU09OLWFuZC1iaW5hcnktZGF0YSkgaW4gdGhlIFNwaW5lXG4gKiBSdW50aW1lcyBHdWlkZS4gKi9cbmV4cG9ydCBjbGFzcyBTa2VsZXRvbkpzb24ge1xuXHRhdHRhY2htZW50TG9hZGVyOiBBdHRhY2htZW50TG9hZGVyO1xuXG5cdC8qKiBTY2FsZXMgYm9uZSBwb3NpdGlvbnMsIGltYWdlIHNpemVzLCBhbmQgdHJhbnNsYXRpb25zIGFzIHRoZXkgYXJlIGxvYWRlZC4gVGhpcyBhbGxvd3MgZGlmZmVyZW50IHNpemUgaW1hZ2VzIHRvIGJlIHVzZWQgYXRcblx0ICogcnVudGltZSB0aGFuIHdlcmUgdXNlZCBpbiBTcGluZS5cblx0ICpcblx0ICogU2VlIFtTY2FsaW5nXShodHRwOi8vZXNvdGVyaWNzb2Z0d2FyZS5jb20vc3BpbmUtbG9hZGluZy1za2VsZXRvbi1kYXRhI1NjYWxpbmcpIGluIHRoZSBTcGluZSBSdW50aW1lcyBHdWlkZS4gKi9cblx0c2NhbGUgPSAxO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxpbmtlZE1lc2hlcyA9IFtdIGFzIExpbmtlZE1lc2hbXTtcblxuXHRjb25zdHJ1Y3RvciAoYXR0YWNobWVudExvYWRlcjogQXR0YWNobWVudExvYWRlcikge1xuXHRcdHRoaXMuYXR0YWNobWVudExvYWRlciA9IGF0dGFjaG1lbnRMb2FkZXI7XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGl0IGlzIGFueSB1bnRpbCB3ZSBkZWZpbmUgYSBzY2hlbWFcblx0cmVhZFNrZWxldG9uRGF0YSAoanNvbjogc3RyaW5nIHwgYW55KTogU2tlbGV0b25EYXRhIHtcblx0XHRjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0Y29uc3Qgc2tlbGV0b25EYXRhID0gbmV3IFNrZWxldG9uRGF0YSgpO1xuXHRcdGNvbnN0IHJvb3QgPSB0eXBlb2YgKGpzb24pID09PSBcInN0cmluZ1wiID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG5cblx0XHQvLyBTa2VsZXRvblxuXHRcdGNvbnN0IHNrZWxldG9uTWFwID0gcm9vdC5za2VsZXRvbjtcblx0XHRpZiAoc2tlbGV0b25NYXApIHtcblx0XHRcdHNrZWxldG9uRGF0YS5oYXNoID0gc2tlbGV0b25NYXAuaGFzaDtcblx0XHRcdHNrZWxldG9uRGF0YS52ZXJzaW9uID0gc2tlbGV0b25NYXAuc3BpbmU7XG5cdFx0XHRza2VsZXRvbkRhdGEueCA9IHNrZWxldG9uTWFwLng7XG5cdFx0XHRza2VsZXRvbkRhdGEueSA9IHNrZWxldG9uTWFwLnk7XG5cdFx0XHRza2VsZXRvbkRhdGEud2lkdGggPSBza2VsZXRvbk1hcC53aWR0aDtcblx0XHRcdHNrZWxldG9uRGF0YS5oZWlnaHQgPSBza2VsZXRvbk1hcC5oZWlnaHQ7XG5cdFx0XHRza2VsZXRvbkRhdGEucmVmZXJlbmNlU2NhbGUgPSBnZXRWYWx1ZShza2VsZXRvbk1hcCwgXCJyZWZlcmVuY2VTY2FsZVwiLCAxMDApICogc2NhbGU7XG5cdFx0XHRza2VsZXRvbkRhdGEuZnBzID0gc2tlbGV0b25NYXAuZnBzO1xuXHRcdFx0c2tlbGV0b25EYXRhLmltYWdlc1BhdGggPSBza2VsZXRvbk1hcC5pbWFnZXMgPz8gbnVsbDtcblx0XHRcdHNrZWxldG9uRGF0YS5hdWRpb1BhdGggPSBza2VsZXRvbk1hcC5hdWRpbyA/PyBudWxsO1xuXHRcdH1cblxuXHRcdC8vIEJvbmVzXG5cdFx0aWYgKHJvb3QuYm9uZXMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5ib25lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBib25lTWFwID0gcm9vdC5ib25lc1tpXTtcblxuXHRcdFx0XHRsZXQgcGFyZW50OiBCb25lRGF0YSB8IG51bGwgPSBudWxsO1xuXHRcdFx0XHRjb25zdCBwYXJlbnROYW1lOiBzdHJpbmcgPSBnZXRWYWx1ZShib25lTWFwLCBcInBhcmVudFwiLCBudWxsKTtcblx0XHRcdFx0aWYgKHBhcmVudE5hbWUpIHBhcmVudCA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShwYXJlbnROYW1lKTtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBCb25lRGF0YShza2VsZXRvbkRhdGEuYm9uZXMubGVuZ3RoLCBib25lTWFwLm5hbWUsIHBhcmVudCk7XG5cdFx0XHRcdGRhdGEubGVuZ3RoID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJsZW5ndGhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0c2V0dXAueCA9IGdldFZhbHVlKGJvbmVNYXAsIFwieFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRzZXR1cC55ID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHNldHVwLnJvdGF0aW9uID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0c2V0dXAuc2NhbGVYID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJzY2FsZVhcIiwgMSk7XG5cdFx0XHRcdHNldHVwLnNjYWxlWSA9IGdldFZhbHVlKGJvbmVNYXAsIFwic2NhbGVZXCIsIDEpO1xuXHRcdFx0XHRzZXR1cC5zaGVhclggPSBnZXRWYWx1ZShib25lTWFwLCBcInNoZWFyWFwiLCAwKTtcblx0XHRcdFx0c2V0dXAuc2hlYXJZID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJzaGVhcllcIiwgMCk7XG5cdFx0XHRcdHNldHVwLmluaGVyaXQgPSBVdGlscy5lbnVtVmFsdWUoSW5oZXJpdCwgZ2V0VmFsdWUoYm9uZU1hcCwgXCJpbmhlcml0XCIsIFwiTm9ybWFsXCIpKTtcblx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBnZXRWYWx1ZShib25lTWFwLCBcInNraW5cIiwgZmFsc2UpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBkYXRhLmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXHRcdFx0XHRkYXRhLmljb24gPSBnZXRWYWx1ZShib25lTWFwLCBcImljb25cIiwgdW5kZWZpbmVkKTtcblx0XHRcdFx0ZGF0YS5pY29uU2l6ZSA9IGdldFZhbHVlKGJvbmVNYXAsIFwiaWNvblNpemVcIiwgMSk7XG5cdFx0XHRcdGRhdGEuaWNvblJvdGF0aW9uID0gZ2V0VmFsdWUoYm9uZU1hcCwgXCJpY29uUm90YXRpb25cIiwgMCk7XG5cblx0XHRcdFx0c2tlbGV0b25EYXRhLmJvbmVzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2xvdHMuXG5cdFx0aWYgKHJvb3Quc2xvdHMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5zbG90cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBzbG90TWFwID0gcm9vdC5zbG90c1tpXTtcblx0XHRcdFx0Y29uc3Qgc2xvdE5hbWUgPSBzbG90TWFwLm5hbWU7XG5cblx0XHRcdFx0Y29uc3QgYm9uZURhdGEgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoc2xvdE1hcC5ib25lKTtcblx0XHRcdFx0aWYgKCFib25lRGF0YSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtzbG90TWFwLmJvbmV9IGZvciBzbG90ICR7c2xvdE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBuZXcgU2xvdERhdGEoc2tlbGV0b25EYXRhLnNsb3RzLmxlbmd0aCwgc2xvdE5hbWUsIGJvbmVEYXRhKTtcblxuXHRcdFx0XHRjb25zdCBjb2xvcjogc3RyaW5nID0gZ2V0VmFsdWUoc2xvdE1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBkYXRhLnNldHVwUG9zZS5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblxuXHRcdFx0XHRjb25zdCBkYXJrOiBzdHJpbmcgPSBnZXRWYWx1ZShzbG90TWFwLCBcImRhcmtcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChkYXJrKSBkYXRhLnNldHVwUG9zZS5kYXJrQ29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKGRhcmspO1xuXG5cdFx0XHRcdGRhdGEuYXR0YWNobWVudE5hbWUgPSBnZXRWYWx1ZShzbG90TWFwLCBcImF0dGFjaG1lbnRcIiwgbnVsbCk7XG5cdFx0XHRcdGRhdGEuYmxlbmRNb2RlID0gVXRpbHMuZW51bVZhbHVlKEJsZW5kTW9kZSwgZ2V0VmFsdWUoc2xvdE1hcCwgXCJibGVuZFwiLCBcIm5vcm1hbFwiKSk7XG5cdFx0XHRcdGRhdGEudmlzaWJsZSA9IGdldFZhbHVlKHNsb3RNYXAsIFwidmlzaWJsZVwiLCB0cnVlKTtcblx0XHRcdFx0c2tlbGV0b25EYXRhLnNsb3RzLnB1c2goZGF0YSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29uc3RyYWludHMuXG5cdFx0aWYgKHJvb3QuY29uc3RyYWludHMpIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE1hcCBvZiByb290LmNvbnN0cmFpbnRzKSB7XG5cdFx0XHRcdGNvbnN0IG5hbWUgPSBjb25zdHJhaW50TWFwLm5hbWU7XG5cdFx0XHRcdGNvbnN0IHNraW5SZXF1aXJlZCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2tpblwiLCBmYWxzZSk7XG5cdFx0XHRcdHN3aXRjaCAoZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ0eXBlXCIsIGZhbHNlKSkge1xuXHRcdFx0XHRcdGNhc2UgXCJpa1wiOiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gbmV3IElrQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNvbnN0cmFpbnRNYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoY29uc3RyYWludE1hcC5ib25lc1tpaV0pO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Y29uc3RyYWludE1hcC5ib25lc1tpaV19IGZvciBJSyBjb25zdHJhaW50ICR7bmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRcdGRhdGEuYm9uZXMucHVzaChib25lKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0TmFtZSA9IGNvbnN0cmFpbnRNYXAudGFyZ2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKHRhcmdldE5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCF0YXJnZXQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0YXJnZXQgYm9uZSAke3RhcmdldE5hbWV9IGZvciBJSyBjb25zdHJhaW50ICR7bmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnRhcmdldCA9IHRhcmdldDtcblxuXHRcdFx0XHRcdFx0Y29uc3Qgc2NhbGVZID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzY2FsZVlcIiwgbnVsbCk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGVZICE9IG51bGwpIGRhdGEuc2NhbGVZTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShTY2FsZVlNb2RlLCBzY2FsZVkpO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cCA9IGRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhcIiwgMSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5zb2Z0bmVzcyA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic29mdG5lc3NcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0XHRcdHNldHVwLmJlbmREaXJlY3Rpb24gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImJlbmRQb3NpdGl2ZVwiLCB0cnVlKSA/IDEgOiAtMTtcblx0XHRcdFx0XHRcdHNldHVwLmNvbXByZXNzID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJjb21wcmVzc1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5zdHJldGNoID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJldGNoXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInRyYW5zZm9ybVwiOiB7XG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gbmV3IFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhKG5hbWUpO1xuXHRcdFx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBza2luUmVxdWlyZWQ7XG5cblx0XHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjb25zdHJhaW50TWFwLmJvbmVzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBib25lTmFtZSA9IGNvbnN0cmFpbnRNYXAuYm9uZXNbaWldO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFib25lKSB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGZpbmQgYm9uZSAke2JvbmVOYW1lfSBmb3IgdHJhbnNmb3JtIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0XHRkYXRhLmJvbmVzLnB1c2goYm9uZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNvdXJjZU5hbWU6IHN0cmluZyA9IGNvbnN0cmFpbnRNYXAuc291cmNlO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc291cmNlID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKHNvdXJjZU5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBzb3VyY2UgYm9uZSAke3NvdXJjZU5hbWV9IGZvciB0cmFuc2Zvcm0gY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnNvdXJjZSA9IHNvdXJjZTtcblxuXHRcdFx0XHRcdFx0ZGF0YS5sb2NhbFNvdXJjZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxTb3VyY2VcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5sb2NhbFRhcmdldCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxUYXJnZXRcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5hZGRpdGl2ZSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiYWRkaXRpdmVcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5jbGFtcCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiY2xhbXBcIiwgZmFsc2UpO1xuXG5cdFx0XHRcdFx0XHRsZXQgcm90YXRlID0gZmFsc2UsIHggPSBmYWxzZSwgeSA9IGZhbHNlLCBzY2FsZVggPSBmYWxzZSwgc2NhbGVZID0gZmFsc2UsIHNoZWFyWSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y29uc3QgZnJvbUVudHJpZXMgPSBPYmplY3QuZW50cmllcyhnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInByb3BlcnRpZXNcIiwge30pKSBhcyBbc3RyaW5nLCBvYmplY3RdW107XG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IFtuYW1lLCBmcm9tRW50cnldIG9mIGZyb21FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGZyb20gPSB0aGlzLmZyb21Qcm9wZXJ0eShuYW1lKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgZnJvbVNjYWxlID0gdGhpcy5wcm9wZXJ0eVNjYWxlKG5hbWUsIHNjYWxlKTtcblx0XHRcdFx0XHRcdFx0ZnJvbS5vZmZzZXQgPSBnZXRWYWx1ZShmcm9tRW50cnksIFwib2Zmc2V0XCIsIDApICogZnJvbVNjYWxlO1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0b0VudHJpZXMgPSBPYmplY3QuZW50cmllcyhnZXRWYWx1ZShmcm9tRW50cnksIFwidG9cIiwge30pKSBhcyBbc3RyaW5nLCBvYmplY3RdW107XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgW25hbWUsIHRvRW50cnldIG9mIHRvRW50cmllcykge1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0b1NjYWxlID0gMTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdG86IFRvUHJvcGVydHk7XG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoIChuYW1lKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicm90YXRlXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cm90YXRlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG8gPSBuZXcgVG9Sb3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwieFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHggPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0byA9IG5ldyBUb1goKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dG9TY2FsZSA9IHNjYWxlO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ5XCI6IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0eSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvWSgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0b1NjYWxlID0gc2NhbGU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxlWFwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNjYWxlWCA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2NhbGVYKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxlWVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNjYWxlWSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2NhbGVZKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNoZWFyWVwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNoZWFyWSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRvID0gbmV3IFRvU2hlYXJZKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRyYW5zZm9ybSBjb25zdHJhaW50IHRvIHByb3BlcnR5OiAke25hbWV9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRvLm9mZnNldCA9IGdldFZhbHVlKHRvRW50cnksIFwib2Zmc2V0XCIsIDApICogdG9TY2FsZTtcblx0XHRcdFx0XHRcdFx0XHR0by5tYXggPSBnZXRWYWx1ZSh0b0VudHJ5LCBcIm1heFwiLCAxKSAqIHRvU2NhbGU7XG5cdFx0XHRcdFx0XHRcdFx0dG8uc2NhbGUgPSBnZXRWYWx1ZSh0b0VudHJ5LCBcInNjYWxlXCIsIDEpICogdG9TY2FsZSAvIGZyb21TY2FsZTtcblx0XHRcdFx0XHRcdFx0XHRmcm9tLnRvLnB1c2godG8pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGlmIChmcm9tLnRvLmxlbmd0aCA+IDApIGRhdGEucHJvcGVydGllcy5wdXNoKGZyb20pO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRkYXRhLm9mZnNldHNbVHJhbnNmb3JtQ29uc3RyYWludERhdGEuUk9UQVRJT05dID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJyb3RhdGlvblwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0c1tUcmFuc2Zvcm1Db25zdHJhaW50RGF0YS5YXSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwieFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0ZGF0YS5vZmZzZXRzW1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhLlldID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdFx0XHRkYXRhLm9mZnNldHNbVHJhbnNmb3JtQ29uc3RyYWludERhdGEuU0NBTEVYXSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2NhbGVYXCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5vZmZzZXRzW1RyYW5zZm9ybUNvbnN0cmFpbnREYXRhLlNDQUxFWV0gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNjYWxlWVwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0c1tUcmFuc2Zvcm1Db25zdHJhaW50RGF0YS5TSEVBUlldID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzaGVhcllcIiwgMCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNldHVwID0gZGF0YS5zZXR1cFBvc2U7XG5cdFx0XHRcdFx0XHRpZiAocm90YXRlKSBzZXR1cC5taXhSb3RhdGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFJvdGF0ZVwiLCAxKTtcblx0XHRcdFx0XHRcdGlmICh4KSBzZXR1cC5taXhYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhYXCIsIDEpO1xuXHRcdFx0XHRcdFx0aWYgKHkpIHNldHVwLm1peFkgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFlcIiwgc2V0dXAubWl4WCk7XG5cdFx0XHRcdFx0XHRpZiAoc2NhbGVYKSBzZXR1cC5taXhTY2FsZVggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFNjYWxlWFwiLCAxKTtcblx0XHRcdFx0XHRcdGlmIChzY2FsZVkpIHNldHVwLm1peFNjYWxlWSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4U2NhbGVZXCIsIHNldHVwLm1peFNjYWxlWCk7XG5cdFx0XHRcdFx0XHRpZiAoc2hlYXJZKSBzZXR1cC5taXhTaGVhclkgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFNoZWFyWVwiLCAxKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInBhdGhcIjoge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBQYXRoQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNvbnN0cmFpbnRNYXAuYm9uZXMubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmVOYW1lID0gY29uc3RyYWludE1hcC5ib25lc1tpaV07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJvbmUpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBib25lICR7Ym9uZU5hbWV9IGZvciBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0XHRkYXRhLmJvbmVzLnB1c2goYm9uZSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNsb3ROYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLnNsb3Q7XG5cdFx0XHRcdFx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRcdFx0XHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHNsb3QgJHtzbG90TmFtZX0gZm9yIHBhdGggY29uc3RyYWludCAke2NvbnN0cmFpbnRNYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRkYXRhLnNsb3QgPSBzbG90O1xuXG5cdFx0XHRcdFx0XHRkYXRhLnBvc2l0aW9uTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShQb3NpdGlvbk1vZGUsIGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwicG9zaXRpb25Nb2RlXCIsIFwiUGVyY2VudFwiKSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNwYWNpbmdNb2RlID0gVXRpbHMuZW51bVZhbHVlKFNwYWNpbmdNb2RlLCBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNwYWNpbmdNb2RlXCIsIFwiTGVuZ3RoXCIpKTtcblx0XHRcdFx0XHRcdGRhdGEucm90YXRlTW9kZSA9IFV0aWxzLmVudW1WYWx1ZShSb3RhdGVNb2RlLCBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0ZU1vZGVcIiwgXCJUYW5nZW50XCIpKTtcblx0XHRcdFx0XHRcdGRhdGEub2Zmc2V0Um90YXRpb24gPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0aW9uXCIsIDApO1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0dXAgPSBkYXRhLnNldHVwUG9zZTtcblx0XHRcdFx0XHRcdHNldHVwLnBvc2l0aW9uID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJwb3NpdGlvblwiLCAwKTtcblx0XHRcdFx0XHRcdGlmIChkYXRhLnBvc2l0aW9uTW9kZSA9PT0gUG9zaXRpb25Nb2RlLkZpeGVkKSBzZXR1cC5wb3NpdGlvbiAqPSBzY2FsZTtcblx0XHRcdFx0XHRcdHNldHVwLnNwYWNpbmcgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNwYWNpbmdcIiwgMCk7XG5cdFx0XHRcdFx0XHRpZiAoZGF0YS5zcGFjaW5nTW9kZSA9PT0gU3BhY2luZ01vZGUuTGVuZ3RoIHx8IGRhdGEuc3BhY2luZ01vZGUgPT09IFNwYWNpbmdNb2RlLkZpeGVkKSBzZXR1cC5zcGFjaW5nICo9IHNjYWxlO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4Um90YXRlID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdFx0XHRzZXR1cC5taXhYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhYXCIsIDEpO1xuXHRcdFx0XHRcdFx0c2V0dXAubWl4WSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibWl4WVwiLCBzZXR1cC5taXhYKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLnB1c2goZGF0YSk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2FzZSBcInBoeXNpY3NcIjoge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludERhdGEobmFtZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNraW5SZXF1aXJlZCA9IHNraW5SZXF1aXJlZDtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYm9uZU5hbWU6IHN0cmluZyA9IGNvbnN0cmFpbnRNYXAuYm9uZTtcblx0XHRcdFx0XHRcdGNvbnN0IGJvbmUgPSBza2VsZXRvbkRhdGEuZmluZEJvbmUoYm9uZU5hbWUpO1xuXHRcdFx0XHRcdFx0aWYgKGJvbmUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBQaHlzaWNzIGJvbmUgbm90IGZvdW5kOiAke2JvbmVOYW1lfWApO1xuXHRcdFx0XHRcdFx0ZGF0YS5ib25lID0gYm9uZTtcblxuXHRcdFx0XHRcdFx0ZGF0YS54ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ4XCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS55ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ5XCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5yb3RhdGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInJvdGF0ZVwiLCAwKTtcblx0XHRcdFx0XHRcdGRhdGEuc2NhbGVYID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzY2FsZVhcIiwgMCk7XG5cdFx0XHRcdFx0XHRkYXRhLnNoZWFyWCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwic2hlYXJYXCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5saW1pdCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibGltaXRcIiwgNTAwMCkgKiBzY2FsZTtcblx0XHRcdFx0XHRcdGRhdGEuc3RlcCA9IDEgLyBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImZwc1wiLCA2MCk7XG5cdFx0XHRcdFx0XHRjb25zdCBzZXR1cCA9IGRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRcdFx0c2V0dXAuaW5lcnRpYSA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiaW5lcnRpYVwiLCAwLjUpO1xuXHRcdFx0XHRcdFx0c2V0dXAuc3RyZW5ndGggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInN0cmVuZ3RoXCIsIDEwMCk7XG5cdFx0XHRcdFx0XHRzZXR1cC5kYW1waW5nID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJkYW1waW5nXCIsIDAuODUpO1xuXHRcdFx0XHRcdFx0c2V0dXAubWFzc0ludmVyc2UgPSAxIC8gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtYXNzXCIsIDEpO1xuXHRcdFx0XHRcdFx0c2V0dXAud2luZCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwid2luZFwiLCAwKTtcblx0XHRcdFx0XHRcdHNldHVwLmdyYXZpdHkgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImdyYXZpdHlcIiwgMCk7XG5cdFx0XHRcdFx0XHRzZXR1cC5taXggPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peFwiLCAxKTtcblx0XHRcdFx0XHRcdGRhdGEuaW5lcnRpYUdsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwiaW5lcnRpYUdsb2JhbFwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnN0cmVuZ3RoR2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJzdHJlbmd0aEdsb2JhbFwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLmRhbXBpbmdHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImRhbXBpbmdHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5tYXNzR2xvYmFsID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtYXNzR2xvYmFsXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdGRhdGEud2luZEdsb2JhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwid2luZEdsb2JhbFwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLmdyYXZpdHlHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImdyYXZpdHlHbG9iYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0ZGF0YS5taXhHbG9iYWwgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcIm1peEdsb2JhbFwiLCBmYWxzZSk7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uRGF0YS5jb25zdHJhaW50cy5wdXNoKGRhdGEpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNhc2UgXCJzbGlkZXJcIjoge1xuXHRcdFx0XHRcdFx0Y29uc3QgZGF0YSA9IG5ldyBTbGlkZXJEYXRhKG5hbWUpO1xuXHRcdFx0XHRcdFx0ZGF0YS5za2luUmVxdWlyZWQgPSBza2luUmVxdWlyZWQ7XG5cblx0XHRcdFx0XHRcdGRhdGEuYWRkaXRpdmUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImFkZGl0aXZlXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRcdGRhdGEubG9vcCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9vcFwiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRkYXRhLnNldHVwUG9zZS50aW1lID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0ZGF0YS5zZXR1cFBvc2UubWl4ID0gZ2V0VmFsdWUoY29uc3RyYWludE1hcCwgXCJtaXhcIiwgMSk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvbmVOYW1lOiBzdHJpbmcgPSBjb25zdHJhaW50TWFwLmJvbmU7XG5cdFx0XHRcdFx0XHRpZiAoYm9uZU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0ZGF0YS5ib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdFx0aWYgKCFkYXRhLmJvbmUpIHRocm93IG5ldyBFcnJvcihgU2xpZGVyIGJvbmUgbm90IGZvdW5kOiAke2JvbmVOYW1lfWApO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBwcm9wZXJ0eSA9IGNvbnN0cmFpbnRNYXAucHJvcGVydHk7XG5cdFx0XHRcdFx0XHRcdGRhdGEucHJvcGVydHkgPSB0aGlzLmZyb21Qcm9wZXJ0eShwcm9wZXJ0eSk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5U2NhbGUgPSB0aGlzLnByb3BlcnR5U2NhbGUocHJvcGVydHksIHNjYWxlKTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5wcm9wZXJ0eS5vZmZzZXQgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcImZyb21cIiwgMCkgKiBwcm9wZXJ0eVNjYWxlO1xuXHRcdFx0XHRcdFx0XHRkYXRhLm9mZnNldCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwidG9cIiwgMCk7XG5cdFx0XHRcdFx0XHRcdGRhdGEuc2NhbGUgPSBnZXRWYWx1ZShjb25zdHJhaW50TWFwLCBcInNjYWxlXCIsIDEpIC8gcHJvcGVydHlTY2FsZTtcblx0XHRcdFx0XHRcdFx0ZGF0YS5sb2NhbCA9IGdldFZhbHVlKGNvbnN0cmFpbnRNYXAsIFwibG9jYWxcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRza2VsZXRvbkRhdGEuY29uc3RyYWludHMucHVzaChkYXRhKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNraW5zLlxuXHRcdGlmIChyb290LnNraW5zKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJvb3Quc2tpbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3Qgc2tpbk1hcCA9IHJvb3Quc2tpbnNbaV1cblx0XHRcdFx0Y29uc3Qgc2tpbiA9IG5ldyBTa2luKHNraW5NYXAubmFtZSk7XG5cblx0XHRcdFx0aWYgKHNraW5NYXAuYm9uZXMpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgc2tpbk1hcC5ib25lcy5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGJvbmVOYW1lID0gc2tpbk1hcC5ib25lc1tpaV07XG5cdFx0XHRcdFx0XHRjb25zdCBib25lID0gc2tlbGV0b25EYXRhLmZpbmRCb25lKGJvbmVOYW1lKTtcblx0XHRcdFx0XHRcdGlmICghYm9uZSkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIGJvbmUgJHtib25lTmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5ib25lcy5wdXNoKGJvbmUpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLmlrKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAuaWsubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50TmFtZSA9IHNraW5NYXAuaWtbaWldO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgSWtDb25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBJSyBjb25zdHJhaW50ICR7Y29uc3RyYWludE5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRcdHNraW4uY29uc3RyYWludHMucHVzaChjb25zdHJhaW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2tpbk1hcC50cmFuc2Zvcm0pIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgc2tpbk1hcC50cmFuc2Zvcm0ubGVuZ3RoOyBpaSsrKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50TmFtZSA9IHNraW5NYXAudHJhbnNmb3JtW2lpXTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHRyYW5zZm9ybSBjb25zdHJhaW50ICR7Y29uc3RyYWludE5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRcdHNraW4uY29uc3RyYWludHMucHVzaChjb25zdHJhaW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc2tpbk1hcC5wYXRoKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAucGF0aC5sZW5ndGg7IGlpKyspIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnROYW1lID0gc2tpbk1hcC5wYXRoW2lpXTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFBhdGhDb25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBwYXRoIGNvbnN0cmFpbnQgJHtjb25zdHJhaW50TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdFx0c2tpbi5jb25zdHJhaW50cy5wdXNoKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChza2luTWFwLnBoeXNpY3MpIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgc2tpbk1hcC5waHlzaWNzLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludE5hbWUgPSBza2luTWFwLnBoeXNpY3NbaWldO1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgUGh5c2ljc0NvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHBoeXNpY3MgY29uc3RyYWludCAke2NvbnN0cmFpbnROYW1lfSBmb3Igc2tpbiAke3NraW5NYXAubmFtZX0uYCk7XG5cdFx0XHRcdFx0XHRza2luLmNvbnN0cmFpbnRzLnB1c2goY29uc3RyYWludCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNraW5NYXAuc2xpZGVyKSB7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHNraW5NYXAuc2xpZGVyLmxlbmd0aDsgaWkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludE5hbWUgPSBza2luTWFwLnNsaWRlcltpaV07XG5cdFx0XHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBTbGlkZXJEYXRhKTtcblx0XHRcdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBmaW5kIHNsaWRlciBjb25zdHJhaW50ICR7Y29uc3RyYWludE5hbWV9IGZvciBza2luICR7c2tpbk1hcC5uYW1lfS5gKTtcblx0XHRcdFx0XHRcdHNraW4uY29uc3RyYWludHMucHVzaChjb25zdHJhaW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKGNvbnN0IHNsb3ROYW1lIGluIHNraW5NYXAuYXR0YWNobWVudHMpIHtcblx0XHRcdFx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3ROYW1lKTtcblx0XHRcdFx0XHRpZiAoIXNsb3QpIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCBza2luIHNsb3QgJHtzbG90TmFtZX0gZm9yIHNraW4gJHtza2luTWFwLm5hbWV9LmApO1xuXHRcdFx0XHRcdGNvbnN0IHNsb3RNYXAgPSBza2luTWFwLmF0dGFjaG1lbnRzW3Nsb3ROYW1lXTtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGVudHJ5TmFtZSBpbiBzbG90TWFwKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBhdHRhY2htZW50ID0gdGhpcy5yZWFkQXR0YWNobWVudChzbG90TWFwW2VudHJ5TmFtZV0sIHNraW4sIHNsb3QuaW5kZXgsIGVudHJ5TmFtZSwgc2tlbGV0b25EYXRhKTtcblx0XHRcdFx0XHRcdGlmIChhdHRhY2htZW50KSBza2luLnNldEF0dGFjaG1lbnQoc2xvdC5pbmRleCwgZW50cnlOYW1lLCBhdHRhY2htZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0c2tlbGV0b25EYXRhLnNraW5zLnB1c2goc2tpbik7XG5cdFx0XHRcdGlmIChza2luLm5hbWUgPT09IFwiZGVmYXVsdFwiKSBza2VsZXRvbkRhdGEuZGVmYXVsdFNraW4gPSBza2luO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIExpbmtlZCBtZXNoZXMuXG5cdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSB0aGlzLmxpbmtlZE1lc2hlcy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGNvbnN0IGxpbmtlZE1lc2ggPSB0aGlzLmxpbmtlZE1lc2hlc1tpXTtcblx0XHRcdGNvbnN0IHNraW4gPSAhbGlua2VkTWVzaC5za2luID8gc2tlbGV0b25EYXRhLmRlZmF1bHRTa2luIDogc2tlbGV0b25EYXRhLmZpbmRTa2luKGxpbmtlZE1lc2guc2tpbik7XG5cdFx0XHRpZiAoIXNraW4pIHRocm93IG5ldyBFcnJvcihgU2tpbiBub3QgZm91bmQ6ICR7bGlua2VkTWVzaC5za2lufWApO1xuXHRcdFx0Y29uc3Qgc291cmNlID0gc2tpbi5nZXRBdHRhY2htZW50KGxpbmtlZE1lc2guc291cmNlSW5kZXgsIGxpbmtlZE1lc2guc291cmNlKTtcblx0XHRcdGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBtZXNoIG5vdCBmb3VuZDogJHtsaW5rZWRNZXNoLnNvdXJjZX1gKTtcblx0XHRcdGxpbmtlZE1lc2gubWVzaC50aW1lbGluZUF0dGFjaG1lbnQgPSBsaW5rZWRNZXNoLmluaGVyaXRUaW1lbGluZXMgPyBzb3VyY2UgOiBsaW5rZWRNZXNoLm1lc2g7XG5cdFx0XHRsaW5rZWRNZXNoLm1lc2guc2V0U291cmNlTWVzaChzb3VyY2UgYXMgTWVzaEF0dGFjaG1lbnQpO1xuXHRcdFx0bGlua2VkTWVzaC5tZXNoLnVwZGF0ZVNlcXVlbmNlKCk7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nTGFiZWxzOiByZWZlcmVuY2UgcnVudGltZVxuXHRcdFx0b3V0ZXI6XG5cdFx0XHRpZiAobGlua2VkTWVzaC5pbmhlcml0VGltZWxpbmVzICYmIGxpbmtlZE1lc2guc2xvdEluZGV4ICE9PSBsaW5rZWRNZXNoLnNvdXJjZUluZGV4KSB7XG5cdFx0XHRcdGNvbnN0IHNsb3RzID0gc291cmNlLnRpbWVsaW5lU2xvdHM7XG5cdFx0XHRcdGZvciAoY29uc3QgZXhpc3Rpbmcgb2Ygc2xvdHMpXG5cdFx0XHRcdFx0aWYgKGV4aXN0aW5nID09PSBsaW5rZWRNZXNoLnNsb3RJbmRleCkgYnJlYWsgb3V0ZXI7XG5cdFx0XHRcdGNvbnN0IG5ld1Nsb3RzID0gWy4uLnNsb3RzXTtcblx0XHRcdFx0bmV3U2xvdHNbc2xvdHMubGVuZ3RoXSA9IGxpbmtlZE1lc2guc2xvdEluZGV4O1xuXHRcdFx0XHRzb3VyY2UudGltZWxpbmVTbG90cyA9IG5ld1Nsb3RzO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLmxpbmtlZE1lc2hlcy5sZW5ndGggPSAwO1xuXG5cdFx0Ly8gRXZlbnRzLlxuXHRcdGlmIChyb290LmV2ZW50cykge1xuXHRcdFx0Zm9yIChjb25zdCBldmVudE5hbWUgaW4gcm9vdC5ldmVudHMpIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRNYXAgPSByb290LmV2ZW50c1tldmVudE5hbWVdO1xuXHRcdFx0XHRjb25zdCBkYXRhID0gbmV3IEV2ZW50RGF0YShldmVudE5hbWUpO1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IGRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRzZXR1cC5pbnRWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImludFwiLCAwKTtcblx0XHRcdFx0c2V0dXAuZmxvYXRWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImZsb2F0XCIsIDApO1xuXHRcdFx0XHRzZXR1cC5zdHJpbmdWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInN0cmluZ1wiLCBcIlwiKTtcblx0XHRcdFx0ZGF0YS5fYXVkaW9QYXRoID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiYXVkaW9cIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChkYXRhLmF1ZGlvUGF0aCkge1xuXHRcdFx0XHRcdHNldHVwLnZvbHVtZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInZvbHVtZVwiLCBzZXR1cC52b2x1bWUpO1xuXHRcdFx0XHRcdHNldHVwLmJhbGFuY2UgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJiYWxhbmNlXCIsIHNldHVwLmJhbGFuY2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHNrZWxldG9uRGF0YS5ldmVudHMucHVzaChkYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRpb25zLlxuXHRcdGlmIChyb290LmFuaW1hdGlvbnMpIHtcblx0XHRcdGZvciAoY29uc3QgYW5pbWF0aW9uTmFtZSBpbiByb290LmFuaW1hdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uTWFwID0gcm9vdC5hbmltYXRpb25zW2FuaW1hdGlvbk5hbWVdO1xuXHRcdFx0XHR0aGlzLnJlYWRBbmltYXRpb24oYW5pbWF0aW9uTWFwLCBhbmltYXRpb25OYW1lLCBza2VsZXRvbkRhdGEpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNsaWRlciBhbmltYXRpb25zLlxuXHRcdGlmIChyb290LmNvbnN0cmFpbnRzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGFuaW1hdGlvbk5hbWUgaW4gcm9vdC5jb25zdHJhaW50cykge1xuXHRcdFx0XHRjb25zdCBhbmltYXRpb25NYXAgPSByb290LmNvbnN0cmFpbnRzW2FuaW1hdGlvbk5hbWVdO1xuXHRcdFx0XHRpZiAoYW5pbWF0aW9uTWFwLnR5cGUgPT09IFwic2xpZGVyXCIpIHtcblx0XHRcdFx0XHRjb25zdCBkYXRhID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGFuaW1hdGlvbk1hcC5uYW1lLCBTbGlkZXJEYXRhKVxuXHRcdFx0XHRcdGNvbnN0IGFuaW1hdGlvbk5hbWUgPSBhbmltYXRpb25NYXAuYW5pbWF0aW9uO1xuXHRcdFx0XHRcdGNvbnN0IGFuaW1hdGlvbiA9IHNrZWxldG9uRGF0YS5maW5kQW5pbWF0aW9uKGFuaW1hdGlvbk5hbWUpO1xuXHRcdFx0XHRcdGlmICghYW5pbWF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoYFNsaWRlciBhbmltYXRpb24gbm90IGZvdW5kOiAke2FuaW1hdGlvbk5hbWV9YCk7XG5cdFx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9Ob25OdWxsQXNzZXJ0aW9uOiByZWZlcmVuY2UgcnVudGltZVxuXHRcdFx0XHRcdGRhdGEhLmFuaW1hdGlvbiA9IGFuaW1hdGlvbjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBza2VsZXRvbkRhdGE7XG5cdH1cblxuXHRwcml2YXRlIGZyb21Qcm9wZXJ0eSAodHlwZTogc3RyaW5nKTogRnJvbVByb3BlcnR5IHtcblx0XHRsZXQgZnJvbTogRnJvbVByb3BlcnR5O1xuXHRcdHN3aXRjaCAodHlwZSkge1xuXHRcdFx0Y2FzZSBcInJvdGF0ZVwiOiBmcm9tID0gbmV3IEZyb21Sb3RhdGUoKTsgYnJlYWs7XG5cdFx0XHRjYXNlIFwieFwiOiBmcm9tID0gbmV3IEZyb21YKCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcInlcIjogZnJvbSA9IG5ldyBGcm9tWSgpOyBicmVhaztcblx0XHRcdGNhc2UgXCJzY2FsZVhcIjogZnJvbSA9IG5ldyBGcm9tU2NhbGVYKCk7IGJyZWFrO1xuXHRcdFx0Y2FzZSBcInNjYWxlWVwiOiBmcm9tID0gbmV3IEZyb21TY2FsZVkoKTsgYnJlYWs7XG5cdFx0XHRjYXNlIFwic2hlYXJZXCI6IGZyb20gPSBuZXcgRnJvbVNoZWFyWSgpOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0cmFuc2Zvcm0gY29uc3RyYWludCBmcm9tIHByb3BlcnR5OiAke3R5cGV9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBmcm9tO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9wZXJ0eVNjYWxlICh0eXBlOiBzdHJpbmcsIHNjYWxlOiBudW1iZXIpIHtcblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgXCJ4XCI6XG5cdFx0XHRjYXNlIFwieVwiOiByZXR1cm4gc2NhbGU7XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4gMTtcblx0XHR9XG5cdH1cblxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGl0IGlzIGFueSB1bnRpbCB3ZSBkZWZpbmUgYSBzY2hlbWFcblx0cmVhZEF0dGFjaG1lbnQgKG1hcDogYW55LCBza2luOiBTa2luLCBzbG90SW5kZXg6IG51bWJlciwgcGxhY2Vob2xkZXI6IHN0cmluZywgc2tlbGV0b25EYXRhOiBTa2VsZXRvbkRhdGEpOiBBdHRhY2htZW50IHwgbnVsbCB7XG5cdFx0Y29uc3Qgc2NhbGUgPSB0aGlzLnNjYWxlO1xuXHRcdGNvbnN0IG5hbWUgPSBnZXRWYWx1ZShtYXAsIFwibmFtZVwiLCBwbGFjZWhvbGRlcik7XG5cblx0XHRzd2l0Y2ggKGdldFZhbHVlKG1hcCwgXCJ0eXBlXCIsIFwicmVnaW9uXCIpKSB7XG5cdFx0XHRjYXNlIFwicmVnaW9uXCI6IHtcblx0XHRcdFx0Y29uc3QgcGF0aCA9IGdldFZhbHVlKG1hcCwgXCJwYXRoXCIsIG5hbWUpO1xuXHRcdFx0XHRjb25zdCBzZXF1ZW5jZSA9IHRoaXMucmVhZFNlcXVlbmNlKGdldFZhbHVlKG1hcCwgXCJzZXF1ZW5jZVwiLCBudWxsKSk7XG5cdFx0XHRcdGNvbnN0IHJlZ2lvbiA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdSZWdpb25BdHRhY2htZW50KHNraW4sIHBsYWNlaG9sZGVyLCBuYW1lLCBwYXRoLCBzZXF1ZW5jZSk7XG5cdFx0XHRcdGlmICghcmVnaW9uKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cmVnaW9uLnBhdGggPSBwYXRoO1xuXHRcdFx0XHRyZWdpb24ueCA9IGdldFZhbHVlKG1hcCwgXCJ4XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHJlZ2lvbi55ID0gZ2V0VmFsdWUobWFwLCBcInlcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0cmVnaW9uLnNjYWxlWCA9IGdldFZhbHVlKG1hcCwgXCJzY2FsZVhcIiwgMSk7XG5cdFx0XHRcdHJlZ2lvbi5zY2FsZVkgPSBnZXRWYWx1ZShtYXAsIFwic2NhbGVZXCIsIDEpO1xuXHRcdFx0XHRyZWdpb24ucm90YXRpb24gPSBnZXRWYWx1ZShtYXAsIFwicm90YXRpb25cIiwgMCk7XG5cdFx0XHRcdHJlZ2lvbi53aWR0aCA9IG1hcC53aWR0aCAqIHNjYWxlO1xuXHRcdFx0XHRyZWdpb24uaGVpZ2h0ID0gbWFwLmhlaWdodCAqIHNjYWxlO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgcmVnaW9uLmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXG5cdFx0XHRcdHJlZ2lvbi51cGRhdGVTZXF1ZW5jZSgpO1xuXHRcdFx0XHRyZXR1cm4gcmVnaW9uO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcImJvdW5kaW5nYm94XCI6IHtcblx0XHRcdFx0Y29uc3QgYm94ID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld0JvdW5kaW5nQm94QXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSk7XG5cdFx0XHRcdGlmICghYm94KSByZXR1cm4gbnVsbDtcblx0XHRcdFx0dGhpcy5yZWFkVmVydGljZXMobWFwLCBib3gsIG1hcC52ZXJ0ZXhDb3VudCA8PCAxKTtcblx0XHRcdFx0Y29uc3QgY29sb3I6IHN0cmluZyA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBib3guY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cdFx0XHRcdHJldHVybiBib3g7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwibWVzaFwiOlxuXHRcdFx0Y2FzZSBcImxpbmtlZG1lc2hcIjoge1xuXHRcdFx0XHRjb25zdCBwYXRoID0gZ2V0VmFsdWUobWFwLCBcInBhdGhcIiwgbmFtZSk7XG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlID0gdGhpcy5yZWFkU2VxdWVuY2UoZ2V0VmFsdWUobWFwLCBcInNlcXVlbmNlXCIsIG51bGwpKTtcblx0XHRcdFx0Y29uc3QgbWVzaCA9IHRoaXMuYXR0YWNobWVudExvYWRlci5uZXdNZXNoQXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSwgcGF0aCwgc2VxdWVuY2UpO1xuXHRcdFx0XHRpZiAoIW1lc2gpIHJldHVybiBudWxsO1xuXHRcdFx0XHRtZXNoLnBhdGggPSBwYXRoO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIG1lc2guY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cblx0XHRcdFx0bWVzaC53aWR0aCA9IGdldFZhbHVlKG1hcCwgXCJ3aWR0aFwiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRtZXNoLmhlaWdodCA9IGdldFZhbHVlKG1hcCwgXCJoZWlnaHRcIiwgMCkgKiBzY2FsZTtcblxuXHRcdFx0XHRjb25zdCBzb3VyY2U6IHN0cmluZyA9IGdldFZhbHVlKG1hcCwgXCJzb3VyY2VcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChzb3VyY2UpIHtcblx0XHRcdFx0XHRsZXQgc291cmNlSW5kZXggPSBzbG90SW5kZXg7XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdCA9IGdldFZhbHVlKG1hcCwgXCJzbG90XCIsIG51bGwpO1xuXHRcdFx0XHRcdGlmIChzbG90KSB7XG5cdFx0XHRcdFx0XHRjb25zdCBzb3VyY2VTbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3QpO1xuXHRcdFx0XHRcdFx0aWYgKCFzb3VyY2VTbG90KSB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBtZXNoIHNsb3Qgbm90IGZvdW5kOiAke3Nsb3R9YCk7XG5cdFx0XHRcdFx0XHRzb3VyY2VJbmRleCA9IHNvdXJjZVNsb3QuaW5kZXg7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubGlua2VkTWVzaGVzLnB1c2gobmV3IExpbmtlZE1lc2gobWVzaCwgZ2V0VmFsdWUobWFwLCBcInNraW5cIiwgbnVsbCksIHNsb3RJbmRleCwgc291cmNlSW5kZXgsIHNvdXJjZSxcblx0XHRcdFx0XHRcdGdldFZhbHVlKG1hcCwgXCJ0aW1lbGluZXNcIiwgdHJ1ZSkpKTtcblx0XHRcdFx0XHRyZXR1cm4gbWVzaDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHV2czogQXJyYXk8bnVtYmVyPiA9IG1hcC51dnM7XG5cdFx0XHRcdHRoaXMucmVhZFZlcnRpY2VzKG1hcCwgbWVzaCwgdXZzLmxlbmd0aCk7XG5cdFx0XHRcdG1lc2gudHJpYW5nbGVzID0gbWFwLnRyaWFuZ2xlcztcblx0XHRcdFx0bWVzaC5yZWdpb25VVnMgPSB1dnM7XG5cblx0XHRcdFx0bWVzaC5lZGdlcyA9IGdldFZhbHVlKG1hcCwgXCJlZGdlc1wiLCBudWxsKTtcblx0XHRcdFx0bWVzaC5odWxsTGVuZ3RoID0gZ2V0VmFsdWUobWFwLCBcImh1bGxcIiwgMCkgKiAyO1xuXHRcdFx0XHRtZXNoLnVwZGF0ZVNlcXVlbmNlKCk7XG5cdFx0XHRcdHJldHVybiBtZXNoO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcInBhdGhcIjoge1xuXHRcdFx0XHRjb25zdCBwYXRoID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld1BhdGhBdHRhY2htZW50KHNraW4sIHBsYWNlaG9sZGVyLCBuYW1lKTtcblx0XHRcdFx0aWYgKCFwYXRoKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0cGF0aC5jbG9zZWQgPSBnZXRWYWx1ZShtYXAsIFwiY2xvc2VkXCIsIGZhbHNlKTtcblx0XHRcdFx0cGF0aC5jb25zdGFudFNwZWVkID0gZ2V0VmFsdWUobWFwLCBcImNvbnN0YW50U3BlZWRcIiwgdHJ1ZSk7XG5cblx0XHRcdFx0Y29uc3QgdmVydGV4Q291bnQgPSBtYXAudmVydGV4Q291bnQ7XG5cdFx0XHRcdHRoaXMucmVhZFZlcnRpY2VzKG1hcCwgcGF0aCwgdmVydGV4Q291bnQgPDwgMSk7XG5cblx0XHRcdFx0Y29uc3QgbGVuZ3RoczogQXJyYXk8bnVtYmVyPiA9IFV0aWxzLm5ld0FycmF5KHZlcnRleENvdW50IC8gMywgMCk7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLmxlbmd0aHMubGVuZ3RoOyBpKyspXG5cdFx0XHRcdFx0bGVuZ3Roc1tpXSA9IG1hcC5sZW5ndGhzW2ldICogc2NhbGU7XG5cdFx0XHRcdHBhdGgubGVuZ3RocyA9IGxlbmd0aHM7XG5cblx0XHRcdFx0Y29uc3QgY29sb3I6IHN0cmluZyA9IGdldFZhbHVlKG1hcCwgXCJjb2xvclwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGNvbG9yKSBwYXRoLmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXHRcdFx0XHRyZXR1cm4gcGF0aDtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCJwb2ludFwiOiB7XG5cdFx0XHRcdGNvbnN0IHBvaW50ID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld1BvaW50QXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSk7XG5cdFx0XHRcdGlmICghcG9pbnQpIHJldHVybiBudWxsO1xuXHRcdFx0XHRwb2ludC54ID0gZ2V0VmFsdWUobWFwLCBcInhcIiwgMCkgKiBzY2FsZTtcblx0XHRcdFx0cG9pbnQueSA9IGdldFZhbHVlKG1hcCwgXCJ5XCIsIDApICogc2NhbGU7XG5cdFx0XHRcdHBvaW50LnJvdGF0aW9uID0gZ2V0VmFsdWUobWFwLCBcInJvdGF0aW9uXCIsIDApO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gZ2V0VmFsdWUobWFwLCBcImNvbG9yXCIsIG51bGwpO1xuXHRcdFx0XHRpZiAoY29sb3IpIHBvaW50LmNvbG9yLnNldEZyb21TdHJpbmcoY29sb3IpO1xuXHRcdFx0XHRyZXR1cm4gcG9pbnQ7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiY2xpcHBpbmdcIjoge1xuXHRcdFx0XHRjb25zdCBjbGlwID0gdGhpcy5hdHRhY2htZW50TG9hZGVyLm5ld0NsaXBwaW5nQXR0YWNobWVudChza2luLCBwbGFjZWhvbGRlciwgbmFtZSk7XG5cdFx0XHRcdGlmICghY2xpcCkgcmV0dXJuIG51bGw7XG5cblx0XHRcdFx0Y29uc3QgZW5kID0gZ2V0VmFsdWUobWFwLCBcImVuZFwiLCBudWxsKTtcblx0XHRcdFx0aWYgKGVuZCkgY2xpcC5lbmRTbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KGVuZCk7XG5cblx0XHRcdFx0Y2xpcC5jb252ZXggPSBnZXRWYWx1ZShtYXAsIFwiY29udmV4XCIsIGZhbHNlKTtcblx0XHRcdFx0Y2xpcC5pbnZlcnNlID0gZ2V0VmFsdWUobWFwLCBcImludmVyc2VcIiwgZmFsc2UpO1xuXG5cdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gbWFwLnZlcnRleENvdW50O1xuXHRcdFx0XHR0aGlzLnJlYWRWZXJ0aWNlcyhtYXAsIGNsaXAsIHZlcnRleENvdW50IDw8IDEpO1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yOiBzdHJpbmcgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0XHRcdGlmIChjb2xvcikgY2xpcC5jb2xvci5zZXRGcm9tU3RyaW5nKGNvbG9yKTtcblx0XHRcdFx0cmV0dXJuIGNsaXA7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmVhZFNlcXVlbmNlIChtYXA6IG9iamVjdCkge1xuXHRcdGlmIChtYXAgPT0gbnVsbCkgcmV0dXJuIG5ldyBTZXF1ZW5jZSgxLCBmYWxzZSk7XG5cdFx0Y29uc3Qgc2VxdWVuY2UgPSBuZXcgU2VxdWVuY2UoZ2V0VmFsdWUobWFwLCBcImNvdW50XCIsIDApLCB0cnVlKTtcblx0XHRzZXF1ZW5jZS5zdGFydCA9IGdldFZhbHVlKG1hcCwgXCJzdGFydFwiLCAxKTtcblx0XHRzZXF1ZW5jZS5kaWdpdHMgPSBnZXRWYWx1ZShtYXAsIFwiZGlnaXRzXCIsIDApO1xuXHRcdHNlcXVlbmNlLnNldHVwSW5kZXggPSBnZXRWYWx1ZShtYXAsIFwic2V0dXBcIiwgMCk7XG5cdFx0cmV0dXJuIHNlcXVlbmNlO1xuXHR9XG5cblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBpdCBpcyBhbnkgdW50aWwgd2UgZGVmaW5lIGEgc2NoZW1hXG5cdHJlYWRWZXJ0aWNlcyAobWFwOiBhbnksIGF0dGFjaG1lbnQ6IFZlcnRleEF0dGFjaG1lbnQsIHZlcnRpY2VzTGVuZ3RoOiBudW1iZXIpIHtcblx0XHRjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0YXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoID0gdmVydGljZXNMZW5ndGg7XG5cdFx0Y29uc3QgdmVydGljZXM6IEFycmF5PG51bWJlcj4gPSBtYXAudmVydGljZXM7XG5cdFx0aWYgKHZlcnRpY2VzTGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IHNjYWxlZFZlcnRpY2VzID0gVXRpbHMudG9GbG9hdEFycmF5KHZlcnRpY2VzKTtcblx0XHRcdGlmIChzY2FsZSAhPT0gMSkge1xuXHRcdFx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdFx0XHRzY2FsZWRWZXJ0aWNlc1tpXSAqPSBzY2FsZTtcblx0XHRcdH1cblx0XHRcdGF0dGFjaG1lbnQudmVydGljZXMgPSBzY2FsZWRWZXJ0aWNlcztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3Qgd2VpZ2h0czogbnVtYmVyW10gPSBbXTtcblx0XHRjb25zdCBib25lczogbnVtYmVyW10gPSBbXTtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IG47KSB7XG5cdFx0XHRjb25zdCBib25lQ291bnQgPSB2ZXJ0aWNlc1tpKytdO1xuXHRcdFx0Ym9uZXMucHVzaChib25lQ291bnQpO1xuXHRcdFx0Zm9yIChsZXQgbm4gPSBpICsgYm9uZUNvdW50ICogNDsgaSA8IG5uOyBpICs9IDQpIHtcblx0XHRcdFx0Ym9uZXMucHVzaCh2ZXJ0aWNlc1tpXSk7XG5cdFx0XHRcdHdlaWdodHMucHVzaCh2ZXJ0aWNlc1tpICsgMV0gKiBzY2FsZSk7XG5cdFx0XHRcdHdlaWdodHMucHVzaCh2ZXJ0aWNlc1tpICsgMl0gKiBzY2FsZSk7XG5cdFx0XHRcdHdlaWdodHMucHVzaCh2ZXJ0aWNlc1tpICsgM10pO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRhdHRhY2htZW50LmJvbmVzID0gYm9uZXM7XG5cdFx0YXR0YWNobWVudC52ZXJ0aWNlcyA9IFV0aWxzLnRvRmxvYXRBcnJheSh3ZWlnaHRzKTtcblx0fVxuXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogaXQgaXMgYW55IHVudGlsZSB3ZSBkZWZpbmUgYSBzY2hlbWFcblx0cmVhZEFuaW1hdGlvbiAobWFwOiBhbnksIG5hbWU6IHN0cmluZywgc2tlbGV0b25EYXRhOiBTa2VsZXRvbkRhdGEpIHtcblx0XHRjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0Y29uc3QgdGltZWxpbmVzOiBUaW1lbGluZVtdID0gW107XG5cblx0XHQvLyBTbG90IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLnNsb3RzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHNsb3ROYW1lIGluIG1hcC5zbG90cykge1xuXHRcdFx0XHRjb25zdCBzbG90TWFwID0gbWFwLnNsb3RzW3Nsb3ROYW1lXTtcblx0XHRcdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChzbG90TmFtZSk7XG5cdFx0XHRcdGlmICghc2xvdCkgdGhyb3cgbmV3IEVycm9yKGBTbG90IG5vdCBmb3VuZDogJHtzbG90TmFtZX1gKTtcblx0XHRcdFx0Y29uc3Qgc2xvdEluZGV4ID0gc2xvdC5pbmRleDtcblx0XHRcdFx0Zm9yIChjb25zdCB0aW1lbGluZU5hbWUgaW4gc2xvdE1hcCkge1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lTWFwID0gc2xvdE1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGlmICghdGltZWxpbmVNYXApIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGNvbnN0IGZyYW1lcyA9IHRpbWVsaW5lTWFwLmxlbmd0aDtcblxuXHRcdFx0XHRcdHN3aXRjaCAodGltZWxpbmVOYW1lKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiYXR0YWNobWVudFwiOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IEF0dGFjaG1lbnRUaW1lbGluZShmcmFtZXMsIHNsb3RJbmRleCk7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMDsgZnJhbWUgPCBmcmFtZXM7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBrZXlNYXAgPSB0aW1lbGluZU1hcFtmcmFtZV07XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApLCBnZXRWYWx1ZShrZXlNYXAsIFwibmFtZVwiLCBudWxsKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJyZ2JhXCI6IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUkdCQVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzIDw8IDIsIHNsb3RJbmRleCk7XG5cdFx0XHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuY29sb3IpO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGNvbG9yLmEpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAuY29sb3IpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIGNvbG9yLnIsIG5ld0NvbG9yLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIGNvbG9yLmcsIG5ld0NvbG9yLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMywgdGltZSwgdGltZTIsIGNvbG9yLmEsIG5ld0NvbG9yLmEsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJyZ2JcIjoge1xuXHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBSR0JUaW1lbGluZShmcmFtZXMsIGZyYW1lcyAqIDMsIHNsb3RJbmRleCk7XG5cdFx0XHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuY29sb3IpO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAuY29sb3IpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIGNvbG9yLnIsIG5ld0NvbG9yLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIGNvbG9yLmcsIG5ld0NvbG9yLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJhbHBoYVwiOiB7XG5cdFx0XHRcdFx0XHRcdHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IEFscGhhVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIHNsb3RJbmRleCksIDAsIDEpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJyZ2JhMlwiOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IFJHQkEyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgKiA3LCBzbG90SW5kZXgpO1xuXG5cdFx0XHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0bGV0IGNvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAubGlnaHQpO1xuXHRcdFx0XHRcdFx0XHRsZXQgY29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhrZXlNYXAuZGFyayk7XG5cblx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgY29sb3IuYSwgY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYik7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dE1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXdDb2xvciA9IENvbG9yLmZyb21TdHJpbmcobmV4dE1hcC5saWdodCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3Q29sb3IyID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmRhcmspO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIGNvbG9yLnIsIG5ld0NvbG9yLnIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMSwgdGltZSwgdGltZTIsIGNvbG9yLmcsIG5ld0NvbG9yLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIGNvbG9yLmIsIG5ld0NvbG9yLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMywgdGltZSwgdGltZTIsIGNvbG9yLmEsIG5ld0NvbG9yLmEsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgNCwgdGltZSwgdGltZTIsIGNvbG9yMi5yLCBuZXdDb2xvcjIuciwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA1LCB0aW1lLCB0aW1lMiwgY29sb3IyLmcsIG5ld0NvbG9yMi5nLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDYsIHRpbWUsIHRpbWUyLCBjb2xvcjIuYiwgbmV3Q29sb3IyLmIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0XHRcdFx0Y29sb3IgPSBuZXdDb2xvcjtcblx0XHRcdFx0XHRcdFx0XHRjb2xvcjIgPSBuZXdDb2xvcjI7XG5cdFx0XHRcdFx0XHRcdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwicmdiMlwiOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IFJHQjJUaW1lbGluZShmcmFtZXMsIGZyYW1lcyAqIDYsIHNsb3RJbmRleCk7XG5cblx0XHRcdFx0XHRcdFx0bGV0IGtleU1hcCA9IHRpbWVsaW5lTWFwWzBdO1xuXHRcdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRsZXQgY29sb3IgPSBDb2xvci5mcm9tU3RyaW5nKGtleU1hcC5saWdodCk7XG5cdFx0XHRcdFx0XHRcdGxldCBjb2xvcjIgPSBDb2xvci5mcm9tU3RyaW5nKGtleU1hcC5kYXJrKTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDAsIGJlemllciA9IDA7IDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCB0aW1lLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0NvbG9yID0gQ29sb3IuZnJvbVN0cmluZyhuZXh0TWFwLmxpZ2h0KTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBuZXdDb2xvcjIgPSBDb2xvci5mcm9tU3RyaW5nKG5leHRNYXAuZGFyayk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGN1cnZlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAwLCB0aW1lLCB0aW1lMiwgY29sb3IuciwgbmV3Q29sb3IuciwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgY29sb3IuZywgbmV3Q29sb3IuZywgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAyLCB0aW1lLCB0aW1lMiwgY29sb3IuYiwgbmV3Q29sb3IuYiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAzLCB0aW1lLCB0aW1lMiwgY29sb3IyLnIsIG5ld0NvbG9yMi5yLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDQsIHRpbWUsIHRpbWUyLCBjb2xvcjIuZywgbmV3Q29sb3IyLmcsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgNSwgdGltZSwgdGltZTIsIGNvbG9yMi5iLCBuZXdDb2xvcjIuYiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRcdFx0XHRjb2xvciA9IG5ld0NvbG9yO1xuXHRcdFx0XHRcdFx0XHRcdGNvbG9yMiA9IG5ld0NvbG9yMjtcblx0XHRcdFx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lbGluZSB0eXBlIGZvciBhIHNsb3Q6ICR7dGltZWxpbmVNYXAubmFtZX0gKCR7c2xvdE1hcC5uYW1lfSlgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBCb25lIHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLmJvbmVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGJvbmVOYW1lIGluIG1hcC5ib25lcykge1xuXHRcdFx0XHRjb25zdCBib25lTWFwID0gbWFwLmJvbmVzW2JvbmVOYW1lXTtcblx0XHRcdFx0Y29uc3QgYm9uZSA9IHNrZWxldG9uRGF0YS5maW5kQm9uZShib25lTmFtZSk7XG5cdFx0XHRcdGlmICghYm9uZSkgdGhyb3cgbmV3IEVycm9yKGBCb25lIG5vdCBmb3VuZDogJHtib25lTmFtZX1gKTtcblx0XHRcdFx0Y29uc3QgYm9uZUluZGV4ID0gYm9uZS5pbmRleDtcblx0XHRcdFx0Zm9yIChjb25zdCB0aW1lbGluZU5hbWUgaW4gYm9uZU1hcCkge1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lTWFwID0gYm9uZU1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGNvbnN0IGZyYW1lcyA9IHRpbWVsaW5lTWFwLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAoZnJhbWVzID09PSAwKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdHN3aXRjaCAodGltZWxpbmVOYW1lKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwicm90YXRlXCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFJvdGF0ZVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpLCAwLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwidHJhbnNsYXRlXCI6IHJlYWRUaW1lbGluZTIodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFRyYW5zbGF0ZVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzIDw8IDEsIGJvbmVJbmRleCksIFwieFwiLCBcInlcIiwgMCwgc2NhbGUpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJ0cmFuc2xhdGV4XCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFRyYW5zbGF0ZVhUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgc2NhbGUpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJ0cmFuc2xhdGV5XCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFRyYW5zbGF0ZVlUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMCwgc2NhbGUpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsZVwiOiByZWFkVGltZWxpbmUyKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTY2FsZVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzIDw8IDEsIGJvbmVJbmRleCksIFwieFwiLCBcInlcIiwgMSwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxleFwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTY2FsZVhUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMSwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInNjYWxleVwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTY2FsZVlUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgYm9uZUluZGV4KSwgMSwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcInNoZWFyXCI6IHJlYWRUaW1lbGluZTIodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFNoZWFyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMgPDwgMSwgYm9uZUluZGV4KSwgXCJ4XCIsIFwieVwiLCAwLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwic2hlYXJ4XCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFNoZWFyWFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpLCAwLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwic2hlYXJ5XCI6IHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgbmV3IFNoZWFyWVRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBib25lSW5kZXgpLCAwLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiaW5oZXJpdFwiOiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IEluaGVyaXRUaW1lbGluZShmcmFtZXMsIGJvbmUuaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRmb3IgKGxldCBmcmFtZSA9IDA7IGZyYW1lIDwgdGltZWxpbmVNYXAubGVuZ3RoOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgYUZyYW1lID0gdGltZWxpbmVNYXBbZnJhbWVdO1xuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lLCBnZXRWYWx1ZShhRnJhbWUsIFwidGltZVwiLCAwKSwgVXRpbHMuZW51bVZhbHVlKEluaGVyaXQsIGdldFZhbHVlKGFGcmFtZSwgXCJpbmhlcml0XCIsIFwiTm9ybWFsXCIpKSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0aW1lbGluZSB0eXBlIGZvciBhIGJvbmU6ICR7dGltZWxpbmVNYXAubmFtZX0gKCR7Ym9uZU1hcC5uYW1lfSlgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElLIGNvbnN0cmFpbnQgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuaWspIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE5hbWUgaW4gbWFwLmlrKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnRNYXAgPSBtYXAuaWtbY29uc3RyYWludE5hbWVdO1xuXHRcdFx0XHRsZXQga2V5TWFwID0gY29uc3RyYWludE1hcFswXTtcblx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIElrQ29uc3RyYWludERhdGEpO1xuXHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgSUsgQ29uc3RyYWludCBub3QgZm91bmQ6ICR7Y29uc3RyYWludE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IElrQ29uc3RyYWludFRpbWVsaW5lKGNvbnN0cmFpbnRNYXAubGVuZ3RoLCBjb25zdHJhaW50TWFwLmxlbmd0aCA8PCAxLFxuXHRcdFx0XHRcdHNrZWxldG9uRGF0YS5jb25zdHJhaW50cy5pbmRleE9mKGNvbnN0cmFpbnQpKTtcblxuXHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRsZXQgbWl4ID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFwiLCAxKTtcblx0XHRcdFx0bGV0IHNvZnRuZXNzID0gZ2V0VmFsdWUoa2V5TWFwLCBcInNvZnRuZXNzXCIsIDApICogc2NhbGU7XG5cblx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbWl4LCBzb2Z0bmVzcywgZ2V0VmFsdWUoa2V5TWFwLCBcImJlbmRQb3NpdGl2ZVwiLCB0cnVlKSA/IDEgOiAtMSwgZ2V0VmFsdWUoa2V5TWFwLCBcImNvbXByZXNzXCIsIGZhbHNlKSwgZ2V0VmFsdWUoa2V5TWFwLCBcInN0cmV0Y2hcIiwgZmFsc2UpKTtcblx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gY29uc3RyYWludE1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0XHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRjb25zdCBtaXgyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhcIiwgMSk7XG5cdFx0XHRcdFx0Y29uc3Qgc29mdG5lc3MyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJzb2Z0bmVzc1wiLCAwKSAqIHNjYWxlO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIG1peCwgbWl4MiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgc29mdG5lc3MsIHNvZnRuZXNzMiwgc2NhbGUpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRtaXggPSBtaXgyO1xuXHRcdFx0XHRcdHNvZnRuZXNzID0gc29mdG5lc3MyO1xuXHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFRyYW5zZm9ybSBjb25zdHJhaW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLnRyYW5zZm9ybSkge1xuXHRcdFx0Zm9yIChjb25zdCBjb25zdHJhaW50TmFtZSBpbiBtYXAudHJhbnNmb3JtKSB7XG5cdFx0XHRcdGNvbnN0IHRpbWVsaW5lTWFwID0gbWFwLnRyYW5zZm9ybVtjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFRyYW5zZm9ybUNvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zZm9ybSBjb25zdHJhaW50IG5vdCBmb3VuZDogJHtjb25zdHJhaW50TmFtZX1gKTtcblx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgVHJhbnNmb3JtQ29uc3RyYWludFRpbWVsaW5lKHRpbWVsaW5lTWFwLmxlbmd0aCwgdGltZWxpbmVNYXAubGVuZ3RoICogNixcblx0XHRcdFx0XHRza2VsZXRvbkRhdGEuY29uc3RyYWludHMuaW5kZXhPZihjb25zdHJhaW50KSk7XG5cblx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0bGV0IG1peFJvdGF0ZSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdGxldCBtaXhYID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFhcIiwgMSksIG1peFkgPSBnZXRWYWx1ZShrZXlNYXAsIFwibWl4WVwiLCBtaXhYKTtcblx0XHRcdFx0bGV0IG1peFNjYWxlWCA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhTY2FsZVhcIiwgMSksIG1peFNjYWxlWSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhTY2FsZVlcIiwgMSk7XG5cdFx0XHRcdGNvbnN0IG1peFNoZWFyWSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhTaGVhcllcIiwgMSk7XG5cblx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwLCBiZXppZXIgPSAwOyA7IGZyYW1lKyspIHtcblx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgbWl4Um90YXRlLCBtaXhYLCBtaXhZLCBtaXhTY2FsZVgsIG1peFNjYWxlWSwgbWl4U2hlYXJZKTtcblx0XHRcdFx0XHRjb25zdCBuZXh0TWFwID0gdGltZWxpbmVNYXBbZnJhbWUgKyAxXTtcblx0XHRcdFx0XHRpZiAoIW5leHRNYXApIHtcblx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgdGltZTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcInRpbWVcIiwgMCk7XG5cdFx0XHRcdFx0Y29uc3QgbWl4Um90YXRlMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4Um90YXRlXCIsIDEpO1xuXHRcdFx0XHRcdGNvbnN0IG1peFgyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhYXCIsIDEpLCBtaXhZMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4WVwiLCBtaXhYMik7XG5cdFx0XHRcdFx0Y29uc3QgbWl4U2NhbGVYMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4U2NhbGVYXCIsIDEpLCBtaXhTY2FsZVkyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhTY2FsZVlcIiwgMSk7XG5cdFx0XHRcdFx0Y29uc3QgbWl4U2hlYXJZMiA9IGdldFZhbHVlKG5leHRNYXAsIFwibWl4U2hlYXJZXCIsIDEpO1xuXHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIG1peFJvdGF0ZSwgbWl4Um90YXRlMiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgbWl4WCwgbWl4WDIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIG1peFksIG1peFkyLCAxKTtcblx0XHRcdFx0XHRcdGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDMsIHRpbWUsIHRpbWUyLCBtaXhTY2FsZVgsIG1peFNjYWxlWDIsIDEpO1xuXHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgNCwgdGltZSwgdGltZTIsIG1peFNjYWxlWSwgbWl4U2NhbGVZMiwgMSk7XG5cdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCA1LCB0aW1lLCB0aW1lMiwgbWl4U2hlYXJZLCBtaXhTaGVhclkyLCAxKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aW1lID0gdGltZTI7XG5cdFx0XHRcdFx0bWl4Um90YXRlID0gbWl4Um90YXRlMjtcblx0XHRcdFx0XHRtaXhYID0gbWl4WDI7XG5cdFx0XHRcdFx0bWl4WSA9IG1peFkyO1xuXHRcdFx0XHRcdG1peFNjYWxlWCA9IG1peFNjYWxlWDI7XG5cdFx0XHRcdFx0bWl4U2NhbGVZID0gbWl4U2NhbGVZMjtcblx0XHRcdFx0XHRtaXhTY2FsZVggPSBtaXhTY2FsZVgyO1xuXHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFBhdGggY29uc3RyYWludCB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5wYXRoKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnROYW1lIGluIG1hcC5wYXRoKSB7XG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnRNYXAgPSBtYXAucGF0aFtjb25zdHJhaW50TmFtZV07XG5cdFx0XHRcdGNvbnN0IGNvbnN0cmFpbnQgPSBza2VsZXRvbkRhdGEuZmluZENvbnN0cmFpbnQoY29uc3RyYWludE5hbWUsIFBhdGhDb25zdHJhaW50RGF0YSk7XG5cdFx0XHRcdGlmICghY29uc3RyYWludCkgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGNvbnN0cmFpbnQgbm90IGZvdW5kOiAke2NvbnN0cmFpbnROYW1lfWApO1xuXHRcdFx0XHRjb25zdCBpbmRleCA9IHNrZWxldG9uRGF0YS5jb25zdHJhaW50cy5pbmRleE9mKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHRpbWVsaW5lTmFtZSBpbiBjb25zdHJhaW50TWFwKSB7XG5cdFx0XHRcdFx0Y29uc3QgdGltZWxpbmVNYXAgPSBjb25zdHJhaW50TWFwW3RpbWVsaW5lTmFtZV07XG5cdFx0XHRcdFx0bGV0IGtleU1hcCA9IHRpbWVsaW5lTWFwWzBdO1xuXHRcdFx0XHRcdGlmICgha2V5TWFwKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGNvbnN0IGZyYW1lcyA9IHRpbWVsaW5lTWFwLmxlbmd0aDtcblx0XHRcdFx0XHRzd2l0Y2ggKHRpbWVsaW5lTmFtZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcInBvc2l0aW9uXCI6IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUGF0aENvbnN0cmFpbnRQb3NpdGlvblRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7XG5cdFx0XHRcdFx0XHRcdHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgdGltZWxpbmUsIDAsIGNvbnN0cmFpbnQucG9zaXRpb25Nb2RlID09PSBQb3NpdGlvbk1vZGUuRml4ZWQgPyBzY2FsZSA6IDEpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNhc2UgXCJzcGFjaW5nXCI6IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUGF0aENvbnN0cmFpbnRTcGFjaW5nVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0cmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCB0aW1lbGluZSwgMCwgY29uc3RyYWludC5zcGFjaW5nTW9kZSA9PT0gU3BhY2luZ01vZGUuTGVuZ3RoIHx8IGNvbnN0cmFpbnQuc3BhY2luZ01vZGUgPT09IFNwYWNpbmdNb2RlLkZpeGVkID8gc2NhbGUgOiAxKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXNlIFwibWl4XCI6IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgUGF0aENvbnN0cmFpbnRNaXhUaW1lbGluZShmcmFtZXMsIGZyYW1lcyAqIDMsIGluZGV4KTtcblx0XHRcdFx0XHRcdFx0bGV0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0bGV0IG1peFJvdGF0ZSA9IGdldFZhbHVlKGtleU1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdFx0XHRcdGxldCBtaXhYID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFhcIiwgMSk7XG5cdFx0XHRcdFx0XHRcdGxldCBtaXhZID0gZ2V0VmFsdWUoa2V5TWFwLCBcIm1peFlcIiwgbWl4WCk7XG5cdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIG1peFJvdGF0ZSwgbWl4WCwgbWl4WSk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbmV4dE1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lMiA9IGdldFZhbHVlKG5leHRNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtaXhSb3RhdGUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJtaXhSb3RhdGVcIiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWl4WDIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFhcIiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWl4WTIgPSBnZXRWYWx1ZShuZXh0TWFwLCBcIm1peFlcIiwgbWl4WDIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGN1cnZlID0ga2V5TWFwLmN1cnZlO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChjdXJ2ZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMCwgdGltZSwgdGltZTIsIG1peFJvdGF0ZSwgbWl4Um90YXRlMiwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgbWl4WCwgbWl4WDIsIDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0YmV6aWVyID0gcmVhZEN1cnZlKGN1cnZlLCB0aW1lbGluZSwgYmV6aWVyLCBmcmFtZSwgMiwgdGltZSwgdGltZTIsIG1peFksIG1peFkyLCAxKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0dGltZSA9IHRpbWUyO1xuXHRcdFx0XHRcdFx0XHRcdG1peFJvdGF0ZSA9IG1peFJvdGF0ZTI7XG5cdFx0XHRcdFx0XHRcdFx0bWl4WCA9IG1peFgyO1xuXHRcdFx0XHRcdFx0XHRcdG1peFkgPSBtaXhZMjtcblx0XHRcdFx0XHRcdFx0XHRrZXlNYXAgPSBuZXh0TWFwO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUGh5c2ljcyBjb25zdHJhaW50IHRpbWVsaW5lcy5cblx0XHRpZiAobWFwLnBoeXNpY3MpIHtcblx0XHRcdGZvciAoY29uc3QgY29uc3RyYWludE5hbWUgaW4gbWFwLnBoeXNpY3MpIHtcblx0XHRcdFx0Y29uc3QgY29uc3RyYWludE1hcCA9IG1hcC5waHlzaWNzW2NvbnN0cmFpbnROYW1lXTtcblx0XHRcdFx0bGV0IGluZGV4ID0gLTE7XG5cdFx0XHRcdGlmIChjb25zdHJhaW50TmFtZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0Y29uc3QgY29uc3RyYWludCA9IHNrZWxldG9uRGF0YS5maW5kQ29uc3RyYWludChjb25zdHJhaW50TmFtZSwgUGh5c2ljc0NvbnN0cmFpbnREYXRhKTtcblx0XHRcdFx0XHRpZiAoIWNvbnN0cmFpbnQpIHRocm93IG5ldyBFcnJvcihgUGh5c2ljcyBjb25zdHJhaW50IG5vdCBmb3VuZDogJHtjb25zdHJhaW50TmFtZX1gKTtcblx0XHRcdFx0XHRpbmRleCA9IHNrZWxldG9uRGF0YS5jb25zdHJhaW50cy5pbmRleE9mKGNvbnN0cmFpbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVOYW1lIGluIGNvbnN0cmFpbnRNYXApIHtcblx0XHRcdFx0XHRjb25zdCB0aW1lbGluZU1hcCA9IGNvbnN0cmFpbnRNYXBbdGltZWxpbmVOYW1lXTtcblx0XHRcdFx0XHRsZXQga2V5TWFwID0gdGltZWxpbmVNYXBbMF07XG5cdFx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Y29uc3QgZnJhbWVzID0gdGltZWxpbmVNYXAubGVuZ3RoO1xuXHRcdFx0XHRcdGxldCB0aW1lbGluZTogQ3VydmVUaW1lbGluZTE7XG5cdFx0XHRcdFx0bGV0IGRlZmF1bHRWYWx1ZSA9IDA7XG5cdFx0XHRcdFx0aWYgKHRpbWVsaW5lTmFtZSA9PT0gXCJyZXNldFwiKSB7XG5cdFx0XHRcdFx0XHRjb25zdCByZXNldFRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50UmVzZXRUaW1lbGluZShmcmFtZXMsIGluZGV4KTtcblx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMDsga2V5TWFwICE9IG51bGw7IGtleU1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV0sIGZyYW1lKyspXG5cdFx0XHRcdFx0XHRcdHJlc2V0VGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApKTtcblx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHJlc2V0VGltZWxpbmUpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHN3aXRjaCAodGltZWxpbmVOYW1lKSB7XG5cdFx0XHRcdFx0XHRjYXNlIFwiaW5lcnRpYVwiOiB0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludEluZXJ0aWFUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJzdHJlbmd0aFwiOiB0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludFN0cmVuZ3RoVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiZGFtcGluZ1wiOiB0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludERhbXBpbmdUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJtYXNzXCI6IHRpbWVsaW5lID0gbmV3IFBoeXNpY3NDb25zdHJhaW50TWFzc1RpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIndpbmRcIjogdGltZWxpbmUgPSBuZXcgUGh5c2ljc0NvbnN0cmFpbnRXaW5kVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KTsgYnJlYWs7XG5cdFx0XHRcdFx0XHRjYXNlIFwiZ3Jhdml0eVwiOiB0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludEdyYXZpdHlUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpOyBicmVhaztcblx0XHRcdFx0XHRcdGNhc2UgXCJtaXhcIjoge1xuXHRcdFx0XHRcdFx0XHRkZWZhdWx0VmFsdWUgPSAxO1xuXHRcdFx0XHRcdFx0XHR0aW1lbGluZSA9IG5ldyBQaHlzaWNzQ29uc3RyYWludE1peFRpbWVsaW5lKGZyYW1lcywgZnJhbWVzLCBpbmRleCk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZGVmYXVsdDogY29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJlYWRUaW1lbGluZTEodGltZWxpbmVzLCB0aW1lbGluZU1hcCwgdGltZWxpbmUsIGRlZmF1bHRWYWx1ZSwgMSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTbGlkZXIgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuc2xpZGVyKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGNvbnN0cmFpbnROYW1lIGluIG1hcC5zbGlkZXIpIHtcblx0XHRcdFx0Y29uc3QgY29uc3RyYWludE1hcCA9IG1hcC5zbGlkZXJbY29uc3RyYWludE5hbWVdO1xuXHRcdFx0XHRjb25zdCBjb25zdHJhaW50ID0gc2tlbGV0b25EYXRhLmZpbmRDb25zdHJhaW50KGNvbnN0cmFpbnROYW1lLCBTbGlkZXJEYXRhKTtcblx0XHRcdFx0aWYgKCFjb25zdHJhaW50KSB0aHJvdyBuZXcgRXJyb3IoYFNsaWRlciBub3QgZm91bmQ6ICR7Y29uc3RyYWludE5hbWV9YCk7XG5cdFx0XHRcdGNvbnN0IGluZGV4ID0gc2tlbGV0b25EYXRhLmNvbnN0cmFpbnRzLmluZGV4T2YoY29uc3RyYWludCk7XG5cblx0XHRcdFx0Zm9yIChjb25zdCB0aW1lbGluZU5hbWUgaW4gY29uc3RyYWludE1hcCkge1xuXHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lTWFwID0gY29uc3RyYWludE1hcFt0aW1lbGluZU5hbWVdO1xuXHRcdFx0XHRcdGNvbnN0IGtleU1hcCA9IHRpbWVsaW5lTWFwWzBdO1xuXHRcdFx0XHRcdGlmICgha2V5TWFwKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGNvbnN0IGZyYW1lcyA9IHRpbWVsaW5lTWFwLmxlbmd0aDtcblx0XHRcdFx0XHRzd2l0Y2ggKHRpbWVsaW5lTmFtZSkge1xuXHRcdFx0XHRcdFx0Y2FzZSBcInRpbWVcIjogcmVhZFRpbWVsaW5lMSh0aW1lbGluZXMsIHRpbWVsaW5lTWFwLCBuZXcgU2xpZGVyVGltZWxpbmUoZnJhbWVzLCBmcmFtZXMsIGluZGV4KSwgMSwgMSk7IGJyZWFrO1xuXHRcdFx0XHRcdFx0Y2FzZSBcIm1peFwiOiByZWFkVGltZWxpbmUxKHRpbWVsaW5lcywgdGltZWxpbmVNYXAsIG5ldyBTbGlkZXJNaXhUaW1lbGluZShmcmFtZXMsIGZyYW1lcywgaW5kZXgpLCAxLCAxKTsgYnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQXR0YWNobWVudCB0aW1lbGluZXMuXG5cdFx0aWYgKG1hcC5hdHRhY2htZW50cykge1xuXHRcdFx0Zm9yIChjb25zdCBhdHRhY2htZW50c05hbWUgaW4gbWFwLmF0dGFjaG1lbnRzKSB7XG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRzTWFwID0gbWFwLmF0dGFjaG1lbnRzW2F0dGFjaG1lbnRzTmFtZV07XG5cdFx0XHRcdGNvbnN0IHNraW4gPSBza2VsZXRvbkRhdGEuZmluZFNraW4oYXR0YWNobWVudHNOYW1lKTtcblx0XHRcdFx0aWYgKCFza2luKSB0aHJvdyBuZXcgRXJyb3IoYFNraW4gbm90IGZvdW5kOiAke2F0dGFjaG1lbnRzTmFtZX1gKTtcblx0XHRcdFx0Zm9yIChjb25zdCBzbG90TWFwTmFtZSBpbiBhdHRhY2htZW50c01hcCkge1xuXHRcdFx0XHRcdGNvbnN0IHNsb3RNYXAgPSBhdHRhY2htZW50c01hcFtzbG90TWFwTmFtZV07XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChzbG90TWFwTmFtZSk7XG5cdFx0XHRcdFx0aWYgKCFzbG90KSB0aHJvdyBuZXcgRXJyb3IoYEF0dGFjaG1lbnQgc2xvdCBub3QgZm91bmQ6ICR7c2xvdE1hcE5hbWV9YCk7XG5cdFx0XHRcdFx0Y29uc3Qgc2xvdEluZGV4ID0gc2xvdC5pbmRleDtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGF0dGFjaG1lbnRNYXBOYW1lIGluIHNsb3RNYXApIHtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRNYXAgPSBzbG90TWFwW2F0dGFjaG1lbnRNYXBOYW1lXTtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSA8VmVydGV4QXR0YWNobWVudD5za2luLmdldEF0dGFjaG1lbnQoc2xvdEluZGV4LCBhdHRhY2htZW50TWFwTmFtZSk7XG5cdFx0XHRcdFx0XHRpZiAoIWF0dGFjaG1lbnQpIHRocm93IG5ldyBFcnJvcihgVGltZWxpbmUgYXR0YWNobWVudCBub3QgZm91bmQ6ICR7YXR0YWNobWVudE1hcE5hbWV9YCk7XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgdGltZWxpbmVNYXBOYW1lIGluIGF0dGFjaG1lbnRNYXApIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgdGltZWxpbmVNYXAgPSBhdHRhY2htZW50TWFwW3RpbWVsaW5lTWFwTmFtZV07XG5cdFx0XHRcdFx0XHRcdGxldCBrZXlNYXAgPSB0aW1lbGluZU1hcFswXTtcblx0XHRcdFx0XHRcdFx0aWYgKCFrZXlNYXApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aW1lbGluZU1hcE5hbWUgPT09IFwiZGVmb3JtXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCB3ZWlnaHRlZCA9IGF0dGFjaG1lbnQuYm9uZXM7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgdmVydGljZXMgPSBhdHRhY2htZW50LnZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGRlZm9ybUxlbmd0aCA9IHdlaWdodGVkID8gdmVydGljZXMubGVuZ3RoIC8gMyAqIDIgOiB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRcdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBEZWZvcm1UaW1lbGluZSh0aW1lbGluZU1hcC5sZW5ndGgsIHRpbWVsaW5lTWFwLmxlbmd0aCwgc2xvdEluZGV4LCBhdHRhY2htZW50KTtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdGltZSA9IGdldFZhbHVlKGtleU1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGZyYW1lID0gMCwgYmV6aWVyID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgZGVmb3JtOiBOdW1iZXJBcnJheUxpa2U7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zdCB2ZXJ0aWNlc1ZhbHVlOiBBcnJheTxudW1iZXI+ID0gZ2V0VmFsdWUoa2V5TWFwLCBcInZlcnRpY2VzXCIsIG51bGwpO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCF2ZXJ0aWNlc1ZhbHVlKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZvcm0gPSB3ZWlnaHRlZCA/IFV0aWxzLm5ld0Zsb2F0QXJyYXkoZGVmb3JtTGVuZ3RoKSA6IHZlcnRpY2VzO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGRlZm9ybSA9IFV0aWxzLm5ld0Zsb2F0QXJyYXkoZGVmb3JtTGVuZ3RoKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc3RhcnQgPSA8bnVtYmVyPmdldFZhbHVlKGtleU1hcCwgXCJvZmZzZXRcIiwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFV0aWxzLmFycmF5Q29weSh2ZXJ0aWNlc1ZhbHVlLCAwLCBkZWZvcm0sIHN0YXJ0LCB2ZXJ0aWNlc1ZhbHVlLmxlbmd0aCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzY2FsZSAhPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZvciAobGV0IGkgPSBzdGFydCwgbiA9IGkgKyB2ZXJ0aWNlc1ZhbHVlLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSAqPSBzY2FsZTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIXdlaWdodGVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkZWZvcm1MZW5ndGg7IGkrKylcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZm9ybVtpXSArPSB2ZXJ0aWNlc1tpXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgZGVmb3JtKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG5leHRNYXAgPSB0aW1lbGluZU1hcFtmcmFtZSArIDFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lLnNocmluayhiZXppZXIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUyID0gZ2V0VmFsdWUobmV4dE1hcCwgXCJ0aW1lXCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoY3VydmUpIGJlemllciA9IHJlYWRDdXJ2ZShjdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCAwLCAxLCAxKTtcblx0XHRcdFx0XHRcdFx0XHRcdHRpbWUgPSB0aW1lMjtcblx0XHRcdFx0XHRcdFx0XHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0aW1lbGluZU1hcE5hbWUgPT09IFwic2VxdWVuY2VcIikge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IFNlcXVlbmNlVGltZWxpbmUodGltZWxpbmVNYXAubGVuZ3RoLCBzbG90SW5kZXgsIGF0dGFjaG1lbnQgYXMgQXR0YWNobWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IGxhc3REZWxheSA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgZnJhbWUgPSAwOyBmcmFtZSA8IHRpbWVsaW5lTWFwLmxlbmd0aDsgZnJhbWUrKykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgZGVsYXkgPSBnZXRWYWx1ZShrZXlNYXAsIFwiZGVsYXlcIiwgbGFzdERlbGF5KTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRpbWUgPSBnZXRWYWx1ZShrZXlNYXAsIFwidGltZVwiLCAwKTtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1vZGUgPSBTZXF1ZW5jZU1vZGVbZ2V0VmFsdWUoa2V5TWFwLCBcIm1vZGVcIiwgXCJob2xkXCIpXSBhcyB1bmtub3duIGFzIG51bWJlcjtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gZ2V0VmFsdWUoa2V5TWFwLCBcImluZGV4XCIsIDApO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIG1vZGUsIGluZGV4LCBkZWxheSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRsYXN0RGVsYXkgPSBkZWxheTtcblx0XHRcdFx0XHRcdFx0XHRcdGtleU1hcCA9IHRpbWVsaW5lTWFwW2ZyYW1lICsgMV07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIERyYXcgb3JkZXIgdGltZWxpbmUuXG5cdFx0aWYgKG1hcC5kcmF3T3JkZXIpIHtcblx0XHRcdGNvbnN0IHRpbWVsaW5lID0gbmV3IERyYXdPcmRlclRpbWVsaW5lKG1hcC5kcmF3T3JkZXIubGVuZ3RoKTtcblx0XHRcdGNvbnN0IHNsb3RDb3VudCA9IHNrZWxldG9uRGF0YS5zbG90cy5sZW5ndGg7XG5cdFx0XHRsZXQgZnJhbWUgPSAwXG5cdFx0XHRmb3IgKGNvbnN0IGRyYXdPcmRlck1hcCBvZiAobWFwLmRyYXdPcmRlciBhcyBEcmF3T3JkZXJLZXlzVHlwZVtdKSkge1xuXHRcdFx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSsrLCBnZXRWYWx1ZShkcmF3T3JkZXJNYXAsIFwidGltZVwiLCAwKSwgcmVhZERyYXdPcmRlcihza2VsZXRvbkRhdGEsIGRyYXdPcmRlck1hcCwgc2xvdENvdW50LCBudWxsKSk7XG5cdFx0XHR9XG5cdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0fVxuXG5cdFx0Ly8gRHJhdyBvcmRlciBmb2xkZXIgdGltZWxpbmVzLlxuXHRcdGlmIChtYXAuZHJhd09yZGVyRm9sZGVyKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHRpbWVsaW5lTWFwIG9mIG1hcC5kcmF3T3JkZXJGb2xkZXIpIHtcblx0XHRcdFx0Y29uc3Qgc2xvdEVudHJpZXMgPSBnZXRWYWx1ZSh0aW1lbGluZU1hcCwgXCJzbG90c1wiLCBbXSkgYXMgc3RyaW5nW107XG5cdFx0XHRcdGNvbnN0IGZvbGRlclNsb3RzID0gbmV3IEFycmF5PG51bWJlcj4oc2xvdEVudHJpZXMubGVuZ3RoKTtcblx0XHRcdFx0bGV0IGlpID0gMDtcblx0XHRcdFx0Zm9yIChjb25zdCBzbG90RW50cnkgb2Ygc2xvdEVudHJpZXMpIHtcblx0XHRcdFx0XHRjb25zdCBzbG90ID0gc2tlbGV0b25EYXRhLmZpbmRTbG90KHNsb3RFbnRyeSk7XG5cdFx0XHRcdFx0aWYgKCFzbG90KSB0aHJvdyBuZXcgRXJyb3IoYERyYXcgb3JkZXIgZm9sZGVyIHNsb3Qgbm90IGZvdW5kOiAke3Nsb3RFbnRyeX1gKTtcblx0XHRcdFx0XHRmb2xkZXJTbG90c1tpaSsrXSA9IHNsb3QuaW5kZXg7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBkcmF3T3JkZXJGb2xkZXJFbnRyaWVzID0gZ2V0VmFsdWUodGltZWxpbmVNYXAsIFwia2V5c1wiLCBbXSkgYXMgRHJhd09yZGVyS2V5c1R5cGVbXTtcblx0XHRcdFx0Y29uc3QgdGltZWxpbmUgPSBuZXcgRHJhd09yZGVyRm9sZGVyVGltZWxpbmUoZHJhd09yZGVyRm9sZGVyRW50cmllcy5sZW5ndGgsIGZvbGRlclNsb3RzLCBza2VsZXRvbkRhdGEuc2xvdHMubGVuZ3RoKTtcblx0XHRcdFx0bGV0IGZyYW1lID0gMDtcblx0XHRcdFx0Zm9yIChjb25zdCBkcmF3T3JkZXJGb2xkZXJNYXAgb2YgZHJhd09yZGVyRm9sZGVyRW50cmllcykge1xuXHRcdFx0XHRcdHRpbWVsaW5lLnNldEZyYW1lKGZyYW1lKyssIGdldFZhbHVlKGRyYXdPcmRlckZvbGRlck1hcCwgXCJ0aW1lXCIsIDApLCByZWFkRHJhd09yZGVyKHNrZWxldG9uRGF0YSwgZHJhd09yZGVyRm9sZGVyTWFwLCBmb2xkZXJTbG90cy5sZW5ndGgsIGZvbGRlclNsb3RzKSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGltZWxpbmVzLnB1c2godGltZWxpbmUpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEV2ZW50IHRpbWVsaW5lLlxuXHRcdGlmIChtYXAuZXZlbnRzKSB7XG5cdFx0XHRjb25zdCB0aW1lbGluZSA9IG5ldyBFdmVudFRpbWVsaW5lKG1hcC5ldmVudHMubGVuZ3RoKTtcblx0XHRcdGxldCBmcmFtZSA9IDA7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG1hcC5ldmVudHMubGVuZ3RoOyBpKyssIGZyYW1lKyspIHtcblx0XHRcdFx0Y29uc3QgZXZlbnRNYXAgPSBtYXAuZXZlbnRzW2ldO1xuXHRcdFx0XHRjb25zdCBkYXRhID0gc2tlbGV0b25EYXRhLmZpbmRFdmVudChldmVudE1hcC5uYW1lKTtcblx0XHRcdFx0aWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYEV2ZW50IG5vdCBmb3VuZDogJHtldmVudE1hcC5uYW1lfWApO1xuXHRcdFx0XHRjb25zdCBzZXR1cCA9IGRhdGEuc2V0dXBQb3NlO1xuXHRcdFx0XHRjb25zdCBldmVudCA9IG5ldyBFdmVudChVdGlscy50b1NpbmdsZVByZWNpc2lvbihnZXRWYWx1ZShldmVudE1hcCwgXCJ0aW1lXCIsIDApKSwgZGF0YSk7XG5cdFx0XHRcdGV2ZW50LmludFZhbHVlID0gZ2V0VmFsdWUoZXZlbnRNYXAsIFwiaW50XCIsIHNldHVwLmludFZhbHVlKTtcblx0XHRcdFx0ZXZlbnQuZmxvYXRWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcImZsb2F0XCIsIHNldHVwLmZsb2F0VmFsdWUpO1xuXHRcdFx0XHRldmVudC5zdHJpbmdWYWx1ZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInN0cmluZ1wiLCBzZXR1cC5zdHJpbmdWYWx1ZSk7XG5cdFx0XHRcdGlmIChldmVudC5kYXRhLmF1ZGlvUGF0aCkge1xuXHRcdFx0XHRcdGV2ZW50LnZvbHVtZSA9IGdldFZhbHVlKGV2ZW50TWFwLCBcInZvbHVtZVwiLCBzZXR1cC52b2x1bWUpO1xuXHRcdFx0XHRcdGV2ZW50LmJhbGFuY2UgPSBnZXRWYWx1ZShldmVudE1hcCwgXCJiYWxhbmNlXCIsIHNldHVwLnZvbHVtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIGV2ZW50KTtcblx0XHRcdH1cblx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHR9XG5cblx0XHRsZXQgZHVyYXRpb24gPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gdGltZWxpbmVzLmxlbmd0aDsgaSA8IG47IGkrKylcblx0XHRcdGR1cmF0aW9uID0gTWF0aC5tYXgoZHVyYXRpb24sIHRpbWVsaW5lc1tpXS5nZXREdXJhdGlvbigpKTtcblxuXHRcdGNvbnN0IGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24obmFtZSwgdGltZWxpbmVzLCBkdXJhdGlvbik7XG5cdFx0Y29uc3QgY29sb3IgPSBnZXRWYWx1ZShtYXAsIFwiY29sb3JcIiwgbnVsbCk7XG5cdFx0aWYgKGNvbG9yICE9PSBudWxsKSBhbmltYXRpb24uY29sb3Iuc2V0RnJvbVN0cmluZyhjb2xvcik7XG5cblx0XHRza2VsZXRvbkRhdGEuYW5pbWF0aW9ucy5wdXNoKGFuaW1hdGlvbik7XG5cdH1cbn1cblxuY2xhc3MgTGlua2VkTWVzaCB7XG5cdHNvdXJjZTogc3RyaW5nOyBza2luOiBzdHJpbmc7XG5cdHNsb3RJbmRleDogbnVtYmVyOyBzb3VyY2VJbmRleDogbnVtYmVyO1xuXHRtZXNoOiBNZXNoQXR0YWNobWVudDtcblx0aW5oZXJpdFRpbWVsaW5lczogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvciAobWVzaDogTWVzaEF0dGFjaG1lbnQsIHNraW46IHN0cmluZywgc2xvdEluZGV4OiBudW1iZXIsIHNvdXJjZUluZGV4OiBudW1iZXIsIHNvdXJjZTogc3RyaW5nLFxuXHRcdGluaGVyaXRUaW1lbGluZXM6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm1lc2ggPSBtZXNoO1xuXHRcdHRoaXMuc2tpbiA9IHNraW47XG5cdFx0dGhpcy5zbG90SW5kZXggPSBzbG90SW5kZXg7XG5cdFx0dGhpcy5zb3VyY2VJbmRleCA9IHNvdXJjZUluZGV4O1xuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXHRcdHRoaXMuaW5oZXJpdFRpbWVsaW5lcyA9IGluaGVyaXRUaW1lbGluZXM7XG5cdH1cbn1cblxudHlwZSBDdXJ2ZVR5cGUgPSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8IFwic3RlcHBlZFwiO1xudHlwZSBUaW1lbGluZTFLZXlzVHlwZSA9IHsgdmFsdWU6IG51bWJlciwgdGltZT86IG51bWJlciwgY3VydmU/OiBDdXJ2ZVR5cGUgfTtcbnR5cGUgVGltZWxpbmUyS2V5c1R5cGUgPSBUaW1lbGluZTFLZXlzVHlwZSAmIHsgeD86IG51bWJlciwgeT86IG51bWJlciB9O1xuXG5mdW5jdGlvbiByZWFkVGltZWxpbmUxICh0aW1lbGluZXM6IEFycmF5PFRpbWVsaW5lPiwga2V5czogVGltZWxpbmUxS2V5c1R5cGVbXSwgdGltZWxpbmU6IEN1cnZlVGltZWxpbmUxLCBkZWZhdWx0VmFsdWU6IG51bWJlciwgc2NhbGU6IG51bWJlcikge1xuXHRsZXQga2V5TWFwID0ga2V5c1swXTtcblx0bGV0IHRpbWUgPSBrZXlNYXAudGltZSA/PyAwO1xuXHRsZXQgdmFsdWUgPSAoa2V5TWFwLnZhbHVlID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0bGV0IGJlemllciA9IDA7XG5cblx0Zm9yIChsZXQgZnJhbWUgPSAwOyA7IGZyYW1lKyspIHtcblx0XHR0aW1lbGluZS5zZXRGcmFtZShmcmFtZSwgdGltZSwgdmFsdWUpO1xuXHRcdGNvbnN0IG5leHRNYXAgPSBrZXlzW2ZyYW1lICsgMV07XG5cdFx0aWYgKCFuZXh0TWFwKSB7XG5cdFx0XHR0aW1lbGluZS5zaHJpbmsoYmV6aWVyKTtcblx0XHRcdHRpbWVsaW5lcy5wdXNoKHRpbWVsaW5lKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdGltZTIgPSBuZXh0TWFwLnRpbWUgPz8gMDtcblx0XHRjb25zdCB2YWx1ZTIgPSAobmV4dE1hcC52YWx1ZSA/PyBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdFx0aWYgKGtleU1hcC5jdXJ2ZSkgYmV6aWVyID0gcmVhZEN1cnZlKGtleU1hcC5jdXJ2ZSwgdGltZWxpbmUsIGJlemllciwgZnJhbWUsIDAsIHRpbWUsIHRpbWUyLCB2YWx1ZSwgdmFsdWUyLCBzY2FsZSk7XG5cdFx0dGltZSA9IHRpbWUyO1xuXHRcdHZhbHVlID0gdmFsdWUyO1xuXHRcdGtleU1hcCA9IG5leHRNYXA7XG5cdH1cbn1cblxuZnVuY3Rpb24gcmVhZFRpbWVsaW5lMiAodGltZWxpbmVzOiBBcnJheTxUaW1lbGluZT4sIGtleXM6IFRpbWVsaW5lMktleXNUeXBlW10sIHRpbWVsaW5lOiBCb25lVGltZWxpbmUyLCBuYW1lMTogXCJ4XCIsIG5hbWUyOiBcInlcIiwgZGVmYXVsdFZhbHVlOiBudW1iZXIsIHNjYWxlOiBudW1iZXIpIHtcblx0bGV0IGtleU1hcCA9IGtleXNbMF07XG5cdGxldCB0aW1lID0ga2V5TWFwLnRpbWUgPz8gMDtcblx0bGV0IHZhbHVlMSA9IChrZXlNYXBbbmFtZTFdID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0bGV0IHZhbHVlMiA9IChrZXlNYXBbbmFtZTJdID8/IGRlZmF1bHRWYWx1ZSkgKiBzY2FsZTtcblx0bGV0IGJlemllciA9IDA7XG5cdGZvciAobGV0IGZyYW1lID0gMDsgOyBmcmFtZSsrKSB7XG5cdFx0dGltZWxpbmUuc2V0RnJhbWUoZnJhbWUsIHRpbWUsIHZhbHVlMSwgdmFsdWUyKTtcblx0XHRjb25zdCBuZXh0TWFwID0ga2V5c1tmcmFtZSArIDFdO1xuXHRcdGlmICghbmV4dE1hcCkge1xuXHRcdFx0dGltZWxpbmUuc2hyaW5rKGJlemllcik7XG5cdFx0XHR0aW1lbGluZXMucHVzaCh0aW1lbGluZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IHRpbWUyID0gbmV4dE1hcC50aW1lID8/IDA7XG5cdFx0Y29uc3QgbnZhbHVlMSA9IChuZXh0TWFwW25hbWUxXSA/PyBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdFx0Y29uc3QgbnZhbHVlMiA9IChuZXh0TWFwW25hbWUyXSA/PyBkZWZhdWx0VmFsdWUpICogc2NhbGU7XG5cdFx0Y29uc3QgY3VydmUgPSBrZXlNYXAuY3VydmU7XG5cdFx0aWYgKGN1cnZlKSB7XG5cdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAwLCB0aW1lLCB0aW1lMiwgdmFsdWUxLCBudmFsdWUxLCBzY2FsZSk7XG5cdFx0XHRiZXppZXIgPSByZWFkQ3VydmUoY3VydmUsIHRpbWVsaW5lLCBiZXppZXIsIGZyYW1lLCAxLCB0aW1lLCB0aW1lMiwgdmFsdWUyLCBudmFsdWUyLCBzY2FsZSk7XG5cdFx0fVxuXHRcdHRpbWUgPSB0aW1lMjtcblx0XHR2YWx1ZTEgPSBudmFsdWUxO1xuXHRcdHZhbHVlMiA9IG52YWx1ZTI7XG5cdFx0a2V5TWFwID0gbmV4dE1hcDtcblx0fVxufVxuXG50eXBlIERyYXdPcmRlcktleXNUeXBlID0geyBvZmZzZXRzPzogeyBzbG90OiBzdHJpbmcsIG9mZnNldDogbnVtYmVyIH1bXSB9O1xuXG4vKiogQHBhcmFtIGZvbGRlclNsb3RzIFNsb3QgbmFtZXMgYXJlIHJlc29sdmVkIHRvIHBvc2l0aW9ucyB3aXRoaW4gdGhpcyBhcnJheS4gSWYgbnVsbCwgc2xvdCBpbmRpY2VzIGFyZSB1c2VkIGFzIHBvc2l0aW9ucy4gKi9cbmZ1bmN0aW9uIHJlYWREcmF3T3JkZXIgKHNrZWxldG9uRGF0YTogU2tlbGV0b25EYXRhLCBrZXlzOiBEcmF3T3JkZXJLZXlzVHlwZSwgc2xvdENvdW50OiBudW1iZXIsIGZvbGRlclNsb3RzOiBudW1iZXJbXSB8IG51bGwpOiBudW1iZXJbXSB8IG51bGwge1xuXHRjb25zdCBjaGFuZ2VzID0ga2V5cy5vZmZzZXRzO1xuXHRpZiAoIWNoYW5nZXMpIHJldHVybiBudWxsOyAvLyBTZXR1cCBkcmF3IG9yZGVyLlxuXHRjb25zdCBkcmF3T3JkZXIgPSBuZXcgQXJyYXk8bnVtYmVyPihzbG90Q291bnQpLmZpbGwoLTEpO1xuXHRjb25zdCB1bmNoYW5nZWQgPSBuZXcgQXJyYXk8bnVtYmVyPihzbG90Q291bnQgLSBjaGFuZ2VzLmxlbmd0aCk7XG5cdGxldCBvcmlnaW5hbEluZGV4ID0gMCwgdW5jaGFuZ2VkSW5kZXggPSAwO1xuXHRmb3IgKGNvbnN0IG9mZnNldE1hcCBvZiBjaGFuZ2VzKSB7XG5cdFx0Y29uc3Qgc2xvdCA9IHNrZWxldG9uRGF0YS5maW5kU2xvdChvZmZzZXRNYXAuc2xvdCk7XG5cdFx0aWYgKHNsb3QgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGBEcmF3IG9yZGVyIHNsb3Qgbm90IGZvdW5kOiAke29mZnNldE1hcC5zbG90fWApO1xuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0aWYgKCFmb2xkZXJTbG90cylcblx0XHRcdGluZGV4ID0gc2xvdC5pbmRleDtcblx0XHRlbHNlIHtcblx0XHRcdGluZGV4ID0gLTE7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RDb3VudDsgaSsrKSB7XG5cdFx0XHRcdGlmIChmb2xkZXJTbG90c1tpXSA9PT0gc2xvdC5pbmRleCkge1xuXHRcdFx0XHRcdGluZGV4ID0gaTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEVycm9yKGBTbG90IG5vdCBpbiBmb2xkZXI6ICR7b2Zmc2V0TWFwLnNsb3R9YCk7XG5cdFx0fVxuXHRcdC8vIENvbGxlY3QgdW5jaGFuZ2VkIGl0ZW1zLlxuXHRcdHdoaWxlIChvcmlnaW5hbEluZGV4ICE9PSBpbmRleClcblx0XHRcdHVuY2hhbmdlZFt1bmNoYW5nZWRJbmRleCsrXSA9IG9yaWdpbmFsSW5kZXgrKztcblx0XHQvLyBTZXQgY2hhbmdlZCBpdGVtcy5cblx0XHRkcmF3T3JkZXJbb3JpZ2luYWxJbmRleCArIG9mZnNldE1hcC5vZmZzZXRdID0gb3JpZ2luYWxJbmRleCsrO1xuXHR9XG5cdC8vIENvbGxlY3QgcmVtYWluaW5nIHVuY2hhbmdlZCBpdGVtcy5cblx0d2hpbGUgKG9yaWdpbmFsSW5kZXggPCBzbG90Q291bnQpXG5cdFx0dW5jaGFuZ2VkW3VuY2hhbmdlZEluZGV4KytdID0gb3JpZ2luYWxJbmRleCsrO1xuXHQvLyBGaWxsIGluIHVuY2hhbmdlZCBpdGVtcy5cblx0Zm9yIChsZXQgaSA9IHNsb3RDb3VudCAtIDE7IGkgPj0gMDsgaS0tKVxuXHRcdGlmIChkcmF3T3JkZXJbaV0gPT09IC0xKSBkcmF3T3JkZXJbaV0gPSB1bmNoYW5nZWRbLS11bmNoYW5nZWRJbmRleF07XG5cdHJldHVybiBkcmF3T3JkZXI7XG59XG5cbmZ1bmN0aW9uIHJlYWRDdXJ2ZSAoY3VydmU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHwgXCJzdGVwcGVkXCIsIHRpbWVsaW5lOiBDdXJ2ZVRpbWVsaW5lLCBiZXppZXI6IG51bWJlciwgZnJhbWU6IG51bWJlciwgdmFsdWU6IG51bWJlciwgdGltZTE6IG51bWJlciwgdGltZTI6IG51bWJlcixcblx0dmFsdWUxOiBudW1iZXIsIHZhbHVlMjogbnVtYmVyLCBzY2FsZTogbnVtYmVyKSB7XG5cdGlmIChjdXJ2ZSA9PT0gXCJzdGVwcGVkXCIpIHtcblx0XHR0aW1lbGluZS5zZXRTdGVwcGVkKGZyYW1lKTtcblx0XHRyZXR1cm4gYmV6aWVyO1xuXHR9XG5cdGNvbnN0IGkgPSB2YWx1ZSA8PCAyO1xuXHRjb25zdCBjeDEgPSBjdXJ2ZVtpXTtcblx0Y29uc3QgY3kxID0gY3VydmVbaSArIDFdICogc2NhbGU7XG5cdGNvbnN0IGN4MiA9IGN1cnZlW2kgKyAyXTtcblx0Y29uc3QgY3kyID0gY3VydmVbaSArIDNdICogc2NhbGU7XG5cdHRpbWVsaW5lLnNldEJlemllcihiZXppZXIsIGZyYW1lLCB2YWx1ZSwgdGltZTEsIHZhbHVlMSwgY3gxLCBjeTEsIGN4MiwgY3kyLCB0aW1lMiwgdmFsdWUyKTtcblx0cmV0dXJuIGJlemllciArIDE7XG59XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogaXQgaXMgYW55IHVudGlsIHdlIGRlZmluZSBhIHNjaGVtYVxuZnVuY3Rpb24gZ2V0VmFsdWUgKG1hcDogYW55LCBwcm9wZXJ0eTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IGFueSkge1xuXHRyZXR1cm4gbWFwW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkID8gbWFwW3Byb3BlcnR5XSA6IGRlZmF1bHRWYWx1ZTtcbn1cbiJdfQ==
|