@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.
Files changed (129) hide show
  1. package/dist/Animation.d.ts +426 -274
  2. package/dist/Animation.js +1174 -1210
  3. package/dist/AnimationState.d.ts +246 -201
  4. package/dist/AnimationState.js +508 -471
  5. package/dist/AnimationStateData.d.ts +12 -10
  6. package/dist/AnimationStateData.js +19 -20
  7. package/dist/AssetManagerBase.d.ts +29 -23
  8. package/dist/AssetManagerBase.js +67 -43
  9. package/dist/AtlasAttachmentLoader.d.ts +18 -12
  10. package/dist/AtlasAttachmentLoader.js +28 -39
  11. package/dist/Bone.d.ts +15 -109
  12. package/dist/Bone.js +22 -362
  13. package/dist/BoneData.d.ts +13 -28
  14. package/dist/BoneData.js +20 -29
  15. package/dist/BonePose.d.ts +130 -0
  16. package/dist/BonePose.js +426 -0
  17. package/dist/Constraint.d.ts +41 -0
  18. package/dist/Constraint.js +38 -0
  19. package/dist/ConstraintData.d.ts +7 -5
  20. package/dist/ConstraintData.js +5 -9
  21. package/dist/DrawOrder.d.ts +48 -0
  22. package/dist/DrawOrder.js +64 -0
  23. package/dist/Event.d.ts +11 -6
  24. package/dist/Event.js +10 -5
  25. package/dist/EventData.d.ts +10 -6
  26. package/dist/EventData.js +18 -7
  27. package/dist/IkConstraint.d.ts +22 -28
  28. package/dist/IkConstraint.js +115 -117
  29. package/dist/IkConstraintData.d.ts +23 -18
  30. package/dist/IkConstraintData.js +32 -22
  31. package/dist/IkConstraintPose.d.ts +49 -0
  32. package/dist/IkConstraintPose.js +55 -0
  33. package/dist/PathConstraint.d.ts +18 -22
  34. package/dist/PathConstraint.js +160 -136
  35. package/dist/PathConstraintData.d.ts +11 -14
  36. package/dist/PathConstraintData.js +14 -16
  37. package/dist/PathConstraintPose.d.ts +43 -0
  38. package/dist/PathConstraintPose.js +49 -0
  39. package/dist/Physics.d.ts +39 -0
  40. package/dist/Physics.js +41 -0
  41. package/dist/PhysicsConstraint.d.ts +26 -30
  42. package/dist/PhysicsConstraint.js +102 -94
  43. package/dist/PhysicsConstraintData.d.ts +22 -12
  44. package/dist/PhysicsConstraintData.js +23 -12
  45. package/dist/PhysicsConstraintPose.d.ts +47 -0
  46. package/dist/PhysicsConstraintPose.js +55 -0
  47. package/dist/Pose.d.ts +33 -0
  48. package/dist/Pose.js +30 -0
  49. package/dist/Posed.d.ts +58 -0
  50. package/dist/Posed.js +78 -0
  51. package/dist/PosedActive.d.ts +41 -0
  52. package/dist/{attachments/HasTextureRegion.js → PosedActive.js} +17 -2
  53. package/dist/PosedData.d.ts +40 -0
  54. package/dist/PosedData.js +45 -0
  55. package/dist/Skeleton.d.ts +110 -99
  56. package/dist/Skeleton.js +271 -449
  57. package/dist/SkeletonBinary.d.ts +2 -2
  58. package/dist/SkeletonBinary.js +644 -466
  59. package/dist/SkeletonBounds.d.ts +4 -4
  60. package/dist/SkeletonBounds.js +45 -46
  61. package/dist/SkeletonClipping.d.ts +26 -22
  62. package/dist/SkeletonClipping.js +654 -340
  63. package/dist/SkeletonData.d.ts +18 -35
  64. package/dist/SkeletonData.js +57 -97
  65. package/dist/SkeletonJson.d.ts +8 -6
  66. package/dist/SkeletonJson.js +892 -641
  67. package/dist/SkeletonRendererCore.d.ts +58 -0
  68. package/dist/SkeletonRendererCore.js +310 -0
  69. package/dist/Skin.d.ts +20 -16
  70. package/dist/Skin.js +58 -53
  71. package/dist/Slider.d.ts +46 -0
  72. package/dist/Slider.js +115 -0
  73. package/dist/SliderData.d.ts +58 -0
  74. package/dist/SliderData.js +59 -0
  75. package/dist/SliderPose.d.ts +37 -0
  76. package/dist/SliderPose.js +40 -0
  77. package/dist/Slot.d.ts +16 -38
  78. package/dist/Slot.js +37 -60
  79. package/dist/SlotData.d.ts +5 -12
  80. package/dist/SlotData.js +7 -15
  81. package/dist/SlotPose.d.ts +59 -0
  82. package/dist/SlotPose.js +81 -0
  83. package/dist/Texture.d.ts +1 -0
  84. package/dist/Texture.js +2 -1
  85. package/dist/TextureAtlas.d.ts +3 -3
  86. package/dist/TextureAtlas.js +49 -49
  87. package/dist/TransformConstraint.d.ts +16 -28
  88. package/dist/TransformConstraint.js +72 -209
  89. package/dist/TransformConstraintData.d.ts +108 -20
  90. package/dist/TransformConstraintData.js +274 -24
  91. package/dist/TransformConstraintPose.d.ts +45 -0
  92. package/dist/TransformConstraintPose.js +52 -0
  93. package/dist/Triangulator.d.ts +1 -1
  94. package/dist/Triangulator.js +91 -107
  95. package/dist/{Updatable.d.ts → Update.d.ts} +5 -12
  96. package/dist/Update.js +30 -0
  97. package/dist/Utils.d.ts +13 -4
  98. package/dist/Utils.js +78 -37
  99. package/dist/attachments/Attachment.d.ts +27 -19
  100. package/dist/attachments/Attachment.js +59 -35
  101. package/dist/attachments/AttachmentLoader.d.ts +14 -14
  102. package/dist/attachments/AttachmentLoader.js +1 -1
  103. package/dist/attachments/BoundingBoxAttachment.d.ts +1 -1
  104. package/dist/attachments/BoundingBoxAttachment.js +2 -2
  105. package/dist/attachments/ClippingAttachment.d.ts +10 -3
  106. package/dist/attachments/ClippingAttachment.js +12 -3
  107. package/dist/attachments/{HasTextureRegion.d.ts → HasSequence.d.ts} +11 -14
  108. package/dist/attachments/HasSequence.js +30 -0
  109. package/dist/attachments/MeshAttachment.d.ts +28 -35
  110. package/dist/attachments/MeshAttachment.js +85 -97
  111. package/dist/attachments/PathAttachment.d.ts +3 -3
  112. package/dist/attachments/PathAttachment.js +6 -6
  113. package/dist/attachments/PointAttachment.d.ts +11 -6
  114. package/dist/attachments/PointAttachment.js +8 -3
  115. package/dist/attachments/RegionAttachment.d.ts +25 -27
  116. package/dist/attachments/RegionAttachment.js +101 -113
  117. package/dist/attachments/Sequence.d.ts +31 -6
  118. package/dist/attachments/Sequence.js +79 -13
  119. package/dist/esm/spine-core.min.mjs +2 -2
  120. package/dist/esm/spine-core.mjs +7651 -6090
  121. package/dist/esm/spine-core.mjs.map +4 -4
  122. package/dist/iife/spine-core.js +7651 -6090
  123. package/dist/iife/spine-core.js.map +4 -4
  124. package/dist/iife/spine-core.min.js +2 -2
  125. package/dist/index.d.ts +32 -11
  126. package/dist/index.js +33 -12
  127. package/dist/polyfills.js +4 -5
  128. package/package.json +1 -1
  129. package/dist/Updatable.js +0 -30
@@ -29,430 +29,605 @@
29
29
  import { Triangulator } from "./Triangulator.js";
30
30
  import { Utils } from "./Utils.js";
31
31
  export class SkeletonClipping {
32
- triangulator = new Triangulator();
33
- clippingPolygon = new Array();
34
- clipOutput = new Array();
35
- clippedVertices = new Array();
36
- clippedUVs = new Array();
37
- clippedTriangles = new Array();
38
- scratch = new Array();
32
+ triangulator = null;
33
+ clippingPolygon = [];
34
+ clippingPolygons = [];
35
+ clipOutput = [];
36
+ clippedVertices = [];
37
+ /** An empty array unless {@link clipTrianglesUnpacked} was used. **/
38
+ clippedUVs = [];
39
+ clippedTriangles = [];
40
+ inverseVertices = [];
41
+ _clippedVerticesTyped = new Float32Array(1024);
42
+ _clippedUVsTyped = new Float32Array(1024);
43
+ _clippedTrianglesTyped = new Uint16Array(1024);
44
+ clippedVerticesTyped = new Float32Array(0);
45
+ clippedUVsTyped = new Float32Array(0);
46
+ clippedTrianglesTyped = new Uint16Array(0);
47
+ clippedVerticesLength = 0;
48
+ clippedUVsLength = 0;
49
+ clippedTrianglesLength = 0;
50
+ scratch = [];
51
+ inverse = false;
39
52
  clipAttachment = null;
40
- clippingPolygons = null;
41
- clipStart(slot, clip) {
53
+ clipStart(skeleton, slot, clip) {
42
54
  if (this.clipAttachment)
43
- return 0;
55
+ return;
56
+ const n = clip.worldVerticesLength;
44
57
  this.clipAttachment = clip;
45
- let n = clip.worldVerticesLength;
46
- let vertices = Utils.setArraySize(this.clippingPolygon, n);
47
- clip.computeWorldVertices(slot, 0, n, vertices, 0, 2);
48
- let clippingPolygon = this.clippingPolygon;
49
- SkeletonClipping.makeClockwise(clippingPolygon);
50
- let clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon));
51
- for (let i = 0, n = clippingPolygons.length; i < n; i++) {
52
- let polygon = clippingPolygons[i];
53
- SkeletonClipping.makeClockwise(polygon);
54
- polygon.push(polygon[0]);
55
- polygon.push(polygon[1]);
58
+ this.inverse = clip.inverse;
59
+ const vertices = Utils.setArraySize(this.clippingPolygon, n);
60
+ clip.computeWorldVertices(skeleton, slot, 0, n, vertices, 0, 2);
61
+ const clippingPolygon = this.clippingPolygon;
62
+ const convex = this.makeClockwise(clippingPolygon);
63
+ if (convex || this.inverse || clip.convex) {
64
+ if (!convex)
65
+ this.makeConvex(clippingPolygon);
66
+ this.clippingPolygon.push(clippingPolygon[0], clippingPolygon[1]);
67
+ this.clippingPolygons.push(clippingPolygon);
68
+ }
69
+ else {
70
+ if (this.triangulator === null)
71
+ this.triangulator = new Triangulator();
72
+ this.clippingPolygons.push(...this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)));
56
73
  }
57
- return clippingPolygons.length;
58
- }
59
- clipEndWithSlot(slot) {
60
- if (this.clipAttachment && this.clipAttachment.endSlot == slot.data)
61
- this.clipEnd();
62
74
  }
63
- clipEnd() {
75
+ clipEnd(slot) {
64
76
  if (!this.clipAttachment)
65
77
  return;
78
+ if (slot && this.clipAttachment.endSlot !== slot.data)
79
+ return;
66
80
  this.clipAttachment = null;
67
- this.clippingPolygons = null;
68
- this.clippedVertices.length = 0;
69
- this.clippedTriangles.length = 0;
70
- this.clippingPolygon.length = 0;
81
+ this.clippingPolygons.length = 0;
71
82
  }
72
83
  isClipping() {
73
84
  return this.clipAttachment != null;
74
85
  }
75
- clipTriangles(vertices, verticesLengthOrTriangles, trianglesOrTrianglesLength, trianglesLengthOrUvs, uvsOrLight, lightOrDark, darkOrTwoColor, twoColorParam) {
76
- // Determine which overload is being used
77
- let triangles;
78
- let trianglesLength;
79
- let uvs;
80
- let light;
81
- let dark;
82
- let twoColor;
83
- if (typeof verticesLengthOrTriangles === 'number') {
84
- triangles = trianglesOrTrianglesLength;
85
- trianglesLength = trianglesLengthOrUvs;
86
- uvs = uvsOrLight;
87
- light = lightOrDark;
88
- dark = darkOrTwoColor;
89
- twoColor = twoColorParam;
90
- }
91
- else {
92
- triangles = verticesLengthOrTriangles;
93
- trianglesLength = trianglesOrTrianglesLength;
94
- uvs = trianglesLengthOrUvs;
95
- light = uvsOrLight;
96
- dark = lightOrDark;
97
- twoColor = darkOrTwoColor;
98
- }
99
- if (uvs && light && dark && typeof twoColor === 'boolean')
100
- this.clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor);
101
- else
102
- this.clipTrianglesNoRender(vertices, triangles, trianglesLength);
86
+ clipTriangles(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride) {
87
+ return (uvs && light && dark && typeof twoColor === 'boolean' && typeof stride === 'number')
88
+ ? this.clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride)
89
+ : this.clipTrianglesNoRender(vertices, triangles, trianglesLength);
103
90
  }
104
91
  clipTrianglesNoRender(vertices, triangles, trianglesLength) {
105
- let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
106
- let clippedTriangles = this.clippedTriangles;
107
- let polygons = this.clippingPolygons;
108
- let polygonsCount = polygons.length;
109
- let index = 0;
92
+ const clippedVertices = this.clippedVertices;
110
93
  clippedVertices.length = 0;
94
+ const clippedTriangles = this.clippedTriangles;
111
95
  clippedTriangles.length = 0;
96
+ let index = 0;
97
+ if (this.inverse) {
98
+ const polygon = this.clippingPolygons[0];
99
+ for (let i = 0; i < trianglesLength; i += 3) {
100
+ let t = triangles[i] << 1;
101
+ const x1 = vertices[t], y1 = vertices[t + 1];
102
+ t = triangles[i + 1] << 1;
103
+ const x2 = vertices[t], y2 = vertices[t + 1];
104
+ t = triangles[i + 2] << 1;
105
+ const x3 = vertices[t], y3 = vertices[t + 1];
106
+ this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
107
+ const iv = this.inverseVertices;
108
+ for (let offset = 0, nn = this.inverseVertices.length; offset < nn;) {
109
+ const polygonSize = iv[offset++];
110
+ let vertexCount = polygonSize >> 1, s = clippedVertices.length;
111
+ const cv = Utils.setArraySize(clippedVertices, s + polygonSize);
112
+ Utils.arrayCopy(iv, offset, cv, s, polygonSize);
113
+ s = clippedTriangles.length;
114
+ const ct = Utils.setArraySize(clippedTriangles, s + 3 * (vertexCount - 2));
115
+ for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
116
+ ct[s] = index;
117
+ ct[s + 1] = index + ii;
118
+ ct[s + 2] = index + ii + 1;
119
+ }
120
+ index += vertexCount;
121
+ offset += polygonSize;
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ const clipOutput = this.clipOutput;
127
+ const polygons = this.clippingPolygons;
128
+ const polygonsCount = polygons.length;
129
+ let clipOutputItems = null;
112
130
  for (let i = 0; i < trianglesLength; i += 3) {
113
- let vertexOffset = triangles[i] << 1;
114
- let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
115
- vertexOffset = triangles[i + 1] << 1;
116
- let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
117
- vertexOffset = triangles[i + 2] << 1;
118
- let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
131
+ let t = triangles[i] << 1;
132
+ const x1 = vertices[t], y1 = vertices[t + 1];
133
+ t = triangles[i + 1] << 1;
134
+ const x2 = vertices[t], y2 = vertices[t + 1];
135
+ t = triangles[i + 2] << 1;
136
+ const x3 = vertices[t], y3 = vertices[t + 1];
119
137
  for (let p = 0; p < polygonsCount; p++) {
120
138
  let s = clippedVertices.length;
121
- if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
122
- let clipOutputLength = clipOutput.length;
123
- if (clipOutputLength == 0)
139
+ if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
140
+ clipOutputItems = this.clipOutput;
141
+ const clipOutputLength = clipOutput.length;
142
+ if (clipOutputLength === 0)
124
143
  continue;
125
144
  let clipOutputCount = clipOutputLength >> 1;
126
- let clipOutputItems = this.clipOutput;
127
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * 2);
128
- for (let ii = 0; ii < clipOutputLength; ii += 2, s += 2) {
129
- let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
130
- clippedVerticesItems[s] = x;
131
- clippedVerticesItems[s + 1] = y;
132
- }
145
+ const cv = Utils.setArraySize(clippedVertices, s + clipOutputLength);
146
+ Utils.arrayCopy(clipOutputItems, 0, cv, s, clipOutputLength);
133
147
  s = clippedTriangles.length;
134
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
148
+ const ct = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
135
149
  clipOutputCount--;
136
150
  for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
137
- clippedTrianglesItems[s] = index;
138
- clippedTrianglesItems[s + 1] = (index + ii);
139
- clippedTrianglesItems[s + 2] = (index + ii + 1);
151
+ ct[s] = index;
152
+ ct[s + 1] = (index + ii);
153
+ ct[s + 2] = (index + ii + 1);
140
154
  }
141
- index += clipOutputCount + 1;
155
+ index += clipOutputCount;
142
156
  }
143
157
  else {
144
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * 2);
145
- clippedVerticesItems[s] = x1;
146
- clippedVerticesItems[s + 1] = y1;
147
- clippedVerticesItems[s + 2] = x2;
148
- clippedVerticesItems[s + 3] = y2;
149
- clippedVerticesItems[s + 4] = x3;
150
- clippedVerticesItems[s + 5] = y3;
158
+ const cv = Utils.setArraySize(clippedVertices, s + 3 * 2);
159
+ cv[s] = x1;
160
+ cv[s + 1] = y1;
161
+ cv[s + 2] = x2;
162
+ cv[s + 3] = y2;
163
+ cv[s + 4] = x3;
164
+ cv[s + 5] = y3;
151
165
  s = clippedTriangles.length;
152
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
153
- clippedTrianglesItems[s] = index;
154
- clippedTrianglesItems[s + 1] = (index + 1);
155
- clippedTrianglesItems[s + 2] = (index + 2);
166
+ const ct = Utils.setArraySize(clippedTriangles, s + 3);
167
+ ct[s] = index;
168
+ ct[s + 1] = (index + 1);
169
+ ct[s + 2] = (index + 2);
156
170
  index += 3;
157
171
  break;
158
172
  }
159
173
  }
160
174
  }
175
+ return clipOutputItems != null;
161
176
  }
162
- clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor) {
163
- let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices;
164
- let clippedTriangles = this.clippedTriangles;
165
- let polygons = this.clippingPolygons;
166
- let polygonsCount = polygons.length;
167
- let vertexSize = twoColor ? 12 : 8;
168
- let index = 0;
177
+ clipTrianglesRender(vertices, triangles, trianglesLength, uvs, light, dark, twoColor, stride) {
178
+ const clippedVertices = this.clippedVertices;
169
179
  clippedVertices.length = 0;
180
+ const clippedTriangles = this.clippedTriangles;
170
181
  clippedTriangles.length = 0;
182
+ let index = 0;
183
+ if (this.inverse) {
184
+ const polygon = this.clippingPolygons[0];
185
+ for (let i = 0; i < trianglesLength; i += 3) {
186
+ let t0 = triangles[i], t1 = triangles[i + 1], t2 = triangles[i + 2];
187
+ const x1 = vertices[t0 * stride], y1 = vertices[t0 * stride + 1];
188
+ const x2 = vertices[t1 * stride], y2 = vertices[t1 * stride + 1];
189
+ const x3 = vertices[t2 * stride], y3 = vertices[t2 * stride + 1];
190
+ this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
191
+ const nn = this.inverseVertices.length;
192
+ if (nn === 0)
193
+ continue;
194
+ const u1 = uvs[t0 <<= 1], v1 = uvs[t0 + 1];
195
+ const u2 = uvs[t1 <<= 1], v2 = uvs[t1 + 1];
196
+ const u3 = uvs[t2 <<= 1], v3 = uvs[t2 + 1];
197
+ const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
198
+ const iv = this.inverseVertices;
199
+ for (let offset = 0; offset < nn;) {
200
+ const polygonSize = iv[offset++];
201
+ const vertexCount = polygonSize >> 1;
202
+ let s = clippedVertices.length;
203
+ const cv = Utils.setArraySize(clippedVertices, s + vertexCount * stride);
204
+ for (let ii = 0; ii < polygonSize; ii += 2, s += stride) {
205
+ const x = iv[offset + ii], y = iv[offset + ii + 1];
206
+ cv[s] = x;
207
+ cv[s + 1] = y;
208
+ cv[s + 2] = light.r;
209
+ cv[s + 3] = light.g;
210
+ cv[s + 4] = light.b;
211
+ cv[s + 5] = light.a;
212
+ const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
213
+ cv[s + 6] = u1 * a + u2 * b + u3 * c;
214
+ cv[s + 7] = v1 * a + v2 * b + v3 * c;
215
+ if (twoColor) {
216
+ cv[s + 8] = dark.r;
217
+ cv[s + 9] = dark.g;
218
+ cv[s + 10] = dark.b;
219
+ cv[s + 11] = dark.a;
220
+ }
221
+ }
222
+ s = clippedTriangles.length;
223
+ const ct = Utils.setArraySize(clippedTriangles, s + 3 * (vertexCount - 2));
224
+ for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
225
+ ct[s] = index;
226
+ ct[s + 1] = index + ii;
227
+ ct[s + 2] = index + ii + 1;
228
+ }
229
+ index += vertexCount;
230
+ offset += polygonSize;
231
+ }
232
+ }
233
+ return true;
234
+ }
235
+ const clipOutput = this.clipOutput;
236
+ const polygons = this.clippingPolygons;
237
+ const polygonsCount = this.clippingPolygons.length;
238
+ let clipOutputItems = null;
171
239
  for (let i = 0; i < trianglesLength; i += 3) {
172
- let vertexOffset = triangles[i] << 1;
173
- let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
174
- let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
175
- vertexOffset = triangles[i + 1] << 1;
176
- let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
177
- let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
178
- vertexOffset = triangles[i + 2] << 1;
179
- let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
180
- let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
240
+ let t = triangles[i];
241
+ const x1 = vertices[t * stride], y1 = vertices[t * stride + 1];
242
+ const u1 = uvs[t << 1], v1 = uvs[(t << 1) + 1];
243
+ t = triangles[i + 1];
244
+ const x2 = vertices[t * stride], y2 = vertices[t * stride + 1];
245
+ const u2 = uvs[t << 1], v2 = uvs[(t << 1) + 1];
246
+ t = triangles[i + 2];
247
+ const x3 = vertices[t * stride], y3 = vertices[t * stride + 1];
248
+ const u3 = uvs[t << 1], v3 = uvs[(t << 1) + 1];
249
+ const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
181
250
  for (let p = 0; p < polygonsCount; p++) {
182
251
  let s = clippedVertices.length;
183
- if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
184
- let clipOutputLength = clipOutput.length;
185
- if (clipOutputLength == 0)
252
+ if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
253
+ clipOutputItems = this.clipOutput;
254
+ const clipOutputLength = clipOutput.length;
255
+ if (clipOutputLength === 0)
186
256
  continue;
187
- let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
188
- let d = 1 / (d0 * d2 + d1 * (y1 - y3));
189
257
  let clipOutputCount = clipOutputLength >> 1;
190
- let clipOutputItems = this.clipOutput;
191
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize);
192
- for (let ii = 0; ii < clipOutputLength; ii += 2, s += vertexSize) {
193
- let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
194
- clippedVerticesItems[s] = x;
195
- clippedVerticesItems[s + 1] = y;
196
- clippedVerticesItems[s + 2] = light.r;
197
- clippedVerticesItems[s + 3] = light.g;
198
- clippedVerticesItems[s + 4] = light.b;
199
- clippedVerticesItems[s + 5] = light.a;
200
- let c0 = x - x3, c1 = y - y3;
201
- let a = (d0 * c0 + d1 * c1) * d;
202
- let b = (d4 * c0 + d2 * c1) * d;
203
- let c = 1 - a - b;
204
- clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c;
205
- clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c;
258
+ const cv = Utils.setArraySize(clippedVertices, s + clipOutputCount * stride);
259
+ for (let ii = 0; ii < clipOutputLength; ii += 2, s += stride) {
260
+ const x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
261
+ cv[s] = x;
262
+ cv[s + 1] = y;
263
+ cv[s + 2] = light.r;
264
+ cv[s + 3] = light.g;
265
+ cv[s + 4] = light.b;
266
+ cv[s + 5] = light.a;
267
+ const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
268
+ cv[s + 6] = u1 * a + u2 * b + u3 * c;
269
+ cv[s + 7] = v1 * a + v2 * b + v3 * c;
206
270
  if (twoColor) {
207
- clippedVerticesItems[s + 8] = dark.r;
208
- clippedVerticesItems[s + 9] = dark.g;
209
- clippedVerticesItems[s + 10] = dark.b;
210
- clippedVerticesItems[s + 11] = dark.a;
271
+ cv[s + 8] = dark.r;
272
+ cv[s + 9] = dark.g;
273
+ cv[s + 10] = dark.b;
274
+ cv[s + 11] = dark.a;
211
275
  }
212
276
  }
213
277
  s = clippedTriangles.length;
214
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
278
+ const ct = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
215
279
  clipOutputCount--;
216
280
  for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
217
- clippedTrianglesItems[s] = index;
218
- clippedTrianglesItems[s + 1] = (index + ii);
219
- clippedTrianglesItems[s + 2] = (index + ii + 1);
281
+ ct[s] = index;
282
+ ct[s + 1] = (index + ii);
283
+ ct[s + 2] = (index + ii + 1);
220
284
  }
221
285
  index += clipOutputCount + 1;
222
286
  }
223
287
  else {
224
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * vertexSize);
225
- clippedVerticesItems[s] = x1;
226
- clippedVerticesItems[s + 1] = y1;
227
- clippedVerticesItems[s + 2] = light.r;
228
- clippedVerticesItems[s + 3] = light.g;
229
- clippedVerticesItems[s + 4] = light.b;
230
- clippedVerticesItems[s + 5] = light.a;
288
+ const cv = Utils.setArraySize(clippedVertices, s + 3 * stride);
289
+ cv[s] = x1;
290
+ cv[s + 1] = y1;
291
+ cv[s + 2] = light.r;
292
+ cv[s + 3] = light.g;
293
+ cv[s + 4] = light.b;
294
+ cv[s + 5] = light.a;
231
295
  if (!twoColor) {
232
- clippedVerticesItems[s + 6] = u1;
233
- clippedVerticesItems[s + 7] = v1;
234
- clippedVerticesItems[s + 8] = x2;
235
- clippedVerticesItems[s + 9] = y2;
236
- clippedVerticesItems[s + 10] = light.r;
237
- clippedVerticesItems[s + 11] = light.g;
238
- clippedVerticesItems[s + 12] = light.b;
239
- clippedVerticesItems[s + 13] = light.a;
240
- clippedVerticesItems[s + 14] = u2;
241
- clippedVerticesItems[s + 15] = v2;
242
- clippedVerticesItems[s + 16] = x3;
243
- clippedVerticesItems[s + 17] = y3;
244
- clippedVerticesItems[s + 18] = light.r;
245
- clippedVerticesItems[s + 19] = light.g;
246
- clippedVerticesItems[s + 20] = light.b;
247
- clippedVerticesItems[s + 21] = light.a;
248
- clippedVerticesItems[s + 22] = u3;
249
- clippedVerticesItems[s + 23] = v3;
296
+ cv[s + 6] = u1;
297
+ cv[s + 7] = v1;
298
+ cv[s + 8] = x2;
299
+ cv[s + 9] = y2;
300
+ cv[s + 10] = light.r;
301
+ cv[s + 11] = light.g;
302
+ cv[s + 12] = light.b;
303
+ cv[s + 13] = light.a;
304
+ cv[s + 14] = u2;
305
+ cv[s + 15] = v2;
306
+ cv[s + 16] = x3;
307
+ cv[s + 17] = y3;
308
+ cv[s + 18] = light.r;
309
+ cv[s + 19] = light.g;
310
+ cv[s + 20] = light.b;
311
+ cv[s + 21] = light.a;
312
+ cv[s + 22] = u3;
313
+ cv[s + 23] = v3;
250
314
  }
251
315
  else {
252
- clippedVerticesItems[s + 6] = u1;
253
- clippedVerticesItems[s + 7] = v1;
254
- clippedVerticesItems[s + 8] = dark.r;
255
- clippedVerticesItems[s + 9] = dark.g;
256
- clippedVerticesItems[s + 10] = dark.b;
257
- clippedVerticesItems[s + 11] = dark.a;
258
- clippedVerticesItems[s + 12] = x2;
259
- clippedVerticesItems[s + 13] = y2;
260
- clippedVerticesItems[s + 14] = light.r;
261
- clippedVerticesItems[s + 15] = light.g;
262
- clippedVerticesItems[s + 16] = light.b;
263
- clippedVerticesItems[s + 17] = light.a;
264
- clippedVerticesItems[s + 18] = u2;
265
- clippedVerticesItems[s + 19] = v2;
266
- clippedVerticesItems[s + 20] = dark.r;
267
- clippedVerticesItems[s + 21] = dark.g;
268
- clippedVerticesItems[s + 22] = dark.b;
269
- clippedVerticesItems[s + 23] = dark.a;
270
- clippedVerticesItems[s + 24] = x3;
271
- clippedVerticesItems[s + 25] = y3;
272
- clippedVerticesItems[s + 26] = light.r;
273
- clippedVerticesItems[s + 27] = light.g;
274
- clippedVerticesItems[s + 28] = light.b;
275
- clippedVerticesItems[s + 29] = light.a;
276
- clippedVerticesItems[s + 30] = u3;
277
- clippedVerticesItems[s + 31] = v3;
278
- clippedVerticesItems[s + 32] = dark.r;
279
- clippedVerticesItems[s + 33] = dark.g;
280
- clippedVerticesItems[s + 34] = dark.b;
281
- clippedVerticesItems[s + 35] = dark.a;
316
+ cv[s + 6] = u1;
317
+ cv[s + 7] = v1;
318
+ cv[s + 8] = dark.r;
319
+ cv[s + 9] = dark.g;
320
+ cv[s + 10] = dark.b;
321
+ cv[s + 11] = dark.a;
322
+ cv[s + 12] = x2;
323
+ cv[s + 13] = y2;
324
+ cv[s + 14] = light.r;
325
+ cv[s + 15] = light.g;
326
+ cv[s + 16] = light.b;
327
+ cv[s + 17] = light.a;
328
+ cv[s + 18] = u2;
329
+ cv[s + 19] = v2;
330
+ cv[s + 20] = dark.r;
331
+ cv[s + 21] = dark.g;
332
+ cv[s + 22] = dark.b;
333
+ cv[s + 23] = dark.a;
334
+ cv[s + 24] = x3;
335
+ cv[s + 25] = y3;
336
+ cv[s + 26] = light.r;
337
+ cv[s + 27] = light.g;
338
+ cv[s + 28] = light.b;
339
+ cv[s + 29] = light.a;
340
+ cv[s + 30] = u3;
341
+ cv[s + 31] = v3;
342
+ cv[s + 32] = dark.r;
343
+ cv[s + 33] = dark.g;
344
+ cv[s + 34] = dark.b;
345
+ cv[s + 35] = dark.a;
282
346
  }
283
347
  s = clippedTriangles.length;
284
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
285
- clippedTrianglesItems[s] = index;
286
- clippedTrianglesItems[s + 1] = (index + 1);
287
- clippedTrianglesItems[s + 2] = (index + 2);
348
+ const ct = Utils.setArraySize(clippedTriangles, s + 3);
349
+ ct[s] = index;
350
+ ct[s + 1] = (index + 1);
351
+ ct[s + 2] = (index + 2);
288
352
  index += 3;
289
353
  break;
290
354
  }
291
355
  }
292
356
  }
357
+ return clipOutputItems != null;
293
358
  }
294
- clipTrianglesUnpacked(vertices, triangles, trianglesLength, uvs) {
295
- let clipOutput = this.clipOutput, clippedVertices = this.clippedVertices, clippedUVs = this.clippedUVs;
296
- let clippedTriangles = this.clippedTriangles;
297
- let polygons = this.clippingPolygons;
298
- let polygonsCount = polygons.length;
359
+ clipTrianglesUnpacked(vertices, vertexStart, triangles, trianglesLength, uvs, stride = 2) {
360
+ let clippedVertices = this._clippedVerticesTyped;
361
+ let clippedUVs = this._clippedUVsTyped;
362
+ let clippedTriangles = this._clippedTrianglesTyped;
299
363
  let index = 0;
300
- clippedVertices.length = 0;
301
- clippedUVs.length = 0;
302
- clippedTriangles.length = 0;
364
+ this.clippedVerticesLength = 0;
365
+ this.clippedUVsLength = 0;
366
+ this.clippedTrianglesLength = 0;
367
+ if (this.inverse) {
368
+ const polygon = this.clippingPolygons[0];
369
+ for (let i = 0; i < trianglesLength; i += 3) {
370
+ let v = triangles[i] * stride;
371
+ const x1 = vertices[vertexStart + v], y1 = vertices[vertexStart + v + 1];
372
+ let uv = triangles[i] << 1;
373
+ const u1 = uvs[uv], v1 = uvs[uv + 1];
374
+ v = triangles[i + 1] * stride;
375
+ const x2 = vertices[vertexStart + v], y2 = vertices[vertexStart + v + 1];
376
+ uv = triangles[i + 1] << 1;
377
+ const u2 = uvs[uv], v2 = uvs[uv + 1];
378
+ v = triangles[i + 2] * stride;
379
+ const x3 = vertices[vertexStart + v], y3 = vertices[vertexStart + v + 1];
380
+ uv = triangles[i + 2] << 1;
381
+ const u3 = uvs[uv], v3 = uvs[uv + 1];
382
+ this.clipInverse(x1, y1, x2, y2, x3, y3, polygon);
383
+ const nn = this.inverseVertices.length;
384
+ if (nn === 0)
385
+ continue;
386
+ const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
387
+ const iv = this.inverseVertices;
388
+ for (let offset = 0; offset < nn;) {
389
+ const polygonSize = iv[offset++];
390
+ const vertexCount = polygonSize >> 1;
391
+ let s = this.clippedVerticesLength;
392
+ const newLength = s + vertexCount * stride;
393
+ const newUVLength = this.clippedUVsLength + vertexCount * 2;
394
+ if (clippedVertices.length < newLength) {
395
+ this._clippedVerticesTyped = new Float32Array(newLength * 2);
396
+ this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
397
+ clippedVertices = this._clippedVerticesTyped;
398
+ }
399
+ if (clippedUVs.length < newUVLength) {
400
+ this._clippedUVsTyped = new Float32Array(newUVLength * 2);
401
+ this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
402
+ clippedUVs = this._clippedUVsTyped;
403
+ }
404
+ this.clippedVerticesLength = newLength;
405
+ this.clippedUVsLength = newUVLength;
406
+ const cv = this._clippedVerticesTyped;
407
+ const cu = this._clippedUVsTyped;
408
+ let uvIndex = newUVLength - vertexCount * 2;
409
+ for (let ii = 0; ii < polygonSize; ii += 2, s += stride, uvIndex += 2) {
410
+ const x = iv[offset + ii], y = iv[offset + ii + 1];
411
+ cv[s] = x;
412
+ cv[s + 1] = y;
413
+ const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
414
+ cu[uvIndex] = u1 * a + u2 * b + u3 * c;
415
+ cu[uvIndex + 1] = v1 * a + v2 * b + v3 * c;
416
+ }
417
+ s = this.clippedTrianglesLength;
418
+ const newLengthTriangles = s + 3 * (vertexCount - 2);
419
+ if (clippedTriangles.length < newLengthTriangles) {
420
+ this._clippedTrianglesTyped = new Uint16Array(newLengthTriangles * 2);
421
+ this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
422
+ clippedTriangles = this._clippedTrianglesTyped;
423
+ }
424
+ this.clippedTrianglesLength = newLengthTriangles;
425
+ const ct = clippedTriangles;
426
+ for (let ii = 1; ii < vertexCount - 1; ii++, s += 3) {
427
+ ct[s] = index;
428
+ ct[s + 1] = index + ii;
429
+ ct[s + 2] = index + ii + 1;
430
+ }
431
+ index += vertexCount;
432
+ offset += polygonSize;
433
+ }
434
+ }
435
+ return true;
436
+ }
437
+ const clipOutput = this.clipOutput;
438
+ const polygons = this.clippingPolygons;
439
+ const polygonsCount = this.clippingPolygons.length;
440
+ let clipOutputItems = null;
303
441
  for (let i = 0; i < trianglesLength; i += 3) {
304
- let vertexOffset = triangles[i] << 1;
305
- let x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1];
306
- let u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1];
307
- vertexOffset = triangles[i + 1] << 1;
308
- let x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1];
309
- let u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1];
310
- vertexOffset = triangles[i + 2] << 1;
311
- let x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1];
312
- let u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1];
442
+ let t = triangles[i];
443
+ let v = t * stride;
444
+ const x1 = vertices[vertexStart + v], y1 = vertices[vertexStart + v + 1];
445
+ let uv = t << 1;
446
+ const u1 = uvs[uv], v1 = uvs[uv + 1];
447
+ t = triangles[i + 1];
448
+ v = t * stride;
449
+ const x2 = vertices[vertexStart + v], y2 = vertices[vertexStart + v + 1];
450
+ uv = t << 1;
451
+ const u2 = uvs[uv], v2 = uvs[uv + 1];
452
+ t = triangles[i + 2];
453
+ v = t * stride;
454
+ const x3 = vertices[vertexStart + v], y3 = vertices[vertexStart + v + 1];
455
+ uv = t << 1;
456
+ const u3 = uvs[uv], v3 = uvs[uv + 1];
457
+ const d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1, d = 1 / (d0 * d2 + d1 * (y1 - y3));
313
458
  for (let p = 0; p < polygonsCount; p++) {
314
- let s = clippedVertices.length;
315
- if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) {
316
- let clipOutputLength = clipOutput.length;
317
- if (clipOutputLength == 0)
459
+ let s = this.clippedVerticesLength;
460
+ if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p])) {
461
+ clipOutputItems = clipOutput;
462
+ const clipOutputLength = clipOutput.length;
463
+ if (clipOutputLength === 0)
318
464
  continue;
319
- let d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1;
320
- let d = 1 / (d0 * d2 + d1 * (y1 - y3));
321
465
  let clipOutputCount = clipOutputLength >> 1;
322
- let clipOutputItems = this.clipOutput;
323
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + clipOutputCount * 2);
324
- let clippedUVsItems = Utils.setArraySize(clippedUVs, s + clipOutputCount * 2);
325
- for (let ii = 0; ii < clipOutputLength; ii += 2, s += 2) {
326
- let x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
327
- clippedVerticesItems[s] = x;
328
- clippedVerticesItems[s + 1] = y;
329
- let c0 = x - x3, c1 = y - y3;
330
- let a = (d0 * c0 + d1 * c1) * d;
331
- let b = (d4 * c0 + d2 * c1) * d;
332
- let c = 1 - a - b;
333
- clippedUVsItems[s] = u1 * a + u2 * b + u3 * c;
334
- clippedUVsItems[s + 1] = v1 * a + v2 * b + v3 * c;
466
+ const newLength = s + clipOutputCount * stride;
467
+ if (clippedVertices.length < newLength) {
468
+ this._clippedVerticesTyped = new Float32Array(newLength * 2);
469
+ this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
470
+ this._clippedUVsTyped = new Float32Array((this.clippedUVsLength + clipOutputCount * 2) * 2);
471
+ this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
472
+ clippedVertices = this._clippedVerticesTyped;
473
+ clippedUVs = this._clippedUVsTyped;
335
474
  }
336
- s = clippedTriangles.length;
337
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2));
475
+ const cv = clippedVertices;
476
+ const cu = clippedUVs;
477
+ this.clippedVerticesLength = newLength;
478
+ let uvIndex = this.clippedUVsLength;
479
+ this.clippedUVsLength = uvIndex + clipOutputCount * 2;
480
+ for (let ii = 0; ii < clipOutputLength; ii += 2, s += stride, uvIndex += 2) {
481
+ const x = clipOutputItems[ii], y = clipOutputItems[ii + 1];
482
+ cv[s] = x;
483
+ cv[s + 1] = y;
484
+ const c0 = x - x3, c1 = y - y3, a = (d0 * c0 + d1 * c1) * d, b = (d4 * c0 + d2 * c1) * d, c = 1 - a - b;
485
+ cu[uvIndex] = u1 * a + u2 * b + u3 * c;
486
+ cu[uvIndex + 1] = v1 * a + v2 * b + v3 * c;
487
+ }
488
+ s = this.clippedTrianglesLength;
489
+ const newLengthTriangles = s + 3 * (clipOutputCount - 2);
490
+ if (clippedTriangles.length < newLengthTriangles) {
491
+ this._clippedTrianglesTyped = new Uint16Array(newLengthTriangles * 2);
492
+ this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
493
+ clippedTriangles = this._clippedTrianglesTyped;
494
+ }
495
+ this.clippedTrianglesLength = newLengthTriangles;
496
+ const ct = clippedTriangles;
338
497
  clipOutputCount--;
339
498
  for (let ii = 1; ii < clipOutputCount; ii++, s += 3) {
340
- clippedTrianglesItems[s] = index;
341
- clippedTrianglesItems[s + 1] = (index + ii);
342
- clippedTrianglesItems[s + 2] = (index + ii + 1);
499
+ ct[s] = index;
500
+ ct[s + 1] = (index + ii);
501
+ ct[s + 2] = (index + ii + 1);
343
502
  }
344
503
  index += clipOutputCount + 1;
345
504
  }
346
505
  else {
347
- let clippedVerticesItems = Utils.setArraySize(clippedVertices, s + 3 * 2);
348
- clippedVerticesItems[s] = x1;
349
- clippedVerticesItems[s + 1] = y1;
350
- clippedVerticesItems[s + 2] = x2;
351
- clippedVerticesItems[s + 3] = y2;
352
- clippedVerticesItems[s + 4] = x3;
353
- clippedVerticesItems[s + 5] = y3;
354
- let clippedUVSItems = Utils.setArraySize(clippedUVs, s + 3 * 2);
355
- clippedUVSItems[s] = u1;
356
- clippedUVSItems[s + 1] = v1;
357
- clippedUVSItems[s + 2] = u2;
358
- clippedUVSItems[s + 3] = v2;
359
- clippedUVSItems[s + 4] = u3;
360
- clippedUVSItems[s + 5] = v3;
361
- s = clippedTriangles.length;
362
- let clippedTrianglesItems = Utils.setArraySize(clippedTriangles, s + 3);
363
- clippedTrianglesItems[s] = index;
364
- clippedTrianglesItems[s + 1] = (index + 1);
365
- clippedTrianglesItems[s + 2] = (index + 2);
506
+ let newLength = s + 3 * stride;
507
+ if (clippedVertices.length < newLength) {
508
+ this._clippedVerticesTyped = new Float32Array(newLength * 2);
509
+ this._clippedVerticesTyped.set(clippedVertices.subarray(0, s));
510
+ clippedVertices = this._clippedVerticesTyped;
511
+ }
512
+ clippedVertices[s] = x1;
513
+ clippedVertices[s + 1] = y1;
514
+ clippedVertices[s + stride] = x2;
515
+ clippedVertices[s + stride + 1] = y2;
516
+ clippedVertices[s + stride * 2] = x3;
517
+ clippedVertices[s + stride * 2 + 1] = y3;
518
+ const uvLength = this.clippedUVsLength + 3 * 2;
519
+ if (clippedUVs.length < uvLength) {
520
+ this._clippedUVsTyped = new Float32Array(uvLength * 2);
521
+ this._clippedUVsTyped.set(clippedUVs.subarray(0, this.clippedUVsLength));
522
+ clippedUVs = this._clippedUVsTyped;
523
+ }
524
+ const uvIndex = this.clippedUVsLength;
525
+ clippedUVs[uvIndex] = u1;
526
+ clippedUVs[uvIndex + 1] = v1;
527
+ clippedUVs[uvIndex + 2] = u2;
528
+ clippedUVs[uvIndex + 3] = v2;
529
+ clippedUVs[uvIndex + 4] = u3;
530
+ clippedUVs[uvIndex + 5] = v3;
531
+ this.clippedVerticesLength = newLength;
532
+ this.clippedUVsLength = uvLength;
533
+ s = this.clippedTrianglesLength;
534
+ newLength = s + 3;
535
+ if (clippedTriangles.length < newLength) {
536
+ this._clippedTrianglesTyped = new Uint16Array(newLength * 2);
537
+ this._clippedTrianglesTyped.set(clippedTriangles.subarray(0, s));
538
+ clippedTriangles = this._clippedTrianglesTyped;
539
+ }
540
+ const ct = clippedTriangles;
541
+ ct[s] = index;
542
+ ct[s + 1] = (index + 1);
543
+ ct[s + 2] = (index + 2);
366
544
  index += 3;
545
+ this.clippedTrianglesLength = newLength;
367
546
  break;
368
547
  }
369
548
  }
370
549
  }
550
+ this.clippedVerticesTyped = this._clippedVerticesTyped.subarray(0, this.clippedVerticesLength);
551
+ this.clippedUVsTyped = this._clippedUVsTyped.subarray(0, this.clippedUVsLength);
552
+ this.clippedTrianglesTyped = this._clippedTrianglesTyped.subarray(0, this.clippedTrianglesLength);
553
+ return clipOutputItems !== null;
371
554
  }
372
- /** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping
373
- * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */
374
- clip(x1, y1, x2, y2, x3, y3, clippingArea, output) {
375
- let originalOutput = output;
555
+ clip(x1, y1, x2, y2, x3, y3, polygon) {
556
+ const originalOutput = this.clipOutput;
376
557
  let clipped = false;
377
558
  // Avoid copy at the end.
378
- let input;
379
- if (clippingArea.length % 4 >= 2) {
380
- input = output;
559
+ let input, output;
560
+ if (polygon.length % 4 >= 2) {
561
+ input = this.clipOutput;
381
562
  output = this.scratch;
382
563
  }
383
- else
564
+ else {
384
565
  input = this.scratch;
385
- input.length = 0;
386
- input.push(x1);
387
- input.push(y1);
388
- input.push(x2);
389
- input.push(y2);
390
- input.push(x3);
391
- input.push(y3);
392
- input.push(x1);
393
- input.push(y1);
566
+ output = this.clipOutput;
567
+ }
568
+ const v = polygon;
569
+ input.length = 8;
570
+ const iv = input;
571
+ iv[0] = x1;
572
+ iv[1] = y1;
573
+ iv[2] = x2;
574
+ iv[3] = y2;
575
+ iv[4] = x3;
576
+ iv[5] = y3;
577
+ iv[6] = x1;
578
+ iv[7] = y1;
394
579
  output.length = 0;
395
- let clippingVerticesLast = clippingArea.length - 4;
396
- let clippingVertices = clippingArea;
580
+ const last = polygon.length - 4;
397
581
  for (let i = 0;; i += 2) {
398
- let edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1];
399
- let ex = edgeX - clippingVertices[i + 2], ey = edgeY - clippingVertices[i + 3];
400
- let outputStart = output.length;
401
- let inputVertices = input;
582
+ const edgeX = v[i], edgeY = v[i + 1], ex = edgeX - v[i + 2], ey = edgeY - v[i + 3];
583
+ const outputStart = output.length;
584
+ const iv = input;
402
585
  for (let ii = 0, nn = input.length - 2; ii < nn;) {
403
- let inputX = inputVertices[ii], inputY = inputVertices[ii + 1];
586
+ x1 = iv[ii];
587
+ y1 = iv[ii + 1];
404
588
  ii += 2;
405
- let inputX2 = inputVertices[ii], inputY2 = inputVertices[ii + 1];
406
- let s2 = ey * (edgeX - inputX2) > ex * (edgeY - inputY2);
407
- let s1 = ey * (edgeX - inputX) - ex * (edgeY - inputY);
589
+ x2 = iv[ii];
590
+ y2 = iv[ii + 1];
591
+ const s2 = ey * (edgeX - x2) > ex * (edgeY - y2);
592
+ const s1 = ey * (edgeX - x1) - ex * (edgeY - y1);
408
593
  if (s1 > 0) {
409
- if (s2) { // v1 inside, v2 inside
410
- output.push(inputX2);
411
- output.push(inputY2);
412
- continue;
413
- }
414
- // v1 inside, v2 outside
415
- let ix = inputX2 - inputX, iy = inputY2 - inputY, t = s1 / (ix * ey - iy * ex);
416
- if (t >= 0 && t <= 1) {
417
- output.push(inputX + ix * t);
418
- output.push(inputY + iy * t);
419
- }
420
- else {
421
- output.push(inputX2);
422
- output.push(inputY2);
423
- continue;
594
+ if (s2) // v1 in, v2 in
595
+ output.push(x2, y2);
596
+ else { // v1 in, v2 out
597
+ const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
598
+ if (t >= 0 && t <= 1) {
599
+ output.push(x1 + ix * t, y1 + iy * t);
600
+ clipped = true;
601
+ }
602
+ else
603
+ output.push(x2, y2);
424
604
  }
425
605
  }
426
- else if (s2) { // v1 outside, v2 inside
427
- let ix = inputX2 - inputX, iy = inputY2 - inputY, t = s1 / (ix * ey - iy * ex);
606
+ else if (s2) { // v1 out, v2 in
607
+ const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
428
608
  if (t >= 0 && t <= 1) {
429
- output.push(inputX + ix * t);
430
- output.push(inputY + iy * t);
431
- output.push(inputX2);
432
- output.push(inputY2);
433
- }
434
- else {
435
- output.push(inputX2);
436
- output.push(inputY2);
437
- continue;
609
+ output.push(x1 + ix * t, y1 + iy * t, x2, y2);
610
+ clipped = true;
438
611
  }
612
+ else
613
+ output.push(x2, y2);
439
614
  }
440
- clipped = true;
615
+ else // v1 out, v2 out
616
+ clipped = true;
441
617
  }
442
- if (outputStart == output.length) { // All edges outside.
618
+ if (outputStart === output.length) { // All outside.
443
619
  originalOutput.length = 0;
444
620
  return true;
445
621
  }
446
- output.push(output[0]);
447
- output.push(output[1]);
448
- if (i == clippingVerticesLast)
622
+ output.push(output[0], output[1]);
623
+ if (i === last)
449
624
  break;
450
- let temp = output;
625
+ const temp = output;
451
626
  output = input;
452
627
  output.length = 0;
453
628
  input = temp;
454
629
  }
455
- if (originalOutput != output) {
630
+ if (originalOutput !== output) {
456
631
  originalOutput.length = 0;
457
632
  for (let i = 0, n = output.length - 2; i < n; i++)
458
633
  originalOutput[i] = output[i];
@@ -461,27 +636,166 @@ export class SkeletonClipping {
461
636
  originalOutput.length = originalOutput.length - 2;
462
637
  return clipped;
463
638
  }
464
- static makeClockwise(polygon) {
465
- let vertices = polygon;
466
- let verticeslength = polygon.length;
467
- let area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0;
468
- for (let i = 0, n = verticeslength - 3; i < n; i += 2) {
469
- p1x = vertices[i];
470
- p1y = vertices[i + 1];
471
- p2x = vertices[i + 2];
472
- p2y = vertices[i + 3];
473
- area += p1x * p2y - p2x * p1y;
639
+ clipInverse(x1, y1, x2, y2, x3, y3, polygon) {
640
+ this.inverseVertices.length = 0;
641
+ const vLast = polygon.length - 4;
642
+ let input, output; // Avoid copy at the end.
643
+ if (polygon.length % 4 >= 2) {
644
+ input = this.clipOutput;
645
+ output = this.scratch;
474
646
  }
475
- if (area < 0)
476
- return;
477
- for (let i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) {
478
- let x = vertices[i], y = vertices[i + 1];
479
- let other = lastX - i;
480
- vertices[i] = vertices[other];
481
- vertices[i + 1] = vertices[other + 1];
482
- vertices[other] = x;
483
- vertices[other + 1] = y;
647
+ else {
648
+ input = this.scratch;
649
+ output = this.clipOutput;
650
+ }
651
+ input.length = 8;
652
+ let v = polygon, iv = input;
653
+ iv[0] = x1;
654
+ iv[1] = y1;
655
+ iv[2] = x2;
656
+ iv[3] = y2;
657
+ iv[4] = x3;
658
+ iv[5] = y3;
659
+ iv[6] = x1;
660
+ iv[7] = y1;
661
+ output.length = 0;
662
+ for (let i = 0;; i += 2) {
663
+ const edgeX = v[i], edgeY = v[i + 1], ex = edgeX - v[i + 2], ey = edgeY - v[i + 3];
664
+ const outputStart = output.length, fragmentStart = this.inverseVertices.length;
665
+ this.inverseVertices.push(0);
666
+ iv = input;
667
+ for (let ii = 0, nn = input.length - 2; ii < nn;) {
668
+ x1 = iv[ii];
669
+ y1 = iv[ii + 1];
670
+ ii += 2;
671
+ x2 = iv[ii];
672
+ y2 = iv[ii + 1];
673
+ const s2 = ey * (edgeX - x2) > ex * (edgeY - y2);
674
+ const s1 = ey * (edgeX - x1) - ex * (edgeY - y1);
675
+ if (s1 > 0) {
676
+ if (s2) // v1 in, v2 in
677
+ output.push(x2, y2);
678
+ else {
679
+ // v1 in, v2 out
680
+ const ix = x2 - x1, iy = y2 - y1, t = s1 / (ix * ey - iy * ex);
681
+ if (t >= 0 && t <= 1) {
682
+ const cx = x1 + ix * t, cy = y1 + iy * t;
683
+ output.push(cx, cy);
684
+ this.inverseVertices.push(cx, cy, x2, y2);
685
+ }
686
+ else
687
+ output.push(x2, y2);
688
+ }
689
+ }
690
+ else if (s2) { // v1 out, v2 in
691
+ const dx = x2 - x1, dy = y2 - y1, t = s1 / (dx * ey - dy * ex);
692
+ if (t >= 0 && t <= 1) {
693
+ const cx = x1 + dx * t, cy = y1 + dy * t;
694
+ this.inverseVertices.push(cx, cy);
695
+ output.push(cx, cy, x2, y2);
696
+ }
697
+ else
698
+ output.push(x2, y2);
699
+ }
700
+ else // v1 out, v2 out
701
+ this.inverseVertices.push(x2, y2);
702
+ }
703
+ const fragmentSize = this.inverseVertices.length - fragmentStart - 1;
704
+ if (fragmentSize >= 6)
705
+ this.inverseVertices[fragmentStart] = fragmentSize;
706
+ else
707
+ this.inverseVertices.length = fragmentStart; // Degenerate.
708
+ if (outputStart === output.length)
709
+ break; // All outside.
710
+ output.push(output[0], output[1]);
711
+ if (i === vLast)
712
+ break;
713
+ const temp = output;
714
+ output = input;
715
+ output.length = 0;
716
+ input = temp;
717
+ }
718
+ }
719
+ makeClockwise(polygon) {
720
+ const v = polygon;
721
+ const n = polygon.length;
722
+ let noCW = true, noCCW = true;
723
+ let area = 0, prevX = v[n - 2], prevY = v[n - 1], currX = v[0], currY = v[1];
724
+ for (let i = 2; i < n; i += 2) {
725
+ const nextX = v[i], nextY = v[i + 1];
726
+ area += currX * nextY - nextX * currY;
727
+ const cross = (currX - prevX) * (nextY - currY) - (currY - prevY) * (nextX - currX);
728
+ noCCW = noCCW && cross <= 0;
729
+ noCW = noCW && cross >= 0;
730
+ prevX = currX;
731
+ prevY = currY;
732
+ currX = nextX;
733
+ currY = nextY;
734
+ }
735
+ area += currX * v[1] - v[0] * currY;
736
+ const cross = (currX - prevX) * (v[1] - currY) - (currY - prevY) * (v[0] - currX);
737
+ noCCW = noCCW && cross <= 0;
738
+ noCW = noCW && cross >= 0;
739
+ if (area >= 0) {
740
+ for (let i = 0, lastX = n - 2, half = n >> 1; i < half; i += 2) {
741
+ const x = v[i], y = v[i + 1];
742
+ const other = lastX - i;
743
+ v[i] = v[other];
744
+ v[i + 1] = v[other + 1];
745
+ v[other] = x;
746
+ v[other + 1] = y;
747
+ }
748
+ return noCW;
749
+ }
750
+ return noCCW;
751
+ }
752
+ makeConvex(polygon) {
753
+ const n = polygon.length;
754
+ const v = polygon;
755
+ this.clipOutput.length = n;
756
+ const sorted = this.clipOutput;
757
+ sorted[0] = v[0];
758
+ sorted[1] = v[1];
759
+ for (let i = 2; i < n; i += 2) {
760
+ const x = v[i], y = v[i + 1];
761
+ let p = i - 2;
762
+ for (; p >= 0 && (sorted[p] > x || (sorted[p] === x && sorted[p + 1] > y)); p -= 2) {
763
+ sorted[p + 2] = sorted[p];
764
+ sorted[p + 3] = sorted[p + 1];
765
+ }
766
+ sorted[p + 2] = x;
767
+ sorted[p + 3] = y;
768
+ }
769
+ v[0] = sorted[0];
770
+ v[1] = sorted[1];
771
+ v[2] = sorted[2];
772
+ v[3] = sorted[3];
773
+ let s = 4;
774
+ for (let i = 4; i < n; i += 2, s += 2) {
775
+ const x = sorted[i], y = sorted[i + 1];
776
+ while ((v[s - 2] - v[s - 4]) * (y - v[s - 3]) - (v[s - 1] - v[s - 3]) * (x - v[s - 4]) >= 0) {
777
+ s -= 2;
778
+ if (s === 2)
779
+ break;
780
+ }
781
+ v[s] = x;
782
+ v[s + 1] = y;
783
+ }
784
+ v[s] = sorted[n - 4];
785
+ v[s + 1] = sorted[n - 3];
786
+ const t = s;
787
+ s += 2;
788
+ for (let i = n - 6; i >= 0; i -= 2, s += 2) {
789
+ const x = sorted[i], y = sorted[i + 1];
790
+ while ((v[s - 2] - v[s - 4]) * (y - v[s - 3]) - (v[s - 1] - v[s - 3]) * (x - v[s - 4]) >= 0) {
791
+ s -= 2;
792
+ if (s === t)
793
+ break;
794
+ }
795
+ v[s] = x;
796
+ v[s + 1] = y;
484
797
  }
798
+ polygon.length = s - 2;
485
799
  }
486
800
  }
487
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvbkNsaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUkvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLEtBQUssRUFBMEIsTUFBTSxZQUFZLENBQUM7QUFFM0QsTUFBTSxPQUFPLGdCQUFnQjtJQUNwQixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUNsQyxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUN0QyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUN6QyxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUN0QyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUNqQyxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBQy9CLE9BQU8sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO0lBRTlCLGNBQWMsR0FBOEIsSUFBSSxDQUFDO0lBQ2pELGdCQUFnQixHQUFnQyxJQUFJLENBQUM7SUFFN0QsU0FBUyxDQUFFLElBQVUsRUFBRSxJQUF3QjtRQUM5QyxJQUFJLElBQUksQ0FBQyxjQUFjO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFFM0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ2pDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMs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R0FBRyxDQUFDLENBQUM7UUFDM0IsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFdkQsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFdkQsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxH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Q0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQzdCLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2pDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2Ysb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFFakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRWxDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNuQyxDQUFDO3lCQUFNLENBQUM7d0JBQ1Asb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3JDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBRXRDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2xDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDdkMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3ZDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLG9CQUFvQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxvQkFBb0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFFdEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbEMsb0JBQW9CLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxD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QztZQUN0QixJQUFJLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLElBQUksR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRixJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN0QixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0QyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDRixDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiBTcGluZSBSdW50aW1lcyBMaWNlbnNlIEFncmVlbWVudFxuICogTGFzdCB1cGRhdGVkIEFwcmlsIDUsIDIwMjUuIFJlcGxhY2VzIGFsbCBwcmlvciB2ZXJzaW9ucy5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAyNSwgRXNvdGVyaWMgU29mdHdhcmUgTExDXG4gKlxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXG4gKiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyBpcyBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZFxuICogY29uZGl0aW9ucyBvZiBTZWN0aW9uIDIgb2YgdGhlIFNwaW5lIEVkaXRvciBMaWNlbnNlIEFncmVlbWVudDpcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxuICpcbiAqIE90aGVyd2lzZSwgaXQgaXMgcGVybWl0dGVkIHRvIGludGVncmF0ZSB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZVxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxuICogXCJQcm9kdWN0c1wiKSwgcHJvdmlkZWQgdGhhdCBlYWNoIHVzZXIgb2YgdGhlIFByb2R1Y3RzIG11c3Qgb2J0YWluIHRoZWlyIG93blxuICogU3BpbmUgRWRpdG9yIGxpY2Vuc2UgYW5kIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9kdWN0cyBpbiBhbnkgZm9ybSBtdXN0XG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cbiAqXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMgQVJFIFBST1ZJREVEIEJZIEVTT1RFUklDIFNPRlRXQVJFIExMQyBcIkFTIElTXCIgQU5EIEFOWVxuICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxuICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRVxuICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRVNPVEVSSUMgU09GVFdBUkUgTExDIEJFIExJQUJMRSBGT1IgQU5ZXG4gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xuICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTLFxuICogQlVTSU5FU1MgSU5URVJSVVBUSU9OLCBPUiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUykgSE9XRVZFUiBDQVVTRUQgQU5EXG4gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GXG4gKiBUSEUgU1BJTkUgUlVOVElNRVMsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENsaXBwaW5nQXR0YWNobWVudCB9IGZyb20gXCIuL2F0dGFjaG1lbnRzL0NsaXBwaW5nQXR0YWNobWVudC5qc1wiO1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gXCIuL1Nsb3QuanNcIjtcbmltcG9ydCB7IFRyaWFuZ3VsYXRvciB9IGZyb20gXCIuL1RyaWFuZ3VsYXRvci5qc1wiO1xuaW1wb3J0IHsgVXRpbHMsIENvbG9yLCBOdW1iZXJBcnJheUxpa2UgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2tlbGV0b25DbGlwcGluZyB7XG5cdHByaXZhdGUgdHJpYW5ndWxhdG9yID0gbmV3IFRyaWFuZ3VsYXRvcigpO1xuXHRwcml2YXRlIGNsaXBwaW5nUG9seWdvbiA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdHByaXZhdGUgY2xpcE91dHB1dCA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdGNsaXBwZWRWZXJ0aWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdGNsaXBwZWRVVnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXHRjbGlwcGVkVHJpYW5nbGVzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblx0cHJpdmF0ZSBzY3JhdGNoID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuXHRwcml2YXRlIGNsaXBBdHRhY2htZW50OiBDbGlwcGluZ0F0dGFjaG1lbnQgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBjbGlwcGluZ1BvbHlnb25zOiBBcnJheTxBcnJheTxudW1iZXI+PiB8IG51bGwgPSBudWxsO1xuXG5cdGNsaXBTdGFydCAoc2xvdDogU2xvdCwgY2xpcDogQ2xpcHBpbmdBdHRhY2htZW50KTogbnVtYmVyIHtcblx0XHRpZiAodGhpcy5jbGlwQXR0YWNobWVudCkgcmV0dXJuIDA7XG5cdFx0dGhpcy5jbGlwQXR0YWNobWVudCA9IGNsaXA7XG5cblx0XHRsZXQgbiA9IGNsaXAud29ybGRWZXJ0aWNlc0xlbmd0aDtcblx0XHRsZXQgdmVydGljZXMgPSBVdGlscy5zZXRBcnJheVNpemUodGhpcy5jbGlwcGluZ1BvbHlnb24sIG4pO1xuXHRcdGNsaXAuY29tcHV0ZVdvcmxkVmVydGljZXMoc2xvdCwgMCwgbiwgdmVydGljZXMsIDAsIDIpO1xuXHRcdGxldCBjbGlwcGluZ1BvbHlnb24gPSB0aGlzLmNsaXBwaW5nUG9seWdvbjtcblx0XHRTa2VsZXRvbkNsaXBwaW5nLm1ha2VDbG9ja3dpc2UoY2xpcHBpbmdQb2x5Z29uKTtcblx0XHRsZXQgY2xpcHBpbmdQb2x5Z29ucyA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucyA9IHRoaXMudHJpYW5ndWxhdG9yLmRlY29tcG9zZShjbGlwcGluZ1BvbHlnb24sIHRoaXMudHJpYW5ndWxhdG9yLnRyaWFuZ3VsYXRlKGNsaXBwaW5nUG9seWdvbikpO1xuXHRcdGZvciAobGV0IGkgPSAwLCBuID0gY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcblx0XHRcdGxldCBwb2x5Z29uID0gY2xpcHBpbmdQb2x5Z29uc1tpXTtcblx0XHRcdFNrZWxldG9uQ2xpcHBpbmcubWFrZUNsb2Nrd2lzZShwb2x5Z29uKTtcblx0XHRcdHBvbHlnb24ucHVzaChwb2x5Z29uWzBdKTtcblx0XHRcdHBvbHlnb24ucHVzaChwb2x5Z29uWzFdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7XG5cdH1cblxuXHRjbGlwRW5kV2l0aFNsb3QgKHNsb3Q6IFNsb3QpIHtcblx0XHRpZiAodGhpcy5jbGlwQXR0YWNobWVudCAmJiB0aGlzLmNsaXBBdHRhY2htZW50LmVuZFNsb3QgPT0gc2xvdC5kYXRhKSB0aGlzLmNsaXBFbmQoKTtcblx0fVxuXG5cdGNsaXBFbmQgKCkge1xuXHRcdGlmICghdGhpcy5jbGlwQXR0YWNobWVudCkgcmV0dXJuO1xuXHRcdHRoaXMuY2xpcEF0dGFjaG1lbnQgPSBudWxsO1xuXHRcdHRoaXMuY2xpcHBpbmdQb2x5Z29ucyA9IG51bGw7XG5cdFx0dGhpcy5jbGlwcGVkVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHR0aGlzLmNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoID0gMDtcblx0XHR0aGlzLmNsaXBwaW5nUG9seWdvbi5sZW5ndGggPSAwO1xuXHR9XG5cblx0aXNDbGlwcGluZyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY2xpcEF0dGFjaG1lbnQgIT0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQqIEBkZXByZWNhdGVkIFVzZSBjbGlwVHJpYW5nbGVzIHdpdGhvdXQgdmVydGljZXNMZW5ndGggcGFyYW1ldGVyLiBNYXJrIGZvciByZW1vdmFsIGluIDQuMy5cblx0Ki9cblx0Y2xpcFRyaWFuZ2xlcyAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdmVydGljZXNMZW5ndGg6IG51bWJlciwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyKTogdm9pZDtcblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWQgVXNlIGNsaXBUcmlhbmdsZXMgd2l0aG91dCB2ZXJ0aWNlc0xlbmd0aCBwYXJhbWV0ZXIuIE1hcmsgZm9yIHJlbW92YWwgaW4gNC4zLlxuXHQgKi9cblx0Y2xpcFRyaWFuZ2xlcyAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdmVydGljZXNMZW5ndGg6IG51bWJlciwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLCB1dnM6IE51bWJlckFycmF5TGlrZSwgbGlnaHQ6IENvbG9yLCBkYXJrOiBDb2xvciwgdHdvQ29sb3I6IGJvb2xlYW4pOiB2b2lkO1xuXG5cdGNsaXBUcmlhbmdsZXMgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXNMZW5ndGg6IG51bWJlcik6IHZvaWQ7XG5cdGNsaXBUcmlhbmdsZXMgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXNMZW5ndGg6IG51bWJlciwgdXZzOiBOdW1iZXJBcnJheUxpa2UsIGxpZ2h0OiBDb2xvciwgZGFyazogQ29sb3IsIHR3b0NvbG9yOiBib29sZWFuKTogdm9pZDtcblx0Y2xpcFRyaWFuZ2xlcyAoXG5cdFx0dmVydGljZXM6IE51bWJlckFycmF5TGlrZSxcblx0XHR2ZXJ0aWNlc0xlbmd0aE9yVHJpYW5nbGVzOiBudW1iZXIgfCBOdW1iZXJBcnJheUxpa2UsXG5cdFx0dHJpYW5nbGVzT3JUcmlhbmdsZXNMZW5ndGg6IE51bWJlckFycmF5TGlrZSB8IG51bWJlcixcblx0XHR0cmlhbmdsZXNMZW5ndGhPclV2cz86IG51bWJlciB8IE51bWJlckFycmF5TGlrZSxcblx0XHR1dnNPckxpZ2h0PzogTnVtYmVyQXJyYXlMaWtlIHwgQ29sb3IsXG5cdFx0bGlnaHRPckRhcms/OiBDb2xvcixcblx0XHRkYXJrT3JUd29Db2xvcj86IENvbG9yIHwgYm9vbGVhbixcblx0XHR0d29Db2xvclBhcmFtPzogYm9vbGVhblxuXHQpOiB2b2lkIHtcblx0XHQvLyBEZXRlcm1pbmUgd2hpY2ggb3ZlcmxvYWQgaXMgYmVpbmcgdXNlZFxuXHRcdGxldCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZTtcblx0XHRsZXQgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXI7XG5cdFx0bGV0IHV2czogTnVtYmVyQXJyYXlMaWtlIHwgdW5kZWZpbmVkO1xuXHRcdGxldCBsaWdodDogQ29sb3IgfCB1bmRlZmluZWQ7XG5cdFx0bGV0IGRhcms6IENvbG9yIHwgdW5kZWZpbmVkO1xuXHRcdGxldCB0d29Db2xvcjogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuXHRcdGlmICh0eXBlb2YgdmVydGljZXNMZW5ndGhPclRyaWFuZ2xlcyA9PT0gJ251bWJlcicpIHtcblx0XHRcdHRyaWFuZ2xlcyA9IHRyaWFuZ2xlc09yVHJpYW5nbGVzTGVuZ3RoIGFzIE51bWJlckFycmF5TGlrZTtcblx0XHRcdHRyaWFuZ2xlc0xlbmd0aCA9IHRyaWFuZ2xlc0xlbmd0aE9yVXZzIGFzIG51bWJlcjtcblx0XHRcdHV2cyA9IHV2c09yTGlnaHQgYXMgTnVtYmVyQXJyYXlMaWtlO1xuXHRcdFx0bGlnaHQgPSBsaWdodE9yRGFyayBhcyBDb2xvciB8IHVuZGVmaW5lZDtcblx0XHRcdGRhcmsgPSBkYXJrT3JUd29Db2xvciBhcyBDb2xvciB8IHVuZGVmaW5lZDtcblx0XHRcdHR3b0NvbG9yID0gdHdvQ29sb3JQYXJhbTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dHJpYW5nbGVzID0gdmVydGljZXNMZW5ndGhPclRyaWFuZ2xlcztcblx0XHRcdHRyaWFuZ2xlc0xlbmd0aCA9IHRyaWFuZ2xlc09yVHJpYW5nbGVzTGVuZ3RoIGFzIG51bWJlcjtcblx0XHRcdHV2cyA9IHRyaWFuZ2xlc0xlbmd0aE9yVXZzIGFzIE51bWJlckFycmF5TGlrZTtcblx0XHRcdGxpZ2h0ID0gdXZzT3JMaWdodCBhcyBDb2xvciB8IHVuZGVmaW5lZDtcblx0XHRcdGRhcmsgPSBsaWdodE9yRGFyayBhcyBDb2xvciB8IHVuZGVmaW5lZDtcblx0XHRcdHR3b0NvbG9yID0gZGFya09yVHdvQ29sb3IgYXMgYm9vbGVhbjtcblx0XHR9XG5cblx0XHRpZiAodXZzICYmIGxpZ2h0ICYmIGRhcmsgJiYgdHlwZW9mIHR3b0NvbG9yID09PSAnYm9vbGVhbicpXG5cdFx0XHR0aGlzLmNsaXBUcmlhbmdsZXNSZW5kZXIodmVydGljZXMsIHRyaWFuZ2xlcywgdHJpYW5nbGVzTGVuZ3RoLCB1dnMsIGxpZ2h0LCBkYXJrLCB0d29Db2xvcik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5jbGlwVHJpYW5nbGVzTm9SZW5kZXIodmVydGljZXMsIHRyaWFuZ2xlcywgdHJpYW5nbGVzTGVuZ3RoKTtcblx0fVxuXG5cdHByaXZhdGUgY2xpcFRyaWFuZ2xlc05vUmVuZGVyICh2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXIpIHtcblxuXHRcdGxldCBjbGlwT3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0LCBjbGlwcGVkVmVydGljZXMgPSB0aGlzLmNsaXBwZWRWZXJ0aWNlcztcblx0XHRsZXQgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlcztcblx0XHRsZXQgcG9seWdvbnMgPSB0aGlzLmNsaXBwaW5nUG9seWdvbnMhO1xuXHRcdGxldCBwb2x5Z29uc0NvdW50ID0gcG9seWdvbnMubGVuZ3RoO1xuXG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjbGlwcGVkVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHRjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0bGV0IHZlcnRleE9mZnNldCA9IHRyaWFuZ2xlc1tpXSA8PCAxO1xuXHRcdFx0bGV0IHgxID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2kgKyAxXSA8PCAxO1xuXHRcdFx0bGV0IHgyID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2kgKyAyXSA8PCAxO1xuXHRcdFx0bGV0IHgzID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0Zm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5Z29uc0NvdW50OyBwKyspIHtcblx0XHRcdFx0bGV0IHMgPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAodGhpcy5jbGlwKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb25zW3BdLCBjbGlwT3V0cHV0KSkge1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0TGVuZ3RoID0gY2xpcE91dHB1dC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGNsaXBPdXRwdXRMZW5ndGggPT0gMCkgY29udGludWU7XG5cblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dENvdW50ID0gY2xpcE91dHB1dExlbmd0aCA+PiAxO1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0SXRlbXMgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRWZXJ0aWNlc0l0ZW1zID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIGNsaXBPdXRwdXRDb3VudCAqIDIpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjbGlwT3V0cHV0TGVuZ3RoOyBpaSArPSAyLCBzICs9IDIpIHtcblx0XHRcdFx0XHRcdGxldCB4ID0gY2xpcE91dHB1dEl0ZW1zW2lpXSwgeSA9IGNsaXBPdXRwdXRJdGVtc1tpaSArIDFdO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbc10gPSB4O1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDFdID0geTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRUcmlhbmdsZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyAqIChjbGlwT3V0cHV0Q291bnQgLSAyKSk7XG5cdFx0XHRcdFx0Y2xpcE91dHB1dENvdW50LS07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IGNsaXBPdXRwdXRDb3VudDsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzSXRlbXNbc10gPSBpbmRleDtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMV0gPSAoaW5kZXggKyBpaSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzSXRlbXNbcyArIDJdID0gKGluZGV4ICsgaWkgKyAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aW5kZXggKz0gY2xpcE91dHB1dENvdW50ICsgMTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxldCBjbGlwcGVkVmVydGljZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVmVydGljZXMsIHMgKyAzICogMik7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbc10gPSB4MTtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMV0gPSB5MTtcblxuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyXSA9IHgyO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAzXSA9IHkyO1xuXG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDRdID0geDM7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDVdID0geTM7XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRUcmlhbmdsZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyk7XG5cdFx0XHRcdFx0Y2xpcHBlZFRyaWFuZ2xlc0l0ZW1zW3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0Y2xpcHBlZFRyaWFuZ2xlc0l0ZW1zW3MgKyAxXSA9IChpbmRleCArIDEpO1xuXHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMl0gPSAoaW5kZXggKyAyKTtcblx0XHRcdFx0XHRpbmRleCArPSAzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBjbGlwVHJpYW5nbGVzUmVuZGVyICh2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXIsIHV2czogTnVtYmVyQXJyYXlMaWtlLFxuXHRcdGxpZ2h0OiBDb2xvciwgZGFyazogQ29sb3IsIHR3b0NvbG9yOiBib29sZWFuKSB7XG5cblx0XHRsZXQgY2xpcE91dHB1dCA9IHRoaXMuY2xpcE91dHB1dCwgY2xpcHBlZFZlcnRpY2VzID0gdGhpcy5jbGlwcGVkVmVydGljZXM7XG5cdFx0bGV0IGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLmNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0bGV0IHBvbHlnb25zID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zITtcblx0XHRsZXQgcG9seWdvbnNDb3VudCA9IHBvbHlnb25zLmxlbmd0aDtcblx0XHRsZXQgdmVydGV4U2l6ZSA9IHR3b0NvbG9yID8gMTIgOiA4O1xuXG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjbGlwcGVkVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHRjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0bGV0IHZlcnRleE9mZnNldCA9IHRyaWFuZ2xlc1tpXSA8PCAxO1xuXHRcdFx0bGV0IHgxID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblx0XHRcdGxldCB1MSA9IHV2c1t2ZXJ0ZXhPZmZzZXRdLCB2MSA9IHV2c1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2kgKyAxXSA8PCAxO1xuXHRcdFx0bGV0IHgyID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblx0XHRcdGxldCB1MiA9IHV2c1t2ZXJ0ZXhPZmZzZXRdLCB2MiA9IHV2c1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdHJpYW5nbGVzW2kgKyAyXSA8PCAxO1xuXHRcdFx0bGV0IHgzID0gdmVydGljZXNbdmVydGV4T2Zmc2V0XSwgeTMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblx0XHRcdGxldCB1MyA9IHV2c1t2ZXJ0ZXhPZmZzZXRdLCB2MyA9IHV2c1t2ZXJ0ZXhPZmZzZXQgKyAxXTtcblxuXHRcdFx0Zm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5Z29uc0NvdW50OyBwKyspIHtcblx0XHRcdFx0bGV0IHMgPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAodGhpcy5jbGlwKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb25zW3BdLCBjbGlwT3V0cHV0KSkge1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0TGVuZ3RoID0gY2xpcE91dHB1dC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGNsaXBPdXRwdXRMZW5ndGggPT0gMCkgY29udGludWU7XG5cdFx0XHRcdFx0bGV0IGQwID0geTIgLSB5MywgZDEgPSB4MyAtIHgyLCBkMiA9IHgxIC0geDMsIGQ0ID0geTMgLSB5MTtcblx0XHRcdFx0XHRsZXQgZCA9IDEgLyAoZDAgKiBkMiArIGQxICogKHkxIC0geTMpKTtcblxuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0Q291bnQgPSBjbGlwT3V0cHV0TGVuZ3RoID4+IDE7XG5cdFx0XHRcdFx0bGV0IGNsaXBPdXRwdXRJdGVtcyA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRcdFx0XHRsZXQgY2xpcHBlZFZlcnRpY2VzSXRlbXMgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgY2xpcE91dHB1dENvdW50ICogdmVydGV4U2l6ZSk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IGNsaXBPdXRwdXRMZW5ndGg7IGlpICs9IDIsIHMgKz0gdmVydGV4U2l6ZSkge1xuXHRcdFx0XHRcdFx0bGV0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLCB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzXSA9IHg7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMV0gPSB5O1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDJdID0gbGlnaHQucjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAzXSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDVdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRcdGxldCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTM7XG5cdFx0XHRcdFx0XHRsZXQgYSA9IChkMCAqIGMwICsgZDEgKiBjMSkgKiBkO1xuXHRcdFx0XHRcdFx0bGV0IGIgPSAoZDQgKiBjMCArIGQyICogYzEpICogZDtcblx0XHRcdFx0XHRcdGxldCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDZdID0gdTEgKiBhICsgdTIgKiBiICsgdTMgKiBjO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDddID0gdjEgKiBhICsgdjIgKiBiICsgdjMgKiBjO1xuXHRcdFx0XHRcdFx0aWYgKHR3b0NvbG9yKSB7XG5cdFx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyA4XSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDldID0gZGFyay5nO1xuXHRcdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTBdID0gZGFyay5iO1xuXHRcdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTFdID0gZGFyay5hO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRsZXQgY2xpcHBlZFRyaWFuZ2xlc0l0ZW1zID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRUcmlhbmdsZXMsIHMgKyAzICogKGNsaXBPdXRwdXRDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRjbGlwT3V0cHV0Q291bnQtLTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgY2xpcE91dHB1dENvdW50OyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzXSA9IGluZGV4O1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFRyaWFuZ2xlc0l0ZW1zW3MgKyAxXSA9IChpbmRleCArIGlpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMl0gPSAoaW5kZXggKyBpaSArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBjbGlwT3V0cHV0Q291bnQgKyAxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRWZXJ0aWNlc0l0ZW1zID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIDMgKiB2ZXJ0ZXhTaXplKTtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzXSA9IHgxO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxXSA9IHkxO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyXSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDNdID0gbGlnaHQuZztcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyA1XSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0aWYgKCF0d29Db2xvcikge1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDZdID0gdTE7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgN10gPSB2MTtcblxuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDhdID0geDI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgOV0gPSB5Mjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxMF0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDExXSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTJdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxM10gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDE0XSA9IHUyO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDE1XSA9IHYyO1xuXG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTZdID0geDM7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTddID0geTM7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMThdID0gbGlnaHQucjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxOV0gPSBsaWdodC5nO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDIwXSA9IGxpZ2h0LmI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMjFdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyMl0gPSB1Mztcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyM10gPSB2Mztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDZdID0gdTE7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgN10gPSB2MTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyA4XSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyA5XSA9IGRhcmsuZztcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxMF0gPSBkYXJrLmI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTFdID0gZGFyay5hO1xuXG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTJdID0geDI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTNdID0geTI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTRdID0gbGlnaHQucjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxNV0gPSBsaWdodC5nO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDE2XSA9IGxpZ2h0LmI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMTddID0gbGlnaHQuYTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxOF0gPSB1Mjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAxOV0gPSB2Mjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyMF0gPSBkYXJrLnI7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMjFdID0gZGFyay5nO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDIyXSA9IGRhcmsuYjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyM10gPSBkYXJrLmE7XG5cblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyNF0gPSB4Mztcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyNV0gPSB5Mztcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyNl0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDI3XSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMjhdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAyOV0gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDMwXSA9IHUzO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDMxXSA9IHYzO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDMyXSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc0l0ZW1zW3MgKyAzM10gPSBkYXJrLmc7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMzRdID0gZGFyay5iO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDM1XSA9IGRhcmsuYTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRUcmlhbmdsZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyk7XG5cdFx0XHRcdFx0Y2xpcHBlZFRyaWFuZ2xlc0l0ZW1zW3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0Y2xpcHBlZFRyaWFuZ2xlc0l0ZW1zW3MgKyAxXSA9IChpbmRleCArIDEpO1xuXHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMl0gPSAoaW5kZXggKyAyKTtcblx0XHRcdFx0XHRpbmRleCArPSAzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsaXBUcmlhbmdsZXNVbnBhY2tlZCAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLCB1dnM6IE51bWJlckFycmF5TGlrZSkge1xuXHRcdGxldCBjbGlwT3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0LCBjbGlwcGVkVmVydGljZXMgPSB0aGlzLmNsaXBwZWRWZXJ0aWNlcywgY2xpcHBlZFVWcyA9IHRoaXMuY2xpcHBlZFVWcztcblx0XHRsZXQgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlcztcblx0XHRsZXQgcG9seWdvbnMgPSB0aGlzLmNsaXBwaW5nUG9seWdvbnMhO1xuXHRcdGxldCBwb2x5Z29uc0NvdW50ID0gcG9seWdvbnMubGVuZ3RoO1xuXG5cdFx0bGV0IGluZGV4ID0gMDtcblx0XHRjbGlwcGVkVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHRjbGlwcGVkVVZzLmxlbmd0aCA9IDA7XG5cdFx0Y2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPSAwO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzTGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdGxldCB2ZXJ0ZXhPZmZzZXQgPSB0cmlhbmdsZXNbaV0gPDwgMTtcblx0XHRcdGxldCB4MSA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldF0sIHkxID0gdmVydGljZXNbdmVydGV4T2Zmc2V0ICsgMV07XG5cdFx0XHRsZXQgdTEgPSB1dnNbdmVydGV4T2Zmc2V0XSwgdjEgPSB1dnNbdmVydGV4T2Zmc2V0ICsgMV07XG5cblx0XHRcdHZlcnRleE9mZnNldCA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMTtcblx0XHRcdGxldCB4MiA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldF0sIHkyID0gdmVydGljZXNbdmVydGV4T2Zmc2V0ICsgMV07XG5cdFx0XHRsZXQgdTIgPSB1dnNbdmVydGV4T2Zmc2V0XSwgdjIgPSB1dnNbdmVydGV4T2Zmc2V0ICsgMV07XG5cblx0XHRcdHZlcnRleE9mZnNldCA9IHRyaWFuZ2xlc1tpICsgMl0gPDwgMTtcblx0XHRcdGxldCB4MyA9IHZlcnRpY2VzW3ZlcnRleE9mZnNldF0sIHkzID0gdmVydGljZXNbdmVydGV4T2Zmc2V0ICsgMV07XG5cdFx0XHRsZXQgdTMgPSB1dnNbdmVydGV4T2Zmc2V0XSwgdjMgPSB1dnNbdmVydGV4T2Zmc2V0ICsgMV07XG5cblx0XHRcdGZvciAobGV0IHAgPSAwOyBwIDwgcG9seWdvbnNDb3VudDsgcCsrKSB7XG5cdFx0XHRcdGxldCBzID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKHRoaXMuY2xpcCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uc1twXSwgY2xpcE91dHB1dCkpIHtcblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dExlbmd0aCA9IGNsaXBPdXRwdXQubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChjbGlwT3V0cHV0TGVuZ3RoID09IDApIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGxldCBkMCA9IHkyIC0geTMsIGQxID0geDMgLSB4MiwgZDIgPSB4MSAtIHgzLCBkNCA9IHkzIC0geTE7XG5cdFx0XHRcdFx0bGV0IGQgPSAxIC8gKGQwICogZDIgKyBkMSAqICh5MSAtIHkzKSk7XG5cblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dENvdW50ID0gY2xpcE91dHB1dExlbmd0aCA+PiAxO1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0SXRlbXMgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRWZXJ0aWNlc0l0ZW1zID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIGNsaXBPdXRwdXRDb3VudCAqIDIpO1xuXHRcdFx0XHRcdGxldCBjbGlwcGVkVVZzSXRlbXMgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFVWcywgcyArIGNsaXBPdXRwdXRDb3VudCAqIDIpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjbGlwT3V0cHV0TGVuZ3RoOyBpaSArPSAyLCBzICs9IDIpIHtcblx0XHRcdFx0XHRcdGxldCB4ID0gY2xpcE91dHB1dEl0ZW1zW2lpXSwgeSA9IGNsaXBPdXRwdXRJdGVtc1tpaSArIDFdO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbc10gPSB4O1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbcyArIDFdID0geTtcblx0XHRcdFx0XHRcdGxldCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTM7XG5cdFx0XHRcdFx0XHRsZXQgYSA9IChkMCAqIGMwICsgZDEgKiBjMSkgKiBkO1xuXHRcdFx0XHRcdFx0bGV0IGIgPSAoZDQgKiBjMCArIGQyICogYzEpICogZDtcblx0XHRcdFx0XHRcdGxldCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWc0l0ZW1zW3NdID0gdTEgKiBhICsgdTIgKiBiICsgdTMgKiBjO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWc0l0ZW1zW3MgKyAxXSA9IHYxICogYSArIHYyICogYiArIHYzICogYztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0bGV0IGNsaXBwZWRUcmlhbmdsZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyAqIChjbGlwT3V0cHV0Q291bnQgLSAyKSk7XG5cdFx0XHRcdFx0Y2xpcE91dHB1dENvdW50LS07XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IGNsaXBPdXRwdXRDb3VudDsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzSXRlbXNbc10gPSBpbmRleDtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMV0gPSAoaW5kZXggKyBpaSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzSXRlbXNbcyArIDJdID0gKGluZGV4ICsgaWkgKyAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aW5kZXggKz0gY2xpcE91dHB1dENvdW50ICsgMTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGxldCBjbGlwcGVkVmVydGljZXNJdGVtcyA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVmVydGljZXMsIHMgKyAzICogMik7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzSXRlbXNbc10gPSB4MTtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMV0gPSB5MTtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgMl0gPSB4Mjtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgM10gPSB5Mjtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNF0gPSB4Mztcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNJdGVtc1tzICsgNV0gPSB5MztcblxuXHRcdFx0XHRcdGxldCBjbGlwcGVkVVZTSXRlbXMgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFVWcywgcyArIDMgKiAyKTtcblx0XHRcdFx0XHRjbGlwcGVkVVZTSXRlbXNbc10gPSB1MTtcblx0XHRcdFx0XHRjbGlwcGVkVVZTSXRlbXNbcyArIDFdID0gdjE7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWU0l0ZW1zW3MgKyAyXSA9IHUyO1xuXHRcdFx0XHRcdGNsaXBwZWRVVlNJdGVtc1tzICsgM10gPSB2Mjtcblx0XHRcdFx0XHRjbGlwcGVkVVZTSXRlbXNbcyArIDRdID0gdTM7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWU0l0ZW1zW3MgKyA1XSA9IHYzO1xuXG5cdFx0XHRcdFx0cyA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGxldCBjbGlwcGVkVHJpYW5nbGVzSXRlbXMgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFRyaWFuZ2xlcywgcyArIDMpO1xuXHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzXSA9IGluZGV4O1xuXHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXNJdGVtc1tzICsgMV0gPSAoaW5kZXggKyAxKTtcblx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzSXRlbXNbcyArIDJdID0gKGluZGV4ICsgMik7XG5cdFx0XHRcdFx0aW5kZXggKz0gMztcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBDbGlwcyB0aGUgaW5wdXQgdHJpYW5nbGUgYWdhaW5zdCB0aGUgY29udmV4LCBjbG9ja3dpc2UgY2xpcHBpbmcgYXJlYS4gSWYgdGhlIHRyaWFuZ2xlIGxpZXMgZW50aXJlbHkgd2l0aGluIHRoZSBjbGlwcGluZ1xuXHQgKiBhcmVhLCBmYWxzZSBpcyByZXR1cm5lZC4gVGhlIGNsaXBwaW5nIGFyZWEgbXVzdCBkdXBsaWNhdGUgdGhlIGZpcnN0IHZlcnRleCBhdCB0aGUgZW5kIG9mIHRoZSB2ZXJ0aWNlcyBsaXN0LiAqL1xuXHRjbGlwICh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB4MzogbnVtYmVyLCB5MzogbnVtYmVyLCBjbGlwcGluZ0FyZWE6IEFycmF5PG51bWJlcj4sIG91dHB1dDogQXJyYXk8bnVtYmVyPikge1xuXHRcdGxldCBvcmlnaW5hbE91dHB1dCA9IG91dHB1dDtcblx0XHRsZXQgY2xpcHBlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQXZvaWQgY29weSBhdCB0aGUgZW5kLlxuXHRcdGxldCBpbnB1dDogQXJyYXk8bnVtYmVyPjtcblx0XHRpZiAoY2xpcHBpbmdBcmVhLmxlbmd0aCAlIDQgPj0gMikge1xuXHRcdFx0aW5wdXQgPSBvdXRwdXQ7XG5cdFx0XHRvdXRwdXQgPSB0aGlzLnNjcmF0Y2g7XG5cdFx0fSBlbHNlXG5cdFx0XHRpbnB1dCA9IHRoaXMuc2NyYXRjaDtcblxuXHRcdGlucHV0Lmxlbmd0aCA9IDA7XG5cdFx0aW5wdXQucHVzaCh4MSk7XG5cdFx0aW5wdXQucHVzaCh5MSk7XG5cdFx0aW5wdXQucHVzaCh4Mik7XG5cdFx0aW5wdXQucHVzaCh5Mik7XG5cdFx0aW5wdXQucHVzaCh4Myk7XG5cdFx0aW5wdXQucHVzaCh5Myk7XG5cdFx0aW5wdXQucHVzaCh4MSk7XG5cdFx0aW5wdXQucHVzaCh5MSk7XG5cdFx0b3V0cHV0Lmxlbmd0aCA9IDA7XG5cblx0XHRsZXQgY2xpcHBpbmdWZXJ0aWNlc0xhc3QgPSBjbGlwcGluZ0FyZWEubGVuZ3RoIC0gNDtcblx0XHRsZXQgY2xpcHBpbmdWZXJ0aWNlcyA9IGNsaXBwaW5nQXJlYTtcblx0XHRmb3IgKGxldCBpID0gMDsgOyBpICs9IDIpIHtcblx0XHRcdGxldCBlZGdlWCA9IGNsaXBwaW5nVmVydGljZXNbaV0sIGVkZ2VZID0gY2xpcHBpbmdWZXJ0aWNlc1tpICsgMV07XG5cdFx0XHRsZXQgZXggPSBlZGdlWCAtIGNsaXBwaW5nVmVydGljZXNbaSArIDJdLCBleSA9IGVkZ2VZIC0gY2xpcHBpbmdWZXJ0aWNlc1tpICsgM107XG5cblx0XHRcdGxldCBvdXRwdXRTdGFydCA9IG91dHB1dC5sZW5ndGg7XG5cdFx0XHRsZXQgaW5wdXRWZXJ0aWNlcyA9IGlucHV0O1xuXHRcdFx0Zm9yIChsZXQgaWkgPSAwLCBubiA9IGlucHV0Lmxlbmd0aCAtIDI7IGlpIDwgbm47KSB7XG5cdFx0XHRcdGxldCBpbnB1dFggPSBpbnB1dFZlcnRpY2VzW2lpXSwgaW5wdXRZID0gaW5wdXRWZXJ0aWNlc1tpaSArIDFdO1xuXHRcdFx0XHRpaSArPSAyO1xuXHRcdFx0XHRsZXQgaW5wdXRYMiA9IGlucHV0VmVydGljZXNbaWldLCBpbnB1dFkyID0gaW5wdXRWZXJ0aWNlc1tpaSArIDFdO1xuXHRcdFx0XHRsZXQgczIgPSBleSAqIChlZGdlWCAtIGlucHV0WDIpID4gZXggKiAoZWRnZVkgLSBpbnB1dFkyKTtcblx0XHRcdFx0bGV0IHMxID0gZXkgKiAoZWRnZVggLSBpbnB1dFgpIC0gZXggKiAoZWRnZVkgLSBpbnB1dFkpO1xuXHRcdFx0XHRpZiAoczEgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKHMyKSB7IC8vIHYxIGluc2lkZSwgdjIgaW5zaWRlXG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChpbnB1dFgyKTtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGlucHV0WTIpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIHYxIGluc2lkZSwgdjIgb3V0c2lkZVxuXHRcdFx0XHRcdGxldCBpeCA9IGlucHV0WDIgLSBpbnB1dFgsIGl5ID0gaW5wdXRZMiAtIGlucHV0WSwgdCA9IHMxIC8gKGl4ICogZXkgLSBpeSAqIGV4KTtcblx0XHRcdFx0XHRpZiAodCA+PSAwICYmIHQgPD0gMSkge1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goaW5wdXRYICsgaXggKiB0KTtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGlucHV0WSArIGl5ICogdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGlucHV0WDIpO1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goaW5wdXRZMik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoczIpIHsgLy8gdjEgb3V0c2lkZSwgdjIgaW5zaWRlXG5cdFx0XHRcdFx0bGV0IGl4ID0gaW5wdXRYMiAtIGlucHV0WCwgaXkgPSBpbnB1dFkyIC0gaW5wdXRZLCB0ID0gczEgLyAoaXggKiBleSAtIGl5ICogZXgpO1xuXHRcdFx0XHRcdGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChpbnB1dFggKyBpeCAqIHQpO1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goaW5wdXRZICsgaXkgKiB0KTtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGlucHV0WDIpO1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goaW5wdXRZMik7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKGlucHV0WDIpO1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goaW5wdXRZMik7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2xpcHBlZCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvdXRwdXRTdGFydCA9PSBvdXRwdXQubGVuZ3RoKSB7IC8vIEFsbCBlZGdlcyBvdXRzaWRlLlxuXHRcdFx0XHRvcmlnaW5hbE91dHB1dC5sZW5ndGggPSAwO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LnB1c2gob3V0cHV0WzBdKTtcblx0XHRcdG91dHB1dC5wdXNoKG91dHB1dFsxXSk7XG5cblx0XHRcdGlmIChpID09IGNsaXBwaW5nVmVydGljZXNMYXN0KSBicmVhaztcblx0XHRcdGxldCB0ZW1wID0gb3V0cHV0O1xuXHRcdFx0b3V0cHV0ID0gaW5wdXQ7XG5cdFx0XHRvdXRwdXQubGVuZ3RoID0gMDtcblx0XHRcdGlucHV0ID0gdGVtcDtcblx0XHR9XG5cblx0XHRpZiAob3JpZ2luYWxPdXRwdXQgIT0gb3V0cHV0KSB7XG5cdFx0XHRvcmlnaW5hbE91dHB1dC5sZW5ndGggPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBvdXRwdXQubGVuZ3RoIC0gMjsgaSA8IG47IGkrKylcblx0XHRcdFx0b3JpZ2luYWxPdXRwdXRbaV0gPSBvdXRwdXRbaV07XG5cdFx0fSBlbHNlXG5cdFx0XHRvcmlnaW5hbE91dHB1dC5sZW5ndGggPSBvcmlnaW5hbE91dHB1dC5sZW5ndGggLSAyO1xuXG5cdFx0cmV0dXJuIGNsaXBwZWQ7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIG1ha2VDbG9ja3dpc2UgKHBvbHlnb246IE51bWJlckFycmF5TGlrZSkge1xuXHRcdGxldCB2ZXJ0aWNlcyA9IHBvbHlnb247XG5cdFx0bGV0IHZlcnRpY2VzbGVuZ3RoID0gcG9seWdvbi5sZW5ndGg7XG5cblx0XHRsZXQgYXJlYSA9IHZlcnRpY2VzW3ZlcnRpY2VzbGVuZ3RoIC0gMl0gKiB2ZXJ0aWNlc1sxXSAtIHZlcnRpY2VzWzBdICogdmVydGljZXNbdmVydGljZXNsZW5ndGggLSAxXSwgcDF4ID0gMCwgcDF5ID0gMCwgcDJ4ID0gMCwgcDJ5ID0gMDtcblx0XHRmb3IgKGxldCBpID0gMCwgbiA9IHZlcnRpY2VzbGVuZ3RoIC0gMzsgaSA8IG47IGkgKz0gMikge1xuXHRcdFx0cDF4ID0gdmVydGljZXNbaV07XG5cdFx0XHRwMXkgPSB2ZXJ0aWNlc1tpICsgMV07XG5cdFx0XHRwMnggPSB2ZXJ0aWNlc1tpICsgMl07XG5cdFx0XHRwMnkgPSB2ZXJ0aWNlc1tpICsgM107XG5cdFx0XHRhcmVhICs9IHAxeCAqIHAyeSAtIHAyeCAqIHAxeTtcblx0XHR9XG5cdFx0aWYgKGFyZWEgPCAwKSByZXR1cm47XG5cblx0XHRmb3IgKGxldCBpID0gMCwgbGFzdFggPSB2ZXJ0aWNlc2xlbmd0aCAtIDIsIG4gPSB2ZXJ0aWNlc2xlbmd0aCA+PiAxOyBpIDwgbjsgaSArPSAyKSB7XG5cdFx0XHRsZXQgeCA9IHZlcnRpY2VzW2ldLCB5ID0gdmVydGljZXNbaSArIDFdO1xuXHRcdFx0bGV0IG90aGVyID0gbGFzdFggLSBpO1xuXHRcdFx0dmVydGljZXNbaV0gPSB2ZXJ0aWNlc1tvdGhlcl07XG5cdFx0XHR2ZXJ0aWNlc1tpICsgMV0gPSB2ZXJ0aWNlc1tvdGhlciArIDFdO1xuXHRcdFx0dmVydGljZXNbb3RoZXJdID0geDtcblx0XHRcdHZlcnRpY2VzW290aGVyICsgMV0gPSB5O1xuXHRcdH1cblx0fVxufVxuIl19
801
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25DbGlwcGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9Ta2VsZXRvbkNsaXBwaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7K0VBMkIrRTtBQUsvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFvQyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFckUsTUFBTSxPQUFPLGdCQUFnQjtJQUNwQixZQUFZLEdBQXdCLElBQUksQ0FBQztJQUN6QyxlQUFlLEdBQUcsRUFBYyxDQUFDO0lBQ2pDLGdCQUFnQixHQUFlLEVBQUUsQ0FBQztJQUNsQyxVQUFVLEdBQUcsRUFBYyxDQUFDO0lBQ3BDLGVBQWUsR0FBRyxFQUFjLENBQUM7SUFFakMscUVBQXFFO0lBQ3JFLFVBQVUsR0FBRyxFQUFjLENBQUM7SUFFNUIsZ0JBQWdCLEdBQUcsRUFBYyxDQUFDO0lBQ2xDLGVBQWUsR0FBRyxFQUFjLENBQUM7SUFFakMscUJBQXFCLEdBQWlCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFpQixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxzQkFBc0IsR0FBZ0IsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUQsb0JBQW9CLEdBQWlCLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELGVBQWUsR0FBaUIsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQscUJBQXFCLEdBQWdCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hELHFCQUFxQixHQUFHLENBQUMsQ0FBQztJQUMxQixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDckIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRW5CLE9BQU8sR0FBRyxFQUFjLENBQUM7SUFD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d0JBQ2YsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBRWhCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ2pCLENBQUM7eUJBQU0sQ0FBQzt3QkFDUCxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDZixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDZixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBQ25CLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDbkIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7d0JBRXBCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3JCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQzt3QkFDckIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dCQUNyQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDaEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ2hCLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNwQixFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFH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Q0FBQztnQkFDOUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDckMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUM5QixNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztnQkFDOUIsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pFLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFB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R0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3BGLEtBQUssR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLEdBQUcsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7WUFDMUIsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNkLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDZCxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ2QsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENB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LENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqIFNwaW5lIFJ1bnRpbWVzIExpY2Vuc2UgQWdyZWVtZW50XG4gKiBMYXN0IHVwZGF0ZWQgQXByaWwgNSwgMjAyNS4gUmVwbGFjZXMgYWxsIHByaW9yIHZlcnNpb25zLlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDI1LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcbiAqXG4gKiBJbnRlZ3JhdGlvbiBvZiB0aGUgU3BpbmUgUnVudGltZXMgaW50byBzb2Z0d2FyZSBvciBvdGhlcndpc2UgY3JlYXRpbmdcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXG4gKiBjb25kaXRpb25zIG9mIFNlY3Rpb24gMiBvZiB0aGUgU3BpbmUgRWRpdG9yIExpY2Vuc2UgQWdyZWVtZW50OlxuICogaHR0cDovL2Vzb3Rlcmljc29mdHdhcmUuY29tL3NwaW5lLWVkaXRvci1saWNlbnNlXG4gKlxuICogT3RoZXJ3aXNlLCBpdCBpcyBwZXJtaXR0ZWQgdG8gaW50ZWdyYXRlIHRoZSBTcGluZSBSdW50aW1lcyBpbnRvIHNvZnR3YXJlXG4gKiBvciBvdGhlcndpc2UgY3JlYXRlIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIChjb2xsZWN0aXZlbHksXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXG4gKiBTcGluZSBFZGl0b3IgbGljZW5zZSBhbmQgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2R1Y3RzIGluIGFueSBmb3JtIG11c3RcbiAqIGluY2x1ZGUgdGhpcyBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgbm90aWNlLlxuICpcbiAqIFRIRSBTUElORSBSVU5USU1FUyBBUkUgUFJPVklERUQgQlkgRVNPVEVSSUMgU09GVFdBUkUgTExDIFwiQVMgSVNcIiBBTkQgQU5ZXG4gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXG4gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBFU09URVJJQyBTT0ZUV0FSRSBMTEMgQkUgTElBQkxFIEZPUiBBTllcbiAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsXG4gKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04sIE9SIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTKSBIT1dFVkVSIENBVVNFRCBBTkRcbiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0ZcbiAqIFRIRSBTUElORSBSVU5USU1FUywgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHR5cGUgeyBDbGlwcGluZ0F0dGFjaG1lbnQgfSBmcm9tIFwiLi9hdHRhY2htZW50cy9DbGlwcGluZ0F0dGFjaG1lbnQuanNcIjtcbmltcG9ydCB0eXBlIHsgU2tlbGV0b24gfSBmcm9tIFwiLi9Ta2VsZXRvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTbG90IH0gZnJvbSBcIi4vU2xvdC5qc1wiO1xuaW1wb3J0IHsgVHJpYW5ndWxhdG9yIH0gZnJvbSBcIi4vVHJpYW5ndWxhdG9yLmpzXCI7XG5pbXBvcnQgeyB0eXBlIENvbG9yLCB0eXBlIE51bWJlckFycmF5TGlrZSwgVXRpbHMgfSBmcm9tIFwiLi9VdGlscy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgU2tlbGV0b25DbGlwcGluZyB7XG5cdHByaXZhdGUgdHJpYW5ndWxhdG9yOiBUcmlhbmd1bGF0b3IgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBjbGlwcGluZ1BvbHlnb24gPSBbXSBhcyBudW1iZXJbXTtcblx0cHJpdmF0ZSBjbGlwcGluZ1BvbHlnb25zOiBudW1iZXJbXVtdID0gW107XG5cdHByaXZhdGUgY2xpcE91dHB1dCA9IFtdIGFzIG51bWJlcltdO1xuXHRjbGlwcGVkVmVydGljZXMgPSBbXSBhcyBudW1iZXJbXTtcblxuXHQvKiogQW4gZW1wdHkgYXJyYXkgdW5sZXNzIHtAbGluayBjbGlwVHJpYW5nbGVzVW5wYWNrZWR9IHdhcyB1c2VkLiAqKi9cblx0Y2xpcHBlZFVWcyA9IFtdIGFzIG51bWJlcltdO1xuXG5cdGNsaXBwZWRUcmlhbmdsZXMgPSBbXSBhcyBudW1iZXJbXTtcblx0aW52ZXJzZVZlcnRpY2VzID0gW10gYXMgbnVtYmVyW107XG5cblx0X2NsaXBwZWRWZXJ0aWNlc1R5cGVkOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDEwMjQpO1xuXHRfY2xpcHBlZFVWc1R5cGVkOiBGbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KDEwMjQpO1xuXHRfY2xpcHBlZFRyaWFuZ2xlc1R5cGVkOiBVaW50MTZBcnJheSA9IG5ldyBVaW50MTZBcnJheSgxMDI0KTtcblx0Y2xpcHBlZFZlcnRpY2VzVHlwZWQ6IEZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoMCk7XG5cdGNsaXBwZWRVVnNUeXBlZDogRmxvYXQzMkFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSgwKTtcblx0Y2xpcHBlZFRyaWFuZ2xlc1R5cGVkOiBVaW50MTZBcnJheSA9IG5ldyBVaW50MTZBcnJheSgwKTtcblx0Y2xpcHBlZFZlcnRpY2VzTGVuZ3RoID0gMDtcblx0Y2xpcHBlZFVWc0xlbmd0aCA9IDA7XG5cdGNsaXBwZWRUcmlhbmdsZXNMZW5ndGggPSAwO1xuXG5cdHByaXZhdGUgc2NyYXRjaCA9IFtdIGFzIG51bWJlcltdO1xuXHRwcml2YXRlIGludmVyc2UgPSBmYWxzZTtcblxuXHRwcml2YXRlIGNsaXBBdHRhY2htZW50OiBDbGlwcGluZ0F0dGFjaG1lbnQgfCBudWxsID0gbnVsbDtcblxuXHRjbGlwU3RhcnQgKHNrZWxldG9uOiBTa2VsZXRvbiwgc2xvdDogU2xvdCwgY2xpcDogQ2xpcHBpbmdBdHRhY2htZW50KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2xpcEF0dGFjaG1lbnQpIHJldHVybjtcblx0XHRjb25zdCBuID0gY2xpcC53b3JsZFZlcnRpY2VzTGVuZ3RoO1xuXHRcdHRoaXMuY2xpcEF0dGFjaG1lbnQgPSBjbGlwO1xuXHRcdHRoaXMuaW52ZXJzZSA9IGNsaXAuaW52ZXJzZTtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gVXRpbHMuc2V0QXJyYXlTaXplKHRoaXMuY2xpcHBpbmdQb2x5Z29uLCBuKTtcblx0XHRjbGlwLmNvbXB1dGVXb3JsZFZlcnRpY2VzKHNrZWxldG9uLCBzbG90LCAwLCBuLCB2ZXJ0aWNlcywgMCwgMik7XG5cdFx0Y29uc3QgY2xpcHBpbmdQb2x5Z29uID0gdGhpcy5jbGlwcGluZ1BvbHlnb247XG5cdFx0Y29uc3QgY29udmV4ID0gdGhpcy5tYWtlQ2xvY2t3aXNlKGNsaXBwaW5nUG9seWdvbik7XG5cblx0XHRpZiAoY29udmV4IHx8IHRoaXMuaW52ZXJzZSB8fCBjbGlwLmNvbnZleCkge1xuXHRcdFx0aWYgKCFjb252ZXgpIHRoaXMubWFrZUNvbnZleChjbGlwcGluZ1BvbHlnb24pO1xuXHRcdFx0dGhpcy5jbGlwcGluZ1BvbHlnb24ucHVzaChjbGlwcGluZ1BvbHlnb25bMF0sIGNsaXBwaW5nUG9seWdvblsxXSk7XG5cdFx0XHR0aGlzLmNsaXBwaW5nUG9seWdvbnMucHVzaChjbGlwcGluZ1BvbHlnb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy50cmlhbmd1bGF0b3IgPT09IG51bGwpIHRoaXMudHJpYW5ndWxhdG9yID0gbmV3IFRyaWFuZ3VsYXRvcigpO1xuXHRcdFx0dGhpcy5jbGlwcGluZ1BvbHlnb25zLnB1c2goLi4udGhpcy50cmlhbmd1bGF0b3IuZGVjb21wb3NlKGNsaXBwaW5nUG9seWdvbiwgdGhpcy50cmlhbmd1bGF0b3IudHJpYW5ndWxhdGUoY2xpcHBpbmdQb2x5Z29uKSkpO1xuXHRcdH1cblx0fVxuXG5cdGNsaXBFbmQgKHNsb3Q/OiBTbG90KSB7XG5cdFx0aWYgKCF0aGlzLmNsaXBBdHRhY2htZW50KSByZXR1cm47XG5cdFx0aWYgKHNsb3QgJiYgdGhpcy5jbGlwQXR0YWNobWVudC5lbmRTbG90ICE9PSBzbG90LmRhdGEpIHJldHVybjtcblx0XHR0aGlzLmNsaXBBdHRhY2htZW50ID0gbnVsbDtcblx0XHR0aGlzLmNsaXBwaW5nUG9seWdvbnMubGVuZ3RoID0gMDtcblx0fVxuXG5cdGlzQ2xpcHBpbmcgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNsaXBBdHRhY2htZW50ICE9IG51bGw7XG5cdH1cblxuXHRjbGlwVHJpYW5nbGVzICh2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXIpOiBib29sZWFuO1xuXHRjbGlwVHJpYW5nbGVzICh2ZXJ0aWNlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzTGVuZ3RoOiBudW1iZXIsXG5cdFx0dXZzOiBOdW1iZXJBcnJheUxpa2UsIGxpZ2h0OiBDb2xvciwgZGFyazogQ29sb3IsIHR3b0NvbG9yOiBib29sZWFuLCBzdHJpZGU6IG51bWJlcik6IGJvb2xlYW47XG5cdGNsaXBUcmlhbmdsZXMgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlLCB0cmlhbmdsZXNMZW5ndGg6IG51bWJlcixcblx0XHR1dnM/OiBOdW1iZXJBcnJheUxpa2UsIGxpZ2h0PzogQ29sb3IsIGRhcms/OiBDb2xvciwgdHdvQ29sb3I/OiBib29sZWFuLCBzdHJpZGU/OiBudW1iZXIpOiBib29sZWFuIHtcblxuXHRcdHJldHVybiAodXZzICYmIGxpZ2h0ICYmIGRhcmsgJiYgdHlwZW9mIHR3b0NvbG9yID09PSAnYm9vbGVhbicgJiYgdHlwZW9mIHN0cmlkZSA9PT0gJ251bWJlcicpXG5cdFx0XHQ/IHRoaXMuY2xpcFRyaWFuZ2xlc1JlbmRlcih2ZXJ0aWNlcywgdHJpYW5nbGVzLCB0cmlhbmdsZXNMZW5ndGgsIHV2cywgbGlnaHQsIGRhcmssIHR3b0NvbG9yLCBzdHJpZGUpXG5cdFx0XHQ6IHRoaXMuY2xpcFRyaWFuZ2xlc05vUmVuZGVyKHZlcnRpY2VzLCB0cmlhbmdsZXMsIHRyaWFuZ2xlc0xlbmd0aCk7XG5cdH1cblxuXHRwcml2YXRlIGNsaXBUcmlhbmdsZXNOb1JlbmRlciAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY2xpcHBlZFZlcnRpY2VzID0gdGhpcy5jbGlwcGVkVmVydGljZXM7XG5cdFx0Y2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0Y29uc3QgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlcztcblx0XHRjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA9IDA7XG5cdFx0bGV0IGluZGV4ID0gMDtcblxuXHRcdGlmICh0aGlzLmludmVyc2UpIHtcblx0XHRcdGNvbnN0IHBvbHlnb24gPSB0aGlzLmNsaXBwaW5nUG9seWdvbnNbMF07XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlc0xlbmd0aDsgaSArPSAzKSB7XG5cdFx0XHRcdGxldCB0ID0gdHJpYW5nbGVzW2ldIDw8IDE7XG5cdFx0XHRcdGNvbnN0IHgxID0gdmVydGljZXNbdF0sIHkxID0gdmVydGljZXNbdCArIDFdO1xuXHRcdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAxXSA8PCAxO1xuXHRcdFx0XHRjb25zdCB4MiA9IHZlcnRpY2VzW3RdLCB5MiA9IHZlcnRpY2VzW3QgKyAxXTtcblx0XHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMl0gPDwgMTtcblx0XHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t0XSwgeTMgPSB2ZXJ0aWNlc1t0ICsgMV07XG5cdFx0XHRcdHRoaXMuY2xpcEludmVyc2UoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcG9seWdvbik7XG5cblx0XHRcdFx0Y29uc3QgaXYgPSB0aGlzLmludmVyc2VWZXJ0aWNlcztcblx0XHRcdFx0Zm9yIChsZXQgb2Zmc2V0ID0gMCwgbm4gPSB0aGlzLmludmVyc2VWZXJ0aWNlcy5sZW5ndGg7IG9mZnNldCA8IG5uOykge1xuXHRcdFx0XHRcdGNvbnN0IHBvbHlnb25TaXplID0gaXZbb2Zmc2V0KytdO1xuXHRcdFx0XHRcdGxldCB2ZXJ0ZXhDb3VudCA9IHBvbHlnb25TaXplID4+IDEsIHMgPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgcG9seWdvblNpemUpO1xuXHRcdFx0XHRcdFV0aWxzLmFycmF5Q29weShpdiwgb2Zmc2V0LCBjdiwgcywgcG9seWdvblNpemUpO1xuXG5cdFx0XHRcdFx0cyA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGN0ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRUcmlhbmdsZXMsIHMgKyAzICogKHZlcnRleENvdW50IC0gMikpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMTsgaWkgPCB2ZXJ0ZXhDb3VudCAtIDE7IGlpKyssIHMgKz0gMykge1xuXHRcdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRcdGN0W3MgKyAxXSA9IGluZGV4ICsgaWk7XG5cdFx0XHRcdFx0XHRjdFtzICsgMl0gPSBpbmRleCArIGlpICsgMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aW5kZXggKz0gdmVydGV4Q291bnQ7XG5cdFx0XHRcdFx0b2Zmc2V0ICs9IHBvbHlnb25TaXplO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBjbGlwT3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdGNvbnN0IHBvbHlnb25zID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zO1xuXHRcdGNvbnN0IHBvbHlnb25zQ291bnQgPSBwb2x5Z29ucy5sZW5ndGg7XG5cdFx0bGV0IGNsaXBPdXRwdXRJdGVtcyA9IG51bGw7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0bGV0IHQgPSB0cmlhbmdsZXNbaV0gPDwgMTtcblx0XHRcdGNvbnN0IHgxID0gdmVydGljZXNbdF0sIHkxID0gdmVydGljZXNbdCArIDFdO1xuXHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMTtcblx0XHRcdGNvbnN0IHgyID0gdmVydGljZXNbdF0sIHkyID0gdmVydGljZXNbdCArIDFdO1xuXHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMl0gPDwgMTtcblx0XHRcdGNvbnN0IHgzID0gdmVydGljZXNbdF0sIHkzID0gdmVydGljZXNbdCArIDFdO1xuXHRcdFx0Zm9yIChsZXQgcCA9IDA7IHAgPCBwb2x5Z29uc0NvdW50OyBwKyspIHtcblx0XHRcdFx0bGV0IHMgPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0XHRpZiAodGhpcy5jbGlwKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb25zW3BdKSkge1xuXHRcdFx0XHRcdGNsaXBPdXRwdXRJdGVtcyA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRcdFx0XHRjb25zdCBjbGlwT3V0cHV0TGVuZ3RoID0gY2xpcE91dHB1dC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGNsaXBPdXRwdXRMZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0Q291bnQgPSBjbGlwT3V0cHV0TGVuZ3RoID4+IDE7XG5cblx0XHRcdFx0XHRjb25zdCBjdiA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVmVydGljZXMsIHMgKyBjbGlwT3V0cHV0TGVuZ3RoKTtcblx0XHRcdFx0XHRVdGlscy5hcnJheUNvcHkoY2xpcE91dHB1dEl0ZW1zLCAwLCBjdiwgcywgY2xpcE91dHB1dExlbmd0aCk7XG5cblx0XHRcdFx0XHRzID0gY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgY3QgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFRyaWFuZ2xlcywgcyArIDMgKiAoY2xpcE91dHB1dENvdW50IC0gMikpO1xuXHRcdFx0XHRcdGNsaXBPdXRwdXRDb3VudC0tO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMTsgaWkgPCBjbGlwT3V0cHV0Q291bnQ7IGlpKyssIHMgKz0gMykge1xuXHRcdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRcdGN0W3MgKyAxXSA9IChpbmRleCArIGlpKTtcblx0XHRcdFx0XHRcdGN0W3MgKyAyXSA9IChpbmRleCArIGlpICsgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZGV4ICs9IGNsaXBPdXRwdXRDb3VudDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBjdiA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVmVydGljZXMsIHMgKyAzICogMik7XG5cdFx0XHRcdFx0Y3Zbc10gPSB4MTtcblx0XHRcdFx0XHRjdltzICsgMV0gPSB5MTtcblx0XHRcdFx0XHRjdltzICsgMl0gPSB4Mjtcblx0XHRcdFx0XHRjdltzICsgM10gPSB5Mjtcblx0XHRcdFx0XHRjdltzICsgNF0gPSB4Mztcblx0XHRcdFx0XHRjdltzICsgNV0gPSB5MztcblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBjdCA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyk7XG5cdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyAxKTtcblx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyAyKTtcblx0XHRcdFx0XHRpbmRleCArPSAzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjbGlwT3V0cHV0SXRlbXMgIT0gbnVsbDtcblx0fVxuXG5cdHByaXZhdGUgY2xpcFRyaWFuZ2xlc1JlbmRlciAodmVydGljZXM6IE51bWJlckFycmF5TGlrZSwgdHJpYW5nbGVzOiBOdW1iZXJBcnJheUxpa2UsIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLCB1dnM6IE51bWJlckFycmF5TGlrZSwgbGlnaHQ6IENvbG9yLCBkYXJrOiBDb2xvcixcblx0XHR0d29Db2xvcjogYm9vbGVhbiwgc3RyaWRlOiBudW1iZXIpOiBib29sZWFuIHtcblx0XHRjb25zdCBjbGlwcGVkVmVydGljZXMgPSB0aGlzLmNsaXBwZWRWZXJ0aWNlcztcblx0XHRjbGlwcGVkVmVydGljZXMubGVuZ3RoID0gMDtcblx0XHRjb25zdCBjbGlwcGVkVHJpYW5nbGVzID0gdGhpcy5jbGlwcGVkVHJpYW5nbGVzO1xuXHRcdGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoID0gMDtcblx0XHRsZXQgaW5kZXggPSAwO1xuXG5cdFx0aWYgKHRoaXMuaW52ZXJzZSkge1xuXHRcdFx0Y29uc3QgcG9seWdvbiA9IHRoaXMuY2xpcHBpbmdQb2x5Z29uc1swXTtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzTGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdFx0bGV0IHQwID0gdHJpYW5nbGVzW2ldLCB0MSA9IHRyaWFuZ2xlc1tpICsgMV0sIHQyID0gdHJpYW5nbGVzW2kgKyAyXTtcblx0XHRcdFx0Y29uc3QgeDEgPSB2ZXJ0aWNlc1t0MCAqIHN0cmlkZV0sIHkxID0gdmVydGljZXNbdDAgKiBzdHJpZGUgKyAxXTtcblx0XHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t0MSAqIHN0cmlkZV0sIHkyID0gdmVydGljZXNbdDEgKiBzdHJpZGUgKyAxXTtcblx0XHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t0MiAqIHN0cmlkZV0sIHkzID0gdmVydGljZXNbdDIgKiBzdHJpZGUgKyAxXTtcblx0XHRcdFx0dGhpcy5jbGlwSW52ZXJzZSh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uKTtcblx0XHRcdFx0Y29uc3Qgbm4gPSB0aGlzLmludmVyc2VWZXJ0aWNlcy5sZW5ndGg7XG5cdFx0XHRcdGlmIChubiA9PT0gMCkgY29udGludWU7XG5cblx0XHRcdFx0Y29uc3QgdTEgPSB1dnNbdDAgPDw9IDFdLCB2MSA9IHV2c1t0MCArIDFdO1xuXHRcdFx0XHRjb25zdCB1MiA9IHV2c1t0MSA8PD0gMV0sIHYyID0gdXZzW3QxICsgMV07XG5cdFx0XHRcdGNvbnN0IHUzID0gdXZzW3QyIDw8PSAxXSwgdjMgPSB1dnNbdDIgKyAxXTtcblx0XHRcdFx0Y29uc3QgZDAgPSB5MiAtIHkzLCBkMSA9IHgzIC0geDIsIGQyID0geDEgLSB4MywgZDQgPSB5MyAtIHkxLCBkID0gMSAvIChkMCAqIGQyICsgZDEgKiAoeTEgLSB5MykpO1xuXHRcdFx0XHRjb25zdCBpdiA9IHRoaXMuaW52ZXJzZVZlcnRpY2VzO1xuXHRcdFx0XHRmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBubjspIHtcblx0XHRcdFx0XHRjb25zdCBwb2x5Z29uU2l6ZSA9IGl2W29mZnNldCsrXTtcblx0XHRcdFx0XHRjb25zdCB2ZXJ0ZXhDb3VudCA9IHBvbHlnb25TaXplID4+IDE7XG5cblx0XHRcdFx0XHRsZXQgcyA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgdmVydGV4Q291bnQgKiBzdHJpZGUpO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBwb2x5Z29uU2l6ZTsgaWkgKz0gMiwgcyArPSBzdHJpZGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSBpdltvZmZzZXQgKyBpaV0sIHkgPSBpdltvZmZzZXQgKyBpaSArIDFdO1xuXHRcdFx0XHRcdFx0Y3Zbc10gPSB4O1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDFdID0geTtcblx0XHRcdFx0XHRcdGN2W3MgKyAyXSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0XHRjdltzICsgM10gPSBsaWdodC5nO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDRdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyA1XSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0XHRjb25zdCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTMsIGEgPSAoZDAgKiBjMCArIGQxICogYzEpICogZCwgYiA9IChkNCAqIGMwICsgZDIgKiBjMSkgKiBkLCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDZdID0gdTEgKiBhICsgdTIgKiBiICsgdTMgKiBjO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDddID0gdjEgKiBhICsgdjIgKiBiICsgdjMgKiBjO1xuXHRcdFx0XHRcdFx0aWYgKHR3b0NvbG9yKSB7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyA4XSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdFx0Y3ZbcyArIDldID0gZGFyay5nO1xuXHRcdFx0XHRcdFx0XHRjdltzICsgMTBdID0gZGFyay5iO1xuXHRcdFx0XHRcdFx0XHRjdltzICsgMTFdID0gZGFyay5hO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBjdCA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyAqICh2ZXJ0ZXhDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgdmVydGV4Q291bnQgLSAxOyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRjdFtzICsgMV0gPSBpbmRleCArIGlpO1xuXHRcdFx0XHRcdFx0Y3RbcyArIDJdID0gaW5kZXggKyBpaSArIDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZGV4ICs9IHZlcnRleENvdW50O1xuXHRcdFx0XHRcdG9mZnNldCArPSBwb2x5Z29uU2l6ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cblx0XHRjb25zdCBjbGlwT3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdGNvbnN0IHBvbHlnb25zID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zO1xuXHRcdGNvbnN0IHBvbHlnb25zQ291bnQgPSB0aGlzLmNsaXBwaW5nUG9seWdvbnMubGVuZ3RoO1xuXHRcdGxldCBjbGlwT3V0cHV0SXRlbXMgPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdHJpYW5nbGVzTGVuZ3RoOyBpICs9IDMpIHtcblx0XHRcdGxldCB0ID0gdHJpYW5nbGVzW2ldO1xuXHRcdFx0Y29uc3QgeDEgPSB2ZXJ0aWNlc1t0ICogc3RyaWRlXSwgeTEgPSB2ZXJ0aWNlc1t0ICogc3RyaWRlICsgMV07XG5cdFx0XHRjb25zdCB1MSA9IHV2c1t0IDw8IDFdLCB2MSA9IHV2c1sodCA8PCAxKSArIDFdO1xuXHRcdFx0dCA9IHRyaWFuZ2xlc1tpICsgMV07XG5cdFx0XHRjb25zdCB4MiA9IHZlcnRpY2VzW3QgKiBzdHJpZGVdLCB5MiA9IHZlcnRpY2VzW3QgKiBzdHJpZGUgKyAxXTtcblx0XHRcdGNvbnN0IHUyID0gdXZzW3QgPDwgMV0sIHYyID0gdXZzWyh0IDw8IDEpICsgMV07XG5cdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAyXTtcblx0XHRcdGNvbnN0IHgzID0gdmVydGljZXNbdCAqIHN0cmlkZV0sIHkzID0gdmVydGljZXNbdCAqIHN0cmlkZSArIDFdO1xuXHRcdFx0Y29uc3QgdTMgPSB1dnNbdCA8PCAxXSwgdjMgPSB1dnNbKHQgPDwgMSkgKyAxXTtcblx0XHRcdGNvbnN0IGQwID0geTIgLSB5MywgZDEgPSB4MyAtIHgyLCBkMiA9IHgxIC0geDMsIGQ0ID0geTMgLSB5MSwgZCA9IDEgLyAoZDAgKiBkMiArIGQxICogKHkxIC0geTMpKTtcblx0XHRcdGZvciAobGV0IHAgPSAwOyBwIDwgcG9seWdvbnNDb3VudDsgcCsrKSB7XG5cdFx0XHRcdGxldCBzID0gY2xpcHBlZFZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKHRoaXMuY2xpcCh4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwb2x5Z29uc1twXSkpIHtcblx0XHRcdFx0XHRjbGlwT3V0cHV0SXRlbXMgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0XHRcdFx0Y29uc3QgY2xpcE91dHB1dExlbmd0aCA9IGNsaXBPdXRwdXQubGVuZ3RoO1xuXHRcdFx0XHRcdGlmIChjbGlwT3V0cHV0TGVuZ3RoID09PSAwKSBjb250aW51ZTtcblx0XHRcdFx0XHRsZXQgY2xpcE91dHB1dENvdW50ID0gY2xpcE91dHB1dExlbmd0aCA+PiAxO1xuXG5cdFx0XHRcdFx0Y29uc3QgY3YgPSBVdGlscy5zZXRBcnJheVNpemUoY2xpcHBlZFZlcnRpY2VzLCBzICsgY2xpcE91dHB1dENvdW50ICogc3RyaWRlKTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDA7IGlpIDwgY2xpcE91dHB1dExlbmd0aDsgaWkgKz0gMiwgcyArPSBzdHJpZGUpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSBjbGlwT3V0cHV0SXRlbXNbaWldLCB5ID0gY2xpcE91dHB1dEl0ZW1zW2lpICsgMV07XG5cdFx0XHRcdFx0XHRjdltzXSA9IHg7XG5cdFx0XHRcdFx0XHRjdltzICsgMV0gPSB5O1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDJdID0gbGlnaHQucjtcblx0XHRcdFx0XHRcdGN2W3MgKyAzXSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgNF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDVdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRcdGNvbnN0IGMwID0geCAtIHgzLCBjMSA9IHkgLSB5MywgYSA9IChkMCAqIGMwICsgZDEgKiBjMSkgKiBkLCBiID0gKGQ0ICogYzAgKyBkMiAqIGMxKSAqIGQsIGMgPSAxIC0gYSAtIGI7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MSAqIGEgKyB1MiAqIGIgKyB1MyAqIGM7XG5cdFx0XHRcdFx0XHRjdltzICsgN10gPSB2MSAqIGEgKyB2MiAqIGIgKyB2MyAqIGM7XG5cdFx0XHRcdFx0XHRpZiAodHdvQ29sb3IpIHtcblx0XHRcdFx0XHRcdFx0Y3ZbcyArIDhdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0XHRjdltzICsgOV0gPSBkYXJrLmc7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyAxMF0gPSBkYXJrLmI7XG5cdFx0XHRcdFx0XHRcdGN2W3MgKyAxMV0gPSBkYXJrLmE7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cyA9IGNsaXBwZWRUcmlhbmdsZXMubGVuZ3RoO1xuXHRcdFx0XHRcdGNvbnN0IGN0ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRUcmlhbmdsZXMsIHMgKyAzICogKGNsaXBPdXRwdXRDb3VudCAtIDIpKTtcblx0XHRcdFx0XHRjbGlwT3V0cHV0Q291bnQtLTtcblx0XHRcdFx0XHRmb3IgKGxldCBpaSA9IDE7IGlpIDwgY2xpcE91dHB1dENvdW50OyBpaSsrLCBzICs9IDMpIHtcblx0XHRcdFx0XHRcdGN0W3NdID0gaW5kZXg7XG5cdFx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyBpaSk7XG5cdFx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyBpaSArIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBjbGlwT3V0cHV0Q291bnQgKyAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0IGN2ID0gVXRpbHMuc2V0QXJyYXlTaXplKGNsaXBwZWRWZXJ0aWNlcywgcyArIDMgKiBzdHJpZGUpO1xuXHRcdFx0XHRcdGN2W3NdID0geDE7XG5cdFx0XHRcdFx0Y3ZbcyArIDFdID0geTE7XG5cdFx0XHRcdFx0Y3ZbcyArIDJdID0gbGlnaHQucjtcblx0XHRcdFx0XHRjdltzICsgM10gPSBsaWdodC5nO1xuXHRcdFx0XHRcdGN2W3MgKyA0XSA9IGxpZ2h0LmI7XG5cdFx0XHRcdFx0Y3ZbcyArIDVdID0gbGlnaHQuYTtcblx0XHRcdFx0XHRpZiAoIXR3b0NvbG9yKSB7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MTtcblx0XHRcdFx0XHRcdGN2W3MgKyA3XSA9IHYxO1xuXG5cdFx0XHRcdFx0XHRjdltzICsgOF0gPSB4Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyA5XSA9IHkyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEwXSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0XHRjdltzICsgMTFdID0gbGlnaHQuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAxMl0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEzXSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0XHRjdltzICsgMTRdID0gdTI7XG5cdFx0XHRcdFx0XHRjdltzICsgMTVdID0gdjI7XG5cblx0XHRcdFx0XHRcdGN2W3MgKyAxNl0gPSB4Mztcblx0XHRcdFx0XHRcdGN2W3MgKyAxN10gPSB5Mztcblx0XHRcdFx0XHRcdGN2W3MgKyAxOF0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE5XSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMjBdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAyMV0gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIyXSA9IHUzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIzXSA9IHYzO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjdltzICsgNl0gPSB1MTtcblx0XHRcdFx0XHRcdGN2W3MgKyA3XSA9IHYxO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDhdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDldID0gZGFyay5nO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDEwXSA9IGRhcmsuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxMV0gPSBkYXJrLmE7XG5cblx0XHRcdFx0XHRcdGN2W3MgKyAxMl0gPSB4Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxM10gPSB5Mjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxNF0gPSBsaWdodC5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE1XSA9IGxpZ2h0Lmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMTZdID0gbGlnaHQuYjtcblx0XHRcdFx0XHRcdGN2W3MgKyAxN10gPSBsaWdodC5hO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE4XSA9IHUyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDE5XSA9IHYyO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIwXSA9IGRhcmsucjtcblx0XHRcdFx0XHRcdGN2W3MgKyAyMV0gPSBkYXJrLmc7XG5cdFx0XHRcdFx0XHRjdltzICsgMjJdID0gZGFyay5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDIzXSA9IGRhcmsuYTtcblxuXHRcdFx0XHRcdFx0Y3ZbcyArIDI0XSA9IHgzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI1XSA9IHkzO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI2XSA9IGxpZ2h0LnI7XG5cdFx0XHRcdFx0XHRjdltzICsgMjddID0gbGlnaHQuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAyOF0gPSBsaWdodC5iO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDI5XSA9IGxpZ2h0LmE7XG5cdFx0XHRcdFx0XHRjdltzICsgMzBdID0gdTM7XG5cdFx0XHRcdFx0XHRjdltzICsgMzFdID0gdjM7XG5cdFx0XHRcdFx0XHRjdltzICsgMzJdID0gZGFyay5yO1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDMzXSA9IGRhcmsuZztcblx0XHRcdFx0XHRcdGN2W3MgKyAzNF0gPSBkYXJrLmI7XG5cdFx0XHRcdFx0XHRjdltzICsgMzVdID0gZGFyay5hO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHMgPSBjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBjdCA9IFV0aWxzLnNldEFycmF5U2l6ZShjbGlwcGVkVHJpYW5nbGVzLCBzICsgMyk7XG5cdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRjdFtzICsgMV0gPSAoaW5kZXggKyAxKTtcblx0XHRcdFx0XHRjdFtzICsgMl0gPSAoaW5kZXggKyAyKTtcblx0XHRcdFx0XHRpbmRleCArPSAzO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjbGlwT3V0cHV0SXRlbXMgIT0gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBjbGlwVHJpYW5nbGVzVW5wYWNrZWQgKHZlcnRpY2VzOiBOdW1iZXJBcnJheUxpa2UsIHZlcnRleFN0YXJ0OiBudW1iZXIsIHRyaWFuZ2xlczogTnVtYmVyQXJyYXlMaWtlIHwgVWludDE2QXJyYXksIHRyaWFuZ2xlc0xlbmd0aDogbnVtYmVyLCB1dnM6IE51bWJlckFycmF5TGlrZSwgc3RyaWRlID0gMik6IGJvb2xlYW4ge1xuXHRcdGxldCBjbGlwcGVkVmVydGljZXMgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZDtcblx0XHRsZXQgY2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRsZXQgY2xpcHBlZFRyaWFuZ2xlcyA9IHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZDtcblx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzTGVuZ3RoID0gMDtcblx0XHR0aGlzLmNsaXBwZWRVVnNMZW5ndGggPSAwO1xuXHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IDA7XG5cblx0XHRpZiAodGhpcy5pbnZlcnNlKSB7XG5cdFx0XHRjb25zdCBwb2x5Z29uID0gdGhpcy5jbGlwcGluZ1BvbHlnb25zWzBdO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0XHRsZXQgdiA9IHRyaWFuZ2xlc1tpXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDEgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MSA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHRsZXQgdXYgPSB0cmlhbmdsZXNbaV0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTEgPSB1dnNbdXZdLCB2MSA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR2ID0gdHJpYW5nbGVzW2kgKyAxXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MiA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHR1diA9IHRyaWFuZ2xlc1tpICsgMV0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTIgPSB1dnNbdXZdLCB2MiA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR2ID0gdHJpYW5nbGVzW2kgKyAyXSAqIHN0cmlkZTtcblx0XHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MyA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0XHR1diA9IHRyaWFuZ2xlc1tpICsgMl0gPDwgMTtcblx0XHRcdFx0Y29uc3QgdTMgPSB1dnNbdXZdLCB2MyA9IHV2c1t1diArIDFdO1xuXHRcdFx0XHR0aGlzLmNsaXBJbnZlcnNlKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHBvbHlnb24pO1xuXHRcdFx0XHRjb25zdCBubiA9IHRoaXMuaW52ZXJzZVZlcnRpY2VzLmxlbmd0aDtcblx0XHRcdFx0aWYgKG5uID09PSAwKSBjb250aW51ZTtcblxuXHRcdFx0XHRjb25zdCBkMCA9IHkyIC0geTMsIGQxID0geDMgLSB4MiwgZDIgPSB4MSAtIHgzLCBkNCA9IHkzIC0geTEsIGQgPSAxIC8gKGQwICogZDIgKyBkMSAqICh5MSAtIHkzKSk7XG5cdFx0XHRcdGNvbnN0IGl2ID0gdGhpcy5pbnZlcnNlVmVydGljZXM7XG5cdFx0XHRcdGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IG5uOykge1xuXHRcdFx0XHRcdGNvbnN0IHBvbHlnb25TaXplID0gaXZbb2Zmc2V0KytdO1xuXHRcdFx0XHRcdGNvbnN0IHZlcnRleENvdW50ID0gcG9seWdvblNpemUgPj4gMTtcblxuXHRcdFx0XHRcdGxldCBzID0gdGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgbmV3TGVuZ3RoID0gcyArIHZlcnRleENvdW50ICogc3RyaWRlO1xuXHRcdFx0XHRcdGNvbnN0IG5ld1VWTGVuZ3RoID0gdGhpcy5jbGlwcGVkVVZzTGVuZ3RoICsgdmVydGV4Q291bnQgKiAyO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVmVydGljZXMubGVuZ3RoIDwgbmV3TGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoICogMik7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zZXQoY2xpcHBlZFZlcnRpY2VzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlcyA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoY2xpcHBlZFVWcy5sZW5ndGggPCBuZXdVVkxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkID0gbmV3IEZsb2F0MzJBcnJheShuZXdVVkxlbmd0aCAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFVWc1R5cGVkLnNldChjbGlwcGVkVVZzLnN1YmFycmF5KDAsIHRoaXMuY2xpcHBlZFVWc0xlbmd0aCkpO1xuXHRcdFx0XHRcdFx0Y2xpcHBlZFVWcyA9IHRoaXMuX2NsaXBwZWRVVnNUeXBlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGggPSBuZXdMZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5jbGlwcGVkVVZzTGVuZ3RoID0gbmV3VVZMZW5ndGg7XG5cblx0XHRcdFx0XHRjb25zdCBjdiA9IHRoaXMuX2NsaXBwZWRWZXJ0aWNlc1R5cGVkO1xuXHRcdFx0XHRcdGNvbnN0IGN1ID0gdGhpcy5fY2xpcHBlZFVWc1R5cGVkO1xuXHRcdFx0XHRcdGxldCB1dkluZGV4ID0gbmV3VVZMZW5ndGggLSB2ZXJ0ZXhDb3VudCAqIDI7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAwOyBpaSA8IHBvbHlnb25TaXplOyBpaSArPSAyLCBzICs9IHN0cmlkZSwgdXZJbmRleCArPSAyKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB4ID0gaXZbb2Zmc2V0ICsgaWldLCB5ID0gaXZbb2Zmc2V0ICsgaWkgKyAxXTtcblx0XHRcdFx0XHRcdGN2W3NdID0geDtcblx0XHRcdFx0XHRcdGN2W3MgKyAxXSA9IHk7XG5cdFx0XHRcdFx0XHRjb25zdCBjMCA9IHggLSB4MywgYzEgPSB5IC0geTMsIGEgPSAoZDAgKiBjMCArIGQxICogYzEpICogZCwgYiA9IChkNCAqIGMwICsgZDIgKiBjMSkgKiBkLCBjID0gMSAtIGEgLSBiO1xuXHRcdFx0XHRcdFx0Y3VbdXZJbmRleF0gPSB1MSAqIGEgKyB1MiAqIGIgKyB1MyAqIGM7XG5cdFx0XHRcdFx0XHRjdVt1dkluZGV4ICsgMV0gPSB2MSAqIGEgKyB2MiAqIGIgKyB2MyAqIGM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aDtcblx0XHRcdFx0XHRjb25zdCBuZXdMZW5ndGhUcmlhbmdsZXMgPSBzICsgMyAqICh2ZXJ0ZXhDb3VudCAtIDIpO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVHJpYW5nbGVzLmxlbmd0aCA8IG5ld0xlbmd0aFRyaWFuZ2xlcykge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkID0gbmV3IFVpbnQxNkFycmF5KG5ld0xlbmd0aFRyaWFuZ2xlcyAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkLnNldChjbGlwcGVkVHJpYW5nbGVzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRUcmlhbmdsZXMgPSB0aGlzLl9jbGlwcGVkVHJpYW5nbGVzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aCA9IG5ld0xlbmd0aFRyaWFuZ2xlcztcblx0XHRcdFx0XHRjb25zdCBjdCA9IGNsaXBwZWRUcmlhbmdsZXM7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaWkgPSAxOyBpaSA8IHZlcnRleENvdW50IC0gMTsgaWkrKywgcyArPSAzKSB7XG5cdFx0XHRcdFx0XHRjdFtzXSA9IGluZGV4O1xuXHRcdFx0XHRcdFx0Y3RbcyArIDFdID0gaW5kZXggKyBpaTtcblx0XHRcdFx0XHRcdGN0W3MgKyAyXSA9IGluZGV4ICsgaWkgKyAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSB2ZXJ0ZXhDb3VudDtcblx0XHRcdFx0XHRvZmZzZXQgKz0gcG9seWdvblNpemU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXBPdXRwdXQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0Y29uc3QgcG9seWdvbnMgPSB0aGlzLmNsaXBwaW5nUG9seWdvbnM7XG5cdFx0Y29uc3QgcG9seWdvbnNDb3VudCA9IHRoaXMuY2xpcHBpbmdQb2x5Z29ucy5sZW5ndGg7XG5cdFx0bGV0IGNsaXBPdXRwdXRJdGVtcyA9IG51bGw7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0cmlhbmdsZXNMZW5ndGg7IGkgKz0gMykge1xuXHRcdFx0bGV0IHQgPSB0cmlhbmdsZXNbaV07XG5cdFx0XHRsZXQgdiA9IHQgKiBzdHJpZGU7XG5cdFx0XHRjb25zdCB4MSA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdl0sIHkxID0gdmVydGljZXNbdmVydGV4U3RhcnQgKyB2ICsgMV07XG5cdFx0XHRsZXQgdXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MSA9IHV2c1t1dl0sIHYxID0gdXZzW3V2ICsgMV07XG5cdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAxXTtcblx0XHRcdHYgPSB0ICogc3RyaWRlO1xuXHRcdFx0Y29uc3QgeDIgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MiA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0dXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MiA9IHV2c1t1dl0sIHYyID0gdXZzW3V2ICsgMV07XG5cdFx0XHR0ID0gdHJpYW5nbGVzW2kgKyAyXTtcblx0XHRcdHYgPSB0ICogc3RyaWRlO1xuXHRcdFx0Y29uc3QgeDMgPSB2ZXJ0aWNlc1t2ZXJ0ZXhTdGFydCArIHZdLCB5MyA9IHZlcnRpY2VzW3ZlcnRleFN0YXJ0ICsgdiArIDFdO1xuXHRcdFx0dXYgPSB0IDw8IDE7XG5cdFx0XHRjb25zdCB1MyA9IHV2c1t1dl0sIHYzID0gdXZzW3V2ICsgMV07XG5cdFx0XHRjb25zdCBkMCA9IHkyIC0geTMsIGQxID0geDMgLSB4MiwgZDIgPSB4MSAtIHgzLCBkNCA9IHkzIC0geTEsIGQgPSAxIC8gKGQwICogZDIgKyBkMSAqICh5MSAtIHkzKSk7XG5cblx0XHRcdGZvciAobGV0IHAgPSAwOyBwIDwgcG9seWdvbnNDb3VudDsgcCsrKSB7XG5cdFx0XHRcdGxldCBzID0gdGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGg7XG5cdFx0XHRcdGlmICh0aGlzLmNsaXAoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcG9seWdvbnNbcF0pKSB7XG5cdFx0XHRcdFx0Y2xpcE91dHB1dEl0ZW1zID0gY2xpcE91dHB1dDtcblx0XHRcdFx0XHRjb25zdCBjbGlwT3V0cHV0TGVuZ3RoID0gY2xpcE91dHB1dC5sZW5ndGg7XG5cdFx0XHRcdFx0aWYgKGNsaXBPdXRwdXRMZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXHRcdFx0XHRcdGxldCBjbGlwT3V0cHV0Q291bnQgPSBjbGlwT3V0cHV0TGVuZ3RoID4+IDE7XG5cblx0XHRcdFx0XHRjb25zdCBuZXdMZW5ndGggPSBzICsgY2xpcE91dHB1dENvdW50ICogc3RyaWRlO1xuXHRcdFx0XHRcdGlmIChjbGlwcGVkVmVydGljZXMubGVuZ3RoIDwgbmV3TGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkobmV3TGVuZ3RoICogMik7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZC5zZXQoY2xpcHBlZFZlcnRpY2VzLnN1YmFycmF5KDAsIHMpKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRVVnNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkoKHRoaXMuY2xpcHBlZFVWc0xlbmd0aCArIGNsaXBPdXRwdXRDb3VudCAqIDIpICogMik7XG5cdFx0XHRcdFx0XHR0aGlzLl9jbGlwcGVkVVZzVHlwZWQuc2V0KGNsaXBwZWRVVnMuc3ViYXJyYXkoMCwgdGhpcy5jbGlwcGVkVVZzTGVuZ3RoKSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXMgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZDtcblx0XHRcdFx0XHRcdGNsaXBwZWRVVnMgPSB0aGlzLl9jbGlwcGVkVVZzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGN2ID0gY2xpcHBlZFZlcnRpY2VzO1xuXHRcdFx0XHRcdGNvbnN0IGN1ID0gY2xpcHBlZFVWcztcblx0XHRcdFx0XHR0aGlzLmNsaXBwZWRWZXJ0aWNlc0xlbmd0aCA9IG5ld0xlbmd0aDtcblxuXHRcdFx0XHRcdGxldCB1dkluZGV4ID0gdGhpcy5jbGlwcGVkVVZzTGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFVWc0xlbmd0aCA9IHV2SW5kZXggKyBjbGlwT3V0cHV0Q291bnQgKiAyO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMDsgaWkgPCBjbGlwT3V0cHV0TGVuZ3RoOyBpaSArPSAyLCBzICs9IHN0cmlkZSwgdXZJbmRleCArPSAyKSB7XG5cdFx0XHRcdFx0XHRjb25zdCB4ID0gY2xpcE91dHB1dEl0ZW1zW2lpXSwgeSA9IGNsaXBPdXRwdXRJdGVtc1tpaSArIDFdO1xuXHRcdFx0XHRcdFx0Y3Zbc10gPSB4O1xuXHRcdFx0XHRcdFx0Y3ZbcyArIDFdID0geTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYzAgPSB4IC0geDMsIGMxID0geSAtIHkzLCBhID0gKGQwICogYzAgKyBkMSAqIGMxKSAqIGQsIGIgPSAoZDQgKiBjMCArIGQyICogYzEpICogZCwgYyA9IDEgLSBhIC0gYjtcblx0XHRcdFx0XHRcdGN1W3V2SW5kZXhdID0gdTEgKiBhICsgdTIgKiBiICsgdTMgKiBjO1xuXHRcdFx0XHRcdFx0Y3VbdXZJbmRleCArIDFdID0gdjEgKiBhICsgdjIgKiBiICsgdjMgKiBjO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHMgPSB0aGlzLmNsaXBwZWRUcmlhbmdsZXNMZW5ndGg7XG5cdFx0XHRcdFx0Y29uc3QgbmV3TGVuZ3RoVHJpYW5nbGVzID0gcyArIDMgKiAoY2xpcE91dHB1dENvdW50IC0gMilcblx0XHRcdFx0XHRpZiAoY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPCBuZXdMZW5ndGhUcmlhbmdsZXMpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZCA9IG5ldyBVaW50MTZBcnJheShuZXdMZW5ndGhUcmlhbmdsZXMgKiAyKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZC5zZXQoY2xpcHBlZFRyaWFuZ2xlcy5zdWJhcnJheSgwLCBzKSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzID0gdGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLmNsaXBwZWRUcmlhbmdsZXNMZW5ndGggPSBuZXdMZW5ndGhUcmlhbmdsZXM7XG5cdFx0XHRcdFx0Y29uc3QgY3QgPSBjbGlwcGVkVHJpYW5nbGVzO1xuXHRcdFx0XHRcdGNsaXBPdXRwdXRDb3VudC0tO1xuXHRcdFx0XHRcdGZvciAobGV0IGlpID0gMTsgaWkgPCBjbGlwT3V0cHV0Q291bnQ7IGlpKyssIHMgKz0gMykge1xuXHRcdFx0XHRcdFx0Y3Rbc10gPSBpbmRleDtcblx0XHRcdFx0XHRcdGN0W3MgKyAxXSA9IChpbmRleCArIGlpKTtcblx0XHRcdFx0XHRcdGN0W3MgKyAyXSA9IChpbmRleCArIGlpICsgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGluZGV4ICs9IGNsaXBPdXRwdXRDb3VudCArIDE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGxldCBuZXdMZW5ndGggPSBzICsgMyAqIHN0cmlkZTtcblx0XHRcdFx0XHRpZiAoY2xpcHBlZFZlcnRpY2VzLmxlbmd0aCA8IG5ld0xlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFZlcnRpY2VzVHlwZWQgPSBuZXcgRmxvYXQzMkFycmF5KG5ld0xlbmd0aCAqIDIpO1xuXHRcdFx0XHRcdFx0dGhpcy5fY2xpcHBlZFZlcnRpY2VzVHlwZWQuc2V0KGNsaXBwZWRWZXJ0aWNlcy5zdWJhcnJheSgwLCBzKSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXMgPSB0aGlzLl9jbGlwcGVkVmVydGljZXNUeXBlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzW3NdID0geDE7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzW3MgKyAxXSA9IHkxO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc1tzICsgc3RyaWRlXSA9IHgyO1xuXHRcdFx0XHRcdGNsaXBwZWRWZXJ0aWNlc1tzICsgc3RyaWRlICsgMV0gPSB5Mjtcblx0XHRcdFx0XHRjbGlwcGVkVmVydGljZXNbcyArIHN0cmlkZSAqIDJdID0geDM7XG5cdFx0XHRcdFx0Y2xpcHBlZFZlcnRpY2VzW3MgKyBzdHJpZGUgKiAyICsgMV0gPSB5MztcblxuXHRcdFx0XHRcdGNvbnN0IHV2TGVuZ3RoID0gdGhpcy5jbGlwcGVkVVZzTGVuZ3RoICsgMyAqIDI7XG5cdFx0XHRcdFx0aWYgKGNsaXBwZWRVVnMubGVuZ3RoIDwgdXZMZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRVVnNUeXBlZCA9IG5ldyBGbG9hdDMyQXJyYXkodXZMZW5ndGggKiAyKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRVVnNUeXBlZC5zZXQoY2xpcHBlZFVWcy5zdWJhcnJheSgwLCB0aGlzLmNsaXBwZWRVVnNMZW5ndGgpKTtcblx0XHRcdFx0XHRcdGNsaXBwZWRVVnMgPSB0aGlzLl9jbGlwcGVkVVZzVHlwZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IHV2SW5kZXggPSB0aGlzLmNsaXBwZWRVVnNMZW5ndGg7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWc1t1dkluZGV4XSA9IHUxO1xuXHRcdFx0XHRcdGNsaXBwZWRVVnNbdXZJbmRleCArIDFdID0gdjE7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWc1t1dkluZGV4ICsgMl0gPSB1Mjtcblx0XHRcdFx0XHRjbGlwcGVkVVZzW3V2SW5kZXggKyAzXSA9IHYyO1xuXHRcdFx0XHRcdGNsaXBwZWRVVnNbdXZJbmRleCArIDRdID0gdTM7XG5cdFx0XHRcdFx0Y2xpcHBlZFVWc1t1dkluZGV4ICsgNV0gPSB2MztcblxuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFZlcnRpY2VzTGVuZ3RoID0gbmV3TGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuY2xpcHBlZFVWc0xlbmd0aCA9IHV2TGVuZ3RoO1xuXG5cdFx0XHRcdFx0cyA9IHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aDtcblx0XHRcdFx0XHRuZXdMZW5ndGggPSBzICsgMztcblx0XHRcdFx0XHRpZiAoY2xpcHBlZFRyaWFuZ2xlcy5sZW5ndGggPCBuZXdMZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZCA9IG5ldyBVaW50MTZBcnJheShuZXdMZW5ndGggKiAyKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NsaXBwZWRUcmlhbmdsZXNUeXBlZC5zZXQoY2xpcHBlZFRyaWFuZ2xlcy5zdWJhcnJheSgwLCBzKSk7XG5cdFx0XHRcdFx0XHRjbGlwcGVkVHJpYW5nbGVzID0gdGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGN0ID0gY2xpcHBlZFRyaWFuZ2xlcztcblx0XHRcdFx0XHRjdFtzXSA9IGluZGV4O1xuXHRcdFx0XHRcdGN0W3MgKyAxXSA9IChpbmRleCArIDEpO1xuXHRcdFx0XHRcdGN0W3MgKyAyXSA9IChpbmRleCArIDIpO1xuXHRcdFx0XHRcdGluZGV4ICs9IDM7XG5cblx0XHRcdFx0XHR0aGlzLmNsaXBwZWRUcmlhbmdsZXNMZW5ndGggPSBuZXdMZW5ndGg7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNsaXBwZWRWZXJ0aWNlc1R5cGVkID0gdGhpcy5fY2xpcHBlZFZlcnRpY2VzVHlwZWQuc3ViYXJyYXkoMCwgdGhpcy5jbGlwcGVkVmVydGljZXNMZW5ndGgpXG5cdFx0dGhpcy5jbGlwcGVkVVZzVHlwZWQgPSB0aGlzLl9jbGlwcGVkVVZzVHlwZWQuc3ViYXJyYXkoMCwgdGhpcy5jbGlwcGVkVVZzTGVuZ3RoKVxuXHRcdHRoaXMuY2xpcHBlZFRyaWFuZ2xlc1R5cGVkID0gdGhpcy5fY2xpcHBlZFRyaWFuZ2xlc1R5cGVkLnN1YmFycmF5KDAsIHRoaXMuY2xpcHBlZFRyaWFuZ2xlc0xlbmd0aClcblx0XHRyZXR1cm4gY2xpcE91dHB1dEl0ZW1zICE9PSBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSBjbGlwICh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB4MzogbnVtYmVyLCB5MzogbnVtYmVyLCBwb2x5Z29uOiBudW1iZXJbXSkge1xuXHRcdGNvbnN0IG9yaWdpbmFsT3V0cHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdGxldCBjbGlwcGVkID0gZmFsc2U7XG5cblx0XHQvLyBBdm9pZCBjb3B5IGF0IHRoZSBlbmQuXG5cdFx0bGV0IGlucHV0OiBudW1iZXJbXSwgb3V0cHV0OiBudW1iZXJbXTtcblx0XHRpZiAocG9seWdvbi5sZW5ndGggJSA0ID49IDIpIHtcblx0XHRcdGlucHV0ID0gdGhpcy5jbGlwT3V0cHV0O1xuXHRcdFx0b3V0cHV0ID0gdGhpcy5zY3JhdGNoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpbnB1dCA9IHRoaXMuc2NyYXRjaDtcblx0XHRcdG91dHB1dCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHR9XG5cblx0XHRjb25zdCB2ID0gcG9seWdvbjtcblx0XHRpbnB1dC5sZW5ndGggPSA4O1xuXHRcdGNvbnN0IGl2ID0gaW5wdXQ7XG5cdFx0aXZbMF0gPSB4MTtcblx0XHRpdlsxXSA9IHkxO1xuXHRcdGl2WzJdID0geDI7XG5cdFx0aXZbM10gPSB5Mjtcblx0XHRpdls0XSA9IHgzO1xuXHRcdGl2WzVdID0geTM7XG5cdFx0aXZbNl0gPSB4MTtcblx0XHRpdls3XSA9IHkxO1xuXHRcdG91dHB1dC5sZW5ndGggPSAwO1xuXG5cdFx0Y29uc3QgbGFzdCA9IHBvbHlnb24ubGVuZ3RoIC0gNDtcblx0XHRmb3IgKGxldCBpID0gMDsgOyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IGVkZ2VYID0gdltpXSwgZWRnZVkgPSB2W2kgKyAxXSwgZXggPSBlZGdlWCAtIHZbaSArIDJdLCBleSA9IGVkZ2VZIC0gdltpICsgM107XG5cdFx0XHRjb25zdCBvdXRwdXRTdGFydCA9IG91dHB1dC5sZW5ndGg7XG5cdFx0XHRjb25zdCBpdiA9IGlucHV0O1xuXHRcdFx0Zm9yIChsZXQgaWkgPSAwLCBubiA9IGlucHV0Lmxlbmd0aCAtIDI7IGlpIDwgbm47KSB7XG5cdFx0XHRcdHgxID0gaXZbaWldO1xuXHRcdFx0XHR5MSA9IGl2W2lpICsgMV07XG5cdFx0XHRcdGlpICs9IDI7XG5cdFx0XHRcdHgyID0gaXZbaWldO1xuXHRcdFx0XHR5MiA9IGl2W2lpICsgMV07XG5cdFx0XHRcdGNvbnN0IHMyID0gZXkgKiAoZWRnZVggLSB4MikgPiBleCAqIChlZGdlWSAtIHkyKTtcblx0XHRcdFx0Y29uc3QgczEgPSBleSAqIChlZGdlWCAtIHgxKSAtIGV4ICogKGVkZ2VZIC0geTEpO1xuXHRcdFx0XHRpZiAoczEgPiAwKSB7XG5cdFx0XHRcdFx0aWYgKHMyKSAvLyB2MSBpbiwgdjIgaW5cblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgyLCB5Mik7XG5cdFx0XHRcdFx0ZWxzZSB7IC8vIHYxIGluLCB2MiBvdXRcblx0XHRcdFx0XHRcdGNvbnN0IGl4ID0geDIgLSB4MSwgaXkgPSB5MiAtIHkxLCB0ID0gczEgLyAoaXggKiBleSAtIGl5ICogZXgpO1xuXHRcdFx0XHRcdFx0aWYgKHQgPj0gMCAmJiB0IDw9IDEpIHtcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDEgKyBpeCAqIHQsIHkxICsgaXkgKiB0KTtcblx0XHRcdFx0XHRcdFx0Y2xpcHBlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoczIpIHsgLy8gdjEgb3V0LCB2MiBpblxuXHRcdFx0XHRcdGNvbnN0IGl4ID0geDIgLSB4MSwgaXkgPSB5MiAtIHkxLCB0ID0gczEgLyAoaXggKiBleSAtIGl5ICogZXgpO1xuXHRcdFx0XHRcdGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaCh4MSArIGl4ICogdCwgeTEgKyBpeSAqIHQsIHgyLCB5Mik7XG5cdFx0XHRcdFx0XHRjbGlwcGVkID0gdHJ1ZTtcblx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdG91dHB1dC5wdXNoKHgyLCB5Mik7XG5cdFx0XHRcdH0gZWxzZSAvLyB2MSBvdXQsIHYyIG91dFxuXHRcdFx0XHRcdGNsaXBwZWQgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3V0cHV0U3RhcnQgPT09IG91dHB1dC5sZW5ndGgpIHsgLy8gQWxsIG91dHNpZGUuXG5cdFx0XHRcdG9yaWdpbmFsT3V0cHV0Lmxlbmd0aCA9IDA7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRvdXRwdXQucHVzaChvdXRwdXRbMF0sIG91dHB1dFsxXSk7XG5cblx0XHRcdGlmIChpID09PSBsYXN0KSBicmVhaztcblx0XHRcdGNvbnN0IHRlbXAgPSBvdXRwdXQ7XG5cdFx0XHRvdXRwdXQgPSBpbnB1dDtcblx0XHRcdG91dHB1dC5sZW5ndGggPSAwO1xuXHRcdFx0aW5wdXQgPSB0ZW1wO1xuXHRcdH1cblxuXHRcdGlmIChvcmlnaW5hbE91dHB1dCAhPT0gb3V0cHV0KSB7XG5cdFx0XHRvcmlnaW5hbE91dHB1dC5sZW5ndGggPSAwO1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIG4gPSBvdXRwdXQubGVuZ3RoIC0gMjsgaSA8IG47IGkrKylcblx0XHRcdFx0b3JpZ2luYWxPdXRwdXRbaV0gPSBvdXRwdXRbaV07XG5cdFx0fSBlbHNlXG5cdFx0XHRvcmlnaW5hbE91dHB1dC5sZW5ndGggPSBvcmlnaW5hbE91dHB1dC5sZW5ndGggLSAyO1xuXG5cdFx0cmV0dXJuIGNsaXBwZWQ7XG5cdH1cblxuXHRwcml2YXRlIGNsaXBJbnZlcnNlICh4MTogbnVtYmVyLCB5MTogbnVtYmVyLCB4MjogbnVtYmVyLCB5MjogbnVtYmVyLCB4MzogbnVtYmVyLCB5MzogbnVtYmVyLCBwb2x5Z29uOiBudW1iZXJbXSk6IHZvaWQge1xuXHRcdHRoaXMuaW52ZXJzZVZlcnRpY2VzLmxlbmd0aCA9IDA7XG5cdFx0Y29uc3Qgdkxhc3QgPSBwb2x5Z29uLmxlbmd0aCAtIDQ7XG5cblx0XHRsZXQgaW5wdXQ6IG51bWJlcltdLCBvdXRwdXQ6IG51bWJlcltdOyAvLyBBdm9pZCBjb3B5IGF0IHRoZSBlbmQuXG5cdFx0aWYgKHBvbHlnb24ubGVuZ3RoICUgNCA+PSAyKSB7XG5cdFx0XHRpbnB1dCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRcdG91dHB1dCA9IHRoaXMuc2NyYXRjaDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW5wdXQgPSB0aGlzLnNjcmF0Y2g7XG5cdFx0XHRvdXRwdXQgPSB0aGlzLmNsaXBPdXRwdXQ7XG5cdFx0fVxuXG5cdFx0aW5wdXQubGVuZ3RoID0gODtcblx0XHRsZXQgdiA9IHBvbHlnb24sIGl2ID0gaW5wdXQ7XG5cdFx0aXZbMF0gPSB4MTtcblx0XHRpdlsxXSA9IHkxO1xuXHRcdGl2WzJdID0geDI7XG5cdFx0aXZbM10gPSB5Mjtcblx0XHRpdls0XSA9IHgzO1xuXHRcdGl2WzVdID0geTM7XG5cdFx0aXZbNl0gPSB4MTtcblx0XHRpdls3XSA9IHkxO1xuXHRcdG91dHB1dC5sZW5ndGggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IDsgaSArPSAyKSB7XG5cdFx0XHRjb25zdCBlZGdlWCA9IHZbaV0sIGVkZ2VZID0gdltpICsgMV0sIGV4ID0gZWRnZVggLSB2W2kgKyAyXSwgZXkgPSBlZGdlWSAtIHZbaSArIDNdO1xuXHRcdFx0Y29uc3Qgb3V0cHV0U3RhcnQgPSBvdXRwdXQubGVuZ3RoLCBmcmFnbWVudFN0YXJ0ID0gdGhpcy5pbnZlcnNlVmVydGljZXMubGVuZ3RoO1xuXHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXMucHVzaCgwKTtcblx0XHRcdGl2ID0gaW5wdXQ7XG5cdFx0XHRmb3IgKGxldCBpaSA9IDAsIG5uID0gaW5wdXQubGVuZ3RoIC0gMjsgaWkgPCBubjspIHtcblx0XHRcdFx0eDEgPSBpdltpaV07XG5cdFx0XHRcdHkxID0gaXZbaWkgKyAxXTtcblx0XHRcdFx0aWkgKz0gMjtcblx0XHRcdFx0eDIgPSBpdltpaV07XG5cdFx0XHRcdHkyID0gaXZbaWkgKyAxXTtcblx0XHRcdFx0Y29uc3QgczIgPSBleSAqIChlZGdlWCAtIHgyKSA+IGV4ICogKGVkZ2VZIC0geTIpO1xuXHRcdFx0XHRjb25zdCBzMSA9IGV5ICogKGVkZ2VYIC0geDEpIC0gZXggKiAoZWRnZVkgLSB5MSk7XG5cdFx0XHRcdGlmIChzMSA+IDApIHtcblx0XHRcdFx0XHRpZiAoczIpIC8vIHYxIGluLCB2MiBpblxuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdC8vIHYxIGluLCB2MiBvdXRcblx0XHRcdFx0XHRcdGNvbnN0IGl4ID0geDIgLSB4MSwgaXkgPSB5MiAtIHkxLCB0ID0gczEgLyAoaXggKiBleSAtIGl5ICogZXgpO1xuXHRcdFx0XHRcdFx0aWYgKHQgPj0gMCAmJiB0IDw9IDEpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY3ggPSB4MSArIGl4ICogdCwgY3kgPSB5MSArIGl5ICogdDtcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goY3gsIGN5KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXMucHVzaChjeCwgY3ksIHgyLCB5Mik7XG5cdFx0XHRcdFx0XHR9IGVsc2Vcblx0XHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoczIpIHsgLy8gdjEgb3V0LCB2MiBpblxuXHRcdFx0XHRcdGNvbnN0IGR4ID0geDIgLSB4MSwgZHkgPSB5MiAtIHkxLCB0ID0gczEgLyAoZHggKiBleSAtIGR5ICogZXgpO1xuXHRcdFx0XHRcdGlmICh0ID49IDAgJiYgdCA8PSAxKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjeCA9IHgxICsgZHggKiB0LCBjeSA9IHkxICsgZHkgKiB0O1xuXHRcdFx0XHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXMucHVzaChjeCwgY3kpO1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goY3gsIGN5LCB4MiwgeTIpO1xuXHRcdFx0XHRcdH0gZWxzZVxuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goeDIsIHkyKTtcblx0XHRcdFx0fSBlbHNlIC8vIHYxIG91dCwgdjIgb3V0XG5cdFx0XHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXMucHVzaCh4MiwgeTIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBmcmFnbWVudFNpemUgPSB0aGlzLmludmVyc2VWZXJ0aWNlcy5sZW5ndGggLSBmcmFnbWVudFN0YXJ0IC0gMTtcblx0XHRcdGlmIChmcmFnbWVudFNpemUgPj0gNilcblx0XHRcdFx0dGhpcy5pbnZlcnNlVmVydGljZXNbZnJhZ21lbnRTdGFydF0gPSBmcmFnbWVudFNpemU7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuaW52ZXJzZVZlcnRpY2VzLmxlbmd0aCA9IGZyYWdtZW50U3RhcnQ7IC8vIERlZ2VuZXJhdGUuXG5cblx0XHRcdGlmIChvdXRwdXRTdGFydCA9PT0gb3V0cHV0Lmxlbmd0aCkgYnJlYWs7IC8vIEFsbCBvdXRzaWRlLlxuXG5cdFx0XHRvdXRwdXQucHVzaChvdXRwdXRbMF0sIG91dHB1dFsxXSk7XG5cblx0XHRcdGlmIChpID09PSB2TGFzdCkgYnJlYWs7XG5cdFx0XHRjb25zdCB0ZW1wID0gb3V0cHV0O1xuXHRcdFx0b3V0cHV0ID0gaW5wdXQ7XG5cdFx0XHRvdXRwdXQubGVuZ3RoID0gMDtcblx0XHRcdGlucHV0ID0gdGVtcDtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG1ha2VDbG9ja3dpc2UgKHBvbHlnb246IG51bWJlcltdKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgdiA9IHBvbHlnb247XG5cdFx0Y29uc3QgbiA9IHBvbHlnb24ubGVuZ3RoO1xuXHRcdGxldCBub0NXID0gdHJ1ZSwgbm9DQ1cgPSB0cnVlO1xuXHRcdGxldCBhcmVhID0gMCwgcHJldlggPSB2W24gLSAyXSwgcHJldlkgPSB2W24gLSAxXSwgY3VyclggPSB2WzBdLCBjdXJyWSA9IHZbMV07XG5cdFx0Zm9yIChsZXQgaSA9IDI7IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IG5leHRYID0gdltpXSwgbmV4dFkgPSB2W2kgKyAxXTtcblx0XHRcdGFyZWEgKz0gY3VyclggKiBuZXh0WSAtIG5leHRYICogY3Vyclk7XG5cdFx0XHRjb25zdCBjcm9zcyA9IChjdXJyWCAtIHByZXZYKSAqIChuZXh0WSAtIGN1cnJZKSAtIChjdXJyWSAtIHByZXZZKSAqIChuZXh0WCAtIGN1cnJYKTtcblx0XHRcdG5vQ0NXID0gbm9DQ1cgJiYgY3Jvc3MgPD0gMDtcblx0XHRcdG5vQ1cgPSBub0NXICYmIGNyb3NzID49IDA7XG5cdFx0XHRwcmV2WCA9IGN1cnJYO1xuXHRcdFx0cHJldlkgPSBjdXJyWTtcblx0XHRcdGN1cnJYID0gbmV4dFg7XG5cdFx0XHRjdXJyWSA9IG5leHRZO1xuXHRcdH1cblx0XHRhcmVhICs9IGN1cnJYICogdlsxXSAtIHZbMF0gKiBjdXJyWTtcblx0XHRjb25zdCBjcm9zcyA9IChjdXJyWCAtIHByZXZYKSAqICh2WzFdIC0gY3VyclkpIC0gKGN1cnJZIC0gcHJldlkpICogKHZbMF0gLSBjdXJyWCk7XG5cdFx0bm9DQ1cgPSBub0NDVyAmJiBjcm9zcyA8PSAwO1xuXHRcdG5vQ1cgPSBub0NXICYmIGNyb3NzID49IDA7XG5cdFx0aWYgKGFyZWEgPj0gMCkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGxhc3RYID0gbiAtIDIsIGhhbGYgPSBuID4+IDE7IGkgPCBoYWxmOyBpICs9IDIpIHtcblx0XHRcdFx0Y29uc3QgeCA9IHZbaV0sIHkgPSB2W2kgKyAxXTtcblx0XHRcdFx0Y29uc3Qgb3RoZXIgPSBsYXN0WCAtIGk7XG5cdFx0XHRcdHZbaV0gPSB2W290aGVyXTtcblx0XHRcdFx0dltpICsgMV0gPSB2W290aGVyICsgMV07XG5cdFx0XHRcdHZbb3RoZXJdID0geDtcblx0XHRcdFx0dltvdGhlciArIDFdID0geTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBub0NXO1xuXHRcdH1cblx0XHRyZXR1cm4gbm9DQ1c7XG5cdH1cblxuXHRwcml2YXRlIG1ha2VDb252ZXggKHBvbHlnb246IG51bWJlcltdKTogdm9pZCB7XG5cdFx0Y29uc3QgbiA9IHBvbHlnb24ubGVuZ3RoO1xuXHRcdGNvbnN0IHYgPSBwb2x5Z29uO1xuXHRcdHRoaXMuY2xpcE91dHB1dC5sZW5ndGggPSBuO1xuXHRcdGNvbnN0IHNvcnRlZCA9IHRoaXMuY2xpcE91dHB1dDtcblx0XHRzb3J0ZWRbMF0gPSB2WzBdO1xuXHRcdHNvcnRlZFsxXSA9IHZbMV07XG5cdFx0Zm9yIChsZXQgaSA9IDI7IGkgPCBuOyBpICs9IDIpIHtcblx0XHRcdGNvbnN0IHggPSB2W2ldLCB5ID0gdltpICsgMV07XG5cdFx0XHRsZXQgcCA9IGkgLSAyO1xuXHRcdFx0Zm9yICg7IHAgPj0gMCAmJiAoc29ydGVkW3BdID4geCB8fCAoc29ydGVkW3BdID09PSB4ICYmIHNvcnRlZFtwICsgMV0gPiB5KSk7IHAgLT0gMikge1xuXHRcdFx0XHRzb3J0ZWRbcCArIDJdID0gc29ydGVkW3BdO1xuXHRcdFx0XHRzb3J0ZWRbcCArIDNdID0gc29ydGVkW3AgKyAxXTtcblx0XHRcdH1cblx0XHRcdHNvcnRlZFtwICsgMl0gPSB4O1xuXHRcdFx0c29ydGVkW3AgKyAzXSA9IHk7XG5cdFx0fVxuXHRcdHZbMF0gPSBzb3J0ZWRbMF07XG5cdFx0dlsxXSA9IHNvcnRlZFsxXTtcblx0XHR2WzJdID0gc29ydGVkWzJdO1xuXHRcdHZbM10gPSBzb3J0ZWRbM107XG5cdFx0bGV0IHMgPSA0O1xuXHRcdGZvciAobGV0IGkgPSA0OyBpIDwgbjsgaSArPSAyLCBzICs9IDIpIHtcblx0XHRcdGNvbnN0IHggPSBzb3J0ZWRbaV0sIHkgPSBzb3J0ZWRbaSArIDFdO1xuXHRcdFx0d2hpbGUgKCh2W3MgLSAyXSAtIHZbcyAtIDRdKSAqICh5IC0gdltzIC0gM10pIC0gKHZbcyAtIDFdIC0gdltzIC0gM10pICogKHggLSB2W3MgLSA0XSkgPj0gMCkge1xuXHRcdFx0XHRzIC09IDI7XG5cdFx0XHRcdGlmIChzID09PSAyKSBicmVhaztcblx0XHRcdH1cblx0XHRcdHZbc10gPSB4O1xuXHRcdFx0dltzICsgMV0gPSB5O1xuXHRcdH1cblx0XHR2W3NdID0gc29ydGVkW24gLSA0XTtcblx0XHR2W3MgKyAxXSA9IHNvcnRlZFtuIC0gM107XG5cdFx0Y29uc3QgdCA9IHM7XG5cdFx0cyArPSAyO1xuXHRcdGZvciAobGV0IGkgPSBuIC0gNjsgaSA+PSAwOyBpIC09IDIsIHMgKz0gMikge1xuXHRcdFx0Y29uc3QgeCA9IHNvcnRlZFtpXSwgeSA9IHNvcnRlZFtpICsgMV07XG5cdFx0XHR3aGlsZSAoKHZbcyAtIDJdIC0gdltzIC0gNF0pICogKHkgLSB2W3MgLSAzXSkgLSAodltzIC0gMV0gLSB2W3MgLSAzXSkgKiAoeCAtIHZbcyAtIDRdKSA+PSAwKSB7XG5cdFx0XHRcdHMgLT0gMjtcblx0XHRcdFx0aWYgKHMgPT09IHQpIGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0dltzXSA9IHg7XG5cdFx0XHR2W3MgKyAxXSA9IHk7XG5cdFx0fVxuXHRcdHBvbHlnb24ubGVuZ3RoID0gcyAtIDI7XG5cdH1cbn1cbiJdfQ==