obsidian-dev-utils 97.0.0 → 98.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +624 -483
- package/dist/lib/cjs/__merged.cjs +14 -9
- package/dist/lib/cjs/__merged.d.cts +2 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +2 -1
- package/dist/lib/esm/__merged.mjs +16 -10
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -212,127 +212,6 @@ class ResourceLockEventsComponent extends import_component_ex.ComponentEx {
|
|
|
212
212
|
}));
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
|
-
class ResourceLockMutationBlockerComponent extends import_monkey_around_component.MonkeyAroundComponent {
|
|
216
|
-
shouldBlockMutation;
|
|
217
|
-
constructor(params) {
|
|
218
|
-
super();
|
|
219
|
-
this.shouldBlockMutation = params.shouldBlockMutation;
|
|
220
|
-
}
|
|
221
|
-
onload() {
|
|
222
|
-
super.onload();
|
|
223
|
-
this.registerMethodPatch({
|
|
224
|
-
$object: import_obsidian.Vault.prototype,
|
|
225
|
-
methodName: "append",
|
|
226
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
227
|
-
this.assertNotBlocked([file.path]);
|
|
228
|
-
return fallback();
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
this.registerMethodPatch({
|
|
232
|
-
$object: import_obsidian.Vault.prototype,
|
|
233
|
-
methodName: "copy",
|
|
234
|
-
patchHandler: ({ fallback, originalArguments: [, newPath] }) => {
|
|
235
|
-
this.assertNotBlocked([newPath]);
|
|
236
|
-
return fallback();
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
this.registerMethodPatch({
|
|
240
|
-
$object: import_obsidian.Vault.prototype,
|
|
241
|
-
methodName: "create",
|
|
242
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
243
|
-
this.assertNotBlocked([path]);
|
|
244
|
-
return fallback();
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
this.registerMethodPatch({
|
|
248
|
-
$object: import_obsidian.Vault.prototype,
|
|
249
|
-
methodName: "createBinary",
|
|
250
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
251
|
-
this.assertNotBlocked([path]);
|
|
252
|
-
return fallback();
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
this.registerMethodPatch({
|
|
256
|
-
$object: import_obsidian.Vault.prototype,
|
|
257
|
-
methodName: "createFolder",
|
|
258
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
259
|
-
this.assertNotBlocked([path]);
|
|
260
|
-
return fallback();
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
this.registerMethodPatch({
|
|
264
|
-
$object: import_obsidian.Vault.prototype,
|
|
265
|
-
methodName: "delete",
|
|
266
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
267
|
-
this.assertNotBlocked([file.path]);
|
|
268
|
-
return fallback();
|
|
269
|
-
}
|
|
270
|
-
});
|
|
271
|
-
this.registerMethodPatch({
|
|
272
|
-
$object: import_obsidian.Vault.prototype,
|
|
273
|
-
methodName: "modify",
|
|
274
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
275
|
-
this.assertNotBlocked([file.path]);
|
|
276
|
-
return fallback();
|
|
277
|
-
}
|
|
278
|
-
});
|
|
279
|
-
this.registerMethodPatch({
|
|
280
|
-
$object: import_obsidian.Vault.prototype,
|
|
281
|
-
methodName: "modifyBinary",
|
|
282
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
283
|
-
this.assertNotBlocked([file.path]);
|
|
284
|
-
return fallback();
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
this.registerMethodPatch({
|
|
288
|
-
$object: import_obsidian.Vault.prototype,
|
|
289
|
-
methodName: "process",
|
|
290
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
291
|
-
this.assertNotBlocked([file.path]);
|
|
292
|
-
return fallback();
|
|
293
|
-
}
|
|
294
|
-
});
|
|
295
|
-
this.registerMethodPatch({
|
|
296
|
-
$object: import_obsidian.Vault.prototype,
|
|
297
|
-
methodName: "rename",
|
|
298
|
-
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
299
|
-
this.assertNotBlocked([file.path, newPath]);
|
|
300
|
-
return fallback();
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
this.registerMethodPatch({
|
|
304
|
-
$object: import_obsidian.Vault.prototype,
|
|
305
|
-
methodName: "trash",
|
|
306
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
307
|
-
this.assertNotBlocked([file.path]);
|
|
308
|
-
return fallback();
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
this.registerMethodPatch({
|
|
312
|
-
$object: import_obsidian.FileManager.prototype,
|
|
313
|
-
methodName: "renameFile",
|
|
314
|
-
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
315
|
-
this.assertNotBlocked([file.path, newPath]);
|
|
316
|
-
return fallback();
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
this.registerMethodPatch({
|
|
320
|
-
$object: import_obsidian.FileManager.prototype,
|
|
321
|
-
methodName: "trashFile",
|
|
322
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
323
|
-
this.assertNotBlocked([file.path]);
|
|
324
|
-
return fallback();
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
assertNotBlocked(paths) {
|
|
329
|
-
for (const path of paths) {
|
|
330
|
-
if (this.shouldBlockMutation(path)) {
|
|
331
|
-
throw new ResourceLockedError(path);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
215
|
class ResourceLockManager {
|
|
337
216
|
beeper = new import_beeper.Beeper();
|
|
338
217
|
// The inner sets are mutable so a rename can re-key the paths of an in-flight bypass scope in place;
|
|
@@ -927,6 +806,127 @@ ${entry.operationName}`;
|
|
|
927
806
|
}, { once: true });
|
|
928
807
|
}
|
|
929
808
|
}
|
|
809
|
+
class ResourceLockMutationBlockerComponent extends import_monkey_around_component.MonkeyAroundComponent {
|
|
810
|
+
shouldBlockMutation;
|
|
811
|
+
constructor(params) {
|
|
812
|
+
super();
|
|
813
|
+
this.shouldBlockMutation = params.shouldBlockMutation;
|
|
814
|
+
}
|
|
815
|
+
onload() {
|
|
816
|
+
super.onload();
|
|
817
|
+
this.registerMethodPatch({
|
|
818
|
+
$object: import_obsidian.Vault.prototype,
|
|
819
|
+
methodName: "append",
|
|
820
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
821
|
+
this.assertNotBlocked([file.path]);
|
|
822
|
+
return fallback();
|
|
823
|
+
}
|
|
824
|
+
});
|
|
825
|
+
this.registerMethodPatch({
|
|
826
|
+
$object: import_obsidian.Vault.prototype,
|
|
827
|
+
methodName: "copy",
|
|
828
|
+
patchHandler: ({ fallback, originalArguments: [, newPath] }) => {
|
|
829
|
+
this.assertNotBlocked([newPath]);
|
|
830
|
+
return fallback();
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
this.registerMethodPatch({
|
|
834
|
+
$object: import_obsidian.Vault.prototype,
|
|
835
|
+
methodName: "create",
|
|
836
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
837
|
+
this.assertNotBlocked([path]);
|
|
838
|
+
return fallback();
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
this.registerMethodPatch({
|
|
842
|
+
$object: import_obsidian.Vault.prototype,
|
|
843
|
+
methodName: "createBinary",
|
|
844
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
845
|
+
this.assertNotBlocked([path]);
|
|
846
|
+
return fallback();
|
|
847
|
+
}
|
|
848
|
+
});
|
|
849
|
+
this.registerMethodPatch({
|
|
850
|
+
$object: import_obsidian.Vault.prototype,
|
|
851
|
+
methodName: "createFolder",
|
|
852
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
853
|
+
this.assertNotBlocked([path]);
|
|
854
|
+
return fallback();
|
|
855
|
+
}
|
|
856
|
+
});
|
|
857
|
+
this.registerMethodPatch({
|
|
858
|
+
$object: import_obsidian.Vault.prototype,
|
|
859
|
+
methodName: "delete",
|
|
860
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
861
|
+
this.assertNotBlocked([file.path]);
|
|
862
|
+
return fallback();
|
|
863
|
+
}
|
|
864
|
+
});
|
|
865
|
+
this.registerMethodPatch({
|
|
866
|
+
$object: import_obsidian.Vault.prototype,
|
|
867
|
+
methodName: "modify",
|
|
868
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
869
|
+
this.assertNotBlocked([file.path]);
|
|
870
|
+
return fallback();
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
this.registerMethodPatch({
|
|
874
|
+
$object: import_obsidian.Vault.prototype,
|
|
875
|
+
methodName: "modifyBinary",
|
|
876
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
877
|
+
this.assertNotBlocked([file.path]);
|
|
878
|
+
return fallback();
|
|
879
|
+
}
|
|
880
|
+
});
|
|
881
|
+
this.registerMethodPatch({
|
|
882
|
+
$object: import_obsidian.Vault.prototype,
|
|
883
|
+
methodName: "process",
|
|
884
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
885
|
+
this.assertNotBlocked([file.path]);
|
|
886
|
+
return fallback();
|
|
887
|
+
}
|
|
888
|
+
});
|
|
889
|
+
this.registerMethodPatch({
|
|
890
|
+
$object: import_obsidian.Vault.prototype,
|
|
891
|
+
methodName: "rename",
|
|
892
|
+
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
893
|
+
this.assertNotBlocked([file.path, newPath]);
|
|
894
|
+
return fallback();
|
|
895
|
+
}
|
|
896
|
+
});
|
|
897
|
+
this.registerMethodPatch({
|
|
898
|
+
$object: import_obsidian.Vault.prototype,
|
|
899
|
+
methodName: "trash",
|
|
900
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
901
|
+
this.assertNotBlocked([file.path]);
|
|
902
|
+
return fallback();
|
|
903
|
+
}
|
|
904
|
+
});
|
|
905
|
+
this.registerMethodPatch({
|
|
906
|
+
$object: import_obsidian.FileManager.prototype,
|
|
907
|
+
methodName: "renameFile",
|
|
908
|
+
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
909
|
+
this.assertNotBlocked([file.path, newPath]);
|
|
910
|
+
return fallback();
|
|
911
|
+
}
|
|
912
|
+
});
|
|
913
|
+
this.registerMethodPatch({
|
|
914
|
+
$object: import_obsidian.FileManager.prototype,
|
|
915
|
+
methodName: "trashFile",
|
|
916
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
917
|
+
this.assertNotBlocked([file.path]);
|
|
918
|
+
return fallback();
|
|
919
|
+
}
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
assertNotBlocked(paths) {
|
|
923
|
+
for (const path of paths) {
|
|
924
|
+
if (this.shouldBlockMutation(path)) {
|
|
925
|
+
throw new ResourceLockedError(path);
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
930
|
class ResourceLockComponent extends import_component_ex.ComponentEx {
|
|
931
931
|
/**
|
|
932
932
|
* The Obsidian app instance.
|
|
@@ -1110,4 +1110,4 @@ function rebasePath(path, oldPath, newPath) {
|
|
|
1110
1110
|
requestResourceUnlockForPath,
|
|
1111
1111
|
unlockResourceForPath
|
|
1112
1112
|
});
|
|
1113
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgTWFya2Rvd25WaWV3LFxuICBNZW51LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uL2JlZXBlci50cyc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Rpc3Bvc2FibGUsXG4gIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yXG59IGZyb20gJy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdG9nZ2xlRWRpdG9yUmVhZE9ubHkgfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4vbW9kYWxzL2NvbmZpcm0udHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbmNvbnN0IExPQ0tfSUNPTl9JRCA9ICdsb2NrJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3InO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvci1mbGFzaCc7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5jb25zdCBVTkxPQ0tfSUNPTl9JRCA9ICd1bmxvY2snO1xuY29uc3QgTUlERExFX01PVVNFX0JVVFRPTiA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0YWtpbmcgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgKS4gU2hvd24gbmV4dCB0b1xuICAgKiB0aGUgcGx1Z2luIG5hbWUgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gYSBsb2NrIGluZGljYXRvciBpcyBjbGlja2VkICh3aXRoXG4gICAqIGFueSBtb3VzZSBidXR0b24pIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2ssIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgcnVucywgb3JcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0gLyB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkXG4gICAqIGZvciB0aGUgcGF0aCwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmLiBVbmxlc3NcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0fSBpcyBzZXQsIHRoZSBvcGVyYXRpb24gaXNcbiAgICogZXhwZWN0ZWQgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuIFdoZW4gb21pdHRlZCwgYW4gdW5sb2NrIHN0aWxsIHJlbGVhc2VzIHRoZSBsb2NrIGJ1dFxuICAgKiBjYW5ub3QgY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBzY29wZS4gYCdzdWJ0cmVlJ2AgYWxzbyBsb2NrcyBldmVyeSBkZXNjZW5kYW50IG9mIGEgZm9sZGVyIHBhdGg7IGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlXG4gICAqIGV4YWN0IHBhdGguIEEgYHN1YnRyZWVgIGxvY2sgbXVzdCBiZSByZWxlYXNlZCB2aWEgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAobm90IHRoZVxuICAgKiBleHBsaWNpdCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnVubG9ja0ZvclBhdGh9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdmaWxlJ2BcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiB1bmxvY2sgb2YgdGhlIGxvY2sgaXMgcmVxdWVzdGVkIFx1MjAxNCBpLmUuIHdoZW4gdGhlXG4gICAqIGxvY2sncyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkIChieSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgXCJVbmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSxcbiAgICogb3Ige0BsaW5rIGhhbmRsZUV4dGVybmFsTXV0YXRpb259KS4gVXNlIGl0IHRvIGNsZWFyIGNvbnN1bWVyLXNpZGUgc3RhdGUgdGhhdCBzaGFkb3dzIHRoZSBsb2NrIChlLmcuXG4gICAqIGEgcGVuZGluZy1vcGVyYXRpb24gYnVmZmVyIG9yIGEgbm90aWNlKSB3aXRob3V0IGhhbmQtd2lyaW5nIGFuIGBhYm9ydGAgbGlzdGVuZXIuIEZpcmVzIGF0IG1vc3Qgb25jZS5cbiAgICovXG4gIG9uVW5sb2NrUmVxdWVzdGVkPyh0aGlzOiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCwgYCdNZXJnZVxuICAgKiBub3RlcydgKS4gSXQgaXMgc2hvd24gXHUyMDE0IG5leHQgdG8gdGhlIGxvY2tpbmcgcGx1Z2luJ3MgbmFtZSBcdTIwMTQgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLCBzb1xuICAgKiB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hpY2ggb3BlcmF0aW9uIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IFx1MjAxNCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIHJlbGVhc2VzIGl0c2VsZiB0aGUgbW9tZW50IGl0c1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbiAgICogdGhlIG93bmluZyBvcGVyYXRpb24gdG8gcmVsZWFzZSBpdCBpbiBpdHMgb3duIGNsZWFudXAuIFVzZSBpdCBmb3IgYSBsb2NrIGhlbGQgKippbmRlZmluaXRlbHkqKlxuICAgKiBvdXRzaWRlIGEgYHVzaW5nYCBzY29wZSAoc28gdGhlcmUgaXMgbm8gYGZpbmFsbHlgIHRvIHJlbGVhc2UgaXQpIFx1MjAxNCBlLmcuIGEgbG9jayB0aGF0IHN0YXlzIHVudGlsIHRoZVxuICAgKiB1c2VyIGV4cGxpY2l0bHkgdW5sb2Nrcy4gTGVhdmUgaXQgYGZhbHNlYCBmb3IgYSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGhvbGRzIHRoZSBsb2NrIHRocm91Z2hcbiAgICogaXRzIG93biBhYm9ydC1kcml2ZW4gcm9sbGJhY2sgYW5kIHJlbGVhc2VzIGl0IHZpYSBgdXNpbmdgIGF0IHNjb3BlIGV4aXQuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tEZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBlbnRyeSBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1bmRlci4gRGVsaWJlcmF0ZWx5IG11dGFibGU6IGEgcmVuYW1lIHJlLWtleXMgdGhlXG4gICAqIHJlZ2lzdHJ5LCBhbmQgcmVsZWFzZSBtdXN0IGZpbmQgdGhlIGVudHJ5IGF0IGl0cyBDVVJSRU5UIHBhdGggXHUyMDE0IGEgcmVsZWFzZSB0aGF0IGNhcHR1cmVkIHRoZSBwYXRoXG4gICAqIGF0IGxvY2sgdGltZSB3b3VsZCBzaWxlbnRseSBuby1vcCBhZnRlciB0aGUgcmVzb3VyY2UgbW92ZWQsIGxlYWtpbmcgdGhlIGxvY2sgZm9yZXZlci5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIGRpc3Bvc2VUeXBlTGlzdGVuZXIoKTogdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICBvbkNoYW5nZSh0aGlzOiB2b2lkKTogdm9pZDtcbiAgb25FeHRlcm5hbE11dGF0aW9uKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG4gIG9uUmVuYW1lKHRoaXM6IHZvaWQsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub25DaGFuZ2UgPSBwYXJhbXMub25DaGFuZ2U7XG4gICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24gPSBwYXJhbXMub25FeHRlcm5hbE11dGF0aW9uO1xuICAgIHRoaXMub25GaWxlTWVudSA9IHBhcmFtcy5vbkZpbGVNZW51O1xuICAgIHRoaXMub25SZW5hbWUgPSBwYXJhbXMub25SZW5hbWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIFNhbWUtbGVhZiBuYXZpZ2F0aW9uIHRvIGFub3RoZXIgbm90ZSBmaXJlcyBubyBsZWFmL2xheW91dCBjaGFuZ2U7IHdpdGhvdXQgdGhpcyBpdCBzdGF5cyByZWFkLW9ubHkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIEFkZHMgYW4gXCJVbmxvY2tcIiBpdGVtIHRvIGEgbG9ja2VkIG5vdGUncyB0YWIvZmlsZSBjb250ZXh0IG1lbnUgKGFsb25nc2lkZSB0aGUgaW5kaWNhdG9yIG1lbnVzKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCB0aGlzLm9uRmlsZU1lbnUpKTtcbiAgICAvLyBFeHRlcm5hbC1jaGFuZ2UgYmFja3N0b3A6IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggbm90IGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBhbiBpbnRydWRlciAoYSBzeW5jL0ZTL2FkYXB0ZXIgY2hhbmdlIHRoYXQgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2gpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpOiB2b2lkID0+IHtcbiAgICAgIC8vIFJlLWtleSBGSVJTVCwgc28gdGhlIGNoZWNrcyBiZWxvdyBydW4gYWdhaW5zdCB3aGVyZSB0aGUgbG9ja3MgYWN0dWFsbHkgYXJlIG5vdy5cbiAgICAgIC8vIEludHJ1ZGVyIGRldGVjdGlvbiBpcyB1bmFmZmVjdGVkOiB0aGUgb2xkIHBhdGggc3RvcHMgcmVzb2x2aW5nLCBidXQgdGhlIG5ldyBvbmUgaXMgY292ZXJlZCBpbnN0ZWFkLlxuICAgICAgdGhpcy5vblJlbmFtZShvbGRQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgLy8gVGhlIGlubmVyIHNldHMgYXJlIG11dGFibGUgc28gYSByZW5hbWUgY2FuIHJlLWtleSB0aGUgcGF0aHMgb2YgYW4gaW4tZmxpZ2h0IGJ5cGFzcyBzY29wZSBpbiBwbGFjZTtcbiAgLy8gVGhlIHNjb3BlJ3MgYERpc3Bvc2FibGVgIGRlbGV0ZXMgYnkgc2V0IGlkZW50aXR5LCBzbyBtdXRhdGluZyB0aGUgY29udGVudHMgY2Fubm90IG9ycGhhbiBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICBwcml2YXRlIG11dGF0aW9uQmxvY2tlckNvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBieXBhc3MoYXBwOiBBcHAsIHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgYnlwYXNzZWRQYXRocyA9IG5ldyBTZXQocGF0aHNPckZpbGVzLm1hcCgocGF0aE9yRmlsZSkgPT4gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSk7XG4gICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5hZGQoYnlwYXNzZWRQYXRocyk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5kZWxldGUoYnlwYXNzZWRQYXRocyk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGguIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0IFx1MjAxNCB0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIFx1MjAxNCB0aGVuIGFib3J0cyBldmVyeVxuICAgKiB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSByZWdpc3RlcmVkIG9uIHRoYXQgb3duZXIgKGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbnMgdGhhdCB0b29rIHRoZSBsb2NrcylcbiAgICogQU5EIHJlbW92ZXMgdGhlIG93bmVyJ3MgbG9jayBlbnRyaWVzIChyZWxlYXNpbmcgdGhlIGxvY2sgdW5jb25kaXRpb25hbGx5KS4gVW5saWtlXG4gICAqIHtAbGluayByZXF1ZXN0VW5sb2NrfSwgd2hpY2ggb25seSBhYm9ydHMgdGhlIGV4YWN0IHBhdGgncyBjb250cm9sbGVycyBhbmQgcmVsaWVzIG9uIGVhY2ggb3BlcmF0aW9uXG4gICAqIHJlbGVhc2luZyBpdHMgb3duIGxvY2ssIHRoaXMgcmVzb2x2ZXMgYW5jZXN0b3IgY292ZXJhZ2UgYW5kIGFsd2F5cyByZWxlYXNlcyBcdTIwMTQgc28gYSBub3RlIGhlbGQgYnkgYW5cbiAgICogaW5kZWZpbml0ZWx5LWhlbGQgbG9jayBpcyBndWFyYW50ZWVkIHRvIGJlY29tZSBlZGl0YWJsZS4gQSBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyBmb3JjZVVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgb3duZXJQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvclxuICAgKiBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgY292ZXJlZCBieSBhIG11dGF0aW9uLWJsb2NraW5nIGxvY2sgKG9uZSB0YWtlbiB3aXRoXG4gICAqIGBibG9ja3NNdXRhdGlvbnNgKSBkaXJlY3RseSBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGV4YWN0RW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmIChleGFjdEVudHJpZXM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGxvY2socGFyYW1zOiBNYW5hZ2VyTG9ja1BhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMucGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cnk6IExvY2tFbnRyeSA9IHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlciA/PyBudWxsLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuYmxvY2tzTXV0YXRpb25zID8/IGZhbHNlLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUgPz8gJ2ZpbGUnLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCA/PyBudWxsLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnQgPz8gZmFsc2VcbiAgICB9O1xuICAgIGxldCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICBlbnRyaWVzID0gW107XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCBlbnRyaWVzKTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICBpZiAoZW50cnkuYmxvY2tzTXV0YXRpb25zKSB7XG4gICAgICB0aGlzLmVuc3VyZUJsb2NrZXJJbnN0YWxsZWQoYXBwKTtcbiAgICB9XG4gICAgdGhpcy53aXJlUmVsZWFzZU9uQWJvcnQoYXBwLCBlbnRyeSk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIHdoaWNoXG4gICAqIGNhbmNlbHMgdGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9jay4gRWFjaCBvcGVyYXRpb24gcmVsZWFzZXMgaXRzIG93biBsb2NrIGluIGl0cyBgZmluYWxseWBcbiAgICogd2hlbiBpdCBvYnNlcnZlcyB0aGUgYWJvcnQsIHNvIHRoaXMgZG9lcyBub3QgdW5sb2NrIHRoZSBwYXRoIGRpcmVjdGx5LiBBIG5vLW9wIHdoZW4gbm8gY29udHJvbGxlclxuICAgKiBpcyByZWdpc3RlcmVkIGZvciB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHVibGljIHVubG9ja0FsbEZvclBsdWdpbihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW3BhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgIT09IHBsdWdpbklkKTtcbiAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcubGVuZ3RoICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gb24gdGhlIGdpdmVuIChhbHJlYWR5LXJlc29sdmVkKSBvd25lciBwYXRoJ3MgbG9jayBlbnRyaWVzIFx1MjAxNFxuICAgKiBjYW5jZWxsaW5nIHRoZSBvd25pbmcgb3BlcmF0aW9ucyBcdTIwMTQgYW5kIHJlbW92ZXMgdGhvc2UgZW50cmllcywgcmVsZWFzaW5nIHRoZSBsb2NrLiBUaGUgZW50cmllc1xuICAgKiBzbmFwc2hvdCBpcyBjb3BpZWQgZmlyc3QgYmVjYXVzZSBhbiBlbnRyeSdzIGBzaG91bGRSZWxlYXNlT25BYm9ydGAgYWJvcnQgbGlzdGVuZXIgbXV0YXRlcyB0aGVcbiAgICogYXJyYXkgYXMgaXQgZmlyZXMuIEFsd2F5cyBsZWF2ZXMgdGhlIG93bmVyIHBhdGggd2l0aCBubyBlbnRyaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG93bmVyUGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgb3duZXIgcGF0aCB3aG9zZSBlbnRyaWVzIHRvIGFib3J0IGFuZCByZWxlYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcDogQXBwLCBvd25lclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChvd25lclBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QoZW50cmllcykpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUob3duZXJQYXRoKTtcbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtVGl0bGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyBgcGF0aGAgaXMgdGhlIHJlc29sdmVkIG93bmVyIHBhdGgsIHNvIGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBhbmQgcmVsZWFzZSB0aGUgbG9jayBvdXRyaWdodC5cbiAgICAgICAgICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICAvLyBUaGUgaW5kaWNhdG9ycyBvdXRsaXZlIGEgcmVuYW1lIG9mIHRoZSBub3RlIChvciBvZiBhbiBlbmNsb3NpbmcgbG9ja2VkIGZvbGRlciksIHNvIHRoZXkgcmVzb2x2ZVxuICAgIC8vIFRoZSBvd25lciBsb2NrIGF0IENMSUNLIHRpbWUgZnJvbSB0aGUgdmlldydzIGN1cnJlbnQgZmlsZSwgZXhhY3RseSBhcyB0aGUgc3RhdHVzLWJhciBpdGVtIGRvZXMuXG4gICAgLy8gQSBjYXB0dXJlZCBvd25lciBwYXRoIHdvdWxkIGdvIHN0YWxlIHRoZSBtb21lbnQgdGhlIGxvY2sgaXMgcmUta2V5ZWQuXG4gICAgY29uc3QgZ2V0T3duZXJQYXRoID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB0aGlzLnJlc29sdmVWaWV3T3duZXJQYXRoKGFwcCwgdmlldyk7XG5cbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0YWJJY29uRWwsIGdldE93bmVyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9LFxuICAgICAgb25SZW5hbWU6IChvbGRQYXRoLCBuZXdQYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuYW1lKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbGVtZW50LmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkgXHUyMDE0IGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgICAvLyBUaGUgdG9nZ2xlIGlzIGlkZW1wb3RlbnQsIHNvIHJlLWFwcGx5aW5nIHRvIGFuIGFscmVhZHktbG9ja2VkIHZpZXcgaXMgY2hlYXAuXG4gICAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKHZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgIGluZGljYXRvcnMuZGlzcG9zZVR5cGVMaXN0ZW5lcigpO1xuICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZUFuZENsZWFudXAoYXBwOiBBcHApOiB2b2lkIHtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIGlmICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclVubG9ja01lbnUoYXBwOiBBcHAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudCgkZXZlbnQpO1xuICAgIH07XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb3BlblVubG9ja01lbnUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudSgkZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgQ1VSUkVOVCBwYXRoLCBub3Qgb25lIGNhcHR1cmVkIHdoZW4gdGhlIGxvY2sgd2FzIHRha2VuOiBhIHJlbmFtZSBtYXkgaGF2ZVxuICAgIC8vIFJlLWtleWVkIGl0IHNpbmNlLCBhbmQgbG9va2luZyBpdCB1cCB1bmRlciB0aGUgb2xkIHBhdGggd291bGQgc2lsZW50bHkgbGVhayB0aGUgbG9jay5cbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZW50cnkucGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKGVudHJ5LnBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3aGljaCBsb2NrZWQgcGF0aCAoaWYgYW55KSBjb3ZlcnMgdGhlIGdpdmVuIHBhdGg6IHRoZSBwYXRoIGl0c2VsZiB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBsb25nZXN0IGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyIHRoYXQgY29udGFpbnMgaXQgKGxvbmdlc3Qgc28gYSBuZXN0ZWRcbiAgICogc3VidHJlZSBsb2NrIHdpbnMgZGV0ZXJtaW5pc3RpY2FsbHkgb3ZlciBhbiBvdXRlciBvbmUpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTG9ja093bmVyUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgbGV0IGJlc3RPd25lclBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGhhc1N1YnRyZWVMb2NrID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnKTtcbiAgICAgIGlmIChoYXNTdWJ0cmVlTG9jayAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkgJiYgKGJlc3RPd25lclBhdGggPT09IG51bGwgfHwgbG9ja2VkUGF0aC5sZW5ndGggPiBiZXN0T3duZXJQYXRoLmxlbmd0aCkpIHtcbiAgICAgICAgYmVzdE93bmVyUGF0aCA9IGxvY2tlZFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0T3duZXJQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIHRoZSBub3RlIGEgdmlldyBjdXJyZW50bHkgc2hvd3MgXHUyMDE0IGl0cyBvd24gcGF0aCB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuIFJlYWQgYXQgY2xpY2sgdGltZSBieSB0aGUgdmlldydzIGxvY2sgaW5kaWNhdG9ycyxcbiAgICogc28gaXQgcmVmbGVjdHMgcmVuYW1lcyBvZiB0aGUgbm90ZSBhbmQgb2YgdGhlIGxvY2tlZCBmb2xkZXIgYWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdmlldyAtIFRoZSB2aWV3IHdob3NlIGN1cnJlbnQgZmlsZSB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZpZXcgaGFzIG5vIGZpbGUgb3Igbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWaWV3T3duZXJQYXRoKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggbXVzdCBiZSBibG9ja2VkOiBgdHJ1ZWAgd2hlbiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkXG4gICAqIGFuZCBub3QgY292ZXJlZCBieSBhbnkgYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWplY3QgdGhlIG11dGF0aW9uLCBgZmFsc2VgIHRvIGFsbG93IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCbG9ja011dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIGxvY2tzIGN1cnJlbnRseSBoZWxkOiBlYWNoIHBsdWdpbiBuYW1lIGFzIGEgY29kZSBibG9jayBmb2xsb3dlZCBieVxuICAgIC8vIFRoZSBvcGVyYXRpb24gaXQgaXMgcnVubmluZywgb25lIHBlciBsaW5lLlxuICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLmxvY2tEZXNjcmlwdG9ycyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgZGVzY3JpcHRvci5wbHVnaW5OYW1lKTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoYDogJHtkZXNjcmlwdG9yLm9wZXJhdGlvbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZXMgYW4gb3B0LWluIGBhYm9ydGAgbGlzdGVuZXIgZm9yIGEgbG9jayBlbnRyeTogd2hlbiB0aGUgZW50cnkncyBjb250cm9sbGVyIGFib3J0cywgcmVsZWFzZXNcbiAgICogdGhlIGVudHJ5IChpZiB7QGxpbmsgTG9ja0VudHJ5LnNob3VsZFJlbGVhc2VPbkFib3J0fSkgYW5kL29yIGludm9rZXNcbiAgICoge0BsaW5rIExvY2tFbnRyeS5vblVubG9ja1JlcXVlc3RlZH0uIEEgbm8tb3Agd2hlbiB0aGUgZW50cnkgaGFzIG5vIGNvbnRyb2xsZXIgb3IgbmVpdGhlciBvcHQtaW4gaXNcbiAgICogc2V0LCBzbyB0cmFuc2FjdGlvbmFsIGxvY2tzIGtlZXAgcmVsZWFzaW5nIHZpYSB0aGVpciBvd24gY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRyeSAtIFRoZSBsb2NrIGVudHJ5IHdob3NlIGNvbnRyb2xsZXIgdG8gb2JzZXJ2ZS5cbiAgICovXG4gIHByaXZhdGUgd2lyZVJlbGVhc2VPbkFib3J0KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgeyBvblVubG9ja1JlcXVlc3RlZCwgc2hvdWxkUmVsZWFzZU9uQWJvcnQgfSA9IGVudHJ5O1xuICAgIGlmICghZW50cnkuYWJvcnRDb250cm9sbGVyIHx8ICghc2hvdWxkUmVsZWFzZU9uQWJvcnQgJiYgIW9uVW5sb2NrUmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlbGVhc2VPbkFib3J0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICBvblVubG9ja1JlcXVlc3RlZD8uKCk7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3IgcGF0aC1zY29wZWQgcmVzb3VyY2UgbG9ja2luZyAoZWRpdG9yIHJlYWQtb25seSwgb3B0aW9uYWwgdmF1bHQtbXV0YXRpb25cbiAqIGJsb2NraW5nLCBhbmQgZXh0ZXJuYWwtY2hhbmdlIGRldGVjdGlvbiBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3KS4gQWRkIGl0IGFzIGEgY2hpbGQgb2YgeW91ciBwbHVnaW5cbiAqIChgdGhpcy5hZGRDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgcmVzb3VyY2UgY2FuIG5ldmVyIGJlIGxlZnQgc3R1Y2sgbG9ja2VkIGJlY2F1c2UgdGhlIHBsdWdpblxuICogdGhhdCBsb2NrZWQgaXQgd2FzIGRpc2FibGVkIG9yIHJlbG9hZGVkIG1pZC1vcGVyYXRpb24uXG4gKlxuICogTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBhdHRyaWJ1dGVkIHRvIHRoaXMgcGx1Z2luLCBzbyB0aGUgbG9jayBpbmRpY2F0b3JzJyB0b29sdGlwIG5hbWVzIGl0XG4gKiBhbW9uZyB0aGUgcGx1Z2lucyBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc306XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ieXBhc3MgPSBjb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhbc291cmNlRmlsZSwgdGFyZ2V0RmlsZV0pO1xuICAgKiAvLyAuLi4gdGhlIG9wZXJhdGlvbidzIG93biB2YXVsdCBtdXRhdGlvbnMgb2YgdGhvc2UgcGF0aHMgYXJlIGFsbG93ZWQgLi4uXG4gICAqIC8vIHNjb3BlIGVuZDogdGhlIHBhdGhzIGFyZSBlbmZvcmNlZCBhZ2FpblxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzT3JGaWxlcyAtIFRoZSBwYXRocyAob3IgZmlsZXMvZm9sZGVycykgd2hvc2UgbXV0YXRpb24gYnkgdGhpcyBvcGVyYXRpb24gaXMgc2FuY3Rpb25lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBlbmRzIHRoZSBieXBhc3Mgc2NvcGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBieXBhc3NCbG9ja2VkTXV0YXRpb25zKHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5ieXBhc3ModGhpcy5hcHAsIHBhdGhzT3JGaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkIGJ5IGEgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrXG4gICAqIG9uIHRoZSBwYXRoIGl0c2VsZiBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlZGl0aW5nL2RlbGV0aW5nL3JlbmFtaW5nL21vdmluZy9jcmVhdGluZyB0aGUgcGF0aCB3b3VsZCB0aHJvdyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIExvY2tpbmcgcGFyYW1ldGVycy4gSXRzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5wYXRoT3JGaWxlfVxuICAgKiBhbmQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLm9wZXJhdGlvbk5hbWV9IGFyZSByZXF1aXJlZCAodGhlIGxhdHRlciBpcyBzaG93blxuICAgKiBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbikuIFBhc3MgYW4ge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSBhIGxvY2sgaW5kaWNhdG9yJ3MgXCJ1bmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLFxuICAgKiBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhcmFtczogUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aDogcmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgKHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIpLCBjYW5jZWxzIHRoZSBvcGVyYXRpb24ocykgdGhhdCB0b29rXG4gICAqIHRoZSBsb2NrIGJ5IGFib3J0aW5nIHRoZWlyIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9cywgYW5kIHJlbGVhc2VzIHRoZSBsb2NrIHNvIHRoZSBub3RlIGJlY29tZXNcbiAgICogZWRpdGFibGUgXHUyMDE0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGx1Z2luIGhvbGRzIHRoZSBsb2NrLiBQb3dlcnMgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZC4gQVxuICAgKiBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkuZm9yY2VVbmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG5cbi8qKlxuICogTWFwcyBhIHN0b3JlZCBwYXRoIHRocm91Z2ggYSByZW5hbWU6IHRoZSByZW5hbWVkIHBhdGggaXRzZWxmIGJlY29tZXMgdGhlIG5ldyBwYXRoLCBhbmQgYSBkZXNjZW5kYW50XG4gKiBvZiBpdCBrZWVwcyBpdHMgc3VmZml4IHVuZGVyIHRoZSBuZXcgcGF0aC4gU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gcmV1c2luZyB7QGxpbmsgaXNDaGlsZE9yU2VsZn1cbiAqIGJlY2F1c2UgdGhlIHJlYmFzZWQgc3VmZml4IGhhcyB0byBiZSBjb21wdXRlZCBmcm9tIHRoZSBzYW1lIHByZWZpeCB0aGUgdGVzdCBtYXRjaGVkLCBhbmQgYSByZW5hbWVcbiAqIHNvdXJjZSBpcyBuZXZlciB0aGUgdmF1bHQgcm9vdCAodGhlIG9uZSBjYXNlIHRob3NlIGhlbHBlcnMgdHJlYXQgc3BlY2lhbGx5KS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBzdG9yZWQgcGF0aCB0byBtYXAuXG4gKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCBmcm9tLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gKiBAcmV0dXJucyBUaGUgcmViYXNlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiB0aGUgcmVuYW1lIGRvZXMgbm90IGFmZmVjdCBpdC5cbiAqL1xuZnVuY3Rpb24gcmViYXNlUGF0aChwYXRoOiBzdHJpbmcsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChwYXRoID09PSBvbGRQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtvbGRQYXRofS9gKSkge1xuICAgIHJldHVybiBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBDQSw2QkFBeUI7QUFDekIsc0JBT087QUFJUCxtQkFBeUI7QUFDekIsbUJBQW1DO0FBQ25DLG9CQUF1QjtBQUN2Qix3QkFHTztBQUNQLHNCQUFxQjtBQUNyQixzQ0FBeUM7QUFDekMseUJBQWtDO0FBQ2xDLDBCQUE0QjtBQUM1QixxQ0FBc0M7QUFDdEMsb0JBQXFDO0FBQ3JDLHlCQUF3QjtBQUN4QiwwQkFBZ0M7QUFDaEMsa0JBQWtCO0FBQ2xCLHFCQUF3QjtBQUN4QixtQkFHTztBQUVQLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHNCQUFzQjtBQXVLNUIsTUFBTSxvQ0FBb0MsZ0NBQVk7QUFBQSxFQUNuQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVWLFlBQVksUUFBc0Q7QUFDdkUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUsscUJBQXFCLE9BQU87QUFDakMsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUN6QjtBQUFBLEVBRWdC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
|
|
1113
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgTWFya2Rvd25WaWV3LFxuICBNZW51LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uL2JlZXBlci50cyc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Rpc3Bvc2FibGUsXG4gIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yXG59IGZyb20gJy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdG9nZ2xlRWRpdG9yUmVhZE9ubHkgfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4vbW9kYWxzL2NvbmZpcm0udHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbmNvbnN0IExPQ0tfSUNPTl9JRCA9ICdsb2NrJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3InO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvci1mbGFzaCc7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5jb25zdCBVTkxPQ0tfSUNPTl9JRCA9ICd1bmxvY2snO1xuY29uc3QgTUlERExFX01PVVNFX0JVVFRPTiA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0YWtpbmcgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgKS4gU2hvd24gbmV4dCB0b1xuICAgKiB0aGUgcGx1Z2luIG5hbWUgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gYSBsb2NrIGluZGljYXRvciBpcyBjbGlja2VkICh3aXRoXG4gICAqIGFueSBtb3VzZSBidXR0b24pIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2ssIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgcnVucywgb3JcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0gLyB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkXG4gICAqIGZvciB0aGUgcGF0aCwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmLiBVbmxlc3NcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0fSBpcyBzZXQsIHRoZSBvcGVyYXRpb24gaXNcbiAgICogZXhwZWN0ZWQgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuIFdoZW4gb21pdHRlZCwgYW4gdW5sb2NrIHN0aWxsIHJlbGVhc2VzIHRoZSBsb2NrIGJ1dFxuICAgKiBjYW5ub3QgY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBzY29wZS4gYCdzdWJ0cmVlJ2AgYWxzbyBsb2NrcyBldmVyeSBkZXNjZW5kYW50IG9mIGEgZm9sZGVyIHBhdGg7IGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlXG4gICAqIGV4YWN0IHBhdGguIEEgYHN1YnRyZWVgIGxvY2sgbXVzdCBiZSByZWxlYXNlZCB2aWEgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAobm90IHRoZVxuICAgKiBleHBsaWNpdCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnVubG9ja0ZvclBhdGh9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdmaWxlJ2BcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiB1bmxvY2sgb2YgdGhlIGxvY2sgaXMgcmVxdWVzdGVkIFx1MjAxNCBpLmUuIHdoZW4gdGhlXG4gICAqIGxvY2sncyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkIChieSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgXCJVbmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSxcbiAgICogb3Ige0BsaW5rIGhhbmRsZUV4dGVybmFsTXV0YXRpb259KS4gVXNlIGl0IHRvIGNsZWFyIGNvbnN1bWVyLXNpZGUgc3RhdGUgdGhhdCBzaGFkb3dzIHRoZSBsb2NrIChlLmcuXG4gICAqIGEgcGVuZGluZy1vcGVyYXRpb24gYnVmZmVyIG9yIGEgbm90aWNlKSB3aXRob3V0IGhhbmQtd2lyaW5nIGFuIGBhYm9ydGAgbGlzdGVuZXIuIEZpcmVzIGF0IG1vc3Qgb25jZS5cbiAgICovXG4gIG9uVW5sb2NrUmVxdWVzdGVkPyh0aGlzOiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCwgYCdNZXJnZVxuICAgKiBub3RlcydgKS4gSXQgaXMgc2hvd24gXHUyMDE0IG5leHQgdG8gdGhlIGxvY2tpbmcgcGx1Z2luJ3MgbmFtZSBcdTIwMTQgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLCBzb1xuICAgKiB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hpY2ggb3BlcmF0aW9uIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IFx1MjAxNCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIHJlbGVhc2VzIGl0c2VsZiB0aGUgbW9tZW50IGl0c1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbiAgICogdGhlIG93bmluZyBvcGVyYXRpb24gdG8gcmVsZWFzZSBpdCBpbiBpdHMgb3duIGNsZWFudXAuIFVzZSBpdCBmb3IgYSBsb2NrIGhlbGQgKippbmRlZmluaXRlbHkqKlxuICAgKiBvdXRzaWRlIGEgYHVzaW5nYCBzY29wZSAoc28gdGhlcmUgaXMgbm8gYGZpbmFsbHlgIHRvIHJlbGVhc2UgaXQpIFx1MjAxNCBlLmcuIGEgbG9jayB0aGF0IHN0YXlzIHVudGlsIHRoZVxuICAgKiB1c2VyIGV4cGxpY2l0bHkgdW5sb2Nrcy4gTGVhdmUgaXQgYGZhbHNlYCBmb3IgYSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGhvbGRzIHRoZSBsb2NrIHRocm91Z2hcbiAgICogaXRzIG93biBhYm9ydC1kcml2ZW4gcm9sbGJhY2sgYW5kIHJlbGVhc2VzIGl0IHZpYSBgdXNpbmdgIGF0IHNjb3BlIGV4aXQuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tEZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBlbnRyeSBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1bmRlci4gRGVsaWJlcmF0ZWx5IG11dGFibGU6IGEgcmVuYW1lIHJlLWtleXMgdGhlXG4gICAqIHJlZ2lzdHJ5LCBhbmQgcmVsZWFzZSBtdXN0IGZpbmQgdGhlIGVudHJ5IGF0IGl0cyBDVVJSRU5UIHBhdGggXHUyMDE0IGEgcmVsZWFzZSB0aGF0IGNhcHR1cmVkIHRoZSBwYXRoXG4gICAqIGF0IGxvY2sgdGltZSB3b3VsZCBzaWxlbnRseSBuby1vcCBhZnRlciB0aGUgcmVzb3VyY2UgbW92ZWQsIGxlYWtpbmcgdGhlIGxvY2sgZm9yZXZlci5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIGRpc3Bvc2VUeXBlTGlzdGVuZXIoKTogdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICBvbkNoYW5nZSh0aGlzOiB2b2lkKTogdm9pZDtcbiAgb25FeHRlcm5hbE11dGF0aW9uKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG4gIG9uUmVuYW1lKHRoaXM6IHZvaWQsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub25DaGFuZ2UgPSBwYXJhbXMub25DaGFuZ2U7XG4gICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24gPSBwYXJhbXMub25FeHRlcm5hbE11dGF0aW9uO1xuICAgIHRoaXMub25GaWxlTWVudSA9IHBhcmFtcy5vbkZpbGVNZW51O1xuICAgIHRoaXMub25SZW5hbWUgPSBwYXJhbXMub25SZW5hbWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIFNhbWUtbGVhZiBuYXZpZ2F0aW9uIHRvIGFub3RoZXIgbm90ZSBmaXJlcyBubyBsZWFmL2xheW91dCBjaGFuZ2U7IHdpdGhvdXQgdGhpcyBpdCBzdGF5cyByZWFkLW9ubHkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIEFkZHMgYW4gXCJVbmxvY2tcIiBpdGVtIHRvIGEgbG9ja2VkIG5vdGUncyB0YWIvZmlsZSBjb250ZXh0IG1lbnUgKGFsb25nc2lkZSB0aGUgaW5kaWNhdG9yIG1lbnVzKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCB0aGlzLm9uRmlsZU1lbnUpKTtcbiAgICAvLyBFeHRlcm5hbC1jaGFuZ2UgYmFja3N0b3A6IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggbm90IGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBhbiBpbnRydWRlciAoYSBzeW5jL0ZTL2FkYXB0ZXIgY2hhbmdlIHRoYXQgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2gpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpOiB2b2lkID0+IHtcbiAgICAgIC8vIFJlLWtleSBGSVJTVCwgc28gdGhlIGNoZWNrcyBiZWxvdyBydW4gYWdhaW5zdCB3aGVyZSB0aGUgbG9ja3MgYWN0dWFsbHkgYXJlIG5vdy5cbiAgICAgIC8vIEludHJ1ZGVyIGRldGVjdGlvbiBpcyB1bmFmZmVjdGVkOiB0aGUgb2xkIHBhdGggc3RvcHMgcmVzb2x2aW5nLCBidXQgdGhlIG5ldyBvbmUgaXMgY292ZXJlZCBpbnN0ZWFkLlxuICAgICAgdGhpcy5vblJlbmFtZShvbGRQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgLy8gVGhlIGlubmVyIHNldHMgYXJlIG11dGFibGUgc28gYSByZW5hbWUgY2FuIHJlLWtleSB0aGUgcGF0aHMgb2YgYW4gaW4tZmxpZ2h0IGJ5cGFzcyBzY29wZSBpbiBwbGFjZTtcbiAgLy8gVGhlIHNjb3BlJ3MgYERpc3Bvc2FibGVgIGRlbGV0ZXMgYnkgc2V0IGlkZW50aXR5LCBzbyBtdXRhdGluZyB0aGUgY29udGVudHMgY2Fubm90IG9ycGhhbiBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICBwcml2YXRlIG11dGF0aW9uQmxvY2tlckNvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBieXBhc3MoYXBwOiBBcHAsIHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgYnlwYXNzZWRQYXRocyA9IG5ldyBTZXQocGF0aHNPckZpbGVzLm1hcCgocGF0aE9yRmlsZSkgPT4gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSk7XG4gICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5hZGQoYnlwYXNzZWRQYXRocyk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5kZWxldGUoYnlwYXNzZWRQYXRocyk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGguIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0IFx1MjAxNCB0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIFx1MjAxNCB0aGVuIGFib3J0cyBldmVyeVxuICAgKiB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSByZWdpc3RlcmVkIG9uIHRoYXQgb3duZXIgKGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbnMgdGhhdCB0b29rIHRoZSBsb2NrcylcbiAgICogQU5EIHJlbW92ZXMgdGhlIG93bmVyJ3MgbG9jayBlbnRyaWVzIChyZWxlYXNpbmcgdGhlIGxvY2sgdW5jb25kaXRpb25hbGx5KS4gVW5saWtlXG4gICAqIHtAbGluayByZXF1ZXN0VW5sb2NrfSwgd2hpY2ggb25seSBhYm9ydHMgdGhlIGV4YWN0IHBhdGgncyBjb250cm9sbGVycyBhbmQgcmVsaWVzIG9uIGVhY2ggb3BlcmF0aW9uXG4gICAqIHJlbGVhc2luZyBpdHMgb3duIGxvY2ssIHRoaXMgcmVzb2x2ZXMgYW5jZXN0b3IgY292ZXJhZ2UgYW5kIGFsd2F5cyByZWxlYXNlcyBcdTIwMTQgc28gYSBub3RlIGhlbGQgYnkgYW5cbiAgICogaW5kZWZpbml0ZWx5LWhlbGQgbG9jayBpcyBndWFyYW50ZWVkIHRvIGJlY29tZSBlZGl0YWJsZS4gQSBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyBmb3JjZVVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgb3duZXJQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvclxuICAgKiBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgY292ZXJlZCBieSBhIG11dGF0aW9uLWJsb2NraW5nIGxvY2sgKG9uZSB0YWtlbiB3aXRoXG4gICAqIGBibG9ja3NNdXRhdGlvbnNgKSBkaXJlY3RseSBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGV4YWN0RW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmIChleGFjdEVudHJpZXM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGxvY2socGFyYW1zOiBNYW5hZ2VyTG9ja1BhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMucGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cnk6IExvY2tFbnRyeSA9IHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlciA/PyBudWxsLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuYmxvY2tzTXV0YXRpb25zID8/IGZhbHNlLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUgPz8gJ2ZpbGUnLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCA/PyBudWxsLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnQgPz8gZmFsc2VcbiAgICB9O1xuICAgIGxldCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICBlbnRyaWVzID0gW107XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCBlbnRyaWVzKTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICBpZiAoZW50cnkuYmxvY2tzTXV0YXRpb25zKSB7XG4gICAgICB0aGlzLmVuc3VyZUJsb2NrZXJJbnN0YWxsZWQoYXBwKTtcbiAgICB9XG4gICAgdGhpcy53aXJlUmVsZWFzZU9uQWJvcnQoYXBwLCBlbnRyeSk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIHdoaWNoXG4gICAqIGNhbmNlbHMgdGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9jay4gRWFjaCBvcGVyYXRpb24gcmVsZWFzZXMgaXRzIG93biBsb2NrIGluIGl0cyBgZmluYWxseWBcbiAgICogd2hlbiBpdCBvYnNlcnZlcyB0aGUgYWJvcnQsIHNvIHRoaXMgZG9lcyBub3QgdW5sb2NrIHRoZSBwYXRoIGRpcmVjdGx5LiBBIG5vLW9wIHdoZW4gbm8gY29udHJvbGxlclxuICAgKiBpcyByZWdpc3RlcmVkIGZvciB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHVibGljIHVubG9ja0FsbEZvclBsdWdpbihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW3BhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgIT09IHBsdWdpbklkKTtcbiAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcubGVuZ3RoICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gb24gdGhlIGdpdmVuIChhbHJlYWR5LXJlc29sdmVkKSBvd25lciBwYXRoJ3MgbG9jayBlbnRyaWVzIFx1MjAxNFxuICAgKiBjYW5jZWxsaW5nIHRoZSBvd25pbmcgb3BlcmF0aW9ucyBcdTIwMTQgYW5kIHJlbW92ZXMgdGhvc2UgZW50cmllcywgcmVsZWFzaW5nIHRoZSBsb2NrLiBUaGUgZW50cmllc1xuICAgKiBzbmFwc2hvdCBpcyBjb3BpZWQgZmlyc3QgYmVjYXVzZSBhbiBlbnRyeSdzIGBzaG91bGRSZWxlYXNlT25BYm9ydGAgYWJvcnQgbGlzdGVuZXIgbXV0YXRlcyB0aGVcbiAgICogYXJyYXkgYXMgaXQgZmlyZXMuIEFsd2F5cyBsZWF2ZXMgdGhlIG93bmVyIHBhdGggd2l0aCBubyBlbnRyaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG93bmVyUGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgb3duZXIgcGF0aCB3aG9zZSBlbnRyaWVzIHRvIGFib3J0IGFuZCByZWxlYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcDogQXBwLCBvd25lclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChvd25lclBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QoZW50cmllcykpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUob3duZXJQYXRoKTtcbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtVGl0bGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyBgcGF0aGAgaXMgdGhlIHJlc29sdmVkIG93bmVyIHBhdGgsIHNvIGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBhbmQgcmVsZWFzZSB0aGUgbG9jayBvdXRyaWdodC5cbiAgICAgICAgICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICAvLyBUaGUgaW5kaWNhdG9ycyBvdXRsaXZlIGEgcmVuYW1lIG9mIHRoZSBub3RlIChvciBvZiBhbiBlbmNsb3NpbmcgbG9ja2VkIGZvbGRlciksIHNvIHRoZXkgcmVzb2x2ZVxuICAgIC8vIFRoZSBvd25lciBsb2NrIGF0IENMSUNLIHRpbWUgZnJvbSB0aGUgdmlldydzIGN1cnJlbnQgZmlsZSwgZXhhY3RseSBhcyB0aGUgc3RhdHVzLWJhciBpdGVtIGRvZXMuXG4gICAgLy8gQSBjYXB0dXJlZCBvd25lciBwYXRoIHdvdWxkIGdvIHN0YWxlIHRoZSBtb21lbnQgdGhlIGxvY2sgaXMgcmUta2V5ZWQuXG4gICAgY29uc3QgZ2V0T3duZXJQYXRoID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB0aGlzLnJlc29sdmVWaWV3T3duZXJQYXRoKGFwcCwgdmlldyk7XG5cbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0YWJJY29uRWwsIGdldE93bmVyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9LFxuICAgICAgb25SZW5hbWU6IChvbGRQYXRoLCBuZXdQYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuYW1lKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbGVtZW50LmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkgXHUyMDE0IGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgICAvLyBUaGUgdG9nZ2xlIGlzIGlkZW1wb3RlbnQsIHNvIHJlLWFwcGx5aW5nIHRvIGFuIGFscmVhZHktbG9ja2VkIHZpZXcgaXMgY2hlYXAuXG4gICAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKHZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgIGluZGljYXRvcnMuZGlzcG9zZVR5cGVMaXN0ZW5lcigpO1xuICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZUFuZENsZWFudXAoYXBwOiBBcHApOiB2b2lkIHtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIGlmICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclVubG9ja01lbnUoYXBwOiBBcHAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudCgkZXZlbnQpO1xuICAgIH07XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb3BlblVubG9ja01lbnUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudSgkZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgQ1VSUkVOVCBwYXRoLCBub3Qgb25lIGNhcHR1cmVkIHdoZW4gdGhlIGxvY2sgd2FzIHRha2VuOiBhIHJlbmFtZSBtYXkgaGF2ZVxuICAgIC8vIFJlLWtleWVkIGl0IHNpbmNlLCBhbmQgbG9va2luZyBpdCB1cCB1bmRlciB0aGUgb2xkIHBhdGggd291bGQgc2lsZW50bHkgbGVhayB0aGUgbG9jay5cbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZW50cnkucGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKGVudHJ5LnBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3aGljaCBsb2NrZWQgcGF0aCAoaWYgYW55KSBjb3ZlcnMgdGhlIGdpdmVuIHBhdGg6IHRoZSBwYXRoIGl0c2VsZiB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBsb25nZXN0IGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyIHRoYXQgY29udGFpbnMgaXQgKGxvbmdlc3Qgc28gYSBuZXN0ZWRcbiAgICogc3VidHJlZSBsb2NrIHdpbnMgZGV0ZXJtaW5pc3RpY2FsbHkgb3ZlciBhbiBvdXRlciBvbmUpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTG9ja093bmVyUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgbGV0IGJlc3RPd25lclBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGhhc1N1YnRyZWVMb2NrID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnKTtcbiAgICAgIGlmIChoYXNTdWJ0cmVlTG9jayAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkgJiYgKGJlc3RPd25lclBhdGggPT09IG51bGwgfHwgbG9ja2VkUGF0aC5sZW5ndGggPiBiZXN0T3duZXJQYXRoLmxlbmd0aCkpIHtcbiAgICAgICAgYmVzdE93bmVyUGF0aCA9IGxvY2tlZFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0T3duZXJQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIHRoZSBub3RlIGEgdmlldyBjdXJyZW50bHkgc2hvd3MgXHUyMDE0IGl0cyBvd24gcGF0aCB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuIFJlYWQgYXQgY2xpY2sgdGltZSBieSB0aGUgdmlldydzIGxvY2sgaW5kaWNhdG9ycyxcbiAgICogc28gaXQgcmVmbGVjdHMgcmVuYW1lcyBvZiB0aGUgbm90ZSBhbmQgb2YgdGhlIGxvY2tlZCBmb2xkZXIgYWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdmlldyAtIFRoZSB2aWV3IHdob3NlIGN1cnJlbnQgZmlsZSB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZpZXcgaGFzIG5vIGZpbGUgb3Igbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWaWV3T3duZXJQYXRoKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggbXVzdCBiZSBibG9ja2VkOiBgdHJ1ZWAgd2hlbiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkXG4gICAqIGFuZCBub3QgY292ZXJlZCBieSBhbnkgYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWplY3QgdGhlIG11dGF0aW9uLCBgZmFsc2VgIHRvIGFsbG93IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCbG9ja011dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIGxvY2tzIGN1cnJlbnRseSBoZWxkOiBlYWNoIHBsdWdpbiBuYW1lIGFzIGEgY29kZSBibG9jayBmb2xsb3dlZCBieVxuICAgIC8vIFRoZSBvcGVyYXRpb24gaXQgaXMgcnVubmluZywgb25lIHBlciBsaW5lLlxuICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLmxvY2tEZXNjcmlwdG9ycyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgZGVzY3JpcHRvci5wbHVnaW5OYW1lKTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoYDogJHtkZXNjcmlwdG9yLm9wZXJhdGlvbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZXMgYW4gb3B0LWluIGBhYm9ydGAgbGlzdGVuZXIgZm9yIGEgbG9jayBlbnRyeTogd2hlbiB0aGUgZW50cnkncyBjb250cm9sbGVyIGFib3J0cywgcmVsZWFzZXNcbiAgICogdGhlIGVudHJ5IChpZiB7QGxpbmsgTG9ja0VudHJ5LnNob3VsZFJlbGVhc2VPbkFib3J0fSkgYW5kL29yIGludm9rZXNcbiAgICoge0BsaW5rIExvY2tFbnRyeS5vblVubG9ja1JlcXVlc3RlZH0uIEEgbm8tb3Agd2hlbiB0aGUgZW50cnkgaGFzIG5vIGNvbnRyb2xsZXIgb3IgbmVpdGhlciBvcHQtaW4gaXNcbiAgICogc2V0LCBzbyB0cmFuc2FjdGlvbmFsIGxvY2tzIGtlZXAgcmVsZWFzaW5nIHZpYSB0aGVpciBvd24gY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRyeSAtIFRoZSBsb2NrIGVudHJ5IHdob3NlIGNvbnRyb2xsZXIgdG8gb2JzZXJ2ZS5cbiAgICovXG4gIHByaXZhdGUgd2lyZVJlbGVhc2VPbkFib3J0KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgeyBvblVubG9ja1JlcXVlc3RlZCwgc2hvdWxkUmVsZWFzZU9uQWJvcnQgfSA9IGVudHJ5O1xuICAgIGlmICghZW50cnkuYWJvcnRDb250cm9sbGVyIHx8ICghc2hvdWxkUmVsZWFzZU9uQWJvcnQgJiYgIW9uVW5sb2NrUmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlbGVhc2VPbkFib3J0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICBvblVubG9ja1JlcXVlc3RlZD8uKCk7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogTW9ua2V5LXBhdGNoZXMgdGhlIHZhdWx0LW11dGF0aW9uIGNob2tlIHBvaW50cyBvbiBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgc28gdGhhdCBhbnkgZWRpdCwgZGVsZXRlLFxuICogcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIG9mIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIHRocm93cyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAqIEluc3RhbGxlZCBsYXppbHkgYnkge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXJ9IG9uIHRoZSBmaXJzdCBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2sgYW5kIHJlbW92ZWRcbiAqIHdoZW4gdGhlIGxhc3Qgb25lIGlzIHJlbGVhc2VkOyBiZWluZyBhIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnR9LCBldmVyeSBwYXRjaCBpcyB0b3JuIGRvd24gb25cbiAqIGB1bmxvYWRgLiBSZW5hbWUvY29weSBjaGVjayBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb247IHRoZSBvdGhlciBtZXRob2RzIGNoZWNrIHRoZWlyIHNpbmdsZSBwYXRoLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbiA9IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2FwcGVuZCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdhcHBlbmQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NvcHknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW25ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVGb2xkZXInPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlRm9sZGVyJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnZGVsZXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2RlbGV0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5QmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncHJvY2Vzcyc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdwcm9jZXNzJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdyZW5hbWUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICd0cmFzaCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAncmVuYW1lRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWVGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Tm90QmxvY2tlZChwYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24ocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTG9ja2VkRXJyb3IocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3IgcGF0aC1zY29wZWQgcmVzb3VyY2UgbG9ja2luZyAoZWRpdG9yIHJlYWQtb25seSwgb3B0aW9uYWwgdmF1bHQtbXV0YXRpb25cbiAqIGJsb2NraW5nLCBhbmQgZXh0ZXJuYWwtY2hhbmdlIGRldGVjdGlvbiBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3KS4gQWRkIGl0IGFzIGEgY2hpbGQgb2YgeW91ciBwbHVnaW5cbiAqIChgdGhpcy5hZGRDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgcmVzb3VyY2UgY2FuIG5ldmVyIGJlIGxlZnQgc3R1Y2sgbG9ja2VkIGJlY2F1c2UgdGhlIHBsdWdpblxuICogdGhhdCBsb2NrZWQgaXQgd2FzIGRpc2FibGVkIG9yIHJlbG9hZGVkIG1pZC1vcGVyYXRpb24uXG4gKlxuICogTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBhdHRyaWJ1dGVkIHRvIHRoaXMgcGx1Z2luLCBzbyB0aGUgbG9jayBpbmRpY2F0b3JzJyB0b29sdGlwIG5hbWVzIGl0XG4gKiBhbW9uZyB0aGUgcGx1Z2lucyBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc306XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ieXBhc3MgPSBjb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhbc291cmNlRmlsZSwgdGFyZ2V0RmlsZV0pO1xuICAgKiAvLyAuLi4gdGhlIG9wZXJhdGlvbidzIG93biB2YXVsdCBtdXRhdGlvbnMgb2YgdGhvc2UgcGF0aHMgYXJlIGFsbG93ZWQgLi4uXG4gICAqIC8vIHNjb3BlIGVuZDogdGhlIHBhdGhzIGFyZSBlbmZvcmNlZCBhZ2FpblxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzT3JGaWxlcyAtIFRoZSBwYXRocyAob3IgZmlsZXMvZm9sZGVycykgd2hvc2UgbXV0YXRpb24gYnkgdGhpcyBvcGVyYXRpb24gaXMgc2FuY3Rpb25lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBlbmRzIHRoZSBieXBhc3Mgc2NvcGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBieXBhc3NCbG9ja2VkTXV0YXRpb25zKHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5ieXBhc3ModGhpcy5hcHAsIHBhdGhzT3JGaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkIGJ5IGEgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrXG4gICAqIG9uIHRoZSBwYXRoIGl0c2VsZiBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlZGl0aW5nL2RlbGV0aW5nL3JlbmFtaW5nL21vdmluZy9jcmVhdGluZyB0aGUgcGF0aCB3b3VsZCB0aHJvdyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIExvY2tpbmcgcGFyYW1ldGVycy4gSXRzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5wYXRoT3JGaWxlfVxuICAgKiBhbmQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLm9wZXJhdGlvbk5hbWV9IGFyZSByZXF1aXJlZCAodGhlIGxhdHRlciBpcyBzaG93blxuICAgKiBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbikuIFBhc3MgYW4ge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSBhIGxvY2sgaW5kaWNhdG9yJ3MgXCJ1bmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLFxuICAgKiBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhcmFtczogUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aDogcmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgKHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIpLCBjYW5jZWxzIHRoZSBvcGVyYXRpb24ocykgdGhhdCB0b29rXG4gICAqIHRoZSBsb2NrIGJ5IGFib3J0aW5nIHRoZWlyIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9cywgYW5kIHJlbGVhc2VzIHRoZSBsb2NrIHNvIHRoZSBub3RlIGJlY29tZXNcbiAgICogZWRpdGFibGUgXHUyMDE0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGx1Z2luIGhvbGRzIHRoZSBsb2NrLiBQb3dlcnMgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZC4gQVxuICAgKiBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkuZm9yY2VVbmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG5cbi8qKlxuICogTWFwcyBhIHN0b3JlZCBwYXRoIHRocm91Z2ggYSByZW5hbWU6IHRoZSByZW5hbWVkIHBhdGggaXRzZWxmIGJlY29tZXMgdGhlIG5ldyBwYXRoLCBhbmQgYSBkZXNjZW5kYW50XG4gKiBvZiBpdCBrZWVwcyBpdHMgc3VmZml4IHVuZGVyIHRoZSBuZXcgcGF0aC4gU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gcmV1c2luZyB7QGxpbmsgaXNDaGlsZE9yU2VsZn1cbiAqIGJlY2F1c2UgdGhlIHJlYmFzZWQgc3VmZml4IGhhcyB0byBiZSBjb21wdXRlZCBmcm9tIHRoZSBzYW1lIHByZWZpeCB0aGUgdGVzdCBtYXRjaGVkLCBhbmQgYSByZW5hbWVcbiAqIHNvdXJjZSBpcyBuZXZlciB0aGUgdmF1bHQgcm9vdCAodGhlIG9uZSBjYXNlIHRob3NlIGhlbHBlcnMgdHJlYXQgc3BlY2lhbGx5KS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBzdG9yZWQgcGF0aCB0byBtYXAuXG4gKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCBmcm9tLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gKiBAcmV0dXJucyBUaGUgcmViYXNlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiB0aGUgcmVuYW1lIGRvZXMgbm90IGFmZmVjdCBpdC5cbiAqL1xuZnVuY3Rpb24gcmViYXNlUGF0aChwYXRoOiBzdHJpbmcsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChwYXRoID09PSBvbGRQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtvbGRQYXRofS9gKSkge1xuICAgIHJldHVybiBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBDQSw2QkFBeUI7QUFDekIsc0JBT087QUFJUCxtQkFBeUI7QUFDekIsbUJBQW1DO0FBQ25DLG9CQUF1QjtBQUN2Qix3QkFHTztBQUNQLHNCQUFxQjtBQUNyQixzQ0FBeUM7QUFDekMseUJBQWtDO0FBQ2xDLDBCQUE0QjtBQUM1QixxQ0FBc0M7QUFDdEMsb0JBQXFDO0FBQ3JDLHlCQUF3QjtBQUN4QiwwQkFBZ0M7QUFDaEMsa0JBQWtCO0FBQ2xCLHFCQUF3QjtBQUN4QixtQkFHTztBQUVQLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHNCQUFzQjtBQXVLNUIsTUFBTSxvQ0FBb0MsZ0NBQVk7QUFBQSxFQUNuQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVWLFlBQVksUUFBc0Q7QUFDdkUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUsscUJBQXFCLE9BQU87QUFDakMsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxXQUFXLE9BQU87QUFBQSxFQUN6QjtBQUFBLEVBRWdC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
|