@lynx-js/react-canary 0.114.0-canary-20250919-f4528d19 → 0.114.0-canary-20250919-e2993a0b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @lynx-js/react
2
2
 
3
- ## 0.114.0-canary-20250919085738-f4528d198a33a91fa1a6b2984ab491dfe3dbbe97
3
+ ## 0.114.0-canary-20250919093329-e2993a0b3e94ec18d4b0e582aabb3f37e6c75a85
4
4
 
5
5
  ### Minor Changes
6
6
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lynx-js/react-canary",
3
- "version": "0.114.0-canary-20250919-f4528d19",
3
+ "version": "0.114.0-canary-20250919-e2993a0b",
4
4
  "description": "ReactLynx is a framework for developing Lynx applications with familiar React.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -2,11 +2,11 @@
2
2
  > @lynx-js/react-refresh@0.1.0 build /home/runner/work/lynx-stack/lynx-stack/packages/react/refresh
3
3
  > rslib build
4
4
 
5
- Rslib v0.13.1
5
+ Rslib v0.13.3
6
6
 
7
7
  info build started...
8
- ready built in 0.16 s
8
+ ready built in 0.19 s
9
9
 
10
10
  File (esm) Size 
11
- dist/index.js 10.1 kB
11
+ dist/index.js 11.1 kB
12
12
 
@@ -1,18 +1,29 @@
1
1
  import { Component, options } from "@lynx-js/react/internal";
2
+ const VNODE_COMPONENT = '__c';
2
3
  const NAMESPACE = '__PREFRESH__';
4
+ const COMPONENT_HOOKS = '__H';
5
+ const HOOKS_LIST = '__';
6
+ const EFFECTS_LIST = '__h';
7
+ const RERENDER_COUNT = '__r';
8
+ const CATCH_ERROR_OPTION = '__e';
9
+ const COMPONENT_DIRTY = '__d';
10
+ const COMPONENT_BITS = '__g';
11
+ const HOOK_VALUE = '__';
12
+ const HOOK_ARGS = '__H';
13
+ const HOOK_CLEANUP = '__c';
3
14
  const COMPONENT_DIRTY_BIT = 8;
4
15
  const isDirty = (vnode)=>{
5
- if (vnode["__c"] && vnode["__c"]["__d"]) return true;
6
- if (vnode["__c"] && vnode["__c"]["__g"] & COMPONENT_DIRTY_BIT) return true;
16
+ if (vnode[VNODE_COMPONENT] && vnode[VNODE_COMPONENT][COMPONENT_DIRTY]) return true;
17
+ if (vnode[VNODE_COMPONENT] && vnode[VNODE_COMPONENT][COMPONENT_BITS] & COMPONENT_DIRTY_BIT) return true;
7
18
  };
8
19
  const unsetDirty = (vnode)=>{
9
- if (vnode["__c"]) {
10
- if (vnode["__c"]["__d"]) vnode["__c"]["__d"] = false;
11
- if (vnode["__c"]["__g"]) vnode["__c"]["__g"] &= ~COMPONENT_DIRTY_BIT;
20
+ if (vnode[VNODE_COMPONENT]) {
21
+ if (vnode[VNODE_COMPONENT][COMPONENT_DIRTY]) vnode[VNODE_COMPONENT][COMPONENT_DIRTY] = false;
22
+ if (vnode[VNODE_COMPONENT][COMPONENT_BITS]) vnode[VNODE_COMPONENT][COMPONENT_BITS] &= ~COMPONENT_DIRTY_BIT;
12
23
  }
13
24
  };
14
- const oldCatchError = options["__e"];
15
- options["__e"] = (error, vnode, oldVNode, info)=>{
25
+ const oldCatchError = options[CATCH_ERROR_OPTION];
26
+ options[CATCH_ERROR_OPTION] = (error, vnode, oldVNode, info)=>{
16
27
  if (isDirty(vnode)) unsetDirty(vnode);
17
28
  if (oldCatchError) oldCatchError(error, vnode, oldVNode, info);
18
29
  };
@@ -22,7 +33,7 @@ options.debounceRendering = (process)=>{
22
33
  try {
23
34
  process();
24
35
  } catch (e) {
25
- process["__r"] = 0;
36
+ process[RERENDER_COUNT] = 0;
26
37
  throw e;
27
38
  }
28
39
  });
@@ -57,7 +68,7 @@ options.vnode = (vnode)=>{
57
68
  ]);
58
69
  }
59
70
  vnode.type = foundType;
60
- if (vnode["__c"] && 'prototype' in vnode.type && vnode.type.prototype.render) vnode["__c"].constructor = vnode.type;
71
+ if (vnode[VNODE_COMPONENT] && 'prototype' in vnode.type && vnode.type.prototype.render) vnode[VNODE_COMPONENT].constructor = vnode.type;
61
72
  }
62
73
  if (oldVnode) oldVnode(vnode);
63
74
  };
@@ -144,13 +155,13 @@ function replaceComponent(OldType, NewType, resetHookState) {
144
155
  }
145
156
  if (!vnode || !vnode.__c || !vnode.__c.__P) return;
146
157
  vnode.type = NewType;
147
- if (vnode["__c"]) {
148
- vnode["__c"].constructor = vnode.type;
158
+ if (vnode[VNODE_COMPONENT]) {
159
+ vnode[VNODE_COMPONENT].constructor = vnode.type;
149
160
  try {
150
- if (vnode["__c"] instanceof OldType) {
151
- const oldInst = vnode["__c"];
152
- const newInst = new NewType(vnode["__c"].props, vnode["__c"].context);
153
- vnode["__c"] = newInst;
161
+ if (vnode[VNODE_COMPONENT] instanceof OldType) {
162
+ const oldInst = vnode[VNODE_COMPONENT];
163
+ const newInst = new NewType(vnode[VNODE_COMPONENT].props, vnode[VNODE_COMPONENT].context);
164
+ vnode[VNODE_COMPONENT] = newInst;
154
165
  for(let i in oldInst){
155
166
  const type = typeof oldInst[i];
156
167
  if (i in newInst) {
@@ -160,41 +171,41 @@ function replaceComponent(OldType, NewType, resetHookState) {
160
171
  }
161
172
  }
162
173
  } catch (e) {
163
- vnode["__c"].constructor = NewType;
174
+ vnode[VNODE_COMPONENT].constructor = NewType;
164
175
  }
165
176
  if (resetHookState) {
166
- if (vnode["__c"]["__H"] && vnode["__c"]["__H"]["__"] && vnode["__c"]["__H"]["__"].length) vnode["__c"]["__H"]["__"].forEach((possibleEffect)=>{
167
- if (possibleEffect["__c"] && 'function' == typeof possibleEffect["__c"]) {
168
- possibleEffect["__c"]();
169
- possibleEffect["__c"] = void 0;
170
- } else if (possibleEffect["__H"] && possibleEffect["__"] && 3 === Object.keys(possibleEffect).length) {
171
- const cleanupKey = Object.keys(possibleEffect).find((key)=>"__H" !== key && "__" !== key);
177
+ if (vnode[VNODE_COMPONENT][COMPONENT_HOOKS] && vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST] && vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST].length) vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST].forEach((possibleEffect)=>{
178
+ if (possibleEffect[HOOK_CLEANUP] && 'function' == typeof possibleEffect[HOOK_CLEANUP]) {
179
+ possibleEffect[HOOK_CLEANUP]();
180
+ possibleEffect[HOOK_CLEANUP] = void 0;
181
+ } else if (possibleEffect[HOOK_ARGS] && possibleEffect[HOOK_VALUE] && 3 === Object.keys(possibleEffect).length) {
182
+ const cleanupKey = Object.keys(possibleEffect).find((key)=>key !== HOOK_ARGS && key !== HOOK_VALUE);
172
183
  if (cleanupKey && 'function' == typeof possibleEffect[cleanupKey]) {
173
184
  possibleEffect[cleanupKey]();
174
185
  possibleEffect[cleanupKey] = void 0;
175
186
  }
176
187
  }
177
188
  });
178
- vnode["__c"]["__H"] = {
179
- ["__"]: [],
180
- ["__h"]: []
189
+ vnode[VNODE_COMPONENT][COMPONENT_HOOKS] = {
190
+ [HOOKS_LIST]: [],
191
+ [EFFECTS_LIST]: []
181
192
  };
182
- } else if (vnode["__c"]["__H"] && vnode["__c"]["__H"]["__"] && vnode["__c"]["__H"]["__"].length) {
183
- vnode["__c"]["__H"]["__"].forEach((possibleEffect)=>{
184
- if (possibleEffect["__c"] && 'function' == typeof possibleEffect["__c"]) {
185
- possibleEffect["__c"]();
186
- possibleEffect["__c"] = void 0;
187
- } else if (possibleEffect["__H"] && possibleEffect["__"] && 3 === Object.keys(possibleEffect).length) {
188
- const cleanupKey = Object.keys(possibleEffect).find((key)=>"__H" !== key && "__" !== key);
193
+ } else if (vnode[VNODE_COMPONENT][COMPONENT_HOOKS] && vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST] && vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST].length) {
194
+ vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST].forEach((possibleEffect)=>{
195
+ if (possibleEffect[HOOK_CLEANUP] && 'function' == typeof possibleEffect[HOOK_CLEANUP]) {
196
+ possibleEffect[HOOK_CLEANUP]();
197
+ possibleEffect[HOOK_CLEANUP] = void 0;
198
+ } else if (possibleEffect[HOOK_ARGS] && possibleEffect[HOOK_VALUE] && 3 === Object.keys(possibleEffect).length) {
199
+ const cleanupKey = Object.keys(possibleEffect).find((key)=>key !== HOOK_ARGS && key !== HOOK_VALUE);
189
200
  if (cleanupKey && 'function' == typeof possibleEffect[cleanupKey]) possibleEffect[cleanupKey]();
190
201
  possibleEffect[cleanupKey] = void 0;
191
202
  }
192
203
  });
193
- vnode["__c"]["__H"]["__"].forEach((hook)=>{
204
+ vnode[VNODE_COMPONENT][COMPONENT_HOOKS][HOOKS_LIST].forEach((hook)=>{
194
205
  if (hook.__H && Array.isArray(hook.__H)) hook.__H = void 0;
195
206
  });
196
207
  }
197
- Component.prototype.forceUpdate.call(vnode["__c"]);
208
+ Component.prototype.forceUpdate.call(vnode[VNODE_COMPONENT]);
198
209
  }
199
210
  });
200
211
  }
@@ -187,21 +187,13 @@
187
187
  }
188
188
  globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;
189
189
  }
190
- var events_WorkletEvents = /*#__PURE__*/ function(WorkletEvents) {
191
- WorkletEvents["runWorkletCtx"] = "Lynx.Worklet.runWorkletCtx";
192
- WorkletEvents["runOnBackground"] = "Lynx.Worklet.runOnBackground";
193
- WorkletEvents["FunctionCallRet"] = "Lynx.Worklet.FunctionCallRet";
194
- WorkletEvents["releaseBackgroundWorkletCtx"] = "Lynx.Worklet.releaseBackgroundWorkletCtx";
195
- WorkletEvents["releaseWorkletRef"] = "Lynx.Worklet.releaseWorkletRef";
196
- return WorkletEvents;
197
- }(events_WorkletEvents || {});
198
190
  function runRunOnMainThreadTask(task, params, resolveId) {
199
191
  let returnValue;
200
192
  try {
201
193
  returnValue = runWorklet(task, params);
202
194
  } finally{
203
195
  lynx.getJSContext().dispatchEvent({
204
- type: events_WorkletEvents.FunctionCallRet,
196
+ type: "Lynx.Worklet.FunctionCallRet",
205
197
  data: JSON.stringify({
206
198
  resolveId,
207
199
  returnValue
@@ -259,11 +251,11 @@
259
251
  }
260
252
  function initEventListeners() {
261
253
  const jsContext = lynx.getJSContext();
262
- jsContext.addEventListener(events_WorkletEvents.runWorkletCtx, (event)=>{
254
+ jsContext.addEventListener("Lynx.Worklet.runWorkletCtx", (event)=>{
263
255
  const data = JSON.parse(event.data);
264
256
  runRunOnMainThreadTask(data.worklet, data.params, data.resolveId);
265
257
  });
266
- jsContext.addEventListener(events_WorkletEvents.releaseWorkletRef, (event)=>{
258
+ jsContext.addEventListener("Lynx.Worklet.releaseWorkletRef", (event)=>{
267
259
  removeValueFromWorkletRefMap(event.data.id);
268
260
  });
269
261
  }
@@ -396,7 +388,7 @@
396
388
  fire() {
397
389
  profile('JsFunctionLifecycleManager.fire', ()=>{
398
390
  lynx.getJSContext().dispatchEvent({
399
- type: events_WorkletEvents.releaseBackgroundWorkletCtx,
391
+ type: "Lynx.Worklet.releaseBackgroundWorkletCtx",
400
392
  data: Array.from(this.execIdSetToFire)
401
393
  });
402
394
  this.execIdSetToFire.clear();
@@ -502,4 +494,4 @@
502
494
  }
503
495
  })();
504
496
 
505
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9hbmltYXRpb24vYW5pbWF0aW9uLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9hcGkvYW5pbWF0aW9uL2VmZmVjdC50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvYXBpL2VsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9sZXB1c1F1ZXJ5U2VsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9seW54QXBpLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9iaW5kaW5ncy9ldmVudHMudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3J1bk9uTWFpblRocmVhZC50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvdXRpbHMvcHJvZmlsZS50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvd29ya2xldFJlZi50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvbGlzdGVuZXJzLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9kZWxheVJ1bk9uQmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvZGVsYXlXb3JrbGV0RXZlbnQudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2VvbUltcGwudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2h5ZHJhdGUudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2pzRnVuY3Rpb25MaWZlY3ljbGUudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3dvcmtsZXRSdW50aW1lLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNSBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHR5cGUgeyBLZXlmcmFtZUVmZmVjdCB9IGZyb20gJy4vZWZmZWN0LmpzJztcblxuZXhwb3J0IGVudW0gQW5pbWF0aW9uT3BlcmF0aW9uIHtcbiAgU1RBUlQgPSAwLCAvLyBTdGFydCBhIG5ldyBhbmltYXRpb25cbiAgUExBWSA9IDEsIC8vIFBsYXkvcmVzdW1lIGEgcGF1c2VkIGFuaW1hdGlvblxuICBQQVVTRSA9IDIsIC8vIFBhdXNlIGFuIGV4aXN0aW5nIGFuaW1hdGlvblxuICBDQU5DRUwgPSAzLCAvLyBDYW5jZWwgYW4gYW5pbWF0aW9uXG59XG5cbmV4cG9ydCBjbGFzcyBBbmltYXRpb24ge1xuICBzdGF0aWMgY291bnQgPSAwO1xuICBwdWJsaWMgcmVhZG9ubHkgZWZmZWN0OiBLZXlmcmFtZUVmZmVjdDtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZWZmZWN0OiBLZXlmcmFtZUVmZmVjdCkge1xuICAgIHRoaXMuZWZmZWN0ID0gZWZmZWN0O1xuICAgIHRoaXMuaWQgPSAnX19seW54LWlubmVyLWpzLWFuaW1hdGlvbi0nICsgQW5pbWF0aW9uLmNvdW50Kys7XG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFjY2Vzc2luZyBwcml2YXRlIG1lbWJlciAnZWxlbWVudCdcbiAgICByZXR1cm4gX19FbGVtZW50QW5pbWF0ZSh0aGlzLmVmZmVjdC50YXJnZXQuZWxlbWVudCwgW0FuaW1hdGlvbk9wZXJhdGlvbi5DQU5DRUwsIHRoaXMuaWRdKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXVzZSgpOiB2b2lkIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFjY2Vzc2luZyBwcml2YXRlIG1lbWJlciAnZWxlbWVudCdcbiAgICByZXR1cm4gX19FbGVtZW50QW5pbWF0ZSh0aGlzLmVmZmVjdC50YXJnZXQuZWxlbWVudCwgW0FuaW1hdGlvbk9wZXJhdGlvbi5QQVVTRSwgdGhpcy5pZF0pO1xuICB9XG5cbiAgcHVibGljIHBsYXkoKTogdm9pZCB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhY2Nlc3NpbmcgcHJpdmF0ZSBtZW1iZXIgJ2VsZW1lbnQnXG4gICAgcmV0dXJuIF9fRWxlbWVudEFuaW1hdGUodGhpcy5lZmZlY3QudGFyZ2V0LmVsZW1lbnQsIFtBbmltYXRpb25PcGVyYXRpb24uUExBWSwgdGhpcy5pZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydCgpOiB2b2lkIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGFjY2Vzc2luZyBwcml2YXRlIG1lbWJlciAnZWxlbWVudCdcbiAgICByZXR1cm4gX19FbGVtZW50QW5pbWF0ZSh0aGlzLmVmZmVjdC50YXJnZXQuZWxlbWVudCwgW1xuICAgICAgQW5pbWF0aW9uT3BlcmF0aW9uLlNUQVJULFxuICAgICAgdGhpcy5pZCxcbiAgICAgIHRoaXMuZWZmZWN0LmtleWZyYW1lcyxcbiAgICAgIHRoaXMuZWZmZWN0Lm9wdGlvbnMsXG4gICAgXSk7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCAyMDI1IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgdHlwZSB7IEVsZW1lbnQgfSBmcm9tICcuLi9lbGVtZW50LmpzJztcblxuZXhwb3J0IGNsYXNzIEtleWZyYW1lRWZmZWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldDogRWxlbWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGtleWZyYW1lczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPltdO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0YXJnZXQ6IEVsZW1lbnQsXG4gICAga2V5ZnJhbWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+W10sXG4gICAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPixcbiAgKSB7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy5rZXlmcmFtZXMgPSBrZXlmcmFtZXM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEFuaW1hdGlvbiB9IGZyb20gJy4vYW5pbWF0aW9uL2FuaW1hdGlvbi5qcyc7XG5pbXBvcnQgeyBLZXlmcmFtZUVmZmVjdCB9IGZyb20gJy4vYW5pbWF0aW9uL2VmZmVjdC5qcyc7XG5cbmxldCB3aWxsRmx1c2ggPSBmYWxzZTtcbmxldCBzaG91bGRGbHVzaCA9IHRydWU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTaG91bGRGbHVzaCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICBzaG91bGRGbHVzaCA9IHZhbHVlO1xufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudCB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc2V0IGluIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudE5vZGU7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudE5vZGUpIHtcbiAgICAvLyBJbiBMeW54IHZlcnNpb25zIHByaW9yIHRvIGFuZCBpbmNsdWRpbmcgMi4xNSxcbiAgICAvLyBhIGNyYXNoIG9jY3VycyB3aGVuIHByaW50aW5nIG9yIHRyYW5zZmVycmluZyByZWZDb3VudGVkIGFjcm9zcyB0aHJlYWRzLlxuICAgIC8vIEJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgaGlkaW5nIHRoZSBlbGVtZW50IG9iamVjdC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VsZW1lbnQnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIF9fU2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZmx1c2hFbGVtZW50VHJlZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0eWxlUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnRpZXMoc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBfX0FkZElubGluZVN0eWxlKHRoaXMuZWxlbWVudCwga2V5LCBzdHlsZXNba2V5XSEpO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9fR2V0QXR0cmlidXRlQnlOYW1lKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZU5hbWVzKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHJlZiA9IF9fUXVlcnlTZWxlY3Rvcih0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSk7XG4gICAgcmV0dXJuIHJlZiA/IG5ldyBFbGVtZW50KHJlZikgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbCh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYW5pbWF0ZShcbiAgICBrZXlmcmFtZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz5bXSxcbiAgICBvcHRpb25zPzogbnVtYmVyIHwgUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPixcbiAgKTogQW5pbWF0aW9uIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJyA/IHsgZHVyYXRpb246IG9wdGlvbnMgfSA6IG9wdGlvbnMgPz8ge307XG4gICAgcmV0dXJuIG5ldyBBbmltYXRpb24obmV3IEtleWZyYW1lRWZmZWN0KHRoaXMsIGtleWZyYW1lcywgbm9ybWFsaXplZE9wdGlvbnMpKTtcbiAgfVxuXG4gIHB1YmxpYyBpbnZva2UoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX19JbnZva2VVSU1ldGhvZChcbiAgICAgICAgdGhpcy5lbGVtZW50LFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBwYXJhbXMgPz8ge30sXG4gICAgICAgIChyZXM6IHsgY29kZTogbnVtYmVyOyBkYXRhOiB1bmtub3duIH0pID0+IHtcbiAgICAgICAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzLmRhdGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVSSBtZXRob2QgaW52b2tlOiAnICsgSlNPTi5zdHJpbmdpZnkocmVzKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hFbGVtZW50VHJlZSgpIHtcbiAgICBpZiAod2lsbEZsdXNoIHx8ICFzaG91bGRGbHVzaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3aWxsRmx1c2ggPSB0cnVlO1xuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICB3aWxsRmx1c2ggPSBmYWxzZTtcbiAgICAgIF9fRmx1c2hFbGVtZW50VHJlZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vZWxlbWVudC5qcyc7XG5cbmNsYXNzIFBhZ2VFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFnZUVsZW1lbnQ6IEVsZW1lbnROb2RlIHwgdW5kZWZpbmVkO1xuXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgUGFnZUVsZW1lbnQucGFnZUVsZW1lbnQgPz89IF9fR2V0UGFnZUVsZW1lbnQoKTtcbiAgICByZXR1cm4gUGFnZUVsZW1lbnQucGFnZUVsZW1lbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3IoY3NzU2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgZWxlbWVudCA9IF9fUXVlcnlTZWxlY3RvcihQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KTtcbiAgcmV0dXJuIGVsZW1lbnQgPyBuZXcgRWxlbWVudChlbGVtZW50KSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50W10ge1xuICByZXR1cm4gX19RdWVyeVNlbGVjdG9yQWxsKFBhZ2VFbGVtZW50LmdldCgpLCBjc3NTZWxlY3Rvciwge30pLm1hcChcbiAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0sXG4gICk7XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzU2RrVmVyc2lvbkd0KG1ham9yOiBudW1iZXIsIG1pbm9yOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbHlueFNka1ZlcnNpb246IHN0cmluZyA9IFN5c3RlbUluZm8ubHlueFNka1ZlcnNpb24gPz8gJzEuMCc7XG4gIGNvbnN0IHZlcnNpb24gPSBseW54U2RrVmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gKFxuICAgIE51bWJlcih2ZXJzaW9uWzBdKSA+IG1ham9yXG4gICAgfHwgKE51bWJlcih2ZXJzaW9uWzBdKSA9PSBtYWpvciAmJiBOdW1iZXIodmVyc2lvblsxXSkgPiBtaW5vcilcbiAgKTtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yLCBxdWVyeVNlbGVjdG9yQWxsIH0gZnJvbSAnLi9sZXB1c1F1ZXJ5U2VsZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuZnVuY3Rpb24gaW5pdEFwaUVudigpOiB2b2lkIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGx5bngucXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3JBbGwgPSBxdWVyeVNlbGVjdG9yQWxsO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ID0gbHlueC5zZXRUaW1lb3V0IGFzIChjYjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLnNldEludGVydmFsID0gbHlueC5zZXRJbnRlcnZhbCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQgPSBseW54LmNsZWFyVGltZW91dCBhcyAodGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAvLyBJbiBseW54IDIuMTQgYGNsZWFySW50ZXJ2YWxgIGlzIG1pc3Rha2VubHkgc3BlbGxlZCBhcyBgY2xlYXJUaW1lSW50ZXJ2YWxgLiBUaGlzIGlzIGZpeGVkIGluIGx5bnggMi4xNS5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJJbnRlcnZhbCA9IChseW54LmNsZWFySW50ZXJ2YWwgPz8gbHlueC5jbGVhclRpbWVJbnRlcnZhbCkgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcblxuICB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYXMgKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBudW1iZXI7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFpc1Nka1ZlcnNpb25HdCgyLCAxNSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gbWFpbiB0aHJlYWQgc2NyaXB0IHJlcXVpcmVzIEx5bnggc2RrIHZlcnNpb24gMi4xNicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBseW54LmNhbmNlbEFuaW1hdGlvbkZyYW1lIGFzIChyZXF1ZXN0SWQ6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHsgaW5pdEFwaUVudiB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgV29ya2xldCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBlbnVtIFdvcmtsZXRFdmVudHMge1xuICBydW5Xb3JrbGV0Q3R4ID0gJ0x5bnguV29ya2xldC5ydW5Xb3JrbGV0Q3R4JyxcbiAgcnVuT25CYWNrZ3JvdW5kID0gJ0x5bnguV29ya2xldC5ydW5PbkJhY2tncm91bmQnLFxuICBGdW5jdGlvbkNhbGxSZXQgPSAnTHlueC5Xb3JrbGV0LkZ1bmN0aW9uQ2FsbFJldCcsXG4gIHJlbGVhc2VCYWNrZ3JvdW5kV29ya2xldEN0eCA9ICdMeW54LldvcmtsZXQucmVsZWFzZUJhY2tncm91bmRXb3JrbGV0Q3R4JyxcbiAgcmVsZWFzZVdvcmtsZXRSZWYgPSAnTHlueC5Xb3JrbGV0LnJlbGVhc2VXb3JrbGV0UmVmJyxcbn1cblxuaW50ZXJmYWNlIFJ1bldvcmtsZXRDdHhEYXRhIHtcbiAgcmVzb2x2ZUlkOiBudW1iZXI7XG4gIHdvcmtsZXQ6IFdvcmtsZXQ7XG4gIHBhcmFtczogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgUnVuV29ya2xldEN0eFJldERhdGEge1xuICByZXNvbHZlSWQ6IG51bWJlcjtcbiAgcmV0dXJuVmFsdWU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBSZWxlYXNlV29ya2xldFJlZkRhdGEge1xuICBpZDogbnVtYmVyO1xufVxuXG5leHBvcnQgeyBXb3JrbGV0RXZlbnRzLCB0eXBlIFJ1bldvcmtsZXRDdHhEYXRhLCB0eXBlIFJ1bldvcmtsZXRDdHhSZXREYXRhLCB0eXBlIFJlbGVhc2VXb3JrbGV0UmVmRGF0YSB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjUgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgUnVuV29ya2xldEN0eFJldERhdGEsIFdvcmtsZXQgfSBmcm9tICcuL2JpbmRpbmdzL2luZGV4LmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blJ1bk9uTWFpblRocmVhZFRhc2sodGFzazogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sIHJlc29sdmVJZDogbnVtYmVyKTogdm9pZCB7XG4gIGxldCByZXR1cm5WYWx1ZTtcbiAgdHJ5IHtcbiAgICByZXR1cm5WYWx1ZSA9IHJ1bldvcmtsZXQodGFzaywgcGFyYW1zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBUT0RPOiBTaG91bGQgYmUgbW9yZSBwcm9wZXIgdG8gcmVqZWN0IHRoZSBwcm9taXNlIGlmIHRoZXJlIGlzIGFuIGVycm9yLlxuICAgIGx5bnguZ2V0SlNDb250ZXh0KCkuZGlzcGF0Y2hFdmVudCh7XG4gICAgICB0eXBlOiBXb3JrbGV0RXZlbnRzLkZ1bmN0aW9uQ2FsbFJldCxcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgcmVzb2x2ZUlkLFxuICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgIH0gYXMgUnVuV29ya2xldEN0eFJldERhdGEpLFxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGU8UmV0LCBGbiBleHRlbmRzICguLi5hcmdzOiB1bmtub3duW10pID0+IFJldD4oXG4gIHNsaWNlTmFtZTogc3RyaW5nLFxuICBmOiBGbixcbik6IFJldCB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDkgKi9cbiAgLy8gVE9ETzogY2hhbmdlIGl0IHRvIF9fUFJPRklMRV9fXG4gIGlmIChfX0RFVl9fKSB7XG4gICAgY29uc29sZS5wcm9maWxlKHNsaWNlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNvbnNvbGUucHJvZmlsZUVuZCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZigpO1xuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrbGV0UmVmLCBXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWZJbXBsIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcblxuaW50ZXJmYWNlIFJlZkltcGwge1xuICBfd29ya2xldFJlZk1hcDogUmVjb3JkPFdvcmtsZXRSZWZJZCwgV29ya2xldFJlZjx1bmtub3duPj47XG4gIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICB1cGRhdGVXb3JrbGV0UmVmKFxuICAgIHJlZkltcGw6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgICBlbGVtZW50OiBFbGVtZW50Tm9kZSB8IG51bGwsXG4gICk6IHZvaWQ7XG4gIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzKHBhdGNoOiBbbnVtYmVyLCB1bmtub3duXVtdKTogdm9pZDtcbiAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAoKTogdm9pZDtcbn1cblxubGV0IGltcGw6IFJlZkltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRXb3JrbGV0UmVmKCk6IFJlZkltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX3dvcmtsZXRSZWZNYXA6IHt9LFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiB3b3JrbGV0IHJlZnMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZy5cbiAgICAgKiBUaGVzZSByZWZzIGFyZSBjcmVhdGVkIHdpdGggbmVnYXRpdmUgSURzIGFuZCBuZWVkIHRvIGJlIGh5ZHJhdGVkXG4gICAgICogd2hlbiB0aGUgYXBwIHN0YXJ0cy4gVGhlIG1hcCBpcyBjbGVhcmVkIGFmdGVyIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZVxuICAgICAqIHRvIGZyZWUgdXAgbWVtb3J5LlxuICAgICAqL1xuICAgIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IHt9LFxuICAgIHVwZGF0ZVdvcmtsZXRSZWYsXG4gICAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG4gICAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAsXG4gIH0pO1xufVxuXG5jb25zdCBjcmVhdGVXb3JrbGV0UmVmID0gPFQ+KFxuICBpZDogV29ya2xldFJlZklkLFxuICB2YWx1ZTogVCxcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IHZhbHVlLFxuICAgIF93dmlkOiBpZCxcbiAgfTtcbn07XG5cbmNvbnN0IGdldEZyb21Xb3JrbGV0UmVmTWFwID0gPFQ+KFxuICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxUPixcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICBjb25zdCBpZCA9IHJlZkltcGwuX3d2aWQ7XG4gIGxldCB2YWx1ZTtcbiAgaWYgKGlkIDwgMCkge1xuICAgIC8vIEF0IHRoZSBmaXJzdCBzY3JlZW4gcmVuZGVyaW5nLCB0aGUgd29ya2xldCByZWYgaXMgY3JlYXRlZCB3aXRoIGEgbmVnYXRpdmUgSUQuXG4gICAgLy8gTWlnaHQgYmUgY2FsbGVkIGluIHR3byBzY2VuYXJpb3M6XG4gICAgLy8gMS4gSW4gTVRTIGV2ZW50c1xuICAgIC8vIDIuIEluIGBtYWluLXRocmVhZDpyZWZgXG4gICAgdmFsdWUgPSBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCByZWZJbXBsLl9pbml0VmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICB9XG5cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAoX19ERVZfXyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrbGV0OiByZWYgaXMgbm90IGluaXRpYWxpemVkOiAnICsgaWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoaWQ6IFdvcmtsZXRSZWZJZCk6IHZvaWQge1xuICBkZWxldGUgaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUsIHRoZW4gc2V0IHRoZSB3b3JrbGV0IHZhbHVlIHRvIGl0LlxuICogVGhpcyBpcyBjYWxsZWQgaW4gYHNuYXBzaG90Q29udGV4dFVwZGF0ZVdvcmtsZXRSZWZgLlxuICogQHBhcmFtIGhhbmRsZSBoYW5kbGUgb2YgdGhlIHdvcmtsZXQgdmFsdWUuXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBub2RlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmKFxuICBoYW5kbGU6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuKTogdm9pZCB7XG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwKGhhbmRsZSkuY3VycmVudCA9IGVsZW1lbnRcbiAgICA/IG5ldyBFbGVtZW50KGVsZW1lbnQpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhcbiAgcGF0Y2g6IFtXb3JrbGV0UmVmSWQsIHVua25vd25dW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgndXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcGF0Y2guZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICghaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdKSB7XG4gICAgICAgIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSA9IGNyZWF0ZVdvcmtsZXRSZWYoaWQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQge1xuICBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwID0ge307XG59XG5cbmV4cG9ydCB7XG4gIHR5cGUgUmVmSW1wbCxcbiAgY3JlYXRlV29ya2xldFJlZixcbiAgaW5pdFdvcmtsZXRSZWYsXG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwLFxuICByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwLFxuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyxcbn07XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgV29ya2xldEV2ZW50cyB9IGZyb20gJy4vYmluZGluZ3MvZXZlbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVsZWFzZVdvcmtsZXRSZWZEYXRhLCBSdW5Xb3JrbGV0Q3R4RGF0YSB9IGZyb20gJy4vYmluZGluZ3MvZXZlbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcnVuUnVuT25NYWluVGhyZWFkVGFzayB9IGZyb20gJy4vcnVuT25NYWluVGhyZWFkLmpzJztcbmltcG9ydCB0eXBlIHsgRXZlbnQgfSBmcm9tICcuL3R5cGVzL3J1bnRpbWVQcm94eS5qcyc7XG5pbXBvcnQgeyByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwIH0gZnJvbSAnLi93b3JrbGV0UmVmLmpzJztcblxuZnVuY3Rpb24gaW5pdEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICBjb25zdCBqc0NvbnRleHQgPSBseW54LmdldEpTQ29udGV4dCgpO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJ1bldvcmtsZXRDdHgsXG4gICAgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSBhcyBzdHJpbmcpIGFzIFJ1bldvcmtsZXRDdHhEYXRhO1xuICAgICAgcnVuUnVuT25NYWluVGhyZWFkVGFzayhkYXRhLndvcmtsZXQsIGRhdGEucGFyYW1zIGFzIENsb3N1cmVWYWx1ZVR5cGVbXSwgZGF0YS5yZXNvbHZlSWQpO1xuICAgIH0sXG4gICk7XG4gIGpzQ29udGV4dC5hZGRFdmVudExpc3RlbmVyKFxuICAgIFdvcmtsZXRFdmVudHMucmVsZWFzZVdvcmtsZXRSZWYsXG4gICAgKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCgoZXZlbnQuZGF0YSBhcyBSZWxlYXNlV29ya2xldFJlZkRhdGEpLmlkKTtcbiAgICB9LFxuICApO1xufVxuXG5leHBvcnQgeyBpbml0RXZlbnRMaXN0ZW5lcnMgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgdHlwZSB7IEpzRm5IYW5kbGUgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcblxuaW50ZXJmYWNlIERldGFpbHMge1xuICB0YXNrOiAoZm5JZDogbnVtYmVyLCBleGVjSWQ6IG51bWJlcikgPT4gdm9pZDtcblxuICAvLyBUaGlzIGNvbWVzIGZyb20gdGhlIGJhY2tncm91bmQgdGhyZWFkLCBpbnNlcnRlZCBoZXJlIGR1cmluZyBjdHggaHlkcmF0aW9uLlxuICBqc0ZuSGFuZGxlPzogSnNGbkhhbmRsZTtcbn1cblxuaW50ZXJmYWNlIFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCB7XG4gIC8vIEVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZSBvcmRlciBiZWluZyBjYWxsZWQgYnkgdGhlIHVzZXIuXG4gIGRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheTogRGV0YWlsc1tdO1xuICBkZWxheVJ1bk9uQmFja2dyb3VuZChmbk9iajogSnNGbkhhbmRsZSwgZm46IChmbklkOiBudW1iZXIsIGV4ZWNJZDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZDtcbiAgcnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMoKTogdm9pZDtcbn1cblxubGV0IGltcGw6IFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5KCk6IFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCB7XG4gIHJldHVybiAoaW1wbCA9IHtcbiAgICBkZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXk6IFtdLFxuICAgIGRlbGF5UnVuT25CYWNrZ3JvdW5kLFxuICAgIHJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVsYXlSdW5PbkJhY2tncm91bmQoZm5PYmo6IEpzRm5IYW5kbGUsIHRhc2s6IChmbklkOiBudW1iZXIsIGV4ZWNJZDogbnVtYmVyKSA9PiB2b2lkKSB7XG4gIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheS5wdXNoKHsgdGFzayB9KTtcbiAgY29uc3QgZGVsYXlJbmRpY2VzID0gZm5PYmouX2RlbGF5SW5kaWNlcyA/Pz0gW107XG4gIGRlbGF5SW5kaWNlcy5wdXNoKGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheS5sZW5ndGggLSAxKTtcbn1cblxuZnVuY3Rpb24gcnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgZGV0YWlscyBvZiBpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkpIHtcbiAgICBpZiAoZGV0YWlscy5qc0ZuSGFuZGxlKSB7XG4gICAgICBkZXRhaWxzLnRhc2soZGV0YWlscy5qc0ZuSGFuZGxlLl9qc0ZuSWQhLCBkZXRhaWxzLmpzRm5IYW5kbGUuX2V4ZWNJZCEpO1xuICAgIH1cbiAgfVxuICBpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkubGVuZ3RoID0gMDtcbn1cblxuZXhwb3J0IHsgdHlwZSBSdW5PbkJhY2tncm91bmREZWxheUltcGwsIGluaXRSdW5PbkJhY2tncm91bmREZWxheSB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBFdmVudERlbGF5SW1wbCB7XG4gIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogTWFwPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZVtdW10+O1xuICBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQ7XG4gIGNsZWFyRGVsYXllZFdvcmtsZXRzKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBFdmVudERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdEV2ZW50RGVsYXkoKTogRXZlbnREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwOiBuZXcgTWFwKCksXG4gICAgcnVuRGVsYXllZFdvcmtsZXQsXG4gICAgY2xlYXJEZWxheWVkV29ya2xldHMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoXG4gIGhhc2g6IHN0cmluZyxcbiAgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgnZGVsYXlFeGVjVW50aWxKc1JlYWR5OiAnICsgaGFzaCwgKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcDtcbiAgICBjb25zdCBwYXJhbVZlYyA9IG1hcC5nZXQoaGFzaCk7XG4gICAgaWYgKHBhcmFtVmVjKSB7XG4gICAgICBwYXJhbVZlYy5wdXNoKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5zZXQoaGFzaCwgW3BhcmFtc10pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRXb3JrbGV0KHdvcmtsZXQ6IFdvcmtsZXQsIGVsZW1lbnQ6IEVsZW1lbnROb2RlKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2NvbW1pdERlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtc1ZlYyA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5nZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgKTtcbiAgICBpZiAocGFyYW1zVmVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVmdFBhcmFtc1ZlYzogQ2xvc3VyZVZhbHVlVHlwZVtdW10gPSBbXTtcbiAgICBwYXJhbXNWZWMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFBhcmFtID0gcGFyYW1zWzBdIGFzIHsgY3VycmVudFRhcmdldD86IHsgZWxlbWVudFJlZnB0cj86IEVsZW1lbnROb2RlIH0gfSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaXJzdFBhcmFtPy5jdXJyZW50VGFyZ2V0Py5lbGVtZW50UmVmcHRyID09PSBlbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHByb2ZpbGUoJ3J1bkRlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuV29ya2xldCh3b3JrbGV0LCBwYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQYXJhbXNWZWMucHVzaChwYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5zZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgICBsZWZ0UGFyYW1zVmVjLFxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkIHtcbiAgaW1wbCEuX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHR5cGUgRXZlbnREZWxheUltcGwsIGluaXRFdmVudERlbGF5LCBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIHJ1bkRlbGF5ZWRXb3JrbGV0LCBjbGVhckRlbGF5ZWRXb3JrbGV0cyB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjUgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IHNldFNob3VsZEZsdXNoIH0gZnJvbSAnLi9hcGkvZWxlbWVudC5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW9tSW1wbCB7XG4gIHNldFNob3VsZEZsdXNoKHZhbHVlOiBib29sZWFuKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRFb21JbXBsKCk6IEVvbUltcGwge1xuICByZXR1cm4ge1xuICAgIHNldFNob3VsZEZsdXNoLFxuICB9O1xufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cblxuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlLCBKc0ZuSGFuZGxlLCBXb3JrbGV0LCBXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWZJbXBsIH0gZnJvbSAnLi9iaW5kaW5ncy9pbmRleC5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXQgY29udGV4dCB3aXRoIGRhdGEgZnJvbSBhIGZpcnN0LXNjcmVlbiBXb3JrbGV0IGNvbnRleHQuXG4gKiBUaGlzIHByb2Nlc3MgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcnVuIGFsbCBkZWxheWVkIGBydW5PbkJhY2tncm91bmRgIGZ1bmN0aW9uc1xuICogYW5kIGluaXRpYWxpemUgYFdvcmtsZXRSZWZgIHZhbHVlcyBtb2RpZmllZCBiZWZvcmUgaHlkcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBjdHggVGhlIHRhcmdldCBXb3JrbGV0IGNvbnRleHQgdG8gYmUgaHlkcmF0ZWQuXG4gKiBAcGFyYW0gZmlyc3RTY3JlZW5DdHggVGhlIFdvcmtsZXQgY29udGV4dCBmcm9tIHRoZSBmaXJzdCBzY3JlZW4gcmVuZGVyaW5nLFxuICogICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gaHlkcmF0ZSB3aXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZUN0eChjdHg6IFdvcmtsZXQsIGZpcnN0U2NyZWVuQ3R4OiBXb3JrbGV0KTogdm9pZCB7XG4gIHByb2ZpbGUoJ2h5ZHJhdGVDdHgnLCAoKSA9PiB7XG4gICAgaHlkcmF0ZUN0eEltcGwoY3R4LCBmaXJzdFNjcmVlbkN0eCwgY3R4Ll9leGVjSWQhKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVDdHhJbXBsKGN0eDogQ2xvc3VyZVZhbHVlVHlwZSwgZmlyc3RTY3JlZW5DdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGV4ZWNJZDogbnVtYmVyKTogdm9pZCB7XG4gIGlmICghY3R4IHx8IHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8ICFmaXJzdFNjcmVlbkN0eCB8fCB0eXBlb2YgZmlyc3RTY3JlZW5DdHggIT09ICdvYmplY3QnKSByZXR1cm47XG5cbiAgY29uc3QgY3R4T2JqID0gY3R4IGFzIFJlY29yZDxzdHJpbmcsIENsb3N1cmVWYWx1ZVR5cGU+O1xuICBjb25zdCBmaXJzdFNjcmVlbkN0eE9iaiA9IGZpcnN0U2NyZWVuQ3R4IGFzIFJlY29yZDxzdHJpbmcsIENsb3N1cmVWYWx1ZVR5cGU+O1xuXG4gIGlmIChjdHhPYmpbJ193a2x0SWQnXSAmJiBjdHhPYmpbJ193a2x0SWQnXSAhPT0gZmlyc3RTY3JlZW5DdHhPYmpbJ193a2x0SWQnXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZm9yLWluLWFycmF5XG4gIGZvciAoY29uc3Qga2V5IGluIGN0eCkge1xuICAgIGlmIChrZXkgPT09ICdfd3ZpZCcpIHtcbiAgICAgIGh5ZHJhdGVNYWluVGhyZWFkUmVmKGN0eE9ialtrZXldIGFzIFdvcmtsZXRSZWZJZCwgZmlyc3RTY3JlZW5DdHhPYmogYXMgdW5rbm93biBhcyBXb3JrbGV0UmVmSW1wbDx1bmtub3duPik7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdfanNGbicpIHtcbiAgICAgIGh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzKFxuICAgICAgICBjdHhPYmpba2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPixcbiAgICAgICAgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPixcbiAgICAgICAgZXhlY0lkLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmlyc3RTY3JlZW5WYWx1ZSA9IHR5cGVvZiBmaXJzdFNjcmVlbkN0eE9ialtrZXldID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gKGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgeyBjdHg6IENsb3N1cmVWYWx1ZVR5cGUgfSkuY3R4XG4gICAgICAgIDogZmlyc3RTY3JlZW5DdHhPYmpba2V5XTtcbiAgICAgIGh5ZHJhdGVDdHhJbXBsKGN0eE9ialtrZXldLCBmaXJzdFNjcmVlblZhbHVlLCBleGVjSWQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEh5ZHJhdGVzIGEgV29ya2xldFJlZiBvbiB0aGUgbWFpbiB0aHJlYWQuXG4gKiBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBXb3JrbGV0UmVmJ3MgYmFja2dyb3VuZCBpbml0aWFsIHZhbHVlIGJhc2VkIG9uIGNoYW5nZXNcbiAqIHRoYXQgb2NjdXJyZWQgaW4gdGhlIGZpcnN0LXNjcmVlbiBXb3JrbGV0IGNvbnRleHQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVmSWQgVGhlIElEIG9mIHRoZSBXb3JrbGV0UmVmIHRvIGh5ZHJhdGUuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIFdvcmtsZXRSZWYuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVNYWluVGhyZWFkUmVmKHJlZklkOiBXb3JrbGV0UmVmSWQsIHZhbHVlOiBXb3JrbGV0UmVmSW1wbDx1bmtub3duPiB8IHsgY3VycmVudDogdW5rbm93biB9KSB7XG4gIGlmICgnX2luaXRWYWx1ZScgaW4gdmFsdWUpIHtcbiAgICAvLyBUaGUgcmVmIGhhcyBub3QgYmVlbiBhY2Nlc3NlZCB5ZXQuXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHJlZiA9IGx5bnhXb3JrbGV0SW1wbCEuX3JlZkltcGwuX3dvcmtsZXRSZWZNYXBbcmVmSWRdITtcbiAgcmVmLmN1cnJlbnQgPSB2YWx1ZS5jdXJyZW50O1xufVxuXG4vKipcbiAqIEh5ZHJhdGVzIGRlbGF5ZWQgYHJ1bk9uQmFja2dyb3VuZGAgdGFza3MuXG4gKiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBhbnkgYHJ1bk9uQmFja2dyb3VuZGAgY2FsbHMgdGhhdCB3ZXJlIGRlbGF5ZWRcbiAqIGR1cmluZyB0aGUgZmlyc3Qtc2NyZWVuIHJlbmRlcmluZyBhcmUgY29ycmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGVpclxuICogcmVzcGVjdGl2ZSBKYXZhU2NyaXB0IGZ1bmN0aW9uIGhhbmRsZXMgaW4gdGhlIGh5ZHJhdGVkIFdvcmtsZXQgY29udGV4dC5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZURlbGF5UnVuT25CYWNrZ3JvdW5kVGFza3MoXG4gIGZuT2JqczogUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sIC8vIGV4YW1wbGU6IHtcIl9qc0ZuMVwiOntcIl9qc0ZuSWRcIjoxfX1cbiAgZmlyc3RTY3JlZW5Gbk9ianM6IFJlY29yZDxzdHJpbmcsIEpzRm5IYW5kbGU+LCAvLyBleGFtcGxlOiB7XCJfanNGbjFcIjp7XCJfaXNGaXJzdFNjcmVlblwiOnRydWUsXCJfZGVsYXlJbmRpY2VzXCI6WzBdfX1cbiAgZXhlY0lkOiBudW1iZXIsXG4pIHtcbiAgZm9yIChjb25zdCBmbk5hbWUgaW4gZm5PYmpzKSB7XG4gICAgY29uc3QgZm5PYmogPSBmbk9ianNbZm5OYW1lXSE7XG4gICAgY29uc3QgZmlyc3RTY3JlZW5Gbk9iajogSnNGbkhhbmRsZSB8IHVuZGVmaW5lZCA9IGZpcnN0U2NyZWVuRm5PYmpzW2ZuTmFtZV07XG4gICAgaWYgKCFmaXJzdFNjcmVlbkZuT2JqPy5fZGVsYXlJbmRpY2VzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBmaXJzdFNjcmVlbkZuT2JqLl9kZWxheUluZGljZXMpIHtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSBseW54V29ya2xldEltcGwhLl9ydW5PbkJhY2tncm91bmREZWxheUltcGwuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5W2luZGV4XSE7XG4gICAgICBmbk9iai5fZXhlY0lkID0gZXhlY0lkO1xuICAgICAgZGV0YWlscy5qc0ZuSGFuZGxlID0gZm5PYmo7XG4gICAgfVxuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgV29ya2xldEV2ZW50cyB9IGZyb20gJy4vYmluZGluZ3MvZXZlbnRzLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIGBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcmAgbW9uaXRvcnMgcmVmZXJlbmNlcyB0byBKUyBmdW5jdGlvbiBoYW5kbGVzIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgLlxuICogSW4gSlMgY29udGV4dCwgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgIGlzIHJlZmVyZW5jZWQgYnkgYEpzRm5IYW5kbGVgcyBhbmQgZmluYWxseSBieSBgZXhlY0lkYC5cbiAqIFdoZW4gYWxsIGBKc0ZuSGFuZGxlYHMgaW4gbGVwdXMgYXJlIHJlbGVhc2VkLCBhbiBldmVudCB3aWxsIGJlIHNlbnQgdG8gSlMgY29udGV4dCB0byBkZS1yZWYgdGhlIGBleGVjSWRgLFxuICogcmVzdWx0aW5nIGEgZGUtcmVmIHRvIHRoZSBqcyBmdW5jdGlvbiBpbiBKUyBjb250ZXh0LlxuICovXG5jbGFzcyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHByaXZhdGUgZXhlY0lkUmVmQ291bnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIGV4ZWNJZFNldFRvRmlyZSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHdpbGxGaXJlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVnaXN0cnk/OiBGaW5hbGl6YXRpb25SZWdpc3RyeTxudW1iZXI+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnk8bnVtYmVyPih0aGlzLnJlbW92ZVJlZi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZFJlZihleGVjSWQ6IG51bWJlciwgb2JqVG9SZWY6IG9iamVjdCk6IHZvaWQge1xuICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KFxuICAgICAgZXhlY0lkLFxuICAgICAgKHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkgPz8gMCkgKyAxLFxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RyeSEucmVnaXN0ZXIob2JqVG9SZWYsIGV4ZWNJZCk7XG4gIH1cblxuICByZW1vdmVSZWYoZXhlY0lkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByYyA9IHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkhO1xuICAgIGlmIChyYyA+IDEpIHtcbiAgICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KGV4ZWNJZCwgcmMgLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leGVjSWRSZWZDb3VudC5kZWxldGUoZXhlY0lkKTtcbiAgICB0aGlzLmV4ZWNJZFNldFRvRmlyZS5hZGQoZXhlY0lkKTtcbiAgICBpZiAoIXRoaXMud2lsbEZpcmUpIHtcbiAgICAgIHRoaXMud2lsbEZpcmUgPSB0cnVlO1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5maXJlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmaXJlKCk6IHZvaWQge1xuICAgIHByb2ZpbGUoJ0pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLmZpcmUnLCAoKSA9PiB7XG4gICAgICBseW54LmdldEpTQ29udGV4dCgpLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICB0eXBlOiBXb3JrbGV0RXZlbnRzLnJlbGVhc2VCYWNrZ3JvdW5kV29ya2xldEN0eCxcbiAgICAgICAgZGF0YTogQXJyYXkuZnJvbSh0aGlzLmV4ZWNJZFNldFRvRmlyZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhlY0lkU2V0VG9GaXJlLmNsZWFyKCk7XG4gICAgICB0aGlzLndpbGxGaXJlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSdW5PbkJhY2tncm91bmRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTZGtWZXJzaW9uR3QoMiwgMTUpO1xufVxuXG5leHBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH07XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlLCBXb3JrbGV0LCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH0gZnJvbSAnLi9kZWxheVJ1bk9uQmFja2dyb3VuZC5qcyc7XG5pbXBvcnQgeyBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIGluaXRFdmVudERlbGF5IH0gZnJvbSAnLi9kZWxheVdvcmtsZXRFdmVudC5qcyc7XG5pbXBvcnQgeyBpbml0RW9tSW1wbCB9IGZyb20gJy4vZW9tSW1wbC5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlQ3R4IH0gZnJvbSAnLi9oeWRyYXRlLmpzJztcbmltcG9ydCB7IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLCBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQgfSBmcm9tICcuL2pzRnVuY3Rpb25MaWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcnVuUnVuT25NYWluVGhyZWFkVGFzayB9IGZyb20gJy4vcnVuT25NYWluVGhyZWFkLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgZ2V0RnJvbVdvcmtsZXRSZWZNYXAsIGluaXRXb3JrbGV0UmVmIH0gZnJvbSAnLi93b3JrbGV0UmVmLmpzJztcblxuZnVuY3Rpb24gaW5pdFdvcmtsZXQoKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsID0ge1xuICAgIF93b3JrbGV0TWFwOiB7fSxcbiAgICBfcmVmSW1wbDogaW5pdFdvcmtsZXRSZWYoKSxcbiAgICBfcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsOiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKSxcbiAgICBfaHlkcmF0ZUN0eDogaHlkcmF0ZUN0eCxcbiAgICBfZXZlbnREZWxheUltcGw6IGluaXRFdmVudERlbGF5KCksXG4gICAgX2VvbUltcGw6IGluaXRFb21JbXBsKCksXG4gICAgX3J1blJ1bk9uTWFpblRocmVhZFRhc2s6IHJ1blJ1bk9uTWFpblRocmVhZFRhc2ssXG4gIH07XG5cbiAgaWYgKGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpKSB7XG4gICAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyID0gbmV3IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyKCk7XG4gIH1cblxuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5yZWdpc3RlcldvcmtsZXRJbnRlcm5hbCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5ydW5Xb3JrbGV0ID0gcnVuV29ya2xldDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHdvcmtsZXQgZnVuY3Rpb24sIGFsbG93aW5nIGl0IHRvIGJlIGV4ZWN1dGVkIGJ5IGBydW5Xb3JrbGV0KClgLlxuICogVGhpcyBpcyBjYWxsZWQgaW4gbGVwdXMuanMuXG4gKiBAcGFyYW0gX3R5cGUgd29ya2xldCB0eXBlLCAnbWFpbi10aHJlYWQnIG9yICd1aSdcbiAqIEBwYXJhbSBpZCB3b3JrbGV0IGhhc2hcbiAqIEBwYXJhbSB3b3JrbGV0IHdvcmtsZXQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJXb3JrbGV0KF90eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwW2lkXSA9IHdvcmtsZXQ7XG59XG5cbi8qKlxuICogRW50cmFuY2Ugb2YgYWxsIHdvcmtsZXQgY2FsbHMuXG4gKiBOYXRpdmUgZXZlbnQgdG91Y2ggaGFuZGxlciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjdHggd29ya2xldCBvYmplY3QuXG4gKiBAcGFyYW0gcGFyYW1zIHdvcmtsZXQgcGFyYW1zLlxuICovXG5mdW5jdGlvbiBydW5Xb3JrbGV0KGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgaWYgKCF2YWxpZGF0ZVdvcmtsZXQoY3R4KSkge1xuICAgIGNvbnNvbGUud2FybignV29ya2xldDogSW52YWxpZCB3b3JrbGV0IG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KGN0eCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpIHtcbiAgICBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoY3R4Ll9sZXB1c1dvcmtsZXRIYXNoLCBwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcnVuV29ya2xldEltcGwoY3R4LCBwYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBydW5Xb3JrbGV0SW1wbChjdHg6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdKTogdW5rbm93biB7XG4gIGNvbnN0IHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24gPSBwcm9maWxlKFxuICAgICd0cmFuc2Zvcm1Xb3JrbGV0Q3R4ICcgKyBjdHguX3drbHRJZCxcbiAgICAoKSA9PiB0cmFuc2Zvcm1Xb3JrbGV0KGN0eCwgdHJ1ZSksXG4gICk7XG4gIGNvbnN0IHBhcmFtc186IENsb3N1cmVWYWx1ZVR5cGVbXSA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRQYXJhbXMnLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQocGFyYW1zIHx8IFtdLCBmYWxzZSksXG4gICk7XG4gIHJldHVybiBwcm9maWxlKCdydW5Xb3JrbGV0JywgKCkgPT4gd29ya2xldCguLi5wYXJhbXNfKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV29ya2xldChjdHg6IHVua25vd24pOiBjdHggaXMgV29ya2xldCB7XG4gIHJldHVybiB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJiBjdHggIT09IG51bGwgJiYgKCdfd2tsdElkJyBpbiBjdHggfHwgJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpO1xufVxuXG5jb25zdCB3b3JrbGV0Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENsb3N1cmVWYWx1ZVR5cGUgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik+KCk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoY3R4OiBXb3JrbGV0LCBpc1dvcmtsZXQ6IHRydWUpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlW10sXG4gIGlzV29ya2xldDogZmFsc2UsXG4pOiBDbG9zdXJlVmFsdWVUeXBlW107XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoXG4gIGN0eDogQ2xvc3VyZVZhbHVlVHlwZSxcbiAgaXNXb3JrbGV0OiBib29sZWFuLFxuKTogQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8IGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHg7XG4gIH1cblxuICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgY29uc3QgcmVzID0gd29ya2xldENhY2hlLmdldChjdHgpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya2xldCA9IHsgbWFpbjogY3R4IH07XG4gIHRyYW5zZm9ybVdvcmtsZXRJbm5lcih3b3JrbGV0LCAwLCBjdHgpO1xuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICB3b3JrbGV0Q2FjaGUuc2V0KGN0eCwgd29ya2xldC5tYWluKTtcbiAgfVxuICByZXR1cm4gd29ya2xldC5tYWluO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIgPSAoXG4gIHZhbHVlOiBDbG9zdXJlVmFsdWVUeXBlLFxuICBkZXB0aDogbnVtYmVyLFxuICBjdHg6IHVua25vd24sXG4pID0+IHtcbiAgY29uc3QgbGltaXQgPSAxMDAwO1xuICBpZiAoKytkZXB0aCA+PSBsaW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwdGggb2YgdmFsdWUgZXhjZWVkcyBsaW1pdCBvZiAnICsgbGltaXQgKyAnLicpO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZT47XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3Qgc3ViT2JqOiBDbG9zdXJlVmFsdWVUeXBlID0gb2JqW2tleV07XG4gICAgaWYgKHR5cGVvZiBzdWJPYmogIT09ICdvYmplY3QnIHx8IHN1Yk9iaiA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC8qKiBpc0V2ZW50VGFyZ2V0ICovICdlbGVtZW50UmVmcHRyJyBpbiBzdWJPYmopIHtcbiAgICAgIG9ialtrZXldID0gbmV3IEVsZW1lbnQoc3ViT2JqWydlbGVtZW50UmVmcHRyJ10gYXMgRWxlbWVudE5vZGUpO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChzdWJPYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIoc3ViT2JqLCBkZXB0aCwgY3R4KTtcblxuICAgIGNvbnN0IGlzV29ya2xldFJlZiA9ICdfd3ZpZCcgaW4gKHN1Yk9iaiBhcyBvYmplY3QpO1xuICAgIGlmIChpc1dvcmtsZXRSZWYpIHtcbiAgICAgIG9ialtrZXldID0gZ2V0RnJvbVdvcmtsZXRSZWZNYXAoXG4gICAgICAgIHN1Yk9iaiBhcyB1bmtub3duIGFzIFdvcmtsZXRSZWZJbXBsPHVua25vd24+LFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc1dvcmtsZXQgPSAnX3drbHRJZCcgaW4gc3ViT2JqO1xuICAgIGlmIChpc1dvcmtsZXQpIHtcbiAgICAgIC8vIGBzdWJPYmpgIGlzIHdvcmtsZXQgY3R4LiBTaGFsbG93IGNvcHkgaXQgdG8gcHJldmVudCB0aGUgdHJhbnNmb3JtZWQgd29ya2xldCBmcm9tIHJlZmVyZW5jaW5nIGN0eC5cbiAgICAgIC8vIFRoaXMgd291bGQgcmVzdWx0IGluIHRoZSB2YWx1ZSBvZiBgd29ya2xldENhY2hlYCByZWZlcmVuY2luZyBpdHMga2V5LlxuICAgICAgb2JqW2tleV0gPSBseW54V29ya2xldEltcGwuX3dvcmtsZXRNYXBbKHN1Yk9iaiBhcyBXb3JrbGV0KS5fd2tsdElkXSFcbiAgICAgICAgLmJpbmQoeyAuLi5zdWJPYmogfSk7XG4gICAgICBvYmpba2V5XS5jdHggPSBzdWJPYmo7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNKc0ZuID0gJ19qc0ZuSWQnIGluIHN1Yk9iajtcbiAgICBpZiAoaXNKc0ZuKSB7XG4gICAgICBzdWJPYmpbJ19leGVjSWQnXSA9IChjdHggYXMgV29ya2xldCkuX2V4ZWNJZDtcbiAgICAgIGx5bnhXb3JrbGV0SW1wbC5fanNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXI/LmFkZFJlZihcbiAgICAgICAgKGN0eCBhcyBXb3JrbGV0KS5fZXhlY0lkISxcbiAgICAgICAgc3ViT2JqLFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IHsgaW5pdFdvcmtsZXQgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBpbml0QXBpRW52IH0gZnJvbSAnLi9hcGkvbHlueEFwaS5qcyc7XG5pbXBvcnQgeyBpbml0RXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuL2xpc3RlbmVycy5qcyc7XG5pbXBvcnQgeyBpbml0V29ya2xldCB9IGZyb20gJy4vd29ya2xldFJ1bnRpbWUuanMnO1xuXG5pZiAoZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPT09IHVuZGVmaW5lZCkge1xuICBpbml0V29ya2xldCgpO1xuICBpbml0QXBpRW52KCk7XG4gIGluaXRFdmVudExpc3RlbmVycygpO1xufVxuIl0sIm5hbWVzIjpbIkFuaW1hdGlvbiIsIl9fRWxlbWVudEFuaW1hdGUiLCJlZmZlY3QiLCJLZXlmcmFtZUVmZmVjdCIsInRhcmdldCIsImtleWZyYW1lcyIsIm9wdGlvbnMiLCJ3aWxsRmx1c2giLCJzaG91bGRGbHVzaCIsInNldFNob3VsZEZsdXNoIiwidmFsdWUiLCJFbGVtZW50IiwibmFtZSIsIl9fU2V0QXR0cmlidXRlIiwiX19BZGRJbmxpbmVTdHlsZSIsInN0eWxlcyIsImtleSIsImF0dHJpYnV0ZU5hbWUiLCJfX0dldEF0dHJpYnV0ZUJ5TmFtZSIsIl9fR2V0QXR0cmlidXRlTmFtZXMiLCJzZWxlY3RvciIsInJlZiIsIl9fUXVlcnlTZWxlY3RvciIsIl9fUXVlcnlTZWxlY3RvckFsbCIsImVsZW1lbnQiLCJub3JtYWxpemVkT3B0aW9ucyIsIm1ldGhvZE5hbWUiLCJwYXJhbXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIl9fSW52b2tlVUlNZXRob2QiLCJyZXMiLCJFcnJvciIsIkpTT04iLCJfX0ZsdXNoRWxlbWVudFRyZWUiLCJPYmplY3QiLCJQYWdlRWxlbWVudCIsIl9QYWdlRWxlbWVudCIsIl9fR2V0UGFnZUVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiY3NzU2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIiwiaXNTZGtWZXJzaW9uR3QiLCJtYWpvciIsIm1pbm9yIiwiX1N5c3RlbUluZm9fbHlueFNka1ZlcnNpb24iLCJseW54U2RrVmVyc2lvbiIsInZlcnNpb24iLCJOdW1iZXIiLCJpbml0QXBpRW52IiwibHlueCIsImdsb2JhbFRoaXMiLCJfbHlueF9jbGVhckludGVydmFsIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2FsbGJhY2siLCJXb3JrbGV0RXZlbnRzIiwicnVuUnVuT25NYWluVGhyZWFkVGFzayIsInRhc2siLCJyZXNvbHZlSWQiLCJyZXR1cm5WYWx1ZSIsInJ1bldvcmtsZXQiLCJwcm9maWxlIiwic2xpY2VOYW1lIiwiZiIsImNvbnNvbGUiLCJpbXBsIiwiaW5pdFdvcmtsZXRSZWYiLCJ1cGRhdGVXb3JrbGV0UmVmIiwidXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMiLCJjbGVhckZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCIsImNyZWF0ZVdvcmtsZXRSZWYiLCJpZCIsImdldEZyb21Xb3JrbGV0UmVmTWFwIiwicmVmSW1wbCIsInVuZGVmaW5lZCIsInJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAiLCJoYW5kbGUiLCJwYXRjaCIsImluaXRFdmVudExpc3RlbmVycyIsImpzQ29udGV4dCIsImV2ZW50IiwiZGF0YSIsImluaXRSdW5PbkJhY2tncm91bmREZWxheSIsImRlbGF5UnVuT25CYWNrZ3JvdW5kIiwicnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMiLCJmbk9iaiIsIl9mbk9iaiIsImRlbGF5SW5kaWNlcyIsImRldGFpbHMiLCJpbml0RXZlbnREZWxheSIsIk1hcCIsInJ1bkRlbGF5ZWRXb3JrbGV0IiwiY2xlYXJEZWxheWVkV29ya2xldHMiLCJkZWxheUV4ZWNVbnRpbEpzUmVhZHkiLCJoYXNoIiwibWFwIiwicGFyYW1WZWMiLCJ3b3JrbGV0IiwicGFyYW1zVmVjIiwibGVmdFBhcmFtc1ZlYyIsIl9maXJzdFBhcmFtX2N1cnJlbnRUYXJnZXQiLCJmaXJzdFBhcmFtIiwic2V0VGltZW91dCIsImluaXRFb21JbXBsIiwiaHlkcmF0ZUN0eCIsImN0eCIsImZpcnN0U2NyZWVuQ3R4IiwiaHlkcmF0ZUN0eEltcGwiLCJleGVjSWQiLCJjdHhPYmoiLCJmaXJzdFNjcmVlbkN0eE9iaiIsImh5ZHJhdGVNYWluVGhyZWFkUmVmIiwiaHlkcmF0ZURlbGF5UnVuT25CYWNrZ3JvdW5kVGFza3MiLCJmaXJzdFNjcmVlblZhbHVlIiwicmVmSWQiLCJseW54V29ya2xldEltcGwiLCJmbk9ianMiLCJmaXJzdFNjcmVlbkZuT2JqcyIsImZuTmFtZSIsImZpcnN0U2NyZWVuRm5PYmoiLCJpbmRleCIsIkpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyIiwib2JqVG9SZWYiLCJfdGhpc19leGVjSWRSZWZDb3VudF9nZXQiLCJyYyIsIkFycmF5IiwiU2V0IiwiRmluYWxpemF0aW9uUmVnaXN0cnkiLCJpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQiLCJpbml0V29ya2xldCIsInJlZ2lzdGVyV29ya2xldCIsIl90eXBlIiwidmFsaWRhdGVXb3JrbGV0IiwicnVuV29ya2xldEltcGwiLCJ0cmFuc2Zvcm1Xb3JrbGV0IiwicGFyYW1zXyIsIndvcmtsZXRDYWNoZSIsIldlYWtNYXAiLCJpc1dvcmtsZXQiLCJ0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIiLCJkZXB0aCIsImxpbWl0Iiwib2JqIiwic3ViT2JqIiwiaXNXb3JrbGV0UmVmIiwiaXNKc0ZuIiwiX2x5bnhXb3JrbGV0SW1wbF9fanNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztJQVlPLE1BQU1BO1FBV0osU0FBZTtZQUVwQixPQUFPQyxpQkFBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFOztnQkFBNEIsSUFBSSxDQUFDLEVBQUU7YUFBQztRQUMxRjtRQUVPLFFBQWM7WUFFbkIsT0FBT0EsaUJBQWlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTs7Z0JBQTJCLElBQUksQ0FBQyxFQUFFO2FBQUM7UUFD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
497
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9hbmltYXRpb24vYW5pbWF0aW9uLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9hcGkvYW5pbWF0aW9uL2VmZmVjdC50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvYXBpL2VsZW1lbnQudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9sZXB1c1F1ZXJ5U2VsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3V0aWxzL3ZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9seW54QXBpLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9ydW5Pbk1haW5UaHJlYWQudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3V0aWxzL3Byb2ZpbGUudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL3dvcmtsZXRSZWYudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2xpc3RlbmVycy50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvZGVsYXlSdW5PbkJhY2tncm91bmQudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2RlbGF5V29ya2xldEV2ZW50LnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9lb21JbXBsLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9oeWRyYXRlLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9qc0Z1bmN0aW9uTGlmZWN5Y2xlLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy93b3JrbGV0UnVudGltZS50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjUgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgS2V5ZnJhbWVFZmZlY3QgfSBmcm9tICcuL2VmZmVjdC5qcyc7XG5cbmV4cG9ydCBlbnVtIEFuaW1hdGlvbk9wZXJhdGlvbiB7XG4gIFNUQVJUID0gMCwgLy8gU3RhcnQgYSBuZXcgYW5pbWF0aW9uXG4gIFBMQVkgPSAxLCAvLyBQbGF5L3Jlc3VtZSBhIHBhdXNlZCBhbmltYXRpb25cbiAgUEFVU0UgPSAyLCAvLyBQYXVzZSBhbiBleGlzdGluZyBhbmltYXRpb25cbiAgQ0FOQ0VMID0gMywgLy8gQ2FuY2VsIGFuIGFuaW1hdGlvblxufVxuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uIHtcbiAgc3RhdGljIGNvdW50ID0gMDtcbiAgcHVibGljIHJlYWRvbmx5IGVmZmVjdDogS2V5ZnJhbWVFZmZlY3Q7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVmZmVjdDogS2V5ZnJhbWVFZmZlY3QpIHtcbiAgICB0aGlzLmVmZmVjdCA9IGVmZmVjdDtcbiAgICB0aGlzLmlkID0gJ19fbHlueC1pbm5lci1qcy1hbmltYXRpb24tJyArIEFuaW1hdGlvbi5jb3VudCsrO1xuICAgIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhY2Nlc3NpbmcgcHJpdmF0ZSBtZW1iZXIgJ2VsZW1lbnQnXG4gICAgcmV0dXJuIF9fRWxlbWVudEFuaW1hdGUodGhpcy5lZmZlY3QudGFyZ2V0LmVsZW1lbnQsIFtBbmltYXRpb25PcGVyYXRpb24uQ0FOQ0VMLCB0aGlzLmlkXSk7XG4gIH1cblxuICBwdWJsaWMgcGF1c2UoKTogdm9pZCB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhY2Nlc3NpbmcgcHJpdmF0ZSBtZW1iZXIgJ2VsZW1lbnQnXG4gICAgcmV0dXJuIF9fRWxlbWVudEFuaW1hdGUodGhpcy5lZmZlY3QudGFyZ2V0LmVsZW1lbnQsIFtBbmltYXRpb25PcGVyYXRpb24uUEFVU0UsIHRoaXMuaWRdKTtcbiAgfVxuXG4gIHB1YmxpYyBwbGF5KCk6IHZvaWQge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgYWNjZXNzaW5nIHByaXZhdGUgbWVtYmVyICdlbGVtZW50J1xuICAgIHJldHVybiBfX0VsZW1lbnRBbmltYXRlKHRoaXMuZWZmZWN0LnRhcmdldC5lbGVtZW50LCBbQW5pbWF0aW9uT3BlcmF0aW9uLlBMQVksIHRoaXMuaWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnQoKTogdm9pZCB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBhY2Nlc3NpbmcgcHJpdmF0ZSBtZW1iZXIgJ2VsZW1lbnQnXG4gICAgcmV0dXJuIF9fRWxlbWVudEFuaW1hdGUodGhpcy5lZmZlY3QudGFyZ2V0LmVsZW1lbnQsIFtcbiAgICAgIEFuaW1hdGlvbk9wZXJhdGlvbi5TVEFSVCxcbiAgICAgIHRoaXMuaWQsXG4gICAgICB0aGlzLmVmZmVjdC5rZXlmcmFtZXMsXG4gICAgICB0aGlzLmVmZmVjdC5vcHRpb25zLFxuICAgIF0pO1xuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNSBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHR5cGUgeyBFbGVtZW50IH0gZnJvbSAnLi4vZWxlbWVudC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlmcmFtZUVmZmVjdCB7XG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXQ6IEVsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBrZXlmcmFtZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz5bXTtcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdGFyZ2V0OiBFbGVtZW50LFxuICAgIGtleWZyYW1lczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPltdLFxuICAgIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4sXG4gICkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMua2V5ZnJhbWVzID0ga2V5ZnJhbWVzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbn1cbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBBbmltYXRpb24gfSBmcm9tICcuL2FuaW1hdGlvbi9hbmltYXRpb24uanMnO1xuaW1wb3J0IHsgS2V5ZnJhbWVFZmZlY3QgfSBmcm9tICcuL2FuaW1hdGlvbi9lZmZlY3QuanMnO1xuXG5sZXQgd2lsbEZsdXNoID0gZmFsc2U7XG5sZXQgc2hvdWxkRmx1c2ggPSB0cnVlO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0U2hvdWxkRmx1c2godmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgc2hvdWxkRmx1c2ggPSB2YWx1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEVsZW1lbnQge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHNldCBpbiBjb25zdHJ1Y3RvclxuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnROb2RlO1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnROb2RlKSB7XG4gICAgLy8gSW4gTHlueCB2ZXJzaW9ucyBwcmlvciB0byBhbmQgaW5jbHVkaW5nIDIuMTUsXG4gICAgLy8gYSBjcmFzaCBvY2N1cnMgd2hlbiBwcmludGluZyBvciB0cmFuc2ZlcnJpbmcgcmVmQ291bnRlZCBhY3Jvc3MgdGhyZWFkcy5cbiAgICAvLyBCeXBhc3MgdGhpcyBwcm9ibGVtIGJ5IGhpZGluZyB0aGUgZWxlbWVudCBvYmplY3QuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlbGVtZW50Jywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBfX1NldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIF9fQWRkSW5saW5lU3R5bGUodGhpcy5lbGVtZW50LCBuYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0U3R5bGVQcm9wZXJ0aWVzKHN0eWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHN0eWxlcykge1xuICAgICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIGtleSwgc3R5bGVzW2tleV0hKTtcbiAgICB9XG4gICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZUJ5TmFtZSh0aGlzLmVsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldEF0dHJpYnV0ZU5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gX19HZXRBdHRyaWJ1dGVOYW1lcyh0aGlzLmVsZW1lbnQpO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCByZWYgPSBfX1F1ZXJ5U2VsZWN0b3IodGhpcy5lbGVtZW50LCBzZWxlY3Rvciwge30pO1xuICAgIHJldHVybiByZWYgPyBuZXcgRWxlbWVudChyZWYpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBxdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50W10ge1xuICAgIHJldHVybiBfX1F1ZXJ5U2VsZWN0b3JBbGwodGhpcy5lbGVtZW50LCBzZWxlY3Rvciwge30pLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFuaW1hdGUoXG4gICAga2V5ZnJhbWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+W10sXG4gICAgb3B0aW9ucz86IG51bWJlciB8IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4sXG4gICk6IEFuaW1hdGlvbiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicgPyB7IGR1cmF0aW9uOiBvcHRpb25zIH0gOiBvcHRpb25zID8/IHt9O1xuICAgIHJldHVybiBuZXcgQW5pbWF0aW9uKG5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLCBrZXlmcmFtZXMsIG5vcm1hbGl6ZWRPcHRpb25zKSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9fSW52b2tlVUlNZXRob2QoXG4gICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGFyYW1zID8/IHt9LFxuICAgICAgICAocmVzOiB7IGNvZGU6IG51bWJlcjsgZGF0YTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVUkgbWV0aG9kIGludm9rZTogJyArIEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRWxlbWVudFRyZWUoKSB7XG4gICAgaWYgKHdpbGxGbHVzaCB8fCAhc2hvdWxkRmx1c2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2lsbEZsdXNoID0gdHJ1ZTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgd2lsbEZsdXNoID0gZmFsc2U7XG4gICAgICBfX0ZsdXNoRWxlbWVudFRyZWUoKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQuanMnO1xuXG5jbGFzcyBQYWdlRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHBhZ2VFbGVtZW50OiBFbGVtZW50Tm9kZSB8IHVuZGVmaW5lZDtcblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50ID8/PSBfX0dldFBhZ2VFbGVtZW50KCk7XG4gICAgcmV0dXJuIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBfX1F1ZXJ5U2VsZWN0b3IoUGFnZUVsZW1lbnQuZ2V0KCksIGNzc1NlbGVjdG9yLCB7fSk7XG4gIHJldHVybiBlbGVtZW50ID8gbmV3IEVsZW1lbnQoZWxlbWVudCkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbChjc3NTZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbChQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KS5tYXAoXG4gICAgKGVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbGVtZW50KTtcbiAgICB9LFxuICApO1xufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmV4cG9ydCBmdW5jdGlvbiBpc1Nka1ZlcnNpb25HdChtYWpvcjogbnVtYmVyLCBtaW5vcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGx5bnhTZGtWZXJzaW9uOiBzdHJpbmcgPSBTeXN0ZW1JbmZvLmx5bnhTZGtWZXJzaW9uID8/ICcxLjAnO1xuICBjb25zdCB2ZXJzaW9uID0gbHlueFNka1ZlcnNpb24uc3BsaXQoJy4nKTtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIodmVyc2lvblswXSkgPiBtYWpvclxuICAgIHx8IChOdW1iZXIodmVyc2lvblswXSkgPT0gbWFqb3IgJiYgTnVtYmVyKHZlcnNpb25bMV0pID4gbWlub3IpXG4gICk7XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgcXVlcnlTZWxlY3RvciwgcXVlcnlTZWxlY3RvckFsbCB9IGZyb20gJy4vbGVwdXNRdWVyeVNlbGVjdG9yLmpzJztcbmltcG9ydCB7IGlzU2RrVmVyc2lvbkd0IH0gZnJvbSAnLi4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRBcGlFbnYoKTogdm9pZCB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3IgPSBxdWVyeVNlbGVjdG9yO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgbHlueC5xdWVyeVNlbGVjdG9yQWxsID0gcXVlcnlTZWxlY3RvckFsbDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuc2V0VGltZW91dCA9IGx5bnguc2V0VGltZW91dCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRJbnRlcnZhbCA9IGx5bnguc2V0SW50ZXJ2YWwgYXMgKGNiOiAoKSA9PiB2b2lkLCB0aW1lb3V0OiBudW1iZXIpID0+IG51bWJlcjtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJUaW1lb3V0ID0gbHlueC5jbGVhclRpbWVvdXQgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgLy8gSW4gbHlueCAyLjE0IGBjbGVhckludGVydmFsYCBpcyBtaXN0YWtlbmx5IHNwZWxsZWQgYXMgYGNsZWFyVGltZUludGVydmFsYC4gVGhpcyBpcyBmaXhlZCBpbiBseW54IDIuMTUuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLmNsZWFySW50ZXJ2YWwgPSAobHlueC5jbGVhckludGVydmFsID8/IGx5bnguY2xlYXJUaW1lSW50ZXJ2YWwpIGFzICh0aW1lb3V0OiBudW1iZXIpID0+IHZvaWQ7XG5cbiAge1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICAgIGNvbnN0IHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IGx5bngucmVxdWVzdEFuaW1hdGlvbkZyYW1lIGFzIChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gbnVtYmVyO1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICAgIGx5bngucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZ2xvYmFsVGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAoXG4gICAgICBjYWxsYmFjazogKCkgPT4gdm9pZCxcbiAgICApID0+IHtcbiAgICAgIGlmICghaXNTZGtWZXJzaW9uR3QoMiwgMTUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAncmVxdWVzdEFuaW1hdGlvbkZyYW1lIGluIG1haW4gdGhyZWFkIHNjcmlwdCByZXF1aXJlcyBMeW54IHNkayB2ZXJzaW9uIDIuMTYnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gbHlueC5jYW5jZWxBbmltYXRpb25GcmFtZSBhcyAocmVxdWVzdElkOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB7IGluaXRBcGlFbnYgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI1IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBXb3JrbGV0RXZlbnRzIH0gZnJvbSAnLi9iaW5kaW5ncy9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IENsb3N1cmVWYWx1ZVR5cGUsIFJ1bldvcmtsZXRDdHhSZXREYXRhLCBXb3JrbGV0IH0gZnJvbSAnLi9iaW5kaW5ncy9pbmRleC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5SdW5Pbk1haW5UaHJlYWRUYXNrKHRhc2s6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdLCByZXNvbHZlSWQ6IG51bWJlcik6IHZvaWQge1xuICBsZXQgcmV0dXJuVmFsdWU7XG4gIHRyeSB7XG4gICAgcmV0dXJuVmFsdWUgPSBydW5Xb3JrbGV0KHRhc2ssIHBhcmFtcyk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gVE9ETzogU2hvdWxkIGJlIG1vcmUgcHJvcGVyIHRvIHJlamVjdCB0aGUgcHJvbWlzZSBpZiB0aGVyZSBpcyBhbiBlcnJvci5cbiAgICBseW54LmdldEpTQ29udGV4dCgpLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgdHlwZTogV29ya2xldEV2ZW50cy5GdW5jdGlvbkNhbGxSZXQsXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIHJlc29sdmVJZCxcbiAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICB9IGFzIFJ1bldvcmtsZXRDdHhSZXREYXRhKSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmV4cG9ydCBmdW5jdGlvbiBwcm9maWxlPFJldCwgRm4gZXh0ZW5kcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBSZXQ+KFxuICBzbGljZU5hbWU6IHN0cmluZyxcbiAgZjogRm4sXG4pOiBSZXQge1xuICAvKiB2OCBpZ25vcmUgbmV4dCA5ICovXG4gIC8vIFRPRE86IGNoYW5nZSBpdCB0byBfX1BST0ZJTEVfX1xuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnNvbGUucHJvZmlsZShzbGljZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zb2xlLnByb2ZpbGVFbmQoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGYoKTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2xldFJlZiwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBSZWZJbXBsIHtcbiAgX3dvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICBfZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwOiBSZWNvcmQ8V29ya2xldFJlZklkLCBXb3JrbGV0UmVmPHVua25vd24+PjtcbiAgdXBkYXRlV29ya2xldFJlZihcbiAgICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxFbGVtZW50IHwgbnVsbD4sXG4gICAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuICApOiB2b2lkO1xuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhwYXRjaDogW251bWJlciwgdW5rbm93bl1bXSk6IHZvaWQ7XG4gIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBSZWZJbXBsIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbml0V29ya2xldFJlZigpOiBSZWZJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIF93b3JrbGV0UmVmTWFwOiB7fSxcbiAgICAvKipcbiAgICAgKiBNYXAgb2Ygd29ya2xldCByZWZzIHRoYXQgYXJlIGNyZWF0ZWQgZHVyaW5nIGZpcnN0IHNjcmVlbiByZW5kZXJpbmcuXG4gICAgICogVGhlc2UgcmVmcyBhcmUgY3JlYXRlZCB3aXRoIG5lZ2F0aXZlIElEcyBhbmQgbmVlZCB0byBiZSBoeWRyYXRlZFxuICAgICAqIHdoZW4gdGhlIGFwcCBzdGFydHMuIFRoZSBtYXAgaXMgY2xlYXJlZCBhZnRlciBoeWRyYXRpb24gaXMgY29tcGxldGVcbiAgICAgKiB0byBmcmVlIHVwIG1lbW9yeS5cbiAgICAgKi9cbiAgICBfZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwOiB7fSxcbiAgICB1cGRhdGVXb3JrbGV0UmVmLFxuICAgIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzLFxuICAgIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwLFxuICB9KTtcbn1cblxuY29uc3QgY3JlYXRlV29ya2xldFJlZiA9IDxUPihcbiAgaWQ6IFdvcmtsZXRSZWZJZCxcbiAgdmFsdWU6IFQsXG4pOiBXb3JrbGV0UmVmPFQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiB2YWx1ZSxcbiAgICBfd3ZpZDogaWQsXG4gIH07XG59O1xuXG5jb25zdCBnZXRGcm9tV29ya2xldFJlZk1hcCA9IDxUPihcbiAgcmVmSW1wbDogV29ya2xldFJlZkltcGw8VD4sXG4pOiBXb3JrbGV0UmVmPFQ+ID0+IHtcbiAgY29uc3QgaWQgPSByZWZJbXBsLl93dmlkO1xuICBsZXQgdmFsdWU7XG4gIGlmIChpZCA8IDApIHtcbiAgICAvLyBBdCB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZywgdGhlIHdvcmtsZXQgcmVmIGlzIGNyZWF0ZWQgd2l0aCBhIG5lZ2F0aXZlIElELlxuICAgIC8vIE1pZ2h0IGJlIGNhbGxlZCBpbiB0d28gc2NlbmFyaW9zOlxuICAgIC8vIDEuIEluIE1UUyBldmVudHNcbiAgICAvLyAyLiBJbiBgbWFpbi10aHJlYWQ6cmVmYFxuICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gYXMgV29ya2xldFJlZjxUPjtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGltcGwhLl9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXBbaWRdID0gY3JlYXRlV29ya2xldFJlZihpZCwgcmVmSW1wbC5faW5pdFZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBpbXBsIS5fd29ya2xldFJlZk1hcFtpZF0gYXMgV29ya2xldFJlZjxUPjtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKF9fREVWX18gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignV29ya2xldDogcmVmIGlzIG5vdCBpbml0aWFsaXplZDogJyArIGlkKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwKGlkOiBXb3JrbGV0UmVmSWQpOiB2b2lkIHtcbiAgZGVsZXRlIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBub2RlLCB0aGVuIHNldCB0aGUgd29ya2xldCB2YWx1ZSB0byBpdC5cbiAqIFRoaXMgaXMgY2FsbGVkIGluIGBzbmFwc2hvdENvbnRleHRVcGRhdGVXb3JrbGV0UmVmYC5cbiAqIEBwYXJhbSBoYW5kbGUgaGFuZGxlIG9mIHRoZSB3b3JrbGV0IHZhbHVlLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV29ya2xldFJlZihcbiAgaGFuZGxlOiBXb3JrbGV0UmVmSW1wbDxFbGVtZW50IHwgbnVsbD4sXG4gIGVsZW1lbnQ6IEVsZW1lbnROb2RlIHwgbnVsbCxcbik6IHZvaWQge1xuICBnZXRGcm9tV29ya2xldFJlZk1hcChoYW5kbGUpLmN1cnJlbnQgPSBlbGVtZW50XG4gICAgPyBuZXcgRWxlbWVudChlbGVtZW50KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMoXG4gIHBhdGNoOiBbV29ya2xldFJlZklkLCB1bmtub3duXVtdLFxuKTogdm9pZCB7XG4gIHByb2ZpbGUoJ3VwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzJywgKCkgPT4ge1xuICAgIHBhdGNoLmZvckVhY2goKFtpZCwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoIWltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSkge1xuICAgICAgICBpbXBsIS5fd29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCgpOiB2b2lkIHtcbiAgaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCA9IHt9O1xufVxuXG5leHBvcnQge1xuICB0eXBlIFJlZkltcGwsXG4gIGNyZWF0ZVdvcmtsZXRSZWYsXG4gIGluaXRXb3JrbGV0UmVmLFxuICBnZXRGcm9tV29ya2xldFJlZk1hcCxcbiAgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCxcbiAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG59O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbGVhc2VXb3JrbGV0UmVmRGF0YSwgUnVuV29ya2xldEN0eERhdGEgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IENsb3N1cmVWYWx1ZVR5cGUgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IHJ1blJ1bk9uTWFpblRocmVhZFRhc2sgfSBmcm9tICcuL3J1bk9uTWFpblRocmVhZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnLi90eXBlcy9ydW50aW1lUHJveHkuanMnO1xuaW1wb3J0IHsgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QganNDb250ZXh0ID0gbHlueC5nZXRKU0NvbnRleHQoKTtcbiAganNDb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgV29ya2xldEV2ZW50cy5ydW5Xb3JrbGV0Q3R4LFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEgYXMgc3RyaW5nKSBhcyBSdW5Xb3JrbGV0Q3R4RGF0YTtcbiAgICAgIHJ1blJ1bk9uTWFpblRocmVhZFRhc2soZGF0YS53b3JrbGV0LCBkYXRhLnBhcmFtcyBhcyBDbG9zdXJlVmFsdWVUeXBlW10sIGRhdGEucmVzb2x2ZUlkKTtcbiAgICB9LFxuICApO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJlbGVhc2VXb3JrbGV0UmVmLFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoKGV2ZW50LmRhdGEgYXMgUmVsZWFzZVdvcmtsZXRSZWZEYXRhKS5pZCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH07XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHR5cGUgeyBKc0ZuSGFuZGxlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5cbmludGVyZmFjZSBEZXRhaWxzIHtcbiAgdGFzazogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQ7XG5cbiAgLy8gVGhpcyBjb21lcyBmcm9tIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCwgaW5zZXJ0ZWQgaGVyZSBkdXJpbmcgY3R4IGh5ZHJhdGlvbi5cbiAganNGbkhhbmRsZT86IEpzRm5IYW5kbGU7XG59XG5cbmludGVyZmFjZSBSdW5PbkJhY2tncm91bmREZWxheUltcGwge1xuICAvLyBFbGVtZW50cyBzaG91bGQga2VlcCB0aGUgb3JkZXIgYmVpbmcgY2FsbGVkIGJ5IHRoZSB1c2VyLlxuICBkZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXk6IERldGFpbHNbXTtcbiAgZGVsYXlSdW5PbkJhY2tncm91bmQoZm5PYmo6IEpzRm5IYW5kbGUsIGZuOiAoZm5JZDogbnVtYmVyLCBleGVjSWQ6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQ7XG4gIHJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBSdW5PbkJhY2tncm91bmREZWxheUltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRSdW5PbkJhY2tncm91bmREZWxheSgpOiBSdW5PbkJhY2tncm91bmREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5OiBbXSxcbiAgICBkZWxheVJ1bk9uQmFja2dyb3VuZCxcbiAgICBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlbGF5UnVuT25CYWNrZ3JvdW5kKGZuT2JqOiBKc0ZuSGFuZGxlLCB0YXNrOiAoZm5JZDogbnVtYmVyLCBleGVjSWQ6IG51bWJlcikgPT4gdm9pZCkge1xuICBpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkucHVzaCh7IHRhc2sgfSk7XG4gIGNvbnN0IGRlbGF5SW5kaWNlcyA9IGZuT2JqLl9kZWxheUluZGljZXMgPz89IFtdO1xuICBkZWxheUluZGljZXMucHVzaChpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkubGVuZ3RoIC0gMSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGRldGFpbHMgb2YgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5KSB7XG4gICAgaWYgKGRldGFpbHMuanNGbkhhbmRsZSkge1xuICAgICAgZGV0YWlscy50YXNrKGRldGFpbHMuanNGbkhhbmRsZS5fanNGbklkISwgZGV0YWlscy5qc0ZuSGFuZGxlLl9leGVjSWQhKTtcbiAgICB9XG4gIH1cbiAgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5Lmxlbmd0aCA9IDA7XG59XG5cbmV4cG9ydCB7IHR5cGUgUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLCBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgdHlwZSB7IENsb3N1cmVWYWx1ZVR5cGUsIFdvcmtsZXQgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuXG5pbnRlcmZhY2UgRXZlbnREZWxheUltcGwge1xuICBfZGVsYXllZFdvcmtsZXRQYXJhbXNNYXA6IE1hcDxzdHJpbmcsIENsb3N1cmVWYWx1ZVR5cGVbXVtdPjtcbiAgcnVuRGVsYXllZFdvcmtsZXQod29ya2xldDogV29ya2xldCwgZWxlbWVudDogRWxlbWVudE5vZGUpOiB2b2lkO1xuICBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkO1xufVxuXG5sZXQgaW1wbDogRXZlbnREZWxheUltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRFdmVudERlbGF5KCk6IEV2ZW50RGVsYXlJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogbmV3IE1hcCgpLFxuICAgIHJ1bkRlbGF5ZWRXb3JrbGV0LFxuICAgIGNsZWFyRGVsYXllZFdvcmtsZXRzLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVsYXlFeGVjVW50aWxKc1JlYWR5KFxuICBoYXNoOiBzdHJpbmcsXG4gIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdLFxuKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2RlbGF5RXhlY1VudGlsSnNSZWFkeTogJyArIGhhc2gsICgpID0+IHtcbiAgICBjb25zdCBtYXAgPSBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXA7XG4gICAgY29uc3QgcGFyYW1WZWMgPSBtYXAuZ2V0KGhhc2gpO1xuICAgIGlmIChwYXJhbVZlYykge1xuICAgICAgcGFyYW1WZWMucHVzaChwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuc2V0KGhhc2gsIFtwYXJhbXNdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQge1xuICBwcm9maWxlKCdjb21taXREZWxheWVkV29ya2xldCcsICgpID0+IHtcbiAgICBjb25zdCBwYXJhbXNWZWMgPSBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXAuZ2V0KFxuICAgICAgd29ya2xldC5fd2tsdElkLFxuICAgICk7XG4gICAgaWYgKHBhcmFtc1ZlYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxlZnRQYXJhbXNWZWM6IENsb3N1cmVWYWx1ZVR5cGVbXVtdID0gW107XG4gICAgcGFyYW1zVmVjLmZvckVhY2goKHBhcmFtcykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RQYXJhbSA9IHBhcmFtc1swXSBhcyB7IGN1cnJlbnRUYXJnZXQ/OiB7IGVsZW1lbnRSZWZwdHI/OiBFbGVtZW50Tm9kZSB9IH0gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmlyc3RQYXJhbT8uY3VycmVudFRhcmdldD8uZWxlbWVudFJlZnB0ciA9PT0gZWxlbWVudCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBwcm9maWxlKCdydW5EZWxheWVkV29ya2xldCcsICgpID0+IHtcbiAgICAgICAgICAgIHJ1bldvcmtsZXQod29ya2xldCwgcGFyYW1zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0UGFyYW1zVmVjLnB1c2gocGFyYW1zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXAuc2V0KFxuICAgICAgd29ya2xldC5fd2tsdElkLFxuICAgICAgbGVmdFBhcmFtc1ZlYyxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJEZWxheWVkV29ya2xldHMoKTogdm9pZCB7XG4gIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB0eXBlIEV2ZW50RGVsYXlJbXBsLCBpbml0RXZlbnREZWxheSwgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBydW5EZWxheWVkV29ya2xldCwgY2xlYXJEZWxheWVkV29ya2xldHMgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI1IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBzZXRTaG91bGRGbHVzaCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVvbUltcGwge1xuICBzZXRTaG91bGRGbHVzaCh2YWx1ZTogYm9vbGVhbik6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0RW9tSW1wbCgpOiBFb21JbXBsIHtcbiAgcmV0dXJuIHtcbiAgICBzZXRTaG91bGRGbHVzaCxcbiAgfTtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIHJlZi5jdXJyZW50ID0gdmFsdWUuY3VycmVudDtcbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBkZWxheWVkIGBydW5PbkJhY2tncm91bmRgIHRhc2tzLlxuICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYW55IGBydW5PbkJhY2tncm91bmRgIGNhbGxzIHRoYXQgd2VyZSBkZWxheWVkXG4gKiBkdXJpbmcgdGhlIGZpcnN0LXNjcmVlbiByZW5kZXJpbmcgYXJlIGNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlaXJcbiAqIHJlc3BlY3RpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGVzIGluIHRoZSBoeWRyYXRlZCBXb3JrbGV0IGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzKFxuICBmbk9ianM6IFJlY29yZDxzdHJpbmcsIEpzRm5IYW5kbGU+LCAvLyBleGFtcGxlOiB7XCJfanNGbjFcIjp7XCJfanNGbklkXCI6MX19XG4gIGZpcnN0U2NyZWVuRm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2lzRmlyc3RTY3JlZW5cIjp0cnVlLFwiX2RlbGF5SW5kaWNlc1wiOlswXX19XG4gIGV4ZWNJZDogbnVtYmVyLFxuKSB7XG4gIGZvciAoY29uc3QgZm5OYW1lIGluIGZuT2Jqcykge1xuICAgIGNvbnN0IGZuT2JqID0gZm5PYmpzW2ZuTmFtZV0hO1xuICAgIGNvbnN0IGZpcnN0U2NyZWVuRm5PYmo6IEpzRm5IYW5kbGUgfCB1bmRlZmluZWQgPSBmaXJzdFNjcmVlbkZuT2Jqc1tmbk5hbWVdO1xuICAgIGlmICghZmlyc3RTY3JlZW5Gbk9iaj8uX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgZmlyc3RTY3JlZW5Gbk9iai5fZGVsYXlJbmRpY2VzKSB7XG4gICAgICBjb25zdCBkZXRhaWxzID0gbHlueFdvcmtsZXRJbXBsIS5fcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheVtpbmRleF0hO1xuICAgICAgZm5PYmouX2V4ZWNJZCA9IGV4ZWNJZDtcbiAgICAgIGRldGFpbHMuanNGbkhhbmRsZSA9IGZuT2JqO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcbmltcG9ydCB7IGlzU2RrVmVyc2lvbkd0IH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXJgIG1vbml0b3JzIHJlZmVyZW5jZXMgdG8gSlMgZnVuY3Rpb24gaGFuZGxlcyB0byBiZSBjYWxsZWQgYnkgYHJ1bk9uQmFja2dyb3VuZCgpYC5cbiAqIEluIEpTIGNvbnRleHQsIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgYnkgYHJ1bk9uQmFja2dyb3VuZCgpYCBpcyByZWZlcmVuY2VkIGJ5IGBKc0ZuSGFuZGxlYHMgYW5kIGZpbmFsbHkgYnkgYGV4ZWNJZGAuXG4gKiBXaGVuIGFsbCBgSnNGbkhhbmRsZWBzIGluIGxlcHVzIGFyZSByZWxlYXNlZCwgYW4gZXZlbnQgd2lsbCBiZSBzZW50IHRvIEpTIGNvbnRleHQgdG8gZGUtcmVmIHRoZSBgZXhlY0lkYCxcbiAqIHJlc3VsdGluZyBhIGRlLXJlZiB0byB0aGUganMgZnVuY3Rpb24gaW4gSlMgY29udGV4dC5cbiAqL1xuY2xhc3MgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIge1xuICBwcml2YXRlIGV4ZWNJZFJlZkNvdW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBleGVjSWRTZXRUb0ZpcmUgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSB3aWxsRmlyZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlZ2lzdHJ5PzogRmluYWxpemF0aW9uUmVnaXN0cnk8bnVtYmVyPiA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5PG51bWJlcj4odGhpcy5yZW1vdmVSZWYuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGRSZWYoZXhlY0lkOiBudW1iZXIsIG9ialRvUmVmOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LnNldChcbiAgICAgIGV4ZWNJZCxcbiAgICAgICh0aGlzLmV4ZWNJZFJlZkNvdW50LmdldChleGVjSWQpID8/IDApICsgMSxcbiAgICApO1xuICAgIHRoaXMucmVnaXN0cnkhLnJlZ2lzdGVyKG9ialRvUmVmLCBleGVjSWQpO1xuICB9XG5cbiAgcmVtb3ZlUmVmKGV4ZWNJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcmMgPSB0aGlzLmV4ZWNJZFJlZkNvdW50LmdldChleGVjSWQpITtcbiAgICBpZiAocmMgPiAxKSB7XG4gICAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LnNldChleGVjSWQsIHJjIC0gMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuZGVsZXRlKGV4ZWNJZCk7XG4gICAgdGhpcy5leGVjSWRTZXRUb0ZpcmUuYWRkKGV4ZWNJZCk7XG4gICAgaWYgKCF0aGlzLndpbGxGaXJlKSB7XG4gICAgICB0aGlzLndpbGxGaXJlID0gdHJ1ZTtcbiAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlyZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZmlyZSgpOiB2b2lkIHtcbiAgICBwcm9maWxlKCdKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlci5maXJlJywgKCkgPT4ge1xuICAgICAgbHlueC5nZXRKU0NvbnRleHQoKS5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgdHlwZTogV29ya2xldEV2ZW50cy5yZWxlYXNlQmFja2dyb3VuZFdvcmtsZXRDdHgsXG4gICAgICAgIGRhdGE6IEFycmF5LmZyb20odGhpcy5leGVjSWRTZXRUb0ZpcmUpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4ZWNJZFNldFRvRmlyZS5jbGVhcigpO1xuICAgICAgdGhpcy53aWxsRmlyZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzU2RrVmVyc2lvbkd0KDIsIDE1KTtcbn1cblxuZXhwb3J0IHsgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIsIGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCwgV29ya2xldFJlZkltcGwgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IGluaXRSdW5PbkJhY2tncm91bmREZWxheSB9IGZyb20gJy4vZGVsYXlSdW5PbkJhY2tncm91bmQuanMnO1xuaW1wb3J0IHsgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBpbml0RXZlbnREZWxheSB9IGZyb20gJy4vZGVsYXlXb3JrbGV0RXZlbnQuanMnO1xuaW1wb3J0IHsgaW5pdEVvbUltcGwgfSBmcm9tICcuL2VvbUltcGwuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZUN0eCB9IGZyb20gJy4vaHlkcmF0ZS5qcyc7XG5pbXBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH0gZnJvbSAnLi9qc0Z1bmN0aW9uTGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IHJ1blJ1bk9uTWFpblRocmVhZFRhc2sgfSBmcm9tICcuL3J1bk9uTWFpblRocmVhZC5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcbmltcG9ydCB7IGdldEZyb21Xb3JrbGV0UmVmTWFwLCBpbml0V29ya2xldFJlZiB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRXb3JrbGV0KCk6IHZvaWQge1xuICBnbG9iYWxUaGlzLmx5bnhXb3JrbGV0SW1wbCA9IHtcbiAgICBfd29ya2xldE1hcDoge30sXG4gICAgX3JlZkltcGw6IGluaXRXb3JrbGV0UmVmKCksXG4gICAgX3J1bk9uQmFja2dyb3VuZERlbGF5SW1wbDogaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5KCksXG4gICAgX2h5ZHJhdGVDdHg6IGh5ZHJhdGVDdHgsXG4gICAgX2V2ZW50RGVsYXlJbXBsOiBpbml0RXZlbnREZWxheSgpLFxuICAgIF9lb21JbXBsOiBpbml0RW9tSW1wbCgpLFxuICAgIF9ydW5SdW5Pbk1haW5UaHJlYWRUYXNrOiBydW5SdW5Pbk1haW5UaHJlYWRUYXNrLFxuICB9O1xuXG4gIGlmIChpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQoKSkge1xuICAgIGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsLl9qc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciA9IG5ldyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcigpO1xuICB9XG5cbiAgZ2xvYmFsVGhpcy5yZWdpc3RlcldvcmtsZXQgPSByZWdpc3RlcldvcmtsZXQ7XG4gIGdsb2JhbFRoaXMucmVnaXN0ZXJXb3JrbGV0SW50ZXJuYWwgPSByZWdpc3RlcldvcmtsZXQ7XG4gIGdsb2JhbFRoaXMucnVuV29ya2xldCA9IHJ1bldvcmtsZXQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSB3b3JrbGV0IGZ1bmN0aW9uLCBhbGxvd2luZyBpdCB0byBiZSBleGVjdXRlZCBieSBgcnVuV29ya2xldCgpYC5cbiAqIFRoaXMgaXMgY2FsbGVkIGluIGxlcHVzLmpzLlxuICogQHBhcmFtIF90eXBlIHdvcmtsZXQgdHlwZSwgJ21haW4tdGhyZWFkJyBvciAndWknXG4gKiBAcGFyYW0gaWQgd29ya2xldCBoYXNoXG4gKiBAcGFyYW0gd29ya2xldCB3b3JrbGV0IGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyV29ya2xldChfdHlwZTogc3RyaW5nLCBpZDogc3RyaW5nLCB3b3JrbGV0OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKTogdm9pZCB7XG4gIGx5bnhXb3JrbGV0SW1wbC5fd29ya2xldE1hcFtpZF0gPSB3b3JrbGV0O1xufVxuXG4vKipcbiAqIEVudHJhbmNlIG9mIGFsbCB3b3JrbGV0IGNhbGxzLlxuICogTmF0aXZlIGV2ZW50IHRvdWNoIGhhbmRsZXIgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gY3R4IHdvcmtsZXQgb2JqZWN0LlxuICogQHBhcmFtIHBhcmFtcyB3b3JrbGV0IHBhcmFtcy5cbiAqL1xuZnVuY3Rpb24gcnVuV29ya2xldChjdHg6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdKTogdW5rbm93biB7XG4gIGlmICghdmFsaWRhdGVXb3JrbGV0KGN0eCkpIHtcbiAgICBjb25zb2xlLndhcm4oJ1dvcmtsZXQ6IEludmFsaWQgd29ya2xldCBvYmplY3Q6ICcgKyBKU09OLnN0cmluZ2lmeShjdHgpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCdfbGVwdXNXb3JrbGV0SGFzaCcgaW4gY3R4KSB7XG4gICAgZGVsYXlFeGVjVW50aWxKc1JlYWR5KGN0eC5fbGVwdXNXb3JrbGV0SGFzaCwgcGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIHJ1bldvcmtsZXRJbXBsKGN0eCwgcGFyYW1zKTtcbn1cblxuZnVuY3Rpb24gcnVuV29ya2xldEltcGwoY3R4OiBXb3JrbGV0LCBwYXJhbXM6IENsb3N1cmVWYWx1ZVR5cGVbXSk6IHVua25vd24ge1xuICBjb25zdCB3b3JrbGV0OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duID0gcHJvZmlsZShcbiAgICAndHJhbnNmb3JtV29ya2xldEN0eCAnICsgY3R4Ll93a2x0SWQsXG4gICAgKCkgPT4gdHJhbnNmb3JtV29ya2xldChjdHgsIHRydWUpLFxuICApO1xuICBjb25zdCBwYXJhbXNfOiBDbG9zdXJlVmFsdWVUeXBlW10gPSBwcm9maWxlKFxuICAgICd0cmFuc2Zvcm1Xb3JrbGV0UGFyYW1zJyxcbiAgICAoKSA9PiB0cmFuc2Zvcm1Xb3JrbGV0KHBhcmFtcyB8fCBbXSwgZmFsc2UpLFxuICApO1xuICByZXR1cm4gcHJvZmlsZSgncnVuV29ya2xldCcsICgpID0+IHdvcmtsZXQoLi4ucGFyYW1zXykpO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVdvcmtsZXQoY3R4OiB1bmtub3duKTogY3R4IGlzIFdvcmtsZXQge1xuICByZXR1cm4gdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiYgY3R4ICE9PSBudWxsICYmICgnX3drbHRJZCcgaW4gY3R4IHx8ICdfbGVwdXNXb3JrbGV0SGFzaCcgaW4gY3R4KTtcbn1cblxuY29uc3Qgd29ya2xldENhY2hlID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBDbG9zdXJlVmFsdWVUeXBlIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pPigpO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Xb3JrbGV0KGN0eDogV29ya2xldCwgaXNXb3JrbGV0OiB0cnVlKTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoXG4gIGN0eDogQ2xvc3VyZVZhbHVlVHlwZVtdLFxuICBpc1dvcmtsZXQ6IGZhbHNlLFxuKTogQ2xvc3VyZVZhbHVlVHlwZVtdO1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Xb3JrbGV0KFxuICBjdHg6IENsb3N1cmVWYWx1ZVR5cGUsXG4gIGlzV29ya2xldDogYm9vbGVhbixcbik6IENsb3N1cmVWYWx1ZVR5cGUgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bikge1xuICAvKiB2OCBpZ25vcmUgbmV4dCAzICovXG4gIGlmICh0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCBjdHggPT09IG51bGwpIHtcbiAgICByZXR1cm4gY3R4O1xuICB9XG5cbiAgaWYgKGlzV29ya2xldCkge1xuICAgIGNvbnN0IHJlcyA9IHdvcmtsZXRDYWNoZS5nZXQoY3R4KTtcbiAgICBpZiAocmVzKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtsZXQgPSB7IG1haW46IGN0eCB9O1xuICB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIod29ya2xldCwgMCwgY3R4KTtcblxuICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgd29ya2xldENhY2hlLnNldChjdHgsIHdvcmtsZXQubWFpbik7XG4gIH1cbiAgcmV0dXJuIHdvcmtsZXQubWFpbjtcbn1cblxuY29uc3QgdHJhbnNmb3JtV29ya2xldElubmVyID0gKFxuICB2YWx1ZTogQ2xvc3VyZVZhbHVlVHlwZSxcbiAgZGVwdGg6IG51bWJlcixcbiAgY3R4OiB1bmtub3duLFxuKSA9PiB7XG4gIGNvbnN0IGxpbWl0ID0gMTAwMDtcbiAgaWYgKCsrZGVwdGggPj0gbGltaXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcHRoIG9mIHZhbHVlIGV4Y2VlZHMgbGltaXQgb2YgJyArIGxpbWl0ICsgJy4nKTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgbmV4dCAzICovXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIENsb3N1cmVWYWx1ZVR5cGU+O1xuXG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGNvbnN0IHN1Yk9iajogQ2xvc3VyZVZhbHVlVHlwZSA9IG9ialtrZXldO1xuICAgIGlmICh0eXBlb2Ygc3ViT2JqICE9PSAnb2JqZWN0JyB8fCBzdWJPYmogPT09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICgvKiogaXNFdmVudFRhcmdldCAqLyAnZWxlbWVudFJlZnB0cicgaW4gc3ViT2JqKSB7XG4gICAgICBvYmpba2V5XSA9IG5ldyBFbGVtZW50KHN1Yk9ialsnZWxlbWVudFJlZnB0ciddIGFzIEVsZW1lbnROb2RlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSBpZiAoc3ViT2JqIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtV29ya2xldElubmVyKHN1Yk9iaiwgZGVwdGgsIGN0eCk7XG5cbiAgICBjb25zdCBpc1dvcmtsZXRSZWYgPSAnX3d2aWQnIGluIChzdWJPYmogYXMgb2JqZWN0KTtcbiAgICBpZiAoaXNXb3JrbGV0UmVmKSB7XG4gICAgICBvYmpba2V5XSA9IGdldEZyb21Xb3JrbGV0UmVmTWFwKFxuICAgICAgICBzdWJPYmogYXMgdW5rbm93biBhcyBXb3JrbGV0UmVmSW1wbDx1bmtub3duPixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNXb3JrbGV0ID0gJ193a2x0SWQnIGluIHN1Yk9iajtcbiAgICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgICAvLyBgc3ViT2JqYCBpcyB3b3JrbGV0IGN0eC4gU2hhbGxvdyBjb3B5IGl0IHRvIHByZXZlbnQgdGhlIHRyYW5zZm9ybWVkIHdvcmtsZXQgZnJvbSByZWZlcmVuY2luZyBjdHguXG4gICAgICAvLyBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgdmFsdWUgb2YgYHdvcmtsZXRDYWNoZWAgcmVmZXJlbmNpbmcgaXRzIGtleS5cbiAgICAgIG9ialtrZXldID0gbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwWyhzdWJPYmogYXMgV29ya2xldCkuX3drbHRJZF0hXG4gICAgICAgIC5iaW5kKHsgLi4uc3ViT2JqIH0pO1xuICAgICAgb2JqW2tleV0uY3R4ID0gc3ViT2JqO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzSnNGbiA9ICdfanNGbklkJyBpbiBzdWJPYmo7XG4gICAgaWYgKGlzSnNGbikge1xuICAgICAgc3ViT2JqWydfZXhlY0lkJ10gPSAoY3R4IGFzIFdvcmtsZXQpLl9leGVjSWQ7XG4gICAgICBseW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyPy5hZGRSZWYoXG4gICAgICAgIChjdHggYXMgV29ya2xldCkuX2V4ZWNJZCEsXG4gICAgICAgIHN1Yk9iaixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCB7IGluaXRXb3JrbGV0IH07XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgaW5pdEFwaUVudiB9IGZyb20gJy4vYXBpL2x5bnhBcGkuanMnO1xuaW1wb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH0gZnJvbSAnLi9saXN0ZW5lcnMuanMnO1xuaW1wb3J0IHsgaW5pdFdvcmtsZXQgfSBmcm9tICcuL3dvcmtsZXRSdW50aW1lLmpzJztcblxuaWYgKGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsID09PSB1bmRlZmluZWQpIHtcbiAgaW5pdFdvcmtsZXQoKTtcbiAgaW5pdEFwaUVudigpO1xuICBpbml0RXZlbnRMaXN0ZW5lcnMoKTtcbn1cbiJdLCJuYW1lcyI6WyJBbmltYXRpb24iLCJfX0VsZW1lbnRBbmltYXRlIiwiZWZmZWN0IiwiS2V5ZnJhbWVFZmZlY3QiLCJ0YXJnZXQiLCJrZXlmcmFtZXMiLCJvcHRpb25zIiwid2lsbEZsdXNoIiwic2hvdWxkRmx1c2giLCJzZXRTaG91bGRGbHVzaCIsInZhbHVlIiwiRWxlbWVudCIsIm5hbWUiLCJfX1NldEF0dHJpYnV0ZSIsIl9fQWRkSW5saW5lU3R5bGUiLCJzdHlsZXMiLCJrZXkiLCJhdHRyaWJ1dGVOYW1lIiwiX19HZXRBdHRyaWJ1dGVCeU5hbWUiLCJfX0dldEF0dHJpYnV0ZU5hbWVzIiwic2VsZWN0b3IiLCJyZWYiLCJfX1F1ZXJ5U2VsZWN0b3IiLCJfX1F1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtZW50Iiwibm9ybWFsaXplZE9wdGlvbnMiLCJtZXRob2ROYW1lIiwicGFyYW1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfX0ludm9rZVVJTWV0aG9kIiwicmVzIiwiRXJyb3IiLCJKU09OIiwiX19GbHVzaEVsZW1lbnRUcmVlIiwiT2JqZWN0IiwiUGFnZUVsZW1lbnQiLCJfUGFnZUVsZW1lbnQiLCJfX0dldFBhZ2VFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImNzc1NlbGVjdG9yIiwicXVlcnlTZWxlY3RvckFsbCIsImlzU2RrVmVyc2lvbkd0IiwibWFqb3IiLCJtaW5vciIsIl9TeXN0ZW1JbmZvX2x5bnhTZGtWZXJzaW9uIiwibHlueFNka1ZlcnNpb24iLCJ2ZXJzaW9uIiwiTnVtYmVyIiwiaW5pdEFwaUVudiIsImx5bngiLCJnbG9iYWxUaGlzIiwiX2x5bnhfY2xlYXJJbnRlcnZhbCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbGxiYWNrIiwicnVuUnVuT25NYWluVGhyZWFkVGFzayIsInRhc2siLCJyZXNvbHZlSWQiLCJyZXR1cm5WYWx1ZSIsInJ1bldvcmtsZXQiLCJXb3JrbGV0RXZlbnRzIiwicHJvZmlsZSIsInNsaWNlTmFtZSIsImYiLCJjb25zb2xlIiwiaW1wbCIsImluaXRXb3JrbGV0UmVmIiwidXBkYXRlV29ya2xldFJlZiIsInVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzIiwiY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAiLCJjcmVhdGVXb3JrbGV0UmVmIiwiaWQiLCJnZXRGcm9tV29ya2xldFJlZk1hcCIsInJlZkltcGwiLCJ1bmRlZmluZWQiLCJyZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwIiwiaGFuZGxlIiwicGF0Y2giLCJpbml0RXZlbnRMaXN0ZW5lcnMiLCJqc0NvbnRleHQiLCJldmVudCIsImRhdGEiLCJpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkiLCJkZWxheVJ1bk9uQmFja2dyb3VuZCIsInJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zIiwiZm5PYmoiLCJfZm5PYmoiLCJkZWxheUluZGljZXMiLCJkZXRhaWxzIiwiaW5pdEV2ZW50RGVsYXkiLCJNYXAiLCJydW5EZWxheWVkV29ya2xldCIsImNsZWFyRGVsYXllZFdvcmtsZXRzIiwiZGVsYXlFeGVjVW50aWxKc1JlYWR5IiwiaGFzaCIsIm1hcCIsInBhcmFtVmVjIiwid29ya2xldCIsInBhcmFtc1ZlYyIsImxlZnRQYXJhbXNWZWMiLCJfZmlyc3RQYXJhbV9jdXJyZW50VGFyZ2V0IiwiZmlyc3RQYXJhbSIsInNldFRpbWVvdXQiLCJpbml0RW9tSW1wbCIsImh5ZHJhdGVDdHgiLCJjdHgiLCJmaXJzdFNjcmVlbkN0eCIsImh5ZHJhdGVDdHhJbXBsIiwiZXhlY0lkIiwiY3R4T2JqIiwiZmlyc3RTY3JlZW5DdHhPYmoiLCJoeWRyYXRlTWFpblRocmVhZFJlZiIsImh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzIiwiZmlyc3RTY3JlZW5WYWx1ZSIsInJlZklkIiwibHlueFdvcmtsZXRJbXBsIiwiZm5PYmpzIiwiZmlyc3RTY3JlZW5Gbk9ianMiLCJmbk5hbWUiLCJmaXJzdFNjcmVlbkZuT2JqIiwiaW5kZXgiLCJKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciIsIm9ialRvUmVmIiwiX3RoaXNfZXhlY0lkUmVmQ291bnRfZ2V0IiwicmMiLCJBcnJheSIsIlNldCIsIkZpbmFsaXphdGlvblJlZ2lzdHJ5IiwiaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIiwiaW5pdFdvcmtsZXQiLCJyZWdpc3RlcldvcmtsZXQiLCJfdHlwZSIsInZhbGlkYXRlV29ya2xldCIsInJ1bldvcmtsZXRJbXBsIiwidHJhbnNmb3JtV29ya2xldCIsInBhcmFtc18iLCJ3b3JrbGV0Q2FjaGUiLCJXZWFrTWFwIiwiaXNXb3JrbGV0IiwidHJhbnNmb3JtV29ya2xldElubmVyIiwiZGVwdGgiLCJsaW1pdCIsIm9iaiIsInN1Yk9iaiIsImlzV29ya2xldFJlZiIsImlzSnNGbiIsIl9seW54V29ya2xldEltcGxfX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7SUFZTyxNQUFNQTtRQVdKLFNBQWU7WUFFcEIsT0FBT0MsaUJBQWlCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTs7Z0JBQTRCLElBQUksQ0FBQyxFQUFFO2FBQUM7UUFDMUY7UUFFTyxRQUFjO1lBRW5CLE9BQU9BLGlCQUFpQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7O2dCQUEyQixJQUFJLENBQUMsRUFBRTthQUFDO1FBQ3pGO1FBRU8sT0FBYTtZQUVsQixPQUFPQSxpQkFBaUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFOztnQkFBMEIs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
@@ -1 +1 @@
1
- (()=>{"use strict";let e,t,n;function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class l{cancel(){return __ElementAnimate(this.effect.target.element,[3,this.id])}pause(){return __ElementAnimate(this.effect.target.element,[2,this.id])}play(){return __ElementAnimate(this.effect.target.element,[1,this.id])}start(){return __ElementAnimate(this.effect.target.element,[0,this.id,this.effect.keyframes,this.effect.options])}constructor(e){r(this,"effect",void 0),r(this,"id",void 0),this.effect=e,this.id="__lynx-inner-js-animation-"+l.count++,this.start()}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}r(l,"count",0);class o{constructor(e,t,n){i(this,"target",void 0),i(this,"keyframes",void 0),i(this,"options",void 0),this.target=e,this.keyframes=t,this.options=n}}let a=!1,u=!0;class s{setAttribute(e,t){__SetAttribute(this.element,e,t),this.flushElementTree()}setStyleProperty(e,t){__AddInlineStyle(this.element,e,t),this.flushElementTree()}setStyleProperties(e){for(let t in e)__AddInlineStyle(this.element,t,e[t]);this.flushElementTree()}getAttribute(e){return __GetAttributeByName(this.element,e)}getAttributeNames(){return __GetAttributeNames(this.element)}querySelector(e){let t=__QuerySelector(this.element,e,{});return t?new s(t):null}querySelectorAll(e){return __QuerySelectorAll(this.element,e,{}).map(e=>new s(e))}animate(e,t){return new l(new o(this,e,"number"==typeof t?{duration:t}:null!=t?t:{}))}invoke(e,t){return new Promise((n,r)=>{__InvokeUIMethod(this.element,e,null!=t?t:{},e=>{0===e.code?n(e.data):r(Error("UI method invoke: "+JSON.stringify(e)))}),this.flushElementTree()})}flushElementTree(){!a&&u&&(a=!0,Promise.resolve().then(()=>{a=!1,__FlushElementTree()}))}constructor(e){!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"element",void 0),Object.defineProperty(this,"element",{get:()=>e})}}class c{static get(){return null!=c.pageElement||(c.pageElement=__GetPageElement()),c.pageElement}}function d(e){let t=__QuerySelector(c.get(),e,{});return t?new s(t):null}function f(e){return __QuerySelectorAll(c.get(),e,{}).map(e=>new s(e))}function m(e,t){var n;let r=(null!=(n=SystemInfo.lynxSdkVersion)?n:"1.0").split(".");return Number(r[0])>e||Number(r[0])==e&&Number(r[1])>t}!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(c,"pageElement",void 0);var y=function(e){return e.runWorkletCtx="Lynx.Worklet.runWorkletCtx",e.runOnBackground="Lynx.Worklet.runOnBackground",e.FunctionCallRet="Lynx.Worklet.FunctionCallRet",e.releaseBackgroundWorkletCtx="Lynx.Worklet.releaseBackgroundWorkletCtx",e.releaseWorkletRef="Lynx.Worklet.releaseWorkletRef",e}(y||{});function h(e,t,n){let r;try{r=runWorklet(e,t)}finally{lynx.getJSContext().dispatchEvent({type:y.FunctionCallRet,data:JSON.stringify({resolveId:n,returnValue:r})})}}let _=(e,t)=>({current:t,_wvid:e}),k=t=>{let n,r=t._wvid;return r<0?(n=e._firstScreenWorkletRefMap[r])||(n=e._firstScreenWorkletRefMap[r]=_(r,t._initValue)):n=e._workletRefMap[r],n};function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function g(e,t,n){lynxWorkletImpl._workletMap[t]=n}let I=new WeakMap;function x(e,t){if("object"!=typeof e||null===e)return e;if(t){let t=I.get(e);if(t)return t}let n={main:e};return v(n,0,e),t&&I.set(e,n.main),n.main}let v=(e,t,n)=>{if(++t>=1e3)throw Error("Depth of value exceeds limit of 1000.");if("object"==typeof e&&null!==e)for(let l in e){let i=e[l];if("object"==typeof i&&null!==i){if("elementRefptr"in i){e[l]=new s(i.elementRefptr);continue}if(!(i instanceof s)){if(v(i,t,n),"_wvid"in i){e[l]=k(i);continue}if("_wkltId"in i){e[l]=lynxWorkletImpl._workletMap[i._wkltId].bind({...i}),e[l].ctx=i;continue}if("_jsFnId"in i){var r;i._execId=n._execId,null==(r=lynxWorkletImpl._jsFunctionLifecycleManager)||r.addRef(n._execId,i);continue}}}}};void 0===globalThis.lynxWorkletImpl&&(globalThis.lynxWorkletImpl={_workletMap:{},_refImpl:e={_workletRefMap:{},_firstScreenWorkletRefMap:{},updateWorkletRef:function(e,t){k(e).current=t?new s(t):null},updateWorkletRefInitValueChanges:function(t){t.forEach(([t,n])=>{e._workletRefMap[t]||(e._workletRefMap[t]=_(t,n))})},clearFirstScreenWorkletRefMap:function(){e._firstScreenWorkletRefMap={}}},_runOnBackgroundDelayImpl:t={delayedBackgroundFunctionArray:[],delayRunOnBackground:function(e,n){var r;t.delayedBackgroundFunctionArray.push({task:n}),(null!=(r=e._delayIndices)?r:e._delayIndices=[]).push(t.delayedBackgroundFunctionArray.length-1)},runDelayedBackgroundFunctions:function(){for(let e of t.delayedBackgroundFunctionArray)e.jsFnHandle&&e.task(e.jsFnHandle._jsFnId,e.jsFnHandle._execId);t.delayedBackgroundFunctionArray.length=0}},_hydrateCtx:function(e,t){(function e(t,n,r){if(t&&"object"==typeof t&&n&&"object"==typeof n&&(!t._wkltId||t._wkltId===n._wkltId))for(let o in t)if("_wvid"===o){var l,i;l=t[o],"_initValue"in(i=n)||(lynxWorkletImpl._refImpl._workletRefMap[l].current=i.current)}else if("_jsFn"===o)!function(e,t,n){for(let r in e){let l=e[r],i=t[r];if(null==i?void 0:i._delayIndices)for(let e of i._delayIndices){let t=lynxWorkletImpl._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[e];l._execId=n,t.jsFnHandle=l}}}(t[o],n[o],r);else{let l="function"==typeof n[o]?n[o].ctx:n[o];e(t[o],l,r)}})(e,t,e._execId)},_eventDelayImpl:n={_delayedWorkletParamsMap:new Map,runDelayedWorklet:function(e,t){(()=>{let r=n._delayedWorkletParamsMap.get(e._wkltId);if(void 0===r)return;let l=[];r.forEach(n=>{var r;let i=n[0];(null==i||null==(r=i.currentTarget)?void 0:r.elementRefptr)===t?setTimeout(()=>{runWorklet(e,n)},0):l.push(n)}),n._delayedWorkletParamsMap.set(e._wkltId,l)})()},clearDelayedWorklets:function(){n._delayedWorkletParamsMap.clear()}},_eomImpl:{setShouldFlush:function(e){u=e}},_runRunOnMainThreadTask:h},m(2,15)&&(globalThis.lynxWorkletImpl._jsFunctionLifecycleManager=new class e{addRef(e,t){var n;this.execIdRefCount.set(e,(null!=(n=this.execIdRefCount.get(e))?n:0)+1),this.registry.register(t,e)}removeRef(e){let t=this.execIdRefCount.get(e);if(t>1)return void this.execIdRefCount.set(e,t-1);this.execIdRefCount.delete(e),this.execIdSetToFire.add(e),this.willFire||(this.willFire=!0,Promise.resolve().then(()=>{this.fire()}))}fire(){lynx.getJSContext().dispatchEvent({type:y.releaseBackgroundWorkletCtx,data:Array.from(this.execIdSetToFire)}),this.execIdSetToFire.clear(),this.willFire=!1}constructor(){p(this,"execIdRefCount",new Map),p(this,"execIdSetToFire",new Set),p(this,"willFire",!1),p(this,"registry",void 0),this.registry=new FinalizationRegistry(this.removeRef.bind(this))}}),globalThis.registerWorklet=g,globalThis.registerWorkletInternal=g,globalThis.runWorklet=function(e,t){var r,l;if(!("object"==typeof(r=e)&&null!==r&&("_wkltId"in r||"_lepusWorkletHash"in r)))return void console.warn("Worklet: Invalid worklet object: "+JSON.stringify(e));if("_lepusWorkletHash"in e){return void(l=e._lepusWorkletHash,(()=>{let e=n._delayedWorkletParamsMap,r=e.get(l);r?r.push(t):e.set(l,[t])})())}return function(e,t){let n=(e._wkltId,x(e,!0)),r=x(t||[],!1);return n(...r)}(e,t)},function(){var e;lynx.querySelector=d,lynx.querySelectorAll=f,globalThis.setTimeout=lynx.setTimeout,globalThis.setInterval=lynx.setInterval,globalThis.clearTimeout=lynx.clearTimeout,globalThis.clearInterval=null!=(e=lynx.clearInterval)?e:lynx.clearTimeInterval;{let e=lynx.requestAnimationFrame;lynx.requestAnimationFrame=globalThis.requestAnimationFrame=t=>{if(!m(2,15))throw Error("requestAnimationFrame in main thread script requires Lynx sdk version 2.16");return e(t)}}globalThis.cancelAnimationFrame=lynx.cancelAnimationFrame}(),function(){let t=lynx.getJSContext();t.addEventListener(y.runWorkletCtx,e=>{let t=JSON.parse(e.data);h(t.worklet,t.params,t.resolveId)}),t.addEventListener(y.releaseWorkletRef,t=>{var n;n=t.data.id,delete e._workletRefMap[n]})}())})();
1
+ (()=>{"use strict";let e,t,n;function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class l{cancel(){return __ElementAnimate(this.effect.target.element,[3,this.id])}pause(){return __ElementAnimate(this.effect.target.element,[2,this.id])}play(){return __ElementAnimate(this.effect.target.element,[1,this.id])}start(){return __ElementAnimate(this.effect.target.element,[0,this.id,this.effect.keyframes,this.effect.options])}constructor(e){r(this,"effect",void 0),r(this,"id",void 0),this.effect=e,this.id="__lynx-inner-js-animation-"+l.count++,this.start()}}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}r(l,"count",0);class o{constructor(e,t,n){i(this,"target",void 0),i(this,"keyframes",void 0),i(this,"options",void 0),this.target=e,this.keyframes=t,this.options=n}}let a=!1,s=!0;class u{setAttribute(e,t){__SetAttribute(this.element,e,t),this.flushElementTree()}setStyleProperty(e,t){__AddInlineStyle(this.element,e,t),this.flushElementTree()}setStyleProperties(e){for(let t in e)__AddInlineStyle(this.element,t,e[t]);this.flushElementTree()}getAttribute(e){return __GetAttributeByName(this.element,e)}getAttributeNames(){return __GetAttributeNames(this.element)}querySelector(e){let t=__QuerySelector(this.element,e,{});return t?new u(t):null}querySelectorAll(e){return __QuerySelectorAll(this.element,e,{}).map(e=>new u(e))}animate(e,t){return new l(new o(this,e,"number"==typeof t?{duration:t}:null!=t?t:{}))}invoke(e,t){return new Promise((n,r)=>{__InvokeUIMethod(this.element,e,null!=t?t:{},e=>{0===e.code?n(e.data):r(Error("UI method invoke: "+JSON.stringify(e)))}),this.flushElementTree()})}flushElementTree(){!a&&s&&(a=!0,Promise.resolve().then(()=>{a=!1,__FlushElementTree()}))}constructor(e){!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(this,"element",void 0),Object.defineProperty(this,"element",{get:()=>e})}}class c{static get(){return null!=c.pageElement||(c.pageElement=__GetPageElement()),c.pageElement}}function d(e){let t=__QuerySelector(c.get(),e,{});return t?new u(t):null}function f(e){return __QuerySelectorAll(c.get(),e,{}).map(e=>new u(e))}function m(e,t){var n;let r=(null!=(n=SystemInfo.lynxSdkVersion)?n:"1.0").split(".");return Number(r[0])>e||Number(r[0])==e&&Number(r[1])>t}function y(e,t,n){let r;try{r=runWorklet(e,t)}finally{lynx.getJSContext().dispatchEvent({type:"Lynx.Worklet.FunctionCallRet",data:JSON.stringify({resolveId:n,returnValue:r})})}}!function(e,t,n){t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n}(c,"pageElement",void 0);let h=(e,t)=>({current:t,_wvid:e}),_=t=>{let n,r=t._wvid;return r<0?(n=e._firstScreenWorkletRefMap[r])||(n=e._firstScreenWorkletRefMap[r]=h(r,t._initValue)):n=e._workletRefMap[r],n};function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function k(e,t,n){lynxWorkletImpl._workletMap[t]=n}let g=new WeakMap;function I(e,t){if("object"!=typeof e||null===e)return e;if(t){let t=g.get(e);if(t)return t}let n={main:e};return v(n,0,e),t&&g.set(e,n.main),n.main}let v=(e,t,n)=>{if(++t>=1e3)throw Error("Depth of value exceeds limit of 1000.");if("object"==typeof e&&null!==e)for(let l in e){let i=e[l];if("object"==typeof i&&null!==i){if("elementRefptr"in i){e[l]=new u(i.elementRefptr);continue}if(!(i instanceof u)){if(v(i,t,n),"_wvid"in i){e[l]=_(i);continue}if("_wkltId"in i){e[l]=lynxWorkletImpl._workletMap[i._wkltId].bind({...i}),e[l].ctx=i;continue}if("_jsFnId"in i){var r;i._execId=n._execId,null==(r=lynxWorkletImpl._jsFunctionLifecycleManager)||r.addRef(n._execId,i);continue}}}}};void 0===globalThis.lynxWorkletImpl&&(globalThis.lynxWorkletImpl={_workletMap:{},_refImpl:e={_workletRefMap:{},_firstScreenWorkletRefMap:{},updateWorkletRef:function(e,t){_(e).current=t?new u(t):null},updateWorkletRefInitValueChanges:function(t){t.forEach(([t,n])=>{e._workletRefMap[t]||(e._workletRefMap[t]=h(t,n))})},clearFirstScreenWorkletRefMap:function(){e._firstScreenWorkletRefMap={}}},_runOnBackgroundDelayImpl:t={delayedBackgroundFunctionArray:[],delayRunOnBackground:function(e,n){var r;t.delayedBackgroundFunctionArray.push({task:n}),(null!=(r=e._delayIndices)?r:e._delayIndices=[]).push(t.delayedBackgroundFunctionArray.length-1)},runDelayedBackgroundFunctions:function(){for(let e of t.delayedBackgroundFunctionArray)e.jsFnHandle&&e.task(e.jsFnHandle._jsFnId,e.jsFnHandle._execId);t.delayedBackgroundFunctionArray.length=0}},_hydrateCtx:function(e,t){(function e(t,n,r){if(t&&"object"==typeof t&&n&&"object"==typeof n&&(!t._wkltId||t._wkltId===n._wkltId))for(let o in t)if("_wvid"===o){var l,i;l=t[o],"_initValue"in(i=n)||(lynxWorkletImpl._refImpl._workletRefMap[l].current=i.current)}else if("_jsFn"===o)!function(e,t,n){for(let r in e){let l=e[r],i=t[r];if(null==i?void 0:i._delayIndices)for(let e of i._delayIndices){let t=lynxWorkletImpl._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[e];l._execId=n,t.jsFnHandle=l}}}(t[o],n[o],r);else{let l="function"==typeof n[o]?n[o].ctx:n[o];e(t[o],l,r)}})(e,t,e._execId)},_eventDelayImpl:n={_delayedWorkletParamsMap:new Map,runDelayedWorklet:function(e,t){(()=>{let r=n._delayedWorkletParamsMap.get(e._wkltId);if(void 0===r)return;let l=[];r.forEach(n=>{var r;let i=n[0];(null==i||null==(r=i.currentTarget)?void 0:r.elementRefptr)===t?setTimeout(()=>{runWorklet(e,n)},0):l.push(n)}),n._delayedWorkletParamsMap.set(e._wkltId,l)})()},clearDelayedWorklets:function(){n._delayedWorkletParamsMap.clear()}},_eomImpl:{setShouldFlush:function(e){s=e}},_runRunOnMainThreadTask:y},m(2,15)&&(globalThis.lynxWorkletImpl._jsFunctionLifecycleManager=new class e{addRef(e,t){var n;this.execIdRefCount.set(e,(null!=(n=this.execIdRefCount.get(e))?n:0)+1),this.registry.register(t,e)}removeRef(e){let t=this.execIdRefCount.get(e);if(t>1)return void this.execIdRefCount.set(e,t-1);this.execIdRefCount.delete(e),this.execIdSetToFire.add(e),this.willFire||(this.willFire=!0,Promise.resolve().then(()=>{this.fire()}))}fire(){lynx.getJSContext().dispatchEvent({type:"Lynx.Worklet.releaseBackgroundWorkletCtx",data:Array.from(this.execIdSetToFire)}),this.execIdSetToFire.clear(),this.willFire=!1}constructor(){p(this,"execIdRefCount",new Map),p(this,"execIdSetToFire",new Set),p(this,"willFire",!1),p(this,"registry",void 0),this.registry=new FinalizationRegistry(this.removeRef.bind(this))}}),globalThis.registerWorklet=k,globalThis.registerWorkletInternal=k,globalThis.runWorklet=function(e,t){var r,l;if(!("object"==typeof(r=e)&&null!==r&&("_wkltId"in r||"_lepusWorkletHash"in r)))return void console.warn("Worklet: Invalid worklet object: "+JSON.stringify(e));if("_lepusWorkletHash"in e){return void(l=e._lepusWorkletHash,(()=>{let e=n._delayedWorkletParamsMap,r=e.get(l);r?r.push(t):e.set(l,[t])})())}return function(e,t){let n=(e._wkltId,I(e,!0)),r=I(t||[],!1);return n(...r)}(e,t)},function(){var e;lynx.querySelector=d,lynx.querySelectorAll=f,globalThis.setTimeout=lynx.setTimeout,globalThis.setInterval=lynx.setInterval,globalThis.clearTimeout=lynx.clearTimeout,globalThis.clearInterval=null!=(e=lynx.clearInterval)?e:lynx.clearTimeInterval;{let e=lynx.requestAnimationFrame;lynx.requestAnimationFrame=globalThis.requestAnimationFrame=t=>{if(!m(2,15))throw Error("requestAnimationFrame in main thread script requires Lynx sdk version 2.16");return e(t)}}globalThis.cancelAnimationFrame=lynx.cancelAnimationFrame}(),function(){let t=lynx.getJSContext();t.addEventListener("Lynx.Worklet.runWorkletCtx",e=>{let t=JSON.parse(e.data);y(t.worklet,t.params,t.resolveId)}),t.addEventListener("Lynx.Worklet.releaseWorkletRef",t=>{var n;n=t.data.id,delete e._workletRefMap[n]})}())})();