@esotericsoftware/spine-webgl 4.3.1 → 4.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -39,10 +39,12 @@ export declare class SkeletonRenderer {
39
39
  private twoColorTint;
40
40
  private renderable;
41
41
  private clipper;
42
- private temp;
43
- private temp2;
44
- private temp3;
45
- private temp4;
42
+ /**
43
+ * Batches additive slots together with normal slots by rendering additive slots with premultiplied alpha RGB and zero alpha,
44
+ * while using normal PMA blending. This reduces draw calls for normal/additive/normal sequences with the same texture.
45
+ * Disable this if rendering to a transparent target and the accumulated destination alpha from additive blending must be preserved.
46
+ */
47
+ pmaAdditiveBatching: boolean;
46
48
  constructor(context: ManagedWebGLRenderingContext, twoColorTint?: boolean);
47
49
  draw(batcher: PolygonBatcher, skeleton: Skeleton, slotRangeStart?: number, slotRangeEnd?: number, transformer?: VertexTransformer | null): void;
48
50
  /** Returns the {@link SkeletonClipping} used by this renderer for use with e.g. {@link Skeleton.getBounds} **/
@@ -26,7 +26,7 @@
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 { ClippingAttachment, Color, MeshAttachment, RegionAttachment, SkeletonClipping, Utils, Vector2 } from "@esotericsoftware/spine-core";
29
+ import { BlendMode, ClippingAttachment, Color, MeshAttachment, RegionAttachment, SkeletonClipping, Utils } from "@esotericsoftware/spine-core";
30
30
  class Renderable {
31
31
  vertices;
32
32
  numVertices;
@@ -47,10 +47,12 @@ export class SkeletonRenderer {
47
47
  twoColorTint = false;
48
48
  renderable = new Renderable([], 0, 0);
49
49
  clipper = new SkeletonClipping();
50
- temp = new Vector2();
51
- temp2 = new Vector2();
52
- temp3 = new Color();
53
- temp4 = new Color();
50
+ /**
51
+ * Batches additive slots together with normal slots by rendering additive slots with premultiplied alpha RGB and zero alpha,
52
+ * while using normal PMA blending. This reduces draw calls for normal/additive/normal sequences with the same texture.
53
+ * Disable this if rendering to a transparent target and the accumulated destination alpha from additive blending must be preserved.
54
+ */
55
+ pmaAdditiveBatching = true;
54
56
  constructor(context, twoColorTint = true) {
55
57
  this.twoColorTint = twoColorTint;
56
58
  if (twoColorTint)
@@ -133,7 +135,9 @@ export class SkeletonRenderer {
133
135
  finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r * alpha;
134
136
  finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g * alpha;
135
137
  finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b * alpha;
136
- finalColor.a = alpha;
138
+ const slotBlendMode = slot.data.blendMode;
139
+ const additiveBlend = this.pmaAdditiveBatching && slotBlendMode === BlendMode.Additive;
140
+ finalColor.a = additiveBlend ? 0 : alpha;
137
141
  const darkColor = this.tempColor2;
138
142
  if (!pose.darkColor)
139
143
  darkColor.set(0, 0, 0, 1.0);
@@ -143,9 +147,9 @@ export class SkeletonRenderer {
143
147
  darkColor.b = pose.darkColor.b * alpha;
144
148
  darkColor.a = 1;
145
149
  }
146
- const slotBlendMode = slot.data.blendMode;
147
- if (slotBlendMode !== blendMode) {
148
- blendMode = slotBlendMode;
150
+ const batchBlendMode = additiveBlend ? BlendMode.Normal : slotBlendMode;
151
+ if (batchBlendMode !== blendMode) {
152
+ blendMode = batchBlendMode;
149
153
  batcher.setBlendMode(blendMode);
150
154
  }
151
155
  if (clipper.isClipping() && clipper.clipTriangles(renderable.vertices, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint, vertexSize)) {
@@ -162,7 +166,7 @@ export class SkeletonRenderer {
162
166
  verts[v] = finalColor.r;
163
167
  verts[v + 1] = finalColor.g;
164
168
  verts[v + 2] = finalColor.b;
165
- verts[v + 3] = alpha;
169
+ verts[v + 3] = finalColor.a;
166
170
  verts[v + 4] = uvs[u];
167
171
  verts[v + 5] = uvs[u + 1];
168
172
  }
@@ -172,7 +176,7 @@ export class SkeletonRenderer {
172
176
  verts[v] = finalColor.r;
173
177
  verts[v + 1] = finalColor.g;
174
178
  verts[v + 2] = finalColor.b;
175
- verts[v + 3] = alpha;
179
+ verts[v + 3] = finalColor.a;
176
180
  verts[v + 4] = uvs[u];
177
181
  verts[v + 5] = uvs[u + 1];
178
182
  verts[v + 6] = darkColor.r;
@@ -196,4 +200,4 @@ export class SkeletonRenderer {
196
200
  return this.clipper;
197
201
  }
198
202
  }
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQWtCLGtCQUFrQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQXdCLGdCQUFnQixFQUFpQixnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFNbE0sTUFBTSxVQUFVO0lBQ0s7SUFBa0M7SUFBNEI7SUFBbEYsWUFBb0IsUUFBeUIsRUFBUyxXQUFtQixFQUFTLFNBQWlCO1FBQS9FLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBUyxjQUFTLEdBQVQsU0FBUyxDQUFRO0lBQUksQ0FBQztDQUN4RztBQUFBLENBQUM7QUFJRixNQUFNLE9BQU8sZ0JBQWdCO0lBQzVCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRW5DLFNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3hCLFVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFFBQVEsQ0FBa0I7SUFDMUIsVUFBVSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsVUFBVSxHQUFlLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEQsT0FBTyxHQUFxQixJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDbkQsSUFBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDckIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDdEIsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDcEIsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFFNUIsWUFBYSxPQUFxQyxFQUFFLGVBQXdCLElBQUk7UUFDL0UsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsSUFBSSxZQUFZO1lBQ2YsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELElBQUksQ0FBRSxPQUF1QixFQUFFLFFBQWtCLEVBQUUsaUJBQXlCLENBQUMsQ0FBQyxFQUFFLGVBQXVCLENBQUMsQ0FBQyxFQUFFLGNBQXdDLElBQUk7UUFDdEosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksU0FBUyxHQUFxQixJQUFJLENBQUM7UUFFdkMsTUFBTSxVQUFVLEdBQWUsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMvQyxJQUFJLEdBQW9CLENBQUM7UUFDekIsSUFBSSxTQUF3QixDQUFDO1FBQzdCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQ2pELElBQUksZUFBc0IsQ0FBQztRQUMzQixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksY0FBYyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsU0FBUztZQUNWLENBQUM7WUFFRCxJQUFJLGNBQWMsSUFBSSxDQUFDLElBQUksY0FBYyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9ELE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUVELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN0QixTQUFTO1lBQ1YsQ0FBQztZQUVELElBQUksWUFBWSxJQUFJLENBQUMsSUFBSSxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDM0QsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ25DLElBQUksT0FBa0IsQ0FBQztZQUN2QixJQUFJLFVBQVUsWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1QyxVQUFVLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3BDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO2dCQUMzQixVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7Z0JBRXZDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2xELFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFdkcsU0FBUyxHQUFHLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztnQkFDNUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQW9CLENBQUM7Z0JBQ2hFLGVBQWUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxVQUFVLFlBQVksY0FBYyxFQUFFLENBQUM7Z0JBQ2pELFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDcEMsVUFBVSxDQUFDLFdBQVcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDL0QsVUFBVSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztnQkFFM0QsSUFBSSxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3ZELFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakYsQ0FBQztnQkFDRCxVQUFVLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN2SCxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFFakMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDckMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFFbEQsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBb0IsQ0FBQztnQkFDaEUsR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3JDLGVBQWUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sSUFBSSxVQUFVLFlBQVksa0JBQWtCLEVBQUUsQ0FBQztnQkFDckQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QyxTQUFTO1lBQ1YsQ0FBQztpQkFBTSxDQUFDO2dCQUNQLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RCLFNBQVM7WUFDVixDQUFDO1lBRUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUM3QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNsQyxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQztnQkFDaEUsVUFBVSxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3pFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6RSxVQUFVLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekUsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztvQkFDbEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztxQkFDeEIsQ0FBQztvQkFDTCxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDdkMsU0FBUyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQ3ZDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN2QyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsQ0FBQztnQkFFRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDMUMsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7b0JBQ2pDLFNBQVMsR0FBRyxhQUFhLENBQUM7b0JBQzFCLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO29CQUMzSixNQUFNLGVBQWUsR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7b0JBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO29CQUNsRCxJQUFJLFdBQVc7d0JBQUUsV0FBVyxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUNsRixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDMUQsQ0FBQztxQkFBTSxDQUFDO29CQUNQLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUNqRixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDeEIsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDOzRCQUM1QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7NEJBQzVCLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDOzRCQUNyQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdEIsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUMzQixDQUFDO29CQUNGLENBQUM7eUJBQU0sQ0FBQzt3QkFDUCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7NEJBQ2pGLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDOzRCQUN4QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7NEJBQzVCLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQzs0QkFDNUIsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3JCLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUN0QixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NEJBQzFCLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDM0IsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOzRCQUMzQixLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7NEJBQzNCLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQztvQkFDRixDQUFDO29CQUNELE1BQU0sSUFBSSxHQUFJLFVBQVUsQ0FBQyxRQUF5QixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNyRixJQUFJLFdBQVc7d0JBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDcEYsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0YsQ0FBQztZQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsK0dBQStHO0lBQ3hHLG1CQUFtQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgdHlwZSBCbGVuZE1vZGUsIENsaXBwaW5nQXR0YWNobWVudCwgQ29sb3IsIE1lc2hBdHRhY2htZW50LCB0eXBlIE51bWJlckFycmF5TGlrZSwgUmVnaW9uQXR0YWNobWVudCwgdHlwZSBTa2VsZXRvbiwgU2tlbGV0b25DbGlwcGluZywgVXRpbHMsIFZlY3RvcjIgfSBmcm9tIFwiQGVzb3Rlcmljc29mdHdhcmUvc3BpbmUtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBHTFRleHR1cmUgfSBmcm9tIFwiLi9HTFRleHR1cmUuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9seWdvbkJhdGNoZXIgfSBmcm9tIFwiLi9Qb2x5Z29uQmF0Y2hlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0IH0gZnJvbSBcIi4vV2ViR0wuanNcIjtcblxuXG5jbGFzcyBSZW5kZXJhYmxlIHtcblx0Y29uc3RydWN0b3IgKHB1YmxpYyB2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCBwdWJsaWMgbnVtVmVydGljZXM6IG51bWJlciwgcHVibGljIG51bUZsb2F0czogbnVtYmVyKSB7IH1cbn07XG5cbmV4cG9ydCB0eXBlIFZlcnRleFRyYW5zZm9ybWVyID0gKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIG51bVZlcnRpY2VzOiBudW1iZXIsIHN0cmlkZTogbnVtYmVyKSA9PiB2b2lkO1xuXG5leHBvcnQgY2xhc3MgU2tlbGV0b25SZW5kZXJlciB7XG5cdHN0YXRpYyBRVUFEX1RSSUFOR0xFUyA9IFswLCAxLCAyLCAyLCAzLCAwXTtcblxuXHRwcml2YXRlIHRlbXBDb2xvciA9IG5ldyBDb2xvcigpO1xuXHRwcml2YXRlIHRlbXBDb2xvcjIgPSBuZXcgQ29sb3IoKTtcblx0cHJpdmF0ZSB2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlO1xuXHRwcml2YXRlIHZlcnRleFNpemUgPSAyICsgMiArIDQ7XG5cdHByaXZhdGUgdHdvQ29sb3JUaW50ID0gZmFsc2U7XG5cdHByaXZhdGUgcmVuZGVyYWJsZTogUmVuZGVyYWJsZSA9IG5ldyBSZW5kZXJhYmxlKFtdLCAwLCAwKTtcblx0cHJpdmF0ZSBjbGlwcGVyOiBTa2VsZXRvbkNsaXBwaW5nID0gbmV3IFNrZWxldG9uQ2xpcHBpbmcoKTtcblx0cHJpdmF0ZSB0ZW1wID0gbmV3IFZlY3RvcjIoKTtcblx0cHJpdmF0ZSB0ZW1wMiA9IG5ldyBWZWN0b3IyKCk7XG5cdHByaXZhdGUgdGVtcDMgPSBuZXcgQ29sb3IoKTtcblx0cHJpdmF0ZSB0ZW1wNCA9IG5ldyBDb2xvcigpO1xuXG5cdGNvbnN0cnVjdG9yIChjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0d29Db2xvclRpbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG5cdFx0dGhpcy50d29Db2xvclRpbnQgPSB0d29Db2xvclRpbnQ7XG5cdFx0aWYgKHR3b0NvbG9yVGludClcblx0XHRcdHRoaXMudmVydGV4U2l6ZSArPSA0O1xuXHRcdHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHRoaXMudmVydGV4U2l6ZSAqIDEwMjQpO1xuXHR9XG5cblx0ZHJhdyAoYmF0Y2hlcjogUG9seWdvbkJhdGNoZXIsIHNrZWxldG9uOiBTa2VsZXRvbiwgc2xvdFJhbmdlU3RhcnQ6IG51bWJlciA9IC0xLCBzbG90UmFuZ2VFbmQ6IG51bWJlciA9IC0xLCB0cmFuc2Zvcm1lcjogVmVydGV4VHJhbnNmb3JtZXIgfCBudWxsID0gbnVsbCkge1xuXHRcdGNvbnN0IGNsaXBwZXIgPSB0aGlzLmNsaXBwZXI7XG5cdFx0Y29uc3QgdHdvQ29sb3JUaW50ID0gdGhpcy50d29Db2xvclRpbnQ7XG5cdFx0bGV0IGJsZW5kTW9kZTogQmxlbmRNb2RlIHwgbnVsbCA9IG51bGw7XG5cblx0XHRjb25zdCByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gdGhpcy5yZW5kZXJhYmxlO1xuXHRcdGxldCB1dnM6IE51bWJlckFycmF5TGlrZTtcblx0XHRsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+O1xuXHRcdGNvbnN0IGRyYXdPcmRlciA9IHNrZWxldG9uLmRyYXdPcmRlci5hcHBsaWVkUG9zZTtcblx0XHRsZXQgYXR0YWNobWVudENvbG9yOiBDb2xvcjtcblx0XHRjb25zdCBza2VsZXRvbkNvbG9yID0gc2tlbGV0b24uY29sb3I7XG5cdFx0Y29uc3QgdmVydGV4U2l6ZSA9IHR3b0NvbG9yVGludCA/IDEyIDogODtcblx0XHRsZXQgaW5SYW5nZSA9IGZhbHNlO1xuXHRcdGlmIChzbG90UmFuZ2VTdGFydCA9PT0gLTEpIGluUmFuZ2UgPSB0cnVlO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IGRyYXdPcmRlcltpXTtcblx0XHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkge1xuXHRcdFx0XHRjbGlwcGVyLmNsaXBFbmQoc2xvdCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc2xvdFJhbmdlU3RhcnQgPj0gMCAmJiBzbG90UmFuZ2VTdGFydCA9PT0gc2xvdC5kYXRhLmluZGV4KSB7XG5cdFx0XHRcdGluUmFuZ2UgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWluUmFuZ2UpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNsb3RSYW5nZUVuZCA+PSAwICYmIHNsb3RSYW5nZUVuZCA9PT0gc2xvdC5kYXRhLmluZGV4KSB7XG5cdFx0XHRcdGluUmFuZ2UgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcG9zZSA9IHNsb3QuYXBwbGllZFBvc2U7XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gcG9zZS5hdHRhY2htZW50O1xuXHRcdFx0bGV0IHRleHR1cmU6IEdMVGV4dHVyZTtcblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xuXHRcdFx0XHRyZW5kZXJhYmxlLnZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcblx0XHRcdFx0cmVuZGVyYWJsZS5udW1WZXJ0aWNlcyA9IDQ7XG5cdFx0XHRcdHJlbmRlcmFibGUubnVtRmxvYXRzID0gdmVydGV4U2l6ZSA8PCAyO1xuXG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlID0gYXR0YWNobWVudC5zZXF1ZW5jZTtcblx0XHRcdFx0Y29uc3Qgc2VxdWVuY2VJbmRleCA9IHNlcXVlbmNlLnJlc29sdmVJbmRleChwb3NlKTtcblx0XHRcdFx0YXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90LCBhdHRhY2htZW50LmdldE9mZnNldHMocG9zZSksIHJlbmRlcmFibGUudmVydGljZXMsIDAsIHZlcnRleFNpemUpO1xuXG5cdFx0XHRcdHRyaWFuZ2xlcyA9IFNrZWxldG9uUmVuZGVyZXIuUVVBRF9UUklBTkdMRVM7XG5cdFx0XHRcdHV2cyA9IHNlcXVlbmNlLmdldFVWcyhzZXF1ZW5jZUluZGV4KTtcblx0XHRcdFx0dGV4dHVyZSA9IHNlcXVlbmNlLnJlZ2lvbnNbc2VxdWVuY2VJbmRleF0/LnRleHR1cmUgYXMgR0xUZXh0dXJlO1xuXHRcdFx0XHRhdHRhY2htZW50Q29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0fSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0cmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cdFx0XHRcdHJlbmRlcmFibGUubnVtVmVydGljZXMgPSAoYXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoID4+IDEpO1xuXHRcdFx0XHRyZW5kZXJhYmxlLm51bUZsb2F0cyA9IHJlbmRlcmFibGUubnVtVmVydGljZXMgKiB2ZXJ0ZXhTaXplO1xuXG5cdFx0XHRcdGlmIChyZW5kZXJhYmxlLm51bUZsb2F0cyA+IHJlbmRlcmFibGUudmVydGljZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHJlbmRlcmFibGUubnVtRmxvYXRzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAwLCBhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgsIHJlbmRlcmFibGUudmVydGljZXMsIDAsIHZlcnRleFNpemUpO1xuXHRcdFx0XHR0cmlhbmdsZXMgPSBhdHRhY2htZW50LnRyaWFuZ2xlcztcblxuXHRcdFx0XHRjb25zdCBzZXF1ZW5jZSA9IGF0dGFjaG1lbnQuc2VxdWVuY2U7XG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlSW5kZXggPSBzZXF1ZW5jZS5yZXNvbHZlSW5kZXgocG9zZSk7XG5cblx0XHRcdFx0dGV4dHVyZSA9IHNlcXVlbmNlLnJlZ2lvbnNbc2VxdWVuY2VJbmRleF0/LnRleHR1cmUgYXMgR0xUZXh0dXJlO1xuXHRcdFx0XHR1dnMgPSBzZXF1ZW5jZS5nZXRVVnMoc2VxdWVuY2VJbmRleCk7XG5cdFx0XHRcdGF0dGFjaG1lbnRDb2xvciA9IGF0dGFjaG1lbnQuY29sb3I7XG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjbGlwcGVyLmNsaXBTdGFydChza2VsZXRvbiwgc2xvdCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRleHR1cmUpIHtcblx0XHRcdFx0Y29uc3Qgc2xvdENvbG9yID0gcG9zZS5jb2xvcjtcblx0XHRcdFx0Y29uc3QgZmluYWxDb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdFx0XHRjb25zdCBhbHBoYSA9IHNrZWxldG9uQ29sb3IuYSAqIHNsb3RDb2xvci5hICogYXR0YWNobWVudENvbG9yLmE7XG5cdFx0XHRcdGZpbmFsQ29sb3IuciA9IHNrZWxldG9uQ29sb3IuciAqIHNsb3RDb2xvci5yICogYXR0YWNobWVudENvbG9yLnIgKiBhbHBoYTtcblx0XHRcdFx0ZmluYWxDb2xvci5nID0gc2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiBhdHRhY2htZW50Q29sb3IuZyAqIGFscGhhO1xuXHRcdFx0XHRmaW5hbENvbG9yLmIgPSBza2VsZXRvbkNvbG9yLmIgKiBzbG90Q29sb3IuYiAqIGF0dGFjaG1lbnRDb2xvci5iICogYWxwaGE7XG5cdFx0XHRcdGZpbmFsQ29sb3IuYSA9IGFscGhhO1xuXHRcdFx0XHRjb25zdCBkYXJrQ29sb3IgPSB0aGlzLnRlbXBDb2xvcjI7XG5cdFx0XHRcdGlmICghcG9zZS5kYXJrQ29sb3IpXG5cdFx0XHRcdFx0ZGFya0NvbG9yLnNldCgwLCAwLCAwLCAxLjApO1xuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRkYXJrQ29sb3IuciA9IHBvc2UuZGFya0NvbG9yLnIgKiBhbHBoYTtcblx0XHRcdFx0XHRkYXJrQ29sb3IuZyA9IHBvc2UuZGFya0NvbG9yLmcgKiBhbHBoYTtcblx0XHRcdFx0XHRkYXJrQ29sb3IuYiA9IHBvc2UuZGFya0NvbG9yLmIgKiBhbHBoYTtcblx0XHRcdFx0XHRkYXJrQ29sb3IuYSA9IDE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzbG90QmxlbmRNb2RlID0gc2xvdC5kYXRhLmJsZW5kTW9kZTtcblx0XHRcdFx0aWYgKHNsb3RCbGVuZE1vZGUgIT09IGJsZW5kTW9kZSkge1xuXHRcdFx0XHRcdGJsZW5kTW9kZSA9IHNsb3RCbGVuZE1vZGU7XG5cdFx0XHRcdFx0YmF0Y2hlci5zZXRCbGVuZE1vZGUoYmxlbmRNb2RlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjbGlwcGVyLmlzQ2xpcHBpbmcoKSAmJiBjbGlwcGVyLmNsaXBUcmlhbmdsZXMocmVuZGVyYWJsZS52ZXJ0aWNlcywgdHJpYW5nbGVzLCB0cmlhbmdsZXMubGVuZ3RoLCB1dnMsIGZpbmFsQ29sb3IsIGRhcmtDb2xvciwgdHdvQ29sb3JUaW50LCB2ZXJ0ZXhTaXplKSkge1xuXHRcdFx0XHRcdGNvbnN0IGNsaXBwZWRWZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2xpcHBlci5jbGlwcGVkVmVydGljZXMpO1xuXHRcdFx0XHRcdGNvbnN0IGNsaXBwZWRUcmlhbmdsZXMgPSBjbGlwcGVyLmNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0XHRcdFx0aWYgKHRyYW5zZm9ybWVyKSB0cmFuc2Zvcm1lcihjbGlwcGVkVmVydGljZXMsIGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGgsIHZlcnRleFNpemUpO1xuXHRcdFx0XHRcdGJhdGNoZXIuZHJhdyh0ZXh0dXJlLCBjbGlwcGVkVmVydGljZXMsIGNsaXBwZWRUcmlhbmdsZXMpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IHZlcnRzID0gcmVuZGVyYWJsZS52ZXJ0aWNlcztcblx0XHRcdFx0XHRpZiAoIXR3b0NvbG9yVGludCkge1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgdiA9IDIsIHUgPSAwLCBuID0gcmVuZGVyYWJsZS5udW1GbG9hdHM7IHYgPCBuOyB2ICs9IHZlcnRleFNpemUsIHUgKz0gMikge1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2XSA9IGZpbmFsQ29sb3Iucjtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDFdID0gZmluYWxDb2xvci5nO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgMl0gPSBmaW5hbENvbG9yLmI7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyAzXSA9IGFscGhhO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgNF0gPSB1dnNbdV07XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyA1XSA9IHV2c1t1ICsgMV07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGZvciAobGV0IHYgPSAyLCB1ID0gMCwgbiA9IHJlbmRlcmFibGUubnVtRmxvYXRzOyB2IDwgbjsgdiArPSB2ZXJ0ZXhTaXplLCB1ICs9IDIpIHtcblx0XHRcdFx0XHRcdFx0dmVydHNbdl0gPSBmaW5hbENvbG9yLnI7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyAxXSA9IGZpbmFsQ29sb3IuZztcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDJdID0gZmluYWxDb2xvci5iO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgM10gPSBhbHBoYTtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDRdID0gdXZzW3VdO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgNV0gPSB1dnNbdSArIDFdO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgNl0gPSBkYXJrQ29sb3Iucjtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDddID0gZGFya0NvbG9yLmc7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyA4XSA9IGRhcmtDb2xvci5iO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgOV0gPSBkYXJrQ29sb3IuYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdmlldyA9IChyZW5kZXJhYmxlLnZlcnRpY2VzIGFzIEZsb2F0MzJBcnJheSkuc3ViYXJyYXkoMCwgcmVuZGVyYWJsZS5udW1GbG9hdHMpO1xuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1lcikgdHJhbnNmb3JtZXIocmVuZGVyYWJsZS52ZXJ0aWNlcywgcmVuZGVyYWJsZS5udW1GbG9hdHMsIHZlcnRleFNpemUpO1xuXHRcdFx0XHRcdGJhdGNoZXIuZHJhdyh0ZXh0dXJlLCB2aWV3LCB0cmlhbmdsZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHR9XG5cdFx0Y2xpcHBlci5jbGlwRW5kKCk7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUge0BsaW5rIFNrZWxldG9uQ2xpcHBpbmd9IHVzZWQgYnkgdGhpcyByZW5kZXJlciBmb3IgdXNlIHdpdGggZS5nLiB7QGxpbmsgU2tlbGV0b24uZ2V0Qm91bmRzfSAqKi9cblx0cHVibGljIGdldFNrZWxldG9uQ2xpcHBpbmcgKCk6IFNrZWxldG9uQ2xpcHBpbmcge1xuXHRcdHJldHVybiB0aGlzLmNsaXBwZXI7XG5cdH1cbn1cbiJdfQ==
203
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUUvRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxjQUFjLEVBQXdCLGdCQUFnQixFQUFpQixnQkFBZ0IsRUFBRSxLQUFLLEVBQVcsTUFBTSw4QkFBOEIsQ0FBQztBQU03TCxNQUFNLFVBQVU7SUFDSztJQUFrQztJQUE0QjtJQUFsRixZQUFvQixRQUF5QixFQUFTLFdBQW1CLEVBQVMsU0FBaUI7UUFBL0UsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFBUyxnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUFTLGNBQVMsR0FBVCxTQUFTLENBQVE7SUFBSSxDQUFDO0NBQ3hHO0FBQUEsQ0FBQztBQUlGLE1BQU0sT0FBTyxnQkFBZ0I7SUFDNUIsTUFBTSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbkMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDeEIsVUFBVSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDekIsUUFBUSxDQUFrQjtJQUMxQixVQUFVLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkIsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUNyQixVQUFVLEdBQWUsSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRCxPQUFPLEdBQXFCLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUUzRDs7OztPQUlHO0lBQ0gsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO0lBRTNCLFlBQWEsT0FBcUMsRUFBRSxlQUF3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QUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDckYsSUFBSSxXQUFXO3dCQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQ3BGLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDeEMsQ0FBQztZQUNGLENBQUM7WUFFRCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELCtHQUErRztJQUN4RyxtQkFBbUI7UUFDekIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEJsZW5kTW9kZSwgQ2xpcHBpbmdBdHRhY2htZW50LCBDb2xvciwgTWVzaEF0dGFjaG1lbnQsIHR5cGUgTnVtYmVyQXJyYXlMaWtlLCBSZWdpb25BdHRhY2htZW50LCB0eXBlIFNrZWxldG9uLCBTa2VsZXRvbkNsaXBwaW5nLCBVdGlscywgVmVjdG9yMiB9IGZyb20gXCJAZXNvdGVyaWNzb2Z0d2FyZS9zcGluZS1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IEdMVGV4dHVyZSB9IGZyb20gXCIuL0dMVGV4dHVyZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQb2x5Z29uQmF0Y2hlciB9IGZyb20gXCIuL1BvbHlnb25CYXRjaGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRXZWJHTFJlbmRlcmluZ0NvbnRleHQgfSBmcm9tIFwiLi9XZWJHTC5qc1wiO1xuXG5cbmNsYXNzIFJlbmRlcmFibGUge1xuXHRjb25zdHJ1Y3RvciAocHVibGljIHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHB1YmxpYyBudW1WZXJ0aWNlczogbnVtYmVyLCBwdWJsaWMgbnVtRmxvYXRzOiBudW1iZXIpIHsgfVxufTtcblxuZXhwb3J0IHR5cGUgVmVydGV4VHJhbnNmb3JtZXIgPSAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgbnVtVmVydGljZXM6IG51bWJlciwgc3RyaWRlOiBudW1iZXIpID0+IHZvaWQ7XG5cbmV4cG9ydCBjbGFzcyBTa2VsZXRvblJlbmRlcmVyIHtcblx0c3RhdGljIFFVQURfVFJJQU5HTEVTID0gWzAsIDEsIDIsIDIsIDMsIDBdO1xuXG5cdHByaXZhdGUgdGVtcENvbG9yID0gbmV3IENvbG9yKCk7XG5cdHByaXZhdGUgdGVtcENvbG9yMiA9IG5ldyBDb2xvcigpO1xuXHRwcml2YXRlIHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2U7XG5cdHByaXZhdGUgdmVydGV4U2l6ZSA9IDIgKyAyICsgNDtcblx0cHJpdmF0ZSB0d29Db2xvclRpbnQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gbmV3IFJlbmRlcmFibGUoW10sIDAsIDApO1xuXHRwcml2YXRlIGNsaXBwZXI6IFNrZWxldG9uQ2xpcHBpbmcgPSBuZXcgU2tlbGV0b25DbGlwcGluZygpO1xuXG5cdC8qKlxuXHQgKiBCYXRjaGVzIGFkZGl0aXZlIHNsb3RzIHRvZ2V0aGVyIHdpdGggbm9ybWFsIHNsb3RzIGJ5IHJlbmRlcmluZyBhZGRpdGl2ZSBzbG90cyB3aXRoIHByZW11bHRpcGxpZWQgYWxwaGEgUkdCIGFuZCB6ZXJvIGFscGhhLFxuXHQgKiB3aGlsZSB1c2luZyBub3JtYWwgUE1BIGJsZW5kaW5nLiBUaGlzIHJlZHVjZXMgZHJhdyBjYWxscyBmb3Igbm9ybWFsL2FkZGl0aXZlL25vcm1hbCBzZXF1ZW5jZXMgd2l0aCB0aGUgc2FtZSB0ZXh0dXJlLlxuXHQgKiBEaXNhYmxlIHRoaXMgaWYgcmVuZGVyaW5nIHRvIGEgdHJhbnNwYXJlbnQgdGFyZ2V0IGFuZCB0aGUgYWNjdW11bGF0ZWQgZGVzdGluYXRpb24gYWxwaGEgZnJvbSBhZGRpdGl2ZSBibGVuZGluZyBtdXN0IGJlIHByZXNlcnZlZC5cblx0ICovXG5cdHBtYUFkZGl0aXZlQmF0Y2hpbmcgPSB0cnVlO1xuXG5cdGNvbnN0cnVjdG9yIChjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0d29Db2xvclRpbnQ6IGJvb2xlYW4gPSB0cnVlKSB7XG5cdFx0dGhpcy50d29Db2xvclRpbnQgPSB0d29Db2xvclRpbnQ7XG5cdFx0aWYgKHR3b0NvbG9yVGludClcblx0XHRcdHRoaXMudmVydGV4U2l6ZSArPSA0O1xuXHRcdHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHRoaXMudmVydGV4U2l6ZSAqIDEwMjQpO1xuXHR9XG5cblx0ZHJhdyAoYmF0Y2hlcjogUG9seWdvbkJhdGNoZXIsIHNrZWxldG9uOiBTa2VsZXRvbiwgc2xvdFJhbmdlU3RhcnQ6IG51bWJlciA9IC0xLCBzbG90UmFuZ2VFbmQ6IG51bWJlciA9IC0xLCB0cmFuc2Zvcm1lcjogVmVydGV4VHJhbnNmb3JtZXIgfCBudWxsID0gbnVsbCkge1xuXHRcdGNvbnN0IGNsaXBwZXIgPSB0aGlzLmNsaXBwZXI7XG5cdFx0Y29uc3QgdHdvQ29sb3JUaW50ID0gdGhpcy50d29Db2xvclRpbnQ7XG5cdFx0bGV0IGJsZW5kTW9kZTogQmxlbmRNb2RlIHwgbnVsbCA9IG51bGw7XG5cblx0XHRjb25zdCByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gdGhpcy5yZW5kZXJhYmxlO1xuXHRcdGxldCB1dnM6IE51bWJlckFycmF5TGlrZTtcblx0XHRsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+O1xuXHRcdGNvbnN0IGRyYXdPcmRlciA9IHNrZWxldG9uLmRyYXdPcmRlci5hcHBsaWVkUG9zZTtcblx0XHRsZXQgYXR0YWNobWVudENvbG9yOiBDb2xvcjtcblx0XHRjb25zdCBza2VsZXRvbkNvbG9yID0gc2tlbGV0b24uY29sb3I7XG5cdFx0Y29uc3QgdmVydGV4U2l6ZSA9IHR3b0NvbG9yVGludCA/IDEyIDogODtcblx0XHRsZXQgaW5SYW5nZSA9IGZhbHNlO1xuXHRcdGlmIChzbG90UmFuZ2VTdGFydCA9PT0gLTEpIGluUmFuZ2UgPSB0cnVlO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0Y29uc3Qgc2xvdCA9IGRyYXdPcmRlcltpXTtcblx0XHRcdGlmICghc2xvdC5ib25lLmFjdGl2ZSkge1xuXHRcdFx0XHRjbGlwcGVyLmNsaXBFbmQoc2xvdCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc2xvdFJhbmdlU3RhcnQgPj0gMCAmJiBzbG90UmFuZ2VTdGFydCA9PT0gc2xvdC5kYXRhLmluZGV4KSB7XG5cdFx0XHRcdGluUmFuZ2UgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWluUmFuZ2UpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNsb3RSYW5nZUVuZCA+PSAwICYmIHNsb3RSYW5nZUVuZCA9PT0gc2xvdC5kYXRhLmluZGV4KSB7XG5cdFx0XHRcdGluUmFuZ2UgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcG9zZSA9IHNsb3QuYXBwbGllZFBvc2U7XG5cdFx0XHRjb25zdCBhdHRhY2htZW50ID0gcG9zZS5hdHRhY2htZW50O1xuXHRcdFx0bGV0IHRleHR1cmU6IEdMVGV4dHVyZTtcblx0XHRcdGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xuXHRcdFx0XHRyZW5kZXJhYmxlLnZlcnRpY2VzID0gdGhpcy52ZXJ0aWNlcztcblx0XHRcdFx0cmVuZGVyYWJsZS5udW1WZXJ0aWNlcyA9IDQ7XG5cdFx0XHRcdHJlbmRlcmFibGUubnVtRmxvYXRzID0gdmVydGV4U2l6ZSA8PCAyO1xuXG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlID0gYXR0YWNobWVudC5zZXF1ZW5jZTtcblx0XHRcdFx0Y29uc3Qgc2VxdWVuY2VJbmRleCA9IHNlcXVlbmNlLnJlc29sdmVJbmRleChwb3NlKTtcblx0XHRcdFx0YXR0YWNobWVudC5jb21wdXRlV29ybGRWZXJ0aWNlcyhzbG90LCBhdHRhY2htZW50LmdldE9mZnNldHMocG9zZSksIHJlbmRlcmFibGUudmVydGljZXMsIDAsIHZlcnRleFNpemUpO1xuXG5cdFx0XHRcdHRyaWFuZ2xlcyA9IFNrZWxldG9uUmVuZGVyZXIuUVVBRF9UUklBTkdMRVM7XG5cdFx0XHRcdHV2cyA9IHNlcXVlbmNlLmdldFVWcyhzZXF1ZW5jZUluZGV4KTtcblx0XHRcdFx0dGV4dHVyZSA9IHNlcXVlbmNlLnJlZ2lvbnNbc2VxdWVuY2VJbmRleF0/LnRleHR1cmUgYXMgR0xUZXh0dXJlO1xuXHRcdFx0XHRhdHRhY2htZW50Q29sb3IgPSBhdHRhY2htZW50LmNvbG9yO1xuXHRcdFx0fSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcblx0XHRcdFx0cmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXM7XG5cdFx0XHRcdHJlbmRlcmFibGUubnVtVmVydGljZXMgPSAoYXR0YWNobWVudC53b3JsZFZlcnRpY2VzTGVuZ3RoID4+IDEpO1xuXHRcdFx0XHRyZW5kZXJhYmxlLm51bUZsb2F0cyA9IHJlbmRlcmFibGUubnVtVmVydGljZXMgKiB2ZXJ0ZXhTaXplO1xuXG5cdFx0XHRcdGlmIChyZW5kZXJhYmxlLm51bUZsb2F0cyA+IHJlbmRlcmFibGUudmVydGljZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHJlbmRlcmFibGUubnVtRmxvYXRzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRhdHRhY2htZW50LmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAwLCBhdHRhY2htZW50LndvcmxkVmVydGljZXNMZW5ndGgsIHJlbmRlcmFibGUudmVydGljZXMsIDAsIHZlcnRleFNpemUpO1xuXHRcdFx0XHR0cmlhbmdsZXMgPSBhdHRhY2htZW50LnRyaWFuZ2xlcztcblxuXHRcdFx0XHRjb25zdCBzZXF1ZW5jZSA9IGF0dGFjaG1lbnQuc2VxdWVuY2U7XG5cdFx0XHRcdGNvbnN0IHNlcXVlbmNlSW5kZXggPSBzZXF1ZW5jZS5yZXNvbHZlSW5kZXgocG9zZSk7XG5cblx0XHRcdFx0dGV4dHVyZSA9IHNlcXVlbmNlLnJlZ2lvbnNbc2VxdWVuY2VJbmRleF0/LnRleHR1cmUgYXMgR0xUZXh0dXJlO1xuXHRcdFx0XHR1dnMgPSBzZXF1ZW5jZS5nZXRVVnMoc2VxdWVuY2VJbmRleCk7XG5cdFx0XHRcdGF0dGFjaG1lbnRDb2xvciA9IGF0dGFjaG1lbnQuY29sb3I7XG5cdFx0XHR9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjbGlwcGVyLmNsaXBTdGFydChza2VsZXRvbiwgc2xvdCwgYXR0YWNobWVudCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xpcHBlci5jbGlwRW5kKHNsb3QpO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRleHR1cmUpIHtcblx0XHRcdFx0Y29uc3Qgc2xvdENvbG9yID0gcG9zZS5jb2xvcjtcblx0XHRcdFx0Y29uc3QgZmluYWxDb2xvciA9IHRoaXMudGVtcENvbG9yO1xuXHRcdFx0XHRjb25zdCBhbHBoYSA9IHNrZWxldG9uQ29sb3IuYSAqIHNsb3RDb2xvci5hICogYXR0YWNobWVudENvbG9yLmE7XG5cdFx0XHRcdGZpbmFsQ29sb3IuciA9IHNrZWxldG9uQ29sb3IuciAqIHNsb3RDb2xvci5yICogYXR0YWNobWVudENvbG9yLnIgKiBhbHBoYTtcblx0XHRcdFx0ZmluYWxDb2xvci5nID0gc2tlbGV0b25Db2xvci5nICogc2xvdENvbG9yLmcgKiBhdHRhY2htZW50Q29sb3IuZyAqIGFscGhhO1xuXHRcdFx0XHRmaW5hbENvbG9yLmIgPSBza2VsZXRvbkNvbG9yLmIgKiBzbG90Q29sb3IuYiAqIGF0dGFjaG1lbnRDb2xvci5iICogYWxwaGE7XG5cblx0XHRcdFx0Y29uc3Qgc2xvdEJsZW5kTW9kZSA9IHNsb3QuZGF0YS5ibGVuZE1vZGU7XG5cdFx0XHRcdGNvbnN0IGFkZGl0aXZlQmxlbmQgPSB0aGlzLnBtYUFkZGl0aXZlQmF0Y2hpbmcgJiYgc2xvdEJsZW5kTW9kZSA9PT0gQmxlbmRNb2RlLkFkZGl0aXZlO1xuXHRcdFx0XHRmaW5hbENvbG9yLmEgPSBhZGRpdGl2ZUJsZW5kID8gMCA6IGFscGhhO1xuXG5cdFx0XHRcdGNvbnN0IGRhcmtDb2xvciA9IHRoaXMudGVtcENvbG9yMjtcblx0XHRcdFx0aWYgKCFwb3NlLmRhcmtDb2xvcilcblx0XHRcdFx0XHRkYXJrQ29sb3Iuc2V0KDAsIDAsIDAsIDEuMCk7XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGRhcmtDb2xvci5yID0gcG9zZS5kYXJrQ29sb3IuciAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmtDb2xvci5nID0gcG9zZS5kYXJrQ29sb3IuZyAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmtDb2xvci5iID0gcG9zZS5kYXJrQ29sb3IuYiAqIGFscGhhO1xuXHRcdFx0XHRcdGRhcmtDb2xvci5hID0gMTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGJhdGNoQmxlbmRNb2RlID0gYWRkaXRpdmVCbGVuZCA/IEJsZW5kTW9kZS5Ob3JtYWwgOiBzbG90QmxlbmRNb2RlO1xuXHRcdFx0XHRpZiAoYmF0Y2hCbGVuZE1vZGUgIT09IGJsZW5kTW9kZSkge1xuXHRcdFx0XHRcdGJsZW5kTW9kZSA9IGJhdGNoQmxlbmRNb2RlO1xuXHRcdFx0XHRcdGJhdGNoZXIuc2V0QmxlbmRNb2RlKGJsZW5kTW9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY2xpcHBlci5pc0NsaXBwaW5nKCkgJiYgY2xpcHBlci5jbGlwVHJpYW5nbGVzKHJlbmRlcmFibGUudmVydGljZXMsIHRyaWFuZ2xlcywgdHJpYW5nbGVzLmxlbmd0aCwgdXZzLCBmaW5hbENvbG9yLCBkYXJrQ29sb3IsIHR3b0NvbG9yVGludCwgdmVydGV4U2l6ZSkpIHtcblx0XHRcdFx0XHRjb25zdCBjbGlwcGVkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzKTtcblx0XHRcdFx0XHRjb25zdCBjbGlwcGVkVHJpYW5nbGVzID0gY2xpcHBlci5jbGlwcGVkVHJpYW5nbGVzO1xuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1lcikgdHJhbnNmb3JtZXIoY2xpcHBlZFZlcnRpY2VzLCBjbGlwcGVkVmVydGljZXMubGVuZ3RoLCB2ZXJ0ZXhTaXplKTtcblx0XHRcdFx0XHRiYXRjaGVyLmRyYXcodGV4dHVyZSwgY2xpcHBlZFZlcnRpY2VzLCBjbGlwcGVkVHJpYW5nbGVzKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCB2ZXJ0cyA9IHJlbmRlcmFibGUudmVydGljZXM7XG5cdFx0XHRcdFx0aWYgKCF0d29Db2xvclRpbnQpIHtcblx0XHRcdFx0XHRcdGZvciAobGV0IHYgPSAyLCB1ID0gMCwgbiA9IHJlbmRlcmFibGUubnVtRmxvYXRzOyB2IDwgbjsgdiArPSB2ZXJ0ZXhTaXplLCB1ICs9IDIpIHtcblx0XHRcdFx0XHRcdFx0dmVydHNbdl0gPSBmaW5hbENvbG9yLnI7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyAxXSA9IGZpbmFsQ29sb3IuZztcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDJdID0gZmluYWxDb2xvci5iO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgM10gPSBmaW5hbENvbG9yLmE7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyA0XSA9IHV2c1t1XTtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDVdID0gdXZzW3UgKyAxXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Zm9yIChsZXQgdiA9IDIsIHUgPSAwLCBuID0gcmVuZGVyYWJsZS5udW1GbG9hdHM7IHYgPCBuOyB2ICs9IHZlcnRleFNpemUsIHUgKz0gMikge1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2XSA9IGZpbmFsQ29sb3Iucjtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDFdID0gZmluYWxDb2xvci5nO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgMl0gPSBmaW5hbENvbG9yLmI7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyAzXSA9IGZpbmFsQ29sb3IuYTtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDRdID0gdXZzW3VdO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgNV0gPSB1dnNbdSArIDFdO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgNl0gPSBkYXJrQ29sb3Iucjtcblx0XHRcdFx0XHRcdFx0dmVydHNbdiArIDddID0gZGFya0NvbG9yLmc7XG5cdFx0XHRcdFx0XHRcdHZlcnRzW3YgKyA4XSA9IGRhcmtDb2xvci5iO1xuXHRcdFx0XHRcdFx0XHR2ZXJ0c1t2ICsgOV0gPSBkYXJrQ29sb3IuYTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgdmlldyA9IChyZW5kZXJhYmxlLnZlcnRpY2VzIGFzIEZsb2F0MzJBcnJheSkuc3ViYXJyYXkoMCwgcmVuZGVyYWJsZS5udW1GbG9hdHMpO1xuXHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1lcikgdHJhbnNmb3JtZXIocmVuZGVyYWJsZS52ZXJ0aWNlcywgcmVuZGVyYWJsZS5udW1GbG9hdHMsIHZlcnRleFNpemUpO1xuXHRcdFx0XHRcdGJhdGNoZXIuZHJhdyh0ZXh0dXJlLCB2aWV3LCB0cmlhbmdsZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNsaXBwZXIuY2xpcEVuZChzbG90KTtcblx0XHR9XG5cdFx0Y2xpcHBlci5jbGlwRW5kKCk7XG5cdH1cblxuXHQvKiogUmV0dXJucyB0aGUge0BsaW5rIFNrZWxldG9uQ2xpcHBpbmd9IHVzZWQgYnkgdGhpcyByZW5kZXJlciBmb3IgdXNlIHdpdGggZS5nLiB7QGxpbmsgU2tlbGV0b24uZ2V0Qm91bmRzfSAqKi9cblx0cHVibGljIGdldFNrZWxldG9uQ2xpcHBpbmcgKCk6IFNrZWxldG9uQ2xpcHBpbmcge1xuXHRcdHJldHVybiB0aGlzLmNsaXBwZXI7XG5cdH1cbn1cbiJdfQ==