@metamask/snaps-execution-environments 0.34.0-flask.1 → 0.34.1-flask.1
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 +6 -1
- package/dist/browserify/iframe/bundle.js +49 -49
- package/dist/browserify/node-process/bundle.js +49 -49
- package/dist/browserify/node-thread/bundle.js +49 -49
- package/dist/browserify/offscreen/bundle.js +49 -49
- package/dist/browserify/worker-executor/bundle.js +49 -49
- package/dist/browserify/worker-pool/bundle.js +49 -49
- package/package.json +10 -9
|
@@ -13262,7 +13262,7 @@ var once=require("once"),noop=function(){},isRequest=function(e){return e.setHea
|
|
|
13262
13262
|
};
|
|
13263
13263
|
}
|
|
13264
13264
|
}
|
|
13265
|
-
}, {package:"
|
|
13265
|
+
}, {package:"@metamask/snaps-utils>fast-json-stable-stringify",file:"../../node_modules/fast-json-stable-stringify/index.js",}],
|
|
13266
13266
|
[115, {}, function(){
|
|
13267
13267
|
with (this.scopeTerminator) {
|
|
13268
13268
|
with (this.globalThis) {
|
|
@@ -13944,7 +13944,7 @@ const ANY=Symbol("SemVer ANY");class Comparator{static get ANY(){return ANY}cons
|
|
|
13944
13944
|
};
|
|
13945
13945
|
}
|
|
13946
13946
|
}
|
|
13947
|
-
}, {package:"
|
|
13947
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/comparator.js",}],
|
|
13948
13948
|
[163, {"../internal/constants":190,"../internal/debug":191,"../internal/parse-options":193,"../internal/re":194,"./comparator":162,"./semver":164,"lru-cache":195}, function(){
|
|
13949
13949
|
with (this.scopeTerminator) {
|
|
13950
13950
|
with (this.globalThis) {
|
|
@@ -13958,7 +13958,7 @@ class Range{constructor(e,r){if(r=parseOptions(r),e instanceof Range)return e.lo
|
|
|
13958
13958
|
};
|
|
13959
13959
|
}
|
|
13960
13960
|
}
|
|
13961
|
-
}, {package:"
|
|
13961
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/range.js",}],
|
|
13962
13962
|
[164, {"../internal/constants":190,"../internal/debug":191,"../internal/identifiers":192,"../internal/parse-options":193,"../internal/re":194}, function(){
|
|
13963
13963
|
with (this.scopeTerminator) {
|
|
13964
13964
|
with (this.globalThis) {
|
|
@@ -13972,7 +13972,7 @@ const debug=require("../internal/debug"),{MAX_LENGTH:MAX_LENGTH,MAX_SAFE_INTEGER
|
|
|
13972
13972
|
};
|
|
13973
13973
|
}
|
|
13974
13974
|
}
|
|
13975
|
-
}, {package:"
|
|
13975
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/classes/semver.js",}],
|
|
13976
13976
|
[165, {"./parse":181}, function(){
|
|
13977
13977
|
with (this.scopeTerminator) {
|
|
13978
13978
|
with (this.globalThis) {
|
|
@@ -13986,7 +13986,7 @@ const parse=require("./parse"),clean=(e,r)=>{const n=parse(e.trim().replace(/^[=
|
|
|
13986
13986
|
};
|
|
13987
13987
|
}
|
|
13988
13988
|
}
|
|
13989
|
-
}, {package:"
|
|
13989
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/clean.js",}],
|
|
13990
13990
|
[166, {"./eq":172,"./gt":173,"./gte":174,"./lt":176,"./lte":177,"./neq":180}, function(){
|
|
13991
13991
|
with (this.scopeTerminator) {
|
|
13992
13992
|
with (this.globalThis) {
|
|
@@ -14000,7 +14000,7 @@ const eq=require("./eq"),neq=require("./neq"),gt=require("./gt"),gte=require("./
|
|
|
14000
14000
|
};
|
|
14001
14001
|
}
|
|
14002
14002
|
}
|
|
14003
|
-
}, {package:"
|
|
14003
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/cmp.js",}],
|
|
14004
14004
|
[167, {"../classes/semver":164,"../internal/re":194,"./parse":181}, function(){
|
|
14005
14005
|
with (this.scopeTerminator) {
|
|
14006
14006
|
with (this.globalThis) {
|
|
@@ -14014,7 +14014,7 @@ const SemVer=require("../classes/semver"),parse=require("./parse"),{re:re,t:t}=r
|
|
|
14014
14014
|
};
|
|
14015
14015
|
}
|
|
14016
14016
|
}
|
|
14017
|
-
}, {package:"
|
|
14017
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/coerce.js",}],
|
|
14018
14018
|
[168, {"../classes/semver":164}, function(){
|
|
14019
14019
|
with (this.scopeTerminator) {
|
|
14020
14020
|
with (this.globalThis) {
|
|
@@ -14028,7 +14028,7 @@ const SemVer=require("../classes/semver"),compareBuild=(e,r,m)=>{const o=new Sem
|
|
|
14028
14028
|
};
|
|
14029
14029
|
}
|
|
14030
14030
|
}
|
|
14031
|
-
}, {package:"
|
|
14031
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare-build.js",}],
|
|
14032
14032
|
[169, {"./compare":170}, function(){
|
|
14033
14033
|
with (this.scopeTerminator) {
|
|
14034
14034
|
with (this.globalThis) {
|
|
@@ -14042,7 +14042,7 @@ const compare=require("./compare"),compareLoose=(o,e)=>compare(o,e,!0);module.ex
|
|
|
14042
14042
|
};
|
|
14043
14043
|
}
|
|
14044
14044
|
}
|
|
14045
|
-
}, {package:"
|
|
14045
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare-loose.js",}],
|
|
14046
14046
|
[170, {"../classes/semver":164}, function(){
|
|
14047
14047
|
with (this.scopeTerminator) {
|
|
14048
14048
|
with (this.globalThis) {
|
|
@@ -14056,7 +14056,7 @@ const SemVer=require("../classes/semver"),compare=(e,r,m)=>new SemVer(e,m).compa
|
|
|
14056
14056
|
};
|
|
14057
14057
|
}
|
|
14058
14058
|
}
|
|
14059
|
-
}, {package:"
|
|
14059
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/compare.js",}],
|
|
14060
14060
|
[171, {"./parse.js":181}, function(){
|
|
14061
14061
|
with (this.scopeTerminator) {
|
|
14062
14062
|
with (this.globalThis) {
|
|
@@ -14070,7 +14070,7 @@ const parse=require("./parse.js"),diff=(r,e)=>{const a=parse(r,null,!0),o=parse(
|
|
|
14070
14070
|
};
|
|
14071
14071
|
}
|
|
14072
14072
|
}
|
|
14073
|
-
}, {package:"
|
|
14073
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/diff.js",}],
|
|
14074
14074
|
[172, {"./compare":170}, function(){
|
|
14075
14075
|
with (this.scopeTerminator) {
|
|
14076
14076
|
with (this.globalThis) {
|
|
@@ -14084,7 +14084,7 @@ const compare=require("./compare"),eq=(e,o,r)=>0===compare(e,o,r);module.exports
|
|
|
14084
14084
|
};
|
|
14085
14085
|
}
|
|
14086
14086
|
}
|
|
14087
|
-
}, {package:"
|
|
14087
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/eq.js",}],
|
|
14088
14088
|
[173, {"./compare":170}, function(){
|
|
14089
14089
|
with (this.scopeTerminator) {
|
|
14090
14090
|
with (this.globalThis) {
|
|
@@ -14098,7 +14098,7 @@ const compare=require("./compare"),gt=(e,o,r)=>compare(e,o,r)>0;module.exports=g
|
|
|
14098
14098
|
};
|
|
14099
14099
|
}
|
|
14100
14100
|
}
|
|
14101
|
-
}, {package:"
|
|
14101
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/gt.js",}],
|
|
14102
14102
|
[174, {"./compare":170}, function(){
|
|
14103
14103
|
with (this.scopeTerminator) {
|
|
14104
14104
|
with (this.globalThis) {
|
|
@@ -14112,7 +14112,7 @@ const compare=require("./compare"),gte=(e,o,r)=>compare(e,o,r)>=0;module.exports
|
|
|
14112
14112
|
};
|
|
14113
14113
|
}
|
|
14114
14114
|
}
|
|
14115
|
-
}, {package:"
|
|
14115
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/gte.js",}],
|
|
14116
14116
|
[175, {"../classes/semver":164}, function(){
|
|
14117
14117
|
with (this.scopeTerminator) {
|
|
14118
14118
|
with (this.globalThis) {
|
|
@@ -14126,7 +14126,7 @@ const SemVer=require("../classes/semver"),inc=(e,r,n,s,i)=>{"string"==typeof n&&
|
|
|
14126
14126
|
};
|
|
14127
14127
|
}
|
|
14128
14128
|
}
|
|
14129
|
-
}, {package:"
|
|
14129
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/inc.js",}],
|
|
14130
14130
|
[176, {"./compare":170}, function(){
|
|
14131
14131
|
with (this.scopeTerminator) {
|
|
14132
14132
|
with (this.globalThis) {
|
|
@@ -14140,7 +14140,7 @@ const compare=require("./compare"),lt=(e,o,r)=>compare(e,o,r)<0;module.exports=l
|
|
|
14140
14140
|
};
|
|
14141
14141
|
}
|
|
14142
14142
|
}
|
|
14143
|
-
}, {package:"
|
|
14143
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/lt.js",}],
|
|
14144
14144
|
[177, {"./compare":170}, function(){
|
|
14145
14145
|
with (this.scopeTerminator) {
|
|
14146
14146
|
with (this.globalThis) {
|
|
@@ -14154,7 +14154,7 @@ const compare=require("./compare"),lte=(e,o,r)=>compare(e,o,r)<=0;module.exports
|
|
|
14154
14154
|
};
|
|
14155
14155
|
}
|
|
14156
14156
|
}
|
|
14157
|
-
}, {package:"
|
|
14157
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/lte.js",}],
|
|
14158
14158
|
[178, {"../classes/semver":164}, function(){
|
|
14159
14159
|
with (this.scopeTerminator) {
|
|
14160
14160
|
with (this.globalThis) {
|
|
@@ -14168,7 +14168,7 @@ const SemVer=require("../classes/semver"),major=(e,r)=>new SemVer(e,r).major;mod
|
|
|
14168
14168
|
};
|
|
14169
14169
|
}
|
|
14170
14170
|
}
|
|
14171
|
-
}, {package:"
|
|
14171
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/major.js",}],
|
|
14172
14172
|
[179, {"../classes/semver":164}, function(){
|
|
14173
14173
|
with (this.scopeTerminator) {
|
|
14174
14174
|
with (this.globalThis) {
|
|
@@ -14182,7 +14182,7 @@ const SemVer=require("../classes/semver"),minor=(e,r)=>new SemVer(e,r).minor;mod
|
|
|
14182
14182
|
};
|
|
14183
14183
|
}
|
|
14184
14184
|
}
|
|
14185
|
-
}, {package:"
|
|
14185
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/minor.js",}],
|
|
14186
14186
|
[180, {"./compare":170}, function(){
|
|
14187
14187
|
with (this.scopeTerminator) {
|
|
14188
14188
|
with (this.globalThis) {
|
|
@@ -14196,7 +14196,7 @@ const compare=require("./compare"),neq=(e,o,r)=>0!==compare(e,o,r);module.export
|
|
|
14196
14196
|
};
|
|
14197
14197
|
}
|
|
14198
14198
|
}
|
|
14199
|
-
}, {package:"
|
|
14199
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/neq.js",}],
|
|
14200
14200
|
[181, {"../classes/semver":164}, function(){
|
|
14201
14201
|
with (this.scopeTerminator) {
|
|
14202
14202
|
with (this.globalThis) {
|
|
@@ -14210,7 +14210,7 @@ const SemVer=require("../classes/semver"),parse=(e,r,s=!1)=>{if(e instanceof Sem
|
|
|
14210
14210
|
};
|
|
14211
14211
|
}
|
|
14212
14212
|
}
|
|
14213
|
-
}, {package:"
|
|
14213
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/parse.js",}],
|
|
14214
14214
|
[182, {"../classes/semver":164}, function(){
|
|
14215
14215
|
with (this.scopeTerminator) {
|
|
14216
14216
|
with (this.globalThis) {
|
|
@@ -14224,7 +14224,7 @@ const SemVer=require("../classes/semver"),patch=(e,r)=>new SemVer(e,r).patch;mod
|
|
|
14224
14224
|
};
|
|
14225
14225
|
}
|
|
14226
14226
|
}
|
|
14227
|
-
}, {package:"
|
|
14227
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/patch.js",}],
|
|
14228
14228
|
[183, {"./parse":181}, function(){
|
|
14229
14229
|
with (this.scopeTerminator) {
|
|
14230
14230
|
with (this.globalThis) {
|
|
@@ -14238,7 +14238,7 @@ const parse=require("./parse"),prerelease=(e,r)=>{const s=parse(e,r);return s&&s
|
|
|
14238
14238
|
};
|
|
14239
14239
|
}
|
|
14240
14240
|
}
|
|
14241
|
-
}, {package:"
|
|
14241
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/prerelease.js",}],
|
|
14242
14242
|
[184, {"./compare":170}, function(){
|
|
14243
14243
|
with (this.scopeTerminator) {
|
|
14244
14244
|
with (this.globalThis) {
|
|
@@ -14252,7 +14252,7 @@ const compare=require("./compare"),rcompare=(r,e,o)=>compare(e,r,o);module.expor
|
|
|
14252
14252
|
};
|
|
14253
14253
|
}
|
|
14254
14254
|
}
|
|
14255
|
-
}, {package:"
|
|
14255
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/rcompare.js",}],
|
|
14256
14256
|
[185, {"./compare-build":168}, function(){
|
|
14257
14257
|
with (this.scopeTerminator) {
|
|
14258
14258
|
with (this.globalThis) {
|
|
@@ -14266,7 +14266,7 @@ const compareBuild=require("./compare-build"),rsort=(r,o)=>r.sort(((r,e)=>compar
|
|
|
14266
14266
|
};
|
|
14267
14267
|
}
|
|
14268
14268
|
}
|
|
14269
|
-
}, {package:"
|
|
14269
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/rsort.js",}],
|
|
14270
14270
|
[186, {"../classes/range":163}, function(){
|
|
14271
14271
|
with (this.scopeTerminator) {
|
|
14272
14272
|
with (this.globalThis) {
|
|
@@ -14280,7 +14280,7 @@ const Range=require("../classes/range"),satisfies=(e,s,t)=>{try{s=new Range(s,t)
|
|
|
14280
14280
|
};
|
|
14281
14281
|
}
|
|
14282
14282
|
}
|
|
14283
|
-
}, {package:"
|
|
14283
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/satisfies.js",}],
|
|
14284
14284
|
[187, {"./compare-build":168}, function(){
|
|
14285
14285
|
with (this.scopeTerminator) {
|
|
14286
14286
|
with (this.globalThis) {
|
|
@@ -14294,7 +14294,7 @@ const compareBuild=require("./compare-build"),sort=(o,r)=>o.sort(((o,e)=>compare
|
|
|
14294
14294
|
};
|
|
14295
14295
|
}
|
|
14296
14296
|
}
|
|
14297
|
-
}, {package:"
|
|
14297
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/sort.js",}],
|
|
14298
14298
|
[188, {"./parse":181}, function(){
|
|
14299
14299
|
with (this.scopeTerminator) {
|
|
14300
14300
|
with (this.globalThis) {
|
|
@@ -14308,7 +14308,7 @@ const parse=require("./parse"),valid=(e,r)=>{const s=parse(e,r);return s?s.versi
|
|
|
14308
14308
|
};
|
|
14309
14309
|
}
|
|
14310
14310
|
}
|
|
14311
|
-
}, {package:"
|
|
14311
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/functions/valid.js",}],
|
|
14312
14312
|
[189, {"./classes/comparator":162,"./classes/range":163,"./classes/semver":164,"./functions/clean":165,"./functions/cmp":166,"./functions/coerce":167,"./functions/compare":170,"./functions/compare-build":168,"./functions/compare-loose":169,"./functions/diff":171,"./functions/eq":172,"./functions/gt":173,"./functions/gte":174,"./functions/inc":175,"./functions/lt":176,"./functions/lte":177,"./functions/major":178,"./functions/minor":179,"./functions/neq":180,"./functions/parse":181,"./functions/patch":182,"./functions/prerelease":183,"./functions/rcompare":184,"./functions/rsort":185,"./functions/satisfies":186,"./functions/sort":187,"./functions/valid":188,"./internal/constants":190,"./internal/identifiers":192,"./internal/re":194,"./ranges/gtr":196,"./ranges/intersects":197,"./ranges/ltr":198,"./ranges/max-satisfying":199,"./ranges/min-satisfying":200,"./ranges/min-version":201,"./ranges/outside":202,"./ranges/simplify":203,"./ranges/subset":204,"./ranges/to-comparators":205,"./ranges/valid":206}, function(){
|
|
14313
14313
|
with (this.scopeTerminator) {
|
|
14314
14314
|
with (this.globalThis) {
|
|
@@ -14322,7 +14322,7 @@ const internalRe=require("./internal/re"),constants=require("./internal/constant
|
|
|
14322
14322
|
};
|
|
14323
14323
|
}
|
|
14324
14324
|
}
|
|
14325
|
-
}, {package:"
|
|
14325
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/index.js",}],
|
|
14326
14326
|
[190, {}, function(){
|
|
14327
14327
|
with (this.scopeTerminator) {
|
|
14328
14328
|
with (this.globalThis) {
|
|
@@ -14336,7 +14336,7 @@ const SEMVER_SPEC_VERSION="2.0.0",MAX_LENGTH=256,MAX_SAFE_INTEGER=Number.MAX_SAF
|
|
|
14336
14336
|
};
|
|
14337
14337
|
}
|
|
14338
14338
|
}
|
|
14339
|
-
}, {package:"
|
|
14339
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/constants.js",}],
|
|
14340
14340
|
[191, {}, function(){
|
|
14341
14341
|
with (this.scopeTerminator) {
|
|
14342
14342
|
with (this.globalThis) {
|
|
@@ -14350,7 +14350,7 @@ const debug="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bse
|
|
|
14350
14350
|
};
|
|
14351
14351
|
}
|
|
14352
14352
|
}
|
|
14353
|
-
}, {package:"
|
|
14353
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/debug.js",}],
|
|
14354
14354
|
[192, {}, function(){
|
|
14355
14355
|
with (this.scopeTerminator) {
|
|
14356
14356
|
with (this.globalThis) {
|
|
@@ -14364,7 +14364,7 @@ const numeric=/^[0-9]+$/,compareIdentifiers=(e,r)=>{const i=numeric.test(e),t=nu
|
|
|
14364
14364
|
};
|
|
14365
14365
|
}
|
|
14366
14366
|
}
|
|
14367
|
-
}, {package:"
|
|
14367
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/identifiers.js",}],
|
|
14368
14368
|
[193, {}, function(){
|
|
14369
14369
|
with (this.scopeTerminator) {
|
|
14370
14370
|
with (this.globalThis) {
|
|
@@ -14378,7 +14378,7 @@ const looseOption=Object.freeze({loose:!0}),emptyOpts=Object.freeze({}),parseOpt
|
|
|
14378
14378
|
};
|
|
14379
14379
|
}
|
|
14380
14380
|
}
|
|
14381
|
-
}, {package:"
|
|
14381
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/parse-options.js",}],
|
|
14382
14382
|
[194, {"./constants":190,"./debug":191}, function(){
|
|
14383
14383
|
with (this.scopeTerminator) {
|
|
14384
14384
|
with (this.globalThis) {
|
|
@@ -14392,7 +14392,7 @@ const{MAX_SAFE_COMPONENT_LENGTH:MAX_SAFE_COMPONENT_LENGTH}=require("./constants"
|
|
|
14392
14392
|
};
|
|
14393
14393
|
}
|
|
14394
14394
|
}
|
|
14395
|
-
}, {package:"
|
|
14395
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/internal/re.js",}],
|
|
14396
14396
|
[195, {"yallist":214}, function(){
|
|
14397
14397
|
with (this.scopeTerminator) {
|
|
14398
14398
|
with (this.globalThis) {
|
|
@@ -14406,7 +14406,7 @@ const{MAX_SAFE_COMPONENT_LENGTH:MAX_SAFE_COMPONENT_LENGTH}=require("./constants"
|
|
|
14406
14406
|
};
|
|
14407
14407
|
}
|
|
14408
14408
|
}
|
|
14409
|
-
}, {package:"
|
|
14409
|
+
}, {package:"@metamask/utils>semver>lru-cache",file:"../../node_modules/semver/node_modules/lru-cache/index.js",}],
|
|
14410
14410
|
[196, {"./outside":202}, function(){
|
|
14411
14411
|
with (this.scopeTerminator) {
|
|
14412
14412
|
with (this.globalThis) {
|
|
@@ -14420,7 +14420,7 @@ const outside=require("./outside"),gtr=(e,t,o)=>outside(e,t,">",o);module.export
|
|
|
14420
14420
|
};
|
|
14421
14421
|
}
|
|
14422
14422
|
}
|
|
14423
|
-
}, {package:"
|
|
14423
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/gtr.js",}],
|
|
14424
14424
|
[197, {"../classes/range":163}, function(){
|
|
14425
14425
|
with (this.scopeTerminator) {
|
|
14426
14426
|
with (this.globalThis) {
|
|
@@ -14434,7 +14434,7 @@ const Range=require("../classes/range"),intersects=(e,s,n)=>(e=new Range(e,n),s=
|
|
|
14434
14434
|
};
|
|
14435
14435
|
}
|
|
14436
14436
|
}
|
|
14437
|
-
}, {package:"
|
|
14437
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/intersects.js",}],
|
|
14438
14438
|
[198, {"./outside":202}, function(){
|
|
14439
14439
|
with (this.scopeTerminator) {
|
|
14440
14440
|
with (this.globalThis) {
|
|
@@ -14448,7 +14448,7 @@ const outside=require("./outside"),ltr=(e,t,o)=>outside(e,t,"<",o);module.export
|
|
|
14448
14448
|
};
|
|
14449
14449
|
}
|
|
14450
14450
|
}
|
|
14451
|
-
}, {package:"
|
|
14451
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/ltr.js",}],
|
|
14452
14452
|
[199, {"../classes/range":163,"../classes/semver":164}, function(){
|
|
14453
14453
|
with (this.scopeTerminator) {
|
|
14454
14454
|
with (this.globalThis) {
|
|
@@ -14462,7 +14462,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),maxS
|
|
|
14462
14462
|
};
|
|
14463
14463
|
}
|
|
14464
14464
|
}
|
|
14465
|
-
}, {package:"
|
|
14465
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/max-satisfying.js",}],
|
|
14466
14466
|
[200, {"../classes/range":163,"../classes/semver":164}, function(){
|
|
14467
14467
|
with (this.scopeTerminator) {
|
|
14468
14468
|
with (this.globalThis) {
|
|
@@ -14476,7 +14476,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),minS
|
|
|
14476
14476
|
};
|
|
14477
14477
|
}
|
|
14478
14478
|
}
|
|
14479
|
-
}, {package:"
|
|
14479
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/min-satisfying.js",}],
|
|
14480
14480
|
[201, {"../classes/range":163,"../classes/semver":164,"../functions/gt":173}, function(){
|
|
14481
14481
|
with (this.scopeTerminator) {
|
|
14482
14482
|
with (this.globalThis) {
|
|
@@ -14490,7 +14490,7 @@ const SemVer=require("../classes/semver"),Range=require("../classes/range"),gt=r
|
|
|
14490
14490
|
};
|
|
14491
14491
|
}
|
|
14492
14492
|
}
|
|
14493
|
-
}, {package:"
|
|
14493
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/min-version.js",}],
|
|
14494
14494
|
[202, {"../classes/comparator":162,"../classes/range":163,"../classes/semver":164,"../functions/gt":173,"../functions/gte":174,"../functions/lt":176,"../functions/lte":177,"../functions/satisfies":186}, function(){
|
|
14495
14495
|
with (this.scopeTerminator) {
|
|
14496
14496
|
with (this.globalThis) {
|
|
@@ -14504,7 +14504,7 @@ const SemVer=require("../classes/semver"),Comparator=require("../classes/compara
|
|
|
14504
14504
|
};
|
|
14505
14505
|
}
|
|
14506
14506
|
}
|
|
14507
|
-
}, {package:"
|
|
14507
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/outside.js",}],
|
|
14508
14508
|
[203, {"../functions/compare.js":170,"../functions/satisfies.js":186}, function(){
|
|
14509
14509
|
with (this.scopeTerminator) {
|
|
14510
14510
|
with (this.globalThis) {
|
|
@@ -14518,7 +14518,7 @@ const satisfies=require("../functions/satisfies.js"),compare=require("../functio
|
|
|
14518
14518
|
};
|
|
14519
14519
|
}
|
|
14520
14520
|
}
|
|
14521
|
-
}, {package:"
|
|
14521
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/simplify.js",}],
|
|
14522
14522
|
[204, {"../classes/comparator.js":162,"../classes/range.js":163,"../functions/compare.js":170,"../functions/satisfies.js":186}, function(){
|
|
14523
14523
|
with (this.scopeTerminator) {
|
|
14524
14524
|
with (this.globalThis) {
|
|
@@ -14532,7 +14532,7 @@ const Range=require("../classes/range.js"),Comparator=require("../classes/compar
|
|
|
14532
14532
|
};
|
|
14533
14533
|
}
|
|
14534
14534
|
}
|
|
14535
|
-
}, {package:"
|
|
14535
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/subset.js",}],
|
|
14536
14536
|
[205, {"../classes/range":163}, function(){
|
|
14537
14537
|
with (this.scopeTerminator) {
|
|
14538
14538
|
with (this.globalThis) {
|
|
@@ -14546,7 +14546,7 @@ const Range=require("../classes/range"),toComparators=(a,e)=>new Range(a,e).set.
|
|
|
14546
14546
|
};
|
|
14547
14547
|
}
|
|
14548
14548
|
}
|
|
14549
|
-
}, {package:"
|
|
14549
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/to-comparators.js",}],
|
|
14550
14550
|
[206, {"../classes/range":163}, function(){
|
|
14551
14551
|
with (this.scopeTerminator) {
|
|
14552
14552
|
with (this.globalThis) {
|
|
@@ -14560,7 +14560,7 @@ const Range=require("../classes/range"),validRange=(e,n)=>{try{return new Range(
|
|
|
14560
14560
|
};
|
|
14561
14561
|
}
|
|
14562
14562
|
}
|
|
14563
|
-
}, {package:"
|
|
14563
|
+
}, {package:"@metamask/utils>semver",file:"../../node_modules/semver/ranges/valid.js",}],
|
|
14564
14564
|
[207, {}, function(){
|
|
14565
14565
|
with (this.scopeTerminator) {
|
|
14566
14566
|
with (this.globalThis) {
|
|
@@ -14658,7 +14658,7 @@ function wrappy(n,r){if(n&&r)return wrappy(n)(r);if("function"!=typeof n)throw n
|
|
|
14658
14658
|
};
|
|
14659
14659
|
}
|
|
14660
14660
|
}
|
|
14661
|
-
}, {package:"
|
|
14661
|
+
}, {package:"@metamask/utils>semver>lru-cache>yallist",file:"../../node_modules/yallist/iterator.js",}],
|
|
14662
14662
|
[214, {"./iterator.js":213}, function(){
|
|
14663
14663
|
with (this.scopeTerminator) {
|
|
14664
14664
|
with (this.globalThis) {
|
|
@@ -14672,7 +14672,7 @@ function wrappy(n,r){if(n&&r)return wrappy(n)(r);if("function"!=typeof n)throw n
|
|
|
14672
14672
|
};
|
|
14673
14673
|
}
|
|
14674
14674
|
}
|
|
14675
|
-
}, {package:"
|
|
14675
|
+
}, {package:"@metamask/utils>semver>lru-cache>yallist",file:"../../node_modules/yallist/yallist.js",}],
|
|
14676
14676
|
[215, {"../logging":235,"../openrpc.json":238,"./../../../snaps-utils/src/index.browser":248,"./commands":216,"./endowments":221,"./globalEvents":228,"./keyring":230,"./sortParams":232,"./utils":233,"./validation":234,"@metamask/providers":61,"@metamask/utils":78,"eth-rpc-errors":111,"json-rpc-engine":139,"superstruct":208}, function(){
|
|
14677
14677
|
with (this.scopeTerminator) {
|
|
14678
14678
|
with (this.globalThis) {
|
|
@@ -15541,5 +15541,5 @@ module.exports={
|
|
|
15541
15541
|
};
|
|
15542
15542
|
}
|
|
15543
15543
|
}
|
|
15544
|
-
}, {package:"external:../snaps-utils/src/virtual-file/index.browser.ts",file:"../snaps-utils/src/virtual-file/index.browser.ts",}]],[237],{"resources":{"@metamask/object-multiplex":{"globals":{"console.warn":true},"packages":{"@metamask/object-multiplex>readable-stream":true,"pump>end-of-stream":true,"pump>once":true}},"@metamask/object-multiplex>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true,"@metamask/object-multiplex>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/object-multiplex>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/object-multiplex>readable-stream>string_decoder":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true}},"@metamask/post-message-stream":{"builtin":{"worker_threads.parentPort":true},"globals":{"MessageEvent.prototype":true,"WorkerGlobalScope":true,"addEventListener":true,"browser":true,"chrome":true,"location.origin":true,"postMessage":true,"process.on":true,"process.removeListener":true,"process.send":true,"removeEventListener":true},"packages":{"@metamask/post-message-stream>@metamask/utils":true,"@metamask/post-message-stream>readable-stream":true,"worker_threads":true}},"@metamask/post-message-stream>@metamask/utils":{"builtin":{"buffer.Buffer":true},"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"buffer":true,"eslint>debug":true,"superstruct":true,"ts-jest>semver":true}},"@metamask/post-message-stream>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/post-message-stream>readable-stream>process-nextick-args":true,"@metamask/post-message-stream>readable-stream>safe-buffer":true,"@metamask/post-message-stream>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/post-message-stream>readable-stream>process-nextick-args":{"globals":{"process.nextTick":true,"process.version":true}},"@metamask/post-message-stream>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/post-message-stream>readable-stream>string_decoder":{"packages":{"@metamask/post-message-stream>readable-stream>safe-buffer":true}},"@metamask/providers":{"globals":{"Event":true,"addEventListener":true,"chrome.runtime.connect":true,"console":true,"dispatchEvent":true,"document.createElement":true,"document.readyState":true,"ethereum":"write","location.hostname":true,"removeEventListener":true,"web3":true},"packages":{"@metamask/object-multiplex":true,"@metamask/providers>@metamask/safe-event-emitter":true,"@metamask/providers>detect-browser":true,"@metamask/providers>extension-port-stream":true,"@metamask/providers>fast-deep-equal":true,"@metamask/providers>is-stream":true,"@metamask/providers>json-rpc-middleware-stream":true,"eth-rpc-errors":true,"json-rpc-engine":true,"pump":true}},"@metamask/providers>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"@metamask/providers>detect-browser":{"globals":{"document":true,"navigator":true,"process":true}},"@metamask/providers>extension-port-stream":{"builtin":{"buffer.Buffer":true,"stream.Duplex":true},"packages":{"buffer":true,"stream":true}},"@metamask/providers>json-rpc-middleware-stream":{"globals":{"console.warn":true,"setTimeout":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream":true}},"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true}},"@metamask/rpc-methods>@noble/hashes":{"globals":{"TextEncoder":true,"crypto":true}},"@metamask/snaps-utils>@scure/base":{"globals":{"TextDecoder":true,"TextEncoder":true}},"@metamask/snaps-utils>cron-parser":{"builtin":{"fs.readFile":true},"packages":{"@metamask/snaps-utils>cron-parser>luxon":true,"fs":true}},"@metamask/snaps-utils>cron-parser>luxon":{"globals":{"Intl":true}},"@metamask/snaps-utils>is-svg":{"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser":true}},"@metamask/snaps-utils>is-svg>fast-xml-parser":{"globals":{"entityName":true,"val":true},"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser>strnum":true}},"@metamask/snaps-utils>rfdc":{"builtin":{"buffer.Buffer":true},"packages":{"buffer":true}},"@metamask/snaps-utils>validate-npm-package-name":{"packages":{"@metamask/snaps-utils>validate-npm-package-name>builtins":true}},"@metamask/snaps-utils>validate-npm-package-name>builtins":{"globals":{"process.version":true},"packages":{"ts-jest>semver":true}},"@metamask/utils":{"builtin":{"buffer.Buffer":true},"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"buffer":true,"eslint>debug":true,"superstruct":true,"ts-jest>semver":true}},"@wdio/mocha-framework>mocha>supports-color":{"builtin":{"os.release":true,"tty.isatty":true},"globals":{"process.env":true,"process.platform":true},"packages":{"istanbul-lib-report>supports-color>has-flag":true,"os":true,"tty":true}},"browserify>inherits":{"builtin":{"util.inherits":true},"packages":{"util":true}},"browserify>readable-stream>core-util-is":{"packages":{"browserify>insert-module-globals>is-buffer":true}},"browserify>readable-stream>process-nextick-args":{"globals":{"process":true}},"browserify>readable-stream>util-deprecate":{"builtin":{"util.deprecate":true},"packages":{"util":true}},"eslint>debug":{"builtin":{"tty.isatty":true,"util.deprecate":true,"util.format":true,"util.inspect":true},"globals":{"console":true,"document":true,"localStorage":true,"navigator":true,"process":true},"packages":{"@wdio/mocha-framework>mocha>supports-color":true,"eslint>debug>ms":true,"tty":true,"util":true}},"eth-rpc-errors":{"packages":{"eth-rpc-errors>fast-safe-stringify":true}},"external:../snaps-utils/src/checksum.ts":{"packages":{"@metamask/rpc-methods>@noble/hashes":true,"@metamask/utils":true,"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"external:../snaps-utils/src/cronjob.ts":{"packages":{"@metamask/snaps-utils>cron-parser":true,"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/deep-clone.ts":{"packages":{"@metamask/snaps-utils>rfdc":true}},"external:../snaps-utils/src/icon.ts":{"builtin":{"buffer":true},"packages":{"@metamask/snaps-utils>is-svg":true,"@metamask/utils":true,"buffer":true}},"external:../snaps-utils/src/index.browser.ts":{"packages":{"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/deep-clone.ts":true,"external:../snaps-utils/src/default-endowments.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/handlers.ts":true,"external:../snaps-utils/src/iframe.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/logging.ts":true,"external:../snaps-utils/src/manifest/index.browser.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/notification.ts":true,"external:../snaps-utils/src/path.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"external:../snaps-utils/src/validation.ts":true,"external:../snaps-utils/src/versions.ts":true,"external:../snaps-utils/src/virtual-file/index.browser.ts":true}},"external:../snaps-utils/src/json-rpc.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/logging.ts":{"globals":{"console":true},"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/manifest/index.browser.ts":{"packages":{"external:../snaps-utils/src/manifest/validation.ts":true}},"external:../snaps-utils/src/manifest/validation.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/namespace.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/notification.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/namespace.ts":true,"superstruct":true}},"external:../snaps-utils/src/path.ts":{"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/snaps.ts":{"packages":{"@metamask/snaps-utils>@scure/base":true,"@metamask/snaps-utils>validate-npm-package-name":true,"@metamask/utils":true,"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true,"ts-jest>fast-json-stable-stringify":true}},"external:../snaps-utils/src/types.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/validation.ts":{"packages":{"external:../snaps-utils/src/icon.ts":true,"external:../snaps-utils/src/manifest/validation.ts":true,"external:../snaps-utils/src/snaps.ts":true}},"external:../snaps-utils/src/versions.ts":{"packages":{"@metamask/utils":true,"superstruct":true,"ts-jest>semver":true}},"external:../snaps-utils/src/virtual-file/VirtualFile.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/deep-clone.ts":true}},"external:../snaps-utils/src/virtual-file/index.browser.ts":{"packages":{"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"istanbul-lib-report>supports-color>has-flag":{"globals":{"process.argv":true}},"json-rpc-engine":{"packages":{"eth-rpc-errors":true,"json-rpc-engine>@metamask/safe-event-emitter":true}},"json-rpc-engine>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"pump":{"builtin":{"fs":true},"globals":{"process.version":true},"packages":{"fs":true,"pump>end-of-stream":true,"pump>once":true}},"pump>end-of-stream":{"globals":{"process.nextTick":true},"packages":{"pump>once":true}},"pump>once":{"packages":{"pump>once>wrappy":true}},"ts-jest>semver":{"globals":{"console.error":true,"process":true},"packages":{"ts-jest>semver>lru-cache":true}},"ts-jest>semver>lru-cache":{"packages":{"ts-jest>semver>lru-cache>yallist":true}}}})
|
|
15544
|
+
}, {package:"external:../snaps-utils/src/virtual-file/index.browser.ts",file:"../snaps-utils/src/virtual-file/index.browser.ts",}]],[237],{"resources":{"@metamask/object-multiplex":{"globals":{"console.warn":true},"packages":{"@metamask/object-multiplex>readable-stream":true,"pump>end-of-stream":true,"pump>once":true}},"@metamask/object-multiplex>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true,"@metamask/object-multiplex>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/object-multiplex>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/object-multiplex>readable-stream>string_decoder":{"packages":{"@metamask/object-multiplex>readable-stream>safe-buffer":true}},"@metamask/post-message-stream":{"builtin":{"worker_threads.parentPort":true},"globals":{"MessageEvent.prototype":true,"WorkerGlobalScope":true,"addEventListener":true,"browser":true,"chrome":true,"location.origin":true,"postMessage":true,"process.on":true,"process.removeListener":true,"process.send":true,"removeEventListener":true},"packages":{"@metamask/post-message-stream>@metamask/utils":true,"@metamask/post-message-stream>readable-stream":true,"worker_threads":true}},"@metamask/post-message-stream>@metamask/utils":{"builtin":{"buffer.Buffer":true},"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"@metamask/utils>semver":true,"buffer":true,"eslint>debug":true,"superstruct":true}},"@metamask/post-message-stream>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/post-message-stream>readable-stream>process-nextick-args":true,"@metamask/post-message-stream>readable-stream>safe-buffer":true,"@metamask/post-message-stream>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/post-message-stream>readable-stream>process-nextick-args":{"globals":{"process.nextTick":true,"process.version":true}},"@metamask/post-message-stream>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/post-message-stream>readable-stream>string_decoder":{"packages":{"@metamask/post-message-stream>readable-stream>safe-buffer":true}},"@metamask/providers":{"globals":{"Event":true,"addEventListener":true,"chrome.runtime.connect":true,"console":true,"dispatchEvent":true,"document.createElement":true,"document.readyState":true,"ethereum":"write","location.hostname":true,"removeEventListener":true,"web3":true},"packages":{"@metamask/object-multiplex":true,"@metamask/providers>@metamask/safe-event-emitter":true,"@metamask/providers>detect-browser":true,"@metamask/providers>extension-port-stream":true,"@metamask/providers>fast-deep-equal":true,"@metamask/providers>is-stream":true,"@metamask/providers>json-rpc-middleware-stream":true,"eth-rpc-errors":true,"json-rpc-engine":true,"pump":true}},"@metamask/providers>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"@metamask/providers>detect-browser":{"globals":{"document":true,"navigator":true,"process":true}},"@metamask/providers>extension-port-stream":{"builtin":{"buffer.Buffer":true,"stream.Duplex":true},"packages":{"buffer":true,"stream":true}},"@metamask/providers>json-rpc-middleware-stream":{"globals":{"console.warn":true,"setTimeout":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream":true}},"@metamask/providers>json-rpc-middleware-stream>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream":{"builtin":{"events.EventEmitter":true,"stream":true,"timers.setImmediate":true,"util":true},"globals":{"process.browser":true,"process.env.READABLE_STREAM":true,"process.stderr":true,"process.stdout":true,"process.version.slice":true},"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true,"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":true,"browserify>inherits":true,"browserify>readable-stream>core-util-is":true,"browserify>readable-stream>isarray":true,"browserify>readable-stream>process-nextick-args":true,"browserify>readable-stream>util-deprecate":true,"events":true,"stream":true,"timers":true,"util":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":{"builtin":{"buffer":true},"packages":{"buffer":true}},"@metamask/providers>json-rpc-middleware-stream>readable-stream>string_decoder":{"packages":{"@metamask/providers>json-rpc-middleware-stream>readable-stream>safe-buffer":true}},"@metamask/rpc-methods>@noble/hashes":{"globals":{"TextEncoder":true,"crypto":true}},"@metamask/snaps-utils>@scure/base":{"globals":{"TextDecoder":true,"TextEncoder":true}},"@metamask/snaps-utils>cron-parser":{"builtin":{"fs.readFile":true},"packages":{"@metamask/snaps-utils>cron-parser>luxon":true,"fs":true}},"@metamask/snaps-utils>cron-parser>luxon":{"globals":{"Intl":true}},"@metamask/snaps-utils>is-svg":{"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser":true}},"@metamask/snaps-utils>is-svg>fast-xml-parser":{"globals":{"entityName":true,"val":true},"packages":{"@metamask/snaps-utils>is-svg>fast-xml-parser>strnum":true}},"@metamask/snaps-utils>rfdc":{"builtin":{"buffer.Buffer":true},"packages":{"buffer":true}},"@metamask/snaps-utils>validate-npm-package-name":{"packages":{"@metamask/snaps-utils>validate-npm-package-name>builtins":true}},"@metamask/snaps-utils>validate-npm-package-name>builtins":{"globals":{"process.version":true},"packages":{"@metamask/utils>semver":true}},"@metamask/utils":{"builtin":{"buffer.Buffer":true},"globals":{"TextDecoder":true,"TextEncoder":true},"packages":{"@metamask/utils>semver":true,"buffer":true,"eslint>debug":true,"superstruct":true}},"@metamask/utils>semver":{"globals":{"console.error":true,"process":true},"packages":{"@metamask/utils>semver>lru-cache":true}},"@metamask/utils>semver>lru-cache":{"packages":{"@metamask/utils>semver>lru-cache>yallist":true}},"@wdio/mocha-framework>mocha>supports-color":{"builtin":{"os.release":true,"tty.isatty":true},"globals":{"process.env":true,"process.platform":true},"packages":{"istanbul-lib-report>supports-color>has-flag":true,"os":true,"tty":true}},"browserify>inherits":{"builtin":{"util.inherits":true},"packages":{"util":true}},"browserify>readable-stream>core-util-is":{"packages":{"browserify>insert-module-globals>is-buffer":true}},"browserify>readable-stream>process-nextick-args":{"globals":{"process":true}},"browserify>readable-stream>util-deprecate":{"builtin":{"util.deprecate":true},"packages":{"util":true}},"eslint>debug":{"builtin":{"tty.isatty":true,"util.deprecate":true,"util.format":true,"util.inspect":true},"globals":{"console":true,"document":true,"localStorage":true,"navigator":true,"process":true},"packages":{"@wdio/mocha-framework>mocha>supports-color":true,"eslint>debug>ms":true,"tty":true,"util":true}},"eth-rpc-errors":{"packages":{"eth-rpc-errors>fast-safe-stringify":true}},"external:../snaps-utils/src/checksum.ts":{"packages":{"@metamask/rpc-methods>@noble/hashes":true,"@metamask/utils":true,"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"external:../snaps-utils/src/cronjob.ts":{"packages":{"@metamask/snaps-utils>cron-parser":true,"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/deep-clone.ts":{"packages":{"@metamask/snaps-utils>rfdc":true}},"external:../snaps-utils/src/icon.ts":{"builtin":{"buffer":true},"packages":{"@metamask/snaps-utils>is-svg":true,"@metamask/utils":true,"buffer":true}},"external:../snaps-utils/src/index.browser.ts":{"packages":{"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/deep-clone.ts":true,"external:../snaps-utils/src/default-endowments.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/handlers.ts":true,"external:../snaps-utils/src/iframe.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/logging.ts":true,"external:../snaps-utils/src/manifest/index.browser.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/notification.ts":true,"external:../snaps-utils/src/path.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"external:../snaps-utils/src/validation.ts":true,"external:../snaps-utils/src/versions.ts":true,"external:../snaps-utils/src/virtual-file/index.browser.ts":true}},"external:../snaps-utils/src/json-rpc.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/logging.ts":{"globals":{"console":true},"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/manifest/index.browser.ts":{"packages":{"external:../snaps-utils/src/manifest/validation.ts":true}},"external:../snaps-utils/src/manifest/validation.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/cronjob.ts":true,"external:../snaps-utils/src/entropy.ts":true,"external:../snaps-utils/src/json-rpc.ts":true,"external:../snaps-utils/src/namespace.ts":true,"external:../snaps-utils/src/snaps.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/namespace.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/notification.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/namespace.ts":true,"superstruct":true}},"external:../snaps-utils/src/path.ts":{"packages":{"@metamask/utils":true}},"external:../snaps-utils/src/snaps.ts":{"packages":{"@metamask/snaps-utils>@scure/base":true,"@metamask/snaps-utils>fast-json-stable-stringify":true,"@metamask/snaps-utils>validate-npm-package-name":true,"@metamask/utils":true,"external:../snaps-utils/src/caveats.ts":true,"external:../snaps-utils/src/checksum.ts":true,"external:../snaps-utils/src/types.ts":true,"superstruct":true}},"external:../snaps-utils/src/types.ts":{"packages":{"@metamask/utils":true,"superstruct":true}},"external:../snaps-utils/src/validation.ts":{"packages":{"external:../snaps-utils/src/icon.ts":true,"external:../snaps-utils/src/manifest/validation.ts":true,"external:../snaps-utils/src/snaps.ts":true}},"external:../snaps-utils/src/versions.ts":{"packages":{"@metamask/utils":true,"@metamask/utils>semver":true,"superstruct":true}},"external:../snaps-utils/src/virtual-file/VirtualFile.ts":{"packages":{"@metamask/utils":true,"external:../snaps-utils/src/deep-clone.ts":true}},"external:../snaps-utils/src/virtual-file/index.browser.ts":{"packages":{"external:../snaps-utils/src/virtual-file/VirtualFile.ts":true}},"istanbul-lib-report>supports-color>has-flag":{"globals":{"process.argv":true}},"json-rpc-engine":{"packages":{"eth-rpc-errors":true,"json-rpc-engine>@metamask/safe-event-emitter":true}},"json-rpc-engine>@metamask/safe-event-emitter":{"builtin":{"events.EventEmitter":true},"globals":{"setTimeout":true},"packages":{"events":true}},"pump":{"builtin":{"fs":true},"globals":{"process.version":true},"packages":{"fs":true,"pump>end-of-stream":true,"pump>once":true}},"pump>end-of-stream":{"globals":{"process.nextTick":true},"packages":{"pump>once":true}},"pump>once":{"packages":{"pump>once>wrappy":true}}}})
|
|
15545
15545
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL25vZGVfbW9kdWxlcy9AbGF2YW1vYXQvbGF2YXBhY2svc3JjL19wcmVsdWRlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIjsoZnVuY3Rpb24oKSB7XG4gIC8vIHRoaXMgcnVudGltZSB0ZW1wbGF0ZSBjb2RlIGlzIGRlc3RpbmVkIHRvIHdyYXAgTGF2YU1vYXQgZW50aXJlbHksXG4gIC8vIHRoZXJlZm9yZSB0aGlzIGlzIG91ciB3YXkgb2YgY2FwdHVyaW5nIGFjY2VzcyB0byBiYXNpYyBBUElzIExhdmFNb2F0XG4gIC8vIHVzZXMgdG8gc3RpbGwgYmUgYWNjZXNzaWJsZSBvbmx5IHRvIExhdmFNb2F0IGFmdGVyIHNjdXR0bGluZyBvY2N1cnNcbiAgY29uc3Qge1xuICAgIFJlZ0V4cCxcbiAgICBSZWZsZWN0LFxuICAgIE9iamVjdCxcbiAgICBFcnJvcixcbiAgICBBcnJheSxcbiAgICBTZXQsXG4gICAgTWF0aCxcbiAgICBEYXRlLFxuICAgIGNvbnNvbGUsXG4gIH0gPSBnbG9iYWxUaGlzXG5cbiAgY29uc3QgbW9kdWxlUmVnaXN0cnkgPSBuZXcgTWFwKClcbiAgY29uc3QgbGF2YW1vYXRQb2xpY3kgPSB7IHJlc291cmNlczoge30gfVxuICBjb25zdCBkZWJ1Z01vZGUgPSBmYWxzZVxuICBjb25zdCBzdGF0c01vZGUgPSBmYWxzZVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGtlcm5lbFxuICBjb25zdCByZXBvcnRTdGF0c0hvb2sgPSBzdGF0c01vZGUgPyAoZnVuY3Rpb24gbWFrZUluaXRTdGF0c0hvb2sgKHsgb25TdGF0c1JlYWR5IH0pIHtcbiAgbGV0IHN0YXRNb2R1bGVTdGFjayA9IFtdXG4gIHJldHVybiByZXBvcnRTdGF0c0hvb2tcblxuICBmdW5jdGlvbiByZXBvcnRTdGF0c0hvb2sgKGV2ZW50LCBtb2R1bGVJZCkge1xuICAgIGlmIChldmVudCA9PT0gJ3N0YXJ0Jykge1xuICAgICAgLy8gcmVjb3JkIHN0YXJ0XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICAvLyBjb25zb2xlLmxvZyhgbG9hZGVkIG1vZHVsZSAke21vZHVsZUlkfWApXG4gICAgICBjb25zdCBzdGF0UmVjb3JkID0ge1xuICAgICAgICAnbmFtZSc6IG1vZHVsZUlkLFxuICAgICAgICAndmFsdWUnOiBudWxsLFxuICAgICAgICAnY2hpbGRyZW4nOiBbXSxcbiAgICAgICAgJ3N0YXJ0VGltZSc6IHN0YXJ0VGltZSxcbiAgICAgICAgJ2VuZFRpbWUnOiBudWxsLFxuICAgICAgfVxuICAgICAgLy8gYWRkIGFzIGNoaWxkIHRvIGN1cnJlbnRcbiAgICAgIGlmIChzdGF0TW9kdWxlU3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdCA9IHN0YXRNb2R1bGVTdGFja1tzdGF0TW9kdWxlU3RhY2subGVuZ3RoIC0gMV1cbiAgICAgICAgY3VycmVudFN0YXQuY2hpbGRyZW4ucHVzaChzdGF0UmVjb3JkKVxuICAgICAgfVxuICAgICAgLy8gc2V0IGFzIGN1cnJlbnRcbiAgICAgIHN0YXRNb2R1bGVTdGFjay5wdXNoKHN0YXRSZWNvcmQpXG4gICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ2VuZCcpIHtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpXG4gICAgICBjb25zdCBjdXJyZW50U3RhdCA9IHN0YXRNb2R1bGVTdGFja1tzdGF0TW9kdWxlU3RhY2subGVuZ3RoIC0gMV1cbiAgICAgIC8vIHNhbml0eSBjaGVjaywgc2hvdWxkIG9ubHkgZ2V0IGFuIGVuZCBmb3IgdGhlIGN1cnJlbnQgdG9wIG9mIHN0YWNrXG4gICAgICBpZiAoY3VycmVudFN0YXQubmFtZSAhPT0gbW9kdWxlSWQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgc3RhdHMgaG9vayBtaXNhbGlnbmVkIFwiJHtjdXJyZW50U3RhdC5uYW1lfVwiLCBcIiR7bW9kdWxlSWR9XCIgJHtzdGF0TW9kdWxlU3RhY2subWFwKGUgPT4gZS5uYW1lKS5qb2luKCl9YClcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRTdGF0LmVuZFRpbWUgPSBlbmRUaW1lXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBjdXJyZW50U3RhdC5zdGFydFRpbWVcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZVxuICAgICAgY3VycmVudFN0YXQudmFsdWUgPSBkdXJhdGlvblxuICAgICAgLy8gY29uc29sZS5sb2coYGxvYWRlZCBtb2R1bGUgJHttb2R1bGVJZH0gaW4gJHtkdXJhdGlvbn1tc2ApXG4gICAgICAvLyBjaGVjayBpZiB0b3RhbGx5IGRvbmVcbiAgICAgIGlmIChzdGF0TW9kdWxlU3RhY2subGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0LnZlcnNpb24gPSAxXG4gICAgICAgIG9uU3RhdHNSZWFkeShjdXJyZW50U3RhdClcbiAgICAgIH1cbiAgICAgIHN0YXRNb2R1bGVTdGFjay5wb3AoKVxuICAgIH1cbiAgfVxuXG59KSh7IG9uU3RhdHNSZWFkeSB9KSA6ICgpID0+IHt9XG4gIGNvbnN0IGNyZWF0ZUtlcm5lbCA9IC8vIExhdmFNb2F0IFByZWx1ZGVcbihmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBjcmVhdGVLZXJuZWxcblxuICBmdW5jdGlvbiBjcmVhdGVLZXJuZWwgKHtcbiAgICBsYXZhbW9hdENvbmZpZyxcbiAgICBsb2FkTW9kdWxlRGF0YSxcbiAgICBnZXRSZWxhdGl2ZU1vZHVsZUlkLFxuICAgIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MsXG4gICAgZ2V0RXh0ZXJuYWxDb21wYXJ0bWVudCxcbiAgICBnbG9iYWxUaGlzUmVmcyxcbiAgICBydW5XaXRoUHJlY29tcGlsZWRNb2R1bGVzLFxuICAgIHJlcG9ydFN0YXRzSG9vayxcbiAgfSkge1xuICAgIC8vIGRlYnVnIG9wdGlvbnMgYXJlIGhhcmQtY29kZWQgYXQgYnVpbGQgdGltZVxuICAgIGNvbnN0IHtcbiAgICAgIGRlYnVnTW9kZSxcbiAgICB9ID0ge1wiZGVidWdNb2RlXCI6ZmFsc2V9XG4gICAgLy8gc2VjdXJpdHkgb3B0aW9ucyBhcmUgaGFyZC1jb2RlZCBhdCBidWlsZCB0aW1lXG4gICAgY29uc3Qge1xuICAgICAgc2N1dHRsZUdsb2JhbFRoaXMsXG4gICAgICBzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnMsXG4gICAgfSA9IHtcInNjdXR0bGVHbG9iYWxUaGlzXCI6ZmFsc2UsXCJzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnNcIjpbXX1cblxuICAgIC8vIGlkZW50aWZ5IHRoZSBnbG9iYWxSZWZcbiAgICBjb25zdCBnbG9iYWxSZWYgPSAodHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnKSA/IGdsb2JhbFRoaXMgOiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnKSA/IHNlbGYgOiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpID8gZ2xvYmFsIDogdW5kZWZpbmVkXG4gICAgaWYgKCFnbG9iYWxSZWYpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTGF2YW1vYXQgLSB1bmFibGUgdG8gaWRlbnRpZnkgZ2xvYmFsUmVmJylcbiAgICB9XG5cbiAgICAvLyBwb2x5ZmlsbCBnbG9iYWxUaGlzXG4gICAgaWYgKGdsb2JhbFJlZiAmJiAhZ2xvYmFsUmVmLmdsb2JhbFRoaXMpIHtcbiAgICAgIGdsb2JhbFJlZi5nbG9iYWxUaGlzID0gZ2xvYmFsUmVmXG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIHRoZSBTRVMgcm9vdFJlYWxtXG4gICAgLy8gXCJ0ZW1wbGF0ZVJlcXVpcmVcIiBjYWxscyBhcmUgaW5saW5lZCBpbiBcImdlbmVyYXRlS2VybmVsXCJcbiAgICAvLyBsb2FkLWJlYXJpbmcgc2VtaS1jb2xvbiwgZG8gbm90IHJlbW92ZVxuICAgIDsvLyBkZWZpbmUgc2VzXG4oZnVuY3Rpb24oKXtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsUmVmXG4gIGNvbnN0IGV4cG9ydHMgPSB7fVxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHMgfVxuICA7KGZ1bmN0aW9uKCl7XG4vLyBTVEFSVCBvZiBpbmplY3RlZCBjb2RlIGZyb20gc2VzXG4ndXNlIHN0cmljdCc7XG4oKCkgPT4ge1xuICBjb25zdCBmdW5jdG9ycyA9IFtcbi8vID09PSBmdW5jdG9yc1swXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAqL1xuXG4vKipcbiAqIGNvbW1vbnMuanNcbiAqIERlY2xhcmUgc2hvcnRoYW5kIGZ1bmN0aW9ucy4gU2hhcmluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYWNyb3NzIG1vZHVsZXNcbiAqIGltcHJvdmVzIG9uIGNvbnNpc3RlbmN5IGFuZCBtaW5pZmljYXRpb24uIFVudXNlZCBkZWNsYXJhdGlvbnMgYXJlXG4gKiBkcm9wcGVkIGJ5IHRoZSB0cmVlIHNoYWtpbmcgcHJvY2Vzcy5cbiAqXG4gKiBXZSBjYXB0dXJlIHRoZXNlLCBub3QganVzdCBmb3IgYnJldml0eSwgYnV0IGZvciBzZWN1cml0eS4gSWYgYW55IGNvZGVcbiAqIG1vZGlmaWVzIE9iamVjdCB0byBjaGFuZ2Ugd2hhdCAnYXNzaWduJyBwb2ludHMgdG8sIHRoZSBDb21wYXJ0bWVudCBzaGltXG4gKiB3b3VsZCBiZSBjb3JydXB0ZWQuXG4gKi9cblxuLy8gV2UgY2Fubm90IHVzZSBnbG9iYWxUaGlzIGFzIHRoZSBsb2NhbCBuYW1lIHNpbmNlIGl0IHdvdWxkIGNhcHR1cmUgdGhlXG4vLyBsZXhpY2FsIG5hbWUuXG5jb25zdCB1bml2ZXJzYWxUaGlzPSAgZ2xvYmFsVGhpczskaOKAjV9vbmNlLnVuaXZlcnNhbFRoaXModW5pdmVyc2FsVGhpcyk7XG5cblxuY29uc3QgICAgICAgIHtcbiAgQXJyYXksXG4gIERhdGUsXG4gIEZpbmFsaXphdGlvblJlZ2lzdHJ5LFxuICBGbG9hdDMyQXJyYXksXG4gIEpTT04sXG4gIE1hcCxcbiAgTWF0aCxcbiAgTnVtYmVyLFxuICBPYmplY3QsXG4gIFByb21pc2UsXG4gIFByb3h5LFxuICBSZWZsZWN0LFxuICBSZWdFeHA6IEZFUkFMX1JFR19FWFAsXG4gIFNldCxcbiAgU3RyaW5nLFxuICBXZWFrTWFwLFxuICBXZWFrU2V0fT1cbiAgICBnbG9iYWxUaGlzOyRo4oCNX29uY2UuQXJyYXkoQXJyYXkpOyRo4oCNX29uY2UuRGF0ZShEYXRlKTskaOKAjV9vbmNlLkZpbmFsaXphdGlvblJlZ2lzdHJ5KEZpbmFsaXphdGlvblJlZ2lzdHJ5KTskaOKAjV9vbmNlLkZsb2F0MzJBcnJheShGbG9hdDMyQXJyYXkpOyRo4oCNX29uY2UuSlNPTihKU09OKTskaOKAjV9vbmNlLk1hcChNYXApOyRo4oCNX29uY2UuTWF0aChNYXRoKTskaOKAjV9vbmNlLk51bWJlcihOdW1iZXIpOyRo4oCNX29uY2UuT2JqZWN0KE9iamVjdCk7JGjigI1fb25jZS5Qcm9taXNlKFByb21pc2UpOyRo4oCNX29uY2UuUHJveHkoUHJveHkpOyRo4oCNX29uY2UuUmVmbGVjdChSZWZsZWN0KTskaOKAjV9vbmNlLkZFUkFMX1JFR19FWFAoRkVSQUxfUkVHX0VYUCk7JGjigI1fb25jZS5TZXQoU2V0KTskaOKAjV9vbmNlLlN0cmluZyhTdHJpbmcpOyRo4oCNX29uY2UuV2Vha01hcChXZWFrTWFwKTskaOKAjV9vbmNlLldlYWtTZXQoV2Vha1NldCk7XG5cbmNvbnN0ICAgICAgICB7XG4gIC8vIFRoZSBmZXJhbCBFcnJvciBjb25zdHJ1Y3RvciBpcyBzYWZlIGZvciBpbnRlcm5hbCB1c2UsIGJ1dCBtdXN0IG5vdCBiZVxuICAvLyByZXZlYWxlZCB0byBwb3N0LWxvY2tkb3duIGNvZGUgaW4gYW55IGNvbXBhcnRtZW50IGluY2x1ZGluZyB0aGUgc3RhcnRcbiAgLy8gY29tcGFydG1lbnQgc2luY2UgaW4gVjggYXQgbGVhc3QgaXQgYmVhcnMgc3RhY2sgaW5zcGVjdGlvbiBjYXBhYmlsaXRpZXMuXG4gIEVycm9yOiBGRVJBTF9FUlJPUixcbiAgUmFuZ2VFcnJvcixcbiAgUmVmZXJlbmNlRXJyb3IsXG4gIFN5bnRheEVycm9yLFxuICBUeXBlRXJyb3J9PVxuICAgIGdsb2JhbFRoaXM7JGjigI1fb25jZS5GRVJBTF9FUlJPUihGRVJBTF9FUlJPUik7JGjigI1fb25jZS5SYW5nZUVycm9yKFJhbmdlRXJyb3IpOyRo4oCNX29uY2UuUmVmZXJlbmNlRXJyb3IoUmVmZXJlbmNlRXJyb3IpOyRo4oCNX29uY2UuU3ludGF4RXJyb3IoU3ludGF4RXJyb3IpOyRo4oCNX29uY2UuVHlwZUVycm9yKFR5cGVFcnJvcik7XG5cbmNvbnN0ICAgICAgICB7XG4gIGFzc2lnbixcbiAgY3JlYXRlLFxuICBkZWZpbmVQcm9wZXJ0aWVzLFxuICBlbnRyaWVzLFxuICBmcmVlemUsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzLFxuICBpc0V4dGVuc2libGUsXG4gIGtleXMsXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBzZWFsLFxuICBwcmV2ZW50RXh0ZW5zaW9ucyxcbiAgc2V0UHJvdG90eXBlT2YsXG4gIHZhbHVlcyxcbiAgZnJvbUVudHJpZXN9PVxuICAgIE9iamVjdDskaOKAjV9vbmNlLmFzc2lnbihhc3NpZ24pOyRo4oCNX29uY2UuY3JlYXRlKGNyZWF0ZSk7JGjigI1fb25jZS5kZWZpbmVQcm9wZXJ0aWVzKGRlZmluZVByb3BlcnRpZXMpOyRo4oCNX29uY2UuZW50cmllcyhlbnRyaWVzKTskaOKAjV9vbmNlLmZyZWV6ZShmcmVlemUpOyRo4oCNX29uY2UuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdldE93blByb3BlcnR5RGVzY3JpcHRvcik7JGjigI1fb25jZS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpOyRo4oCNX29uY2UuZ2V0T3duUHJvcGVydHlOYW1lcyhnZXRPd25Qcm9wZXJ0eU5hbWVzKTskaOKAjV9vbmNlLmdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKTskaOKAjV9vbmNlLmlzKGlzKTskaOKAjV9vbmNlLmlzRXh0ZW5zaWJsZShpc0V4dGVuc2libGUpOyRo4oCNX29uY2Uua2V5cyhrZXlzKTskaOKAjV9vbmNlLm9iamVjdFByb3RvdHlwZShvYmplY3RQcm90b3R5cGUpOyRo4oCNX29uY2Uuc2VhbChzZWFsKTskaOKAjV9vbmNlLnByZXZlbnRFeHRlbnNpb25zKHByZXZlbnRFeHRlbnNpb25zKTskaOKAjV9vbmNlLnNldFByb3RvdHlwZU9mKHNldFByb3RvdHlwZU9mKTskaOKAjV9vbmNlLnZhbHVlcyh2YWx1ZXMpOyRo4oCNX29uY2UuZnJvbUVudHJpZXMoZnJvbUVudHJpZXMpO1xuXG5jb25zdCAgICAgICAge1xuICBzcGVjaWVzOiBzcGVjaWVzU3ltYm9sLFxuICB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wsXG4gIGl0ZXJhdG9yOiBpdGVyYXRvclN5bWJvbCxcbiAgbWF0Y2hBbGw6IG1hdGNoQWxsU3ltYm9sLFxuICB1bnNjb3BhYmxlczogdW5zY29wYWJsZXNTeW1ib2wsXG4gIGtleUZvcjogc3ltYm9sS2V5Rm9yLFxuICBmb3I6IHN5bWJvbEZvcn09XG4gICAgU3ltYm9sOyRo4oCNX29uY2Uuc3BlY2llc1N5bWJvbChzcGVjaWVzU3ltYm9sKTskaOKAjV9vbmNlLnRvU3RyaW5nVGFnU3ltYm9sKHRvU3RyaW5nVGFnU3ltYm9sKTskaOKAjV9vbmNlLml0ZXJhdG9yU3ltYm9sKGl0ZXJhdG9yU3ltYm9sKTskaOKAjV9vbmNlLm1hdGNoQWxsU3ltYm9sKG1hdGNoQWxsU3ltYm9sKTskaOKAjV9vbmNlLnVuc2NvcGFibGVzU3ltYm9sKHVuc2NvcGFibGVzU3ltYm9sKTskaOKAjV9vbmNlLnN5bWJvbEtleUZvcihzeW1ib2xLZXlGb3IpOyRo4oCNX29uY2Uuc3ltYm9sRm9yKHN5bWJvbEZvcik7XG5cbmNvbnN0ICAgICAgICB7IGlzSW50ZWdlcn09ICAgTnVtYmVyOyRo4oCNX29uY2UuaXNJbnRlZ2VyKGlzSW50ZWdlcik7XG5cbmNvbnN0ICAgICAgICB7IHN0cmluZ2lmeTogc3RyaW5naWZ5SnNvbn09ICAgSlNPTjtcblxuLy8gTmVlZGVkIG9ubHkgZm9yIHRoZSBTYWZhcmkgYnVnIHdvcmthcm91bmQgYmVsb3dcbiRo4oCNX29uY2Uuc3RyaW5naWZ5SnNvbihzdHJpbmdpZnlKc29uKTtjb25zdHtkZWZpbmVQcm9wZXJ0eTpvcmlnaW5hbERlZmluZVByb3BlcnR5fT1PYmplY3Q7XG5cbmNvbnN0ICAgICAgICBkZWZpbmVQcm9wZXJ0eT0gIChvYmplY3QsIHByb3AsIGRlc2NyaXB0b3IpPT4gIHtcbiAgLy8gV2UgdXNlZCB0byBkbyB0aGUgZm9sbG93aW5nLCB1bnRpbCB3ZSBoYWQgdG8gcmVvcGVuIFNhZmFyaSBidWdcbiAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyMjUzOCNjMTdcbiAgLy8gT25jZSB0aGlzIGlzIGZpeGVkLCB3ZSBtYXkgcmVzdG9yZSBpdC5cbiAgLy8gLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIGFsbG93ZWQgdG8gZmFpbCBzaWxlbnRseSBzbyB3ZSB1c2VcbiAgLy8gLy8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgaW5zdGVhZC5cbiAgLy8gcmV0dXJuIGRlZmluZVByb3BlcnRpZXMob2JqZWN0LCB7IFtwcm9wXTogZGVzY3JpcHRvciB9KTtcblxuICAvLyBJbnN0ZWFkLCB0byB3b3JrYXJvdW5kIHRoZSBTYWZhcmkgYnVnXG4gIGNvbnN0IHJlc3VsdD0gIG9yaWdpbmFsRGVmaW5lUHJvcGVydHkob2JqZWN0LCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgaWYoIHJlc3VsdCE9PSAgb2JqZWN0KSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFxuICAgICAgIGBQbGVhc2UgcmVwb3J0IHRoYXQgdGhlIG9yaWdpbmFsIGRlZmluZVByb3BlcnR5IHNpbGVudGx5IGZhaWxlZCB0byBzZXQgJHtzdHJpbmdpZnlKc29uKFxuICAgICAgICBTdHJpbmcocHJvcCkpXG4gICAgICAgIH0uIChTRVNfREVGSU5FX1BST1BFUlRZX0ZBSUxFRF9TSUxFTlRMWSlgKTtcblxuICAgfVxuICByZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5kZWZpbmVQcm9wZXJ0eShkZWZpbmVQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICB7XG4gIGFwcGx5LFxuICBjb25zdHJ1Y3QsXG4gIGdldDogcmVmbGVjdEdldCxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiByZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBoYXM6IHJlZmxlY3RIYXMsXG4gIGlzRXh0ZW5zaWJsZTogcmVmbGVjdElzRXh0ZW5zaWJsZSxcbiAgb3duS2V5cyxcbiAgcHJldmVudEV4dGVuc2lvbnM6IHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9ucyxcbiAgc2V0OiByZWZsZWN0U2V0fT1cbiAgICBSZWZsZWN0OyRo4oCNX29uY2UuYXBwbHkoYXBwbHkpOyRo4oCNX29uY2UuY29uc3RydWN0KGNvbnN0cnVjdCk7JGjigI1fb25jZS5yZWZsZWN0R2V0KHJlZmxlY3RHZXQpOyRo4oCNX29uY2UucmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKTskaOKAjV9vbmNlLnJlZmxlY3RIYXMocmVmbGVjdEhhcyk7JGjigI1fb25jZS5yZWZsZWN0SXNFeHRlbnNpYmxlKHJlZmxlY3RJc0V4dGVuc2libGUpOyRo4oCNX29uY2Uub3duS2V5cyhvd25LZXlzKTskaOKAjV9vbmNlLnJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9ucyhyZWZsZWN0UHJldmVudEV4dGVuc2lvbnMpOyRo4oCNX29uY2UucmVmbGVjdFNldChyZWZsZWN0U2V0KTtcblxuY29uc3QgICAgICAgIHsgaXNBcnJheSwgcHJvdG90eXBlOiBhcnJheVByb3RvdHlwZX09ICAgQXJyYXk7JGjigI1fb25jZS5pc0FycmF5KGlzQXJyYXkpOyRo4oCNX29uY2UuYXJyYXlQcm90b3R5cGUoYXJyYXlQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiBtYXBQcm90b3R5cGV9PSAgIE1hcDskaOKAjV9vbmNlLm1hcFByb3RvdHlwZShtYXBQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcmV2b2NhYmxlOiBwcm94eVJldm9jYWJsZX09ICAgUHJveHk7JGjigI1fb25jZS5wcm94eVJldm9jYWJsZShwcm94eVJldm9jYWJsZSk7XG5jb25zdCAgICAgICAgeyBwcm90b3R5cGU6IHJlZ2V4cFByb3RvdHlwZX09ICAgUmVnRXhwOyRo4oCNX29uY2UucmVnZXhwUHJvdG90eXBlKHJlZ2V4cFByb3RvdHlwZSk7XG5jb25zdCAgICAgICAgeyBwcm90b3R5cGU6IHNldFByb3RvdHlwZX09ICAgU2V0OyRo4oCNX29uY2Uuc2V0UHJvdG90eXBlKHNldFByb3RvdHlwZSk7XG5jb25zdCAgICAgICAgeyBwcm90b3R5cGU6IHN0cmluZ1Byb3RvdHlwZX09ICAgU3RyaW5nOyRo4oCNX29uY2Uuc3RyaW5nUHJvdG90eXBlKHN0cmluZ1Byb3RvdHlwZSk7XG5jb25zdCAgICAgICAgeyBwcm90b3R5cGU6IHdlYWttYXBQcm90b3R5cGV9PSAgIFdlYWtNYXA7JGjigI1fb25jZS53ZWFrbWFwUHJvdG90eXBlKHdlYWttYXBQcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiB3ZWFrc2V0UHJvdG90eXBlfT0gICBXZWFrU2V0OyRo4oCNX29uY2Uud2Vha3NldFByb3RvdHlwZSh3ZWFrc2V0UHJvdG90eXBlKTtcbmNvbnN0ICAgICAgICB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGV9PSAgIEZ1bmN0aW9uOyRo4oCNX29uY2UuZnVuY3Rpb25Qcm90b3R5cGUoZnVuY3Rpb25Qcm90b3R5cGUpO1xuY29uc3QgICAgICAgIHsgcHJvdG90eXBlOiBwcm9taXNlUHJvdG90eXBlfT0gICBQcm9taXNlOyRo4oCNX29uY2UucHJvbWlzZVByb3RvdHlwZShwcm9taXNlUHJvdG90eXBlKTtcblxuY29uc3QgICAgICAgIHR5cGVkQXJyYXlQcm90b3R5cGU9ICBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7JGjigI1fb25jZS50eXBlZEFycmF5UHJvdG90eXBlKHR5cGVkQXJyYXlQcm90b3R5cGUpO1xuXG5jb25zdCB7IGJpbmR9PSAgIGZ1bmN0aW9uUHJvdG90eXBlO1xuLyoqXG4gKiB1bmN1cnJ5VGhpcygpXG4gKiBFcXVpdmFsZW50IG9mOiBmbiA9PiAodGhpc0FyZywgLi4uYXJncykgPT4gYXBwbHkoZm4sIHRoaXNBcmcsIGFyZ3MpXG4gKlxuICogU2VlIHRob3NlIHJlZmVyZW5jZSBmb3IgYSBjb21wbGV0ZSBleHBsYW5hdGlvbjpcbiAqIGh0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPWNvbnZlbnRpb25zOnNhZmVfbWV0YV9wcm9ncmFtbWluZ1xuICogd2hpY2ggb25seSBsaXZlcyBhdFxuICogaHR0cDovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA4MDUyMjU3MTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9Y29udmVudGlvbnM6c2FmZV9tZXRhX3Byb2dyYW1taW5nXG4gKlxuICogQHR5cGUgezxGIGV4dGVuZHMgKHRoaXM6IGFueSwgLi4uYXJnczogYW55W10pID0+IGFueT4oZm46IEYpID0+ICgodGhpc0FyZzogVGhpc1BhcmFtZXRlclR5cGU8Rj4sIC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IFJldHVyblR5cGU8Rj4pfVxuICovXG5jb25zdCAgICAgICAgdW5jdXJyeVRoaXM9ICBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4kaOKAjV9vbmNlLnVuY3VycnlUaGlzKHVuY3VycnlUaGlzKTtcbmNvbnN0ICAgICAgICBvYmplY3RIYXNPd25Qcm9wZXJ0eT0gIHVuY3VycnlUaGlzKG9iamVjdFByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG4vL1xuJGjigI1fb25jZS5vYmplY3RIYXNPd25Qcm9wZXJ0eShvYmplY3RIYXNPd25Qcm9wZXJ0eSk7Y29uc3QgYXJyYXlGaWx0ZXI9dW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUuZmlsdGVyKTskaOKAjV9vbmNlLmFycmF5RmlsdGVyKGFycmF5RmlsdGVyKTtcbmNvbnN0ICAgICAgICBhcnJheUZvckVhY2g9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5mb3JFYWNoKTskaOKAjV9vbmNlLmFycmF5Rm9yRWFjaChhcnJheUZvckVhY2gpO1xuY29uc3QgICAgICAgIGFycmF5SW5jbHVkZXM9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5pbmNsdWRlcyk7JGjigI1fb25jZS5hcnJheUluY2x1ZGVzKGFycmF5SW5jbHVkZXMpO1xuY29uc3QgICAgICAgIGFycmF5Sm9pbj0gIHVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLmpvaW4pO1xuLyoqIEB0eXBlIHs8VCwgVT4odGhpc0FyZzogcmVhZG9ubHkgVFtdLCBjYWxsYmFja2ZuOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFUsIHRoaXNBcmc/OiBhbnkpID0+IFVbXX0gKi8kaOKAjV9vbmNlLmFycmF5Sm9pbihhcnJheUpvaW4pO1xuY29uc3QgICAgICAgIGFycmF5TWFwPSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUubWFwKTskaOKAjV9vbmNlLmFycmF5TWFwKGFycmF5TWFwKTtcbmNvbnN0ICAgICAgICBhcnJheVBvcD0gIHVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLnBvcCk7XG4vKiogQHR5cGUgezxUPih0aGlzQXJnOiBUW10sIC4uLml0ZW1zOiBUW10pID0+IG51bWJlcn0gKi8kaOKAjV9vbmNlLmFycmF5UG9wKGFycmF5UG9wKTtcbmNvbnN0ICAgICAgICBhcnJheVB1c2g9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5wdXNoKTskaOKAjV9vbmNlLmFycmF5UHVzaChhcnJheVB1c2gpO1xuY29uc3QgICAgICAgIGFycmF5U2xpY2U9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZS5zbGljZSk7JGjigI1fb25jZS5hcnJheVNsaWNlKGFycmF5U2xpY2UpO1xuY29uc3QgICAgICAgIGFycmF5U29tZT0gIHVuY3VycnlUaGlzKGFycmF5UHJvdG90eXBlLnNvbWUpOyRo4oCNX29uY2UuYXJyYXlTb21lKGFycmF5U29tZSk7XG5jb25zdCAgICAgICAgYXJyYXlTb3J0PSAgdW5jdXJyeVRoaXMoYXJyYXlQcm90b3R5cGUuc29ydCk7JGjigI1fb25jZS5hcnJheVNvcnQoYXJyYXlTb3J0KTtcbmNvbnN0ICAgICAgICBpdGVyYXRlQXJyYXk9ICB1bmN1cnJ5VGhpcyhhcnJheVByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0pO1xuLy9cbiRo4oCNX29uY2UuaXRlcmF0ZUFycmF5KGl0ZXJhdGVBcnJheSk7Y29uc3QgbWFwU2V0PXVuY3VycnlUaGlzKG1hcFByb3RvdHlwZS5zZXQpOyRo4oCNX29uY2UubWFwU2V0KG1hcFNldCk7XG5jb25zdCAgICAgICAgbWFwR2V0PSAgdW5jdXJyeVRoaXMobWFwUHJvdG90eXBlLmdldCk7JGjigI1fb25jZS5tYXBHZXQobWFwR2V0KTtcbmNvbnN0ICAgICAgICBtYXBIYXM9ICB1bmN1cnJ5VGhpcyhtYXBQcm90b3R5cGUuaGFzKTskaOKAjV9vbmNlLm1hcEhhcyhtYXBIYXMpO1xuY29uc3QgICAgICAgIG1hcERlbGV0ZT0gIHVuY3VycnlUaGlzKG1hcFByb3RvdHlwZS5kZWxldGUpOyRo4oCNX29uY2UubWFwRGVsZXRlKG1hcERlbGV0ZSk7XG5jb25zdCAgICAgICAgbWFwRW50cmllcz0gIHVuY3VycnlUaGlzKG1hcFByb3RvdHlwZS5lbnRyaWVzKTskaOKAjV9vbmNlLm1hcEVudHJpZXMobWFwRW50cmllcyk7XG5jb25zdCAgICAgICAgaXRlcmF0ZU1hcD0gIHVuY3VycnlUaGlzKG1hcFByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0pO1xuLy9cbiRo4oCNX29uY2UuaXRlcmF0ZU1hcChpdGVyYXRlTWFwKTtjb25zdCBzZXRBZGQ9dW5jdXJyeVRoaXMoc2V0UHJvdG90eXBlLmFkZCk7JGjigI1fb25jZS5zZXRBZGQoc2V0QWRkKTtcbmNvbnN0ICAgICAgICBzZXREZWxldGU9ICB1bmN1cnJ5VGhpcyhzZXRQcm90b3R5cGUuZGVsZXRlKTskaOKAjV9vbmNlLnNldERlbGV0ZShzZXREZWxldGUpO1xuY29uc3QgICAgICAgIHNldEZvckVhY2g9ICB1bmN1cnJ5VGhpcyhzZXRQcm90b3R5cGUuZm9yRWFjaCk7JGjigI1fb25jZS5zZXRGb3JFYWNoKHNldEZvckVhY2gpO1xuY29uc3QgICAgICAgIHNldEhhcz0gIHVuY3VycnlUaGlzKHNldFByb3RvdHlwZS5oYXMpOyRo4oCNX29uY2Uuc2V0SGFzKHNldEhhcyk7XG5jb25zdCAgICAgICAgaXRlcmF0ZVNldD0gIHVuY3VycnlUaGlzKHNldFByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0pO1xuLy9cbiRo4oCNX29uY2UuaXRlcmF0ZVNldChpdGVyYXRlU2V0KTtjb25zdCByZWdleHBUZXN0PXVuY3VycnlUaGlzKHJlZ2V4cFByb3RvdHlwZS50ZXN0KTskaOKAjV9vbmNlLnJlZ2V4cFRlc3QocmVnZXhwVGVzdCk7XG5jb25zdCAgICAgICAgcmVnZXhwRXhlYz0gIHVuY3VycnlUaGlzKHJlZ2V4cFByb3RvdHlwZS5leGVjKTskaOKAjV9vbmNlLnJlZ2V4cEV4ZWMocmVnZXhwRXhlYyk7XG5jb25zdCAgICAgICAgbWF0Y2hBbGxSZWdFeHA9ICB1bmN1cnJ5VGhpcyhyZWdleHBQcm90b3R5cGVbbWF0Y2hBbGxTeW1ib2xdKTtcbi8vXG4kaOKAjV9vbmNlLm1hdGNoQWxsUmVnRXhwKG1hdGNoQWxsUmVnRXhwKTtjb25zdCBzdHJpbmdFbmRzV2l0aD11bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGUuZW5kc1dpdGgpOyRo4oCNX29uY2Uuc3RyaW5nRW5kc1dpdGgoc3RyaW5nRW5kc1dpdGgpO1xuY29uc3QgICAgICAgIHN0cmluZ0luY2x1ZGVzPSAgdW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLmluY2x1ZGVzKTskaOKAjV9vbmNlLnN0cmluZ0luY2x1ZGVzKHN0cmluZ0luY2x1ZGVzKTtcbmNvbnN0ICAgICAgICBzdHJpbmdJbmRleE9mPSAgdW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLmluZGV4T2YpOyRo4oCNX29uY2Uuc3RyaW5nSW5kZXhPZihzdHJpbmdJbmRleE9mKTtcbmNvbnN0ICAgICAgICBzdHJpbmdNYXRjaD0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5tYXRjaCk7XG4vKipcbiAqIEB0eXBlIHtcbiAqICAgKCh0aGlzQXJnOiBzdHJpbmcsIHNlYXJjaFZhbHVlOiB7IFtTeW1ib2wucmVwbGFjZV0oc3RyaW5nOiBzdHJpbmcsIHJlcGxhY2VWYWx1ZTogc3RyaW5nKTogc3RyaW5nOyB9LCByZXBsYWNlVmFsdWU6IHN0cmluZykgPT4gc3RyaW5nKSB8XG4gKiAgICgodGhpc0FyZzogc3RyaW5nLCBzZWFyY2hWYWx1ZTogeyBbU3ltYm9sLnJlcGxhY2VdKHN0cmluZzogc3RyaW5nLCByZXBsYWNlcjogKHN1YnN0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nKTogc3RyaW5nOyB9LCByZXBsYWNlcjogKHN1YnN0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgPT4gc3RyaW5nKSA9PiBzdHJpbmcpXG4gKiB9XG4gKi8kaOKAjV9vbmNlLnN0cmluZ01hdGNoKHN0cmluZ01hdGNoKTtcbmNvbnN0ICAgICAgICBzdHJpbmdSZXBsYWNlPSAgdW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLnJlcGxhY2UpOyRo4oCNX29uY2Uuc3RyaW5nUmVwbGFjZShzdHJpbmdSZXBsYWNlKTtcbmNvbnN0ICAgICAgICBzdHJpbmdTZWFyY2g9ICB1bmN1cnJ5VGhpcyhzdHJpbmdQcm90b3R5cGUuc2VhcmNoKTskaOKAjV9vbmNlLnN0cmluZ1NlYXJjaChzdHJpbmdTZWFyY2gpO1xuY29uc3QgICAgICAgIHN0cmluZ1NsaWNlPSAgdW5jdXJyeVRoaXMoc3RyaW5nUHJvdG90eXBlLnNsaWNlKTtcbi8qKiBAdHlwZSB7KHRoaXNBcmc6IHN0cmluZywgc3BsaXR0ZXI6IHN0cmluZyB8IFJlZ0V4cCB8IHsgW1N5bWJvbC5zcGxpdF0oc3RyaW5nOiBzdHJpbmcsIGxpbWl0PzogbnVtYmVyKTogc3RyaW5nW107IH0sIGxpbWl0PzogbnVtYmVyKSA9PiBzdHJpbmdbXX0gKi8kaOKAjV9vbmNlLnN0cmluZ1NsaWNlKHN0cmluZ1NsaWNlKTtcbmNvbnN0ICAgICAgICBzdHJpbmdTcGxpdD0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5zcGxpdCk7JGjigI1fb25jZS5zdHJpbmdTcGxpdChzdHJpbmdTcGxpdCk7XG5jb25zdCAgICAgICAgc3RyaW5nU3RhcnRzV2l0aD0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZS5zdGFydHNXaXRoKTskaOKAjV9vbmNlLnN0cmluZ1N0YXJ0c1dpdGgoc3RyaW5nU3RhcnRzV2l0aCk7XG5jb25zdCAgICAgICAgaXRlcmF0ZVN0cmluZz0gIHVuY3VycnlUaGlzKHN0cmluZ1Byb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0pO1xuLy9cbiRo4oCNX29uY2UuaXRlcmF0ZVN0cmluZyhpdGVyYXRlU3RyaW5nKTtjb25zdCB3ZWFrbWFwRGVsZXRlPXVuY3VycnlUaGlzKHdlYWttYXBQcm90b3R5cGUuZGVsZXRlKTtcbi8qKiBAdHlwZSB7PEssIFY+KHRoaXNBcmc6IFdlYWtNYXA8SywgVj4sIC4uLmFyZ3M6IFBhcmFtZXRlcnM8V2Vha01hcDxLLFY+WydnZXQnXT4pID0+IFJldHVyblR5cGU8V2Vha01hcDxLLFY+WydnZXQnXT59ICovJGjigI1fb25jZS53ZWFrbWFwRGVsZXRlKHdlYWttYXBEZWxldGUpO1xuY29uc3QgICAgICAgIHdlYWttYXBHZXQ9ICB1bmN1cnJ5VGhpcyh3ZWFrbWFwUHJvdG90eXBlLmdldCk7JGjigI1fb25jZS53ZWFrbWFwR2V0KHdlYWttYXBHZXQpO1xuY29uc3QgICAgICAgIHdlYWttYXBIYXM9ICB1bmN1cnJ5VGhpcyh3ZWFrbWFwUHJvdG90eXBlLmhhcyk7JGjigI1fb25jZS53ZWFrbWFwSGFzKHdlYWttYXBIYXMpO1xuY29uc3QgICAgICAgIHdlYWttYXBTZXQ9ICB1bmN1cnJ5VGhpcyh3ZWFrbWFwUHJvdG90eXBlLnNldCk7XG4vL1xuJGjigI1fb25jZS53ZWFrbWFwU2V0KHdlYWttYXBTZXQpO2NvbnN0IHdlYWtzZXRBZGQ9dW5jdXJyeVRoaXMod2Vha3NldFByb3RvdHlwZS5hZGQpOyRo4oCNX29uY2Uud2Vha3NldEFkZCh3ZWFrc2V0QWRkKTtcbmNvbnN0ICAgICAgICB3ZWFrc2V0R2V0PSAgdW5jdXJyeVRoaXMod2Vha3NldFByb3RvdHlwZS5nZXQpOyRo4oCNX29uY2Uud2Vha3NldEdldCh3ZWFrc2V0R2V0KTtcbmNvbnN0ICAgICAgICB3ZWFrc2V0SGFzPSAgdW5jdXJyeVRoaXMod2Vha3NldFByb3RvdHlwZS5oYXMpO1xuLy9cbiRo4oCNX29uY2Uud2Vha3NldEhhcyh3ZWFrc2V0SGFzKTtjb25zdCBmdW5jdGlvblRvU3RyaW5nPXVuY3VycnlUaGlzKGZ1bmN0aW9uUHJvdG90eXBlLnRvU3RyaW5nKTtcbi8vXG4kaOKAjV9vbmNlLmZ1bmN0aW9uVG9TdHJpbmcoZnVuY3Rpb25Ub1N0cmluZyk7Y29uc3R7YWxsfT1Qcm9taXNlO1xuY29uc3QgICAgICAgIHByb21pc2VBbGw9ICAocHJvbWlzZXMpPT5hcHBseShhbGwsIFByb21pc2UsIFtwcm9taXNlc10pOyRo4oCNX29uY2UucHJvbWlzZUFsbChwcm9taXNlQWxsKTtcbmNvbnN0ICAgICAgICBwcm9taXNlQ2F0Y2g9ICB1bmN1cnJ5VGhpcyhwcm9taXNlUHJvdG90eXBlLmNhdGNoKTtcbi8qKiBAdHlwZSB7PFQsIFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4odGhpc0FyZzogVCwgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCB1bmRlZmluZWQgfCBudWxsLCBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgdW5kZWZpbmVkIHwgbnVsbCkgPT4gUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPn0gKi8kaOKAjV9vbmNlLnByb21pc2VDYXRjaChwcm9taXNlQ2F0Y2gpO1xuY29uc3QgICAgICAgIHByb21pc2VUaGVuPSAgdW5jdXJyeVRoaXMocHJvbWlzZVByb3RvdHlwZS50aGVuKTtcbi8vXG4kaOKAjV9vbmNlLnByb21pc2VUaGVuKHByb21pc2VUaGVuKTtjb25zdCBmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyPVxuICBGaW5hbGl6YXRpb25SZWdpc3RyeSYmICB1bmN1cnJ5VGhpcyhGaW5hbGl6YXRpb25SZWdpc3RyeS5wcm90b3R5cGUucmVnaXN0ZXIpOyRo4oCNX29uY2UuZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3RlcihmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyKTtcbmNvbnN0ICAgICAgICBmaW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXI9XG4gIEZpbmFsaXphdGlvblJlZ2lzdHJ5JiZcbiAgdW5jdXJyeVRoaXMoRmluYWxpemF0aW9uUmVnaXN0cnkucHJvdG90eXBlLnVucmVnaXN0ZXIpO1xuXG4vKipcbiAqIGdldENvbnN0cnVjdG9yT2YoKVxuICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmcm9tIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi8kaOKAjV9vbmNlLmZpbmFsaXphdGlvblJlZ2lzdHJ5VW5yZWdpc3RlcihmaW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXIpO1xuY29uc3QgICAgICAgIGdldENvbnN0cnVjdG9yT2Y9ICAoZm4pPT5cbiAgcmVmbGVjdEdldChnZXRQcm90b3R5cGVPZihmbiksICdjb25zdHJ1Y3RvcicpO1xuXG4vKipcbiAqIGltbXV0YWJsZU9iamVjdFxuICogQW4gaW1tdXRhYmxlIChmcm96ZW4pIGVtcHR5IG9iamVjdCB0aGF0IGlzIHNhZmUgdG8gc2hhcmUuXG4gKi8kaOKAjV9vbmNlLmdldENvbnN0cnVjdG9yT2YoZ2V0Q29uc3RydWN0b3JPZik7XG5jb25zdCAgICAgICAgaW1tdXRhYmxlT2JqZWN0PSAgZnJlZXplKGNyZWF0ZShudWxsKSk7XG5cbi8qKlxuICogaXNPYmplY3QgdGVzdHMgd2hldGhlciBhIHZhbHVlIGlzIGFuIG9iamVjdC5cbiAqIFRvZGF5LCB0aGlzIGlzIGVxdWl2YWxlbnQgdG86XG4gKlxuICogICBjb25zdCBpc09iamVjdCA9IHZhbHVlID0+IHtcbiAqICAgICBpZiAodmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAqICAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICogICAgIHJldHVybiB0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nO1xuICogICB9O1xuICpcbiAqIEJ1dCB0aGlzIGlzIG5vdCBzYWZlIGluIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGV2b2x1dGlvbiBvZiB0aGUgbGFuZ3VhZ2UsIGZvclxuICogZXhhbXBsZSBuZXcgdHlwZXMgb3Igc2VtYW50aWNzIG9mIHJlY29yZHMgYW5kIHR1cGxlcy5cbiAqIFdlIHVzZSB0aGlzIGltcGxlbWVudGF0aW9uIGRlc3BpdGUgdGhlIHVubmVjZXNzYXJ5IGFsbG9jYXRpb24gaW1wbGllZCBieVxuICogYXR0ZW1wdGluZyB0byBib3ggYSBwcmltaXRpdmUuXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKi8kaOKAjV9vbmNlLmltbXV0YWJsZU9iamVjdChpbW11dGFibGVPYmplY3QpO1xuY29uc3QgICAgICAgIGlzT2JqZWN0PSAgKHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PSAgdmFsdWU7XG5cbi8qKlxuICogaXNFcnJvciB0ZXN0cyB3aGV0aGVyIGFuIG9iamVjdCBpbmhlcml0cyBmcm9tIHRoZSBpbnRyaW5zaWNcbiAqIGBFcnJvci5wcm90b3R5cGVgLlxuICogV2UgY2FwdHVyZSB0aGUgb3JpZ2luYWwgZXJyb3IgY29uc3RydWN0b3IgYXMgRkVSQUxfRVJST1IgdG8gcHJvdmlkZSBhIGNsZWFyXG4gKiBzaWduYWwgZm9yIHJldmlld2VycyB0aGF0IHdlIGFyZSBoYW5kbGluZyBhbiBvYmplY3Qgd2l0aCBleGNlc3MgYXV0aG9yaXR5LFxuICogbGlrZSBzdGFjayB0cmFjZSBpbnNwZWN0aW9uLCB0aGF0IHdlIGFyZSBjYXJlZnVsbHkgaGlkaW5nIGZyb20gY2xpZW50IGNvZGUuXG4gKiBDaGVja2luZyBpbnN0YW5jZW9mIGhhcHBlbnMgdG8gYmUgc2FmZSwgYnV0IHRvIGF2b2lkIHV0dGVyaW5nIEZFUkFMX0VSUk9SXG4gKiBmb3Igc3VjaCBhIHRyaXZpYWwgY2FzZSBvdXRzaWRlIGNvbW1vbnMuanMsIHdlIHByb3ZpZGUgYSB1dGlsaXR5IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICovJGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5jb25zdCAgICAgICAgaXNFcnJvcj0gICh2YWx1ZSk9PnZhbHVlIGluc3RhbmNlb2YgRkVSQUxfRVJST1I7XG5cbi8vIFRoZSBvcmlnaW5hbCB1bnNhZmUgdW50YW1lZCBldmFsIGZ1bmN0aW9uLCB3aGljaCBtdXN0IG5vdCBlc2NhcGUuXG4vLyBTYW1wbGUgYXQgbW9kdWxlIGluaXRpYWxpemF0aW9uIHRpbWUsIHdoaWNoIGlzIGJlZm9yZSBsb2NrZG93biBjYW5cbi8vIHJlcGFpciBpdC4gIFVzZSBpdCBvbmx5IHRvIGJ1aWxkIHBvd2VybGVzcyBhYnN0cmFjdGlvbnMuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbFxuJGjigI1fb25jZS5pc0Vycm9yKGlzRXJyb3IpO2NvbnN0IEZFUkFMX0VWQUw9ZXZhbDtcblxuLy8gVGhlIG9yaWdpbmFsIHVuc2FmZSB1bnRhbWVkIEZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB3aGljaCBtdXN0IG5vdCBlc2NhcGUuXG4vLyBTYW1wbGUgYXQgbW9kdWxlIGluaXRpYWxpemF0aW9uIHRpbWUsIHdoaWNoIGlzIGJlZm9yZSBsb2NrZG93biBjYW5cbi8vIHJlcGFpciBpdC4gIFVzZSBpdCBvbmx5IHRvIGJ1aWxkIHBvd2VybGVzcyBhYnN0cmFjdGlvbnMuXG4kaOKAjV9vbmNlLkZFUkFMX0VWQUwoRkVSQUxfRVZBTCk7Y29uc3QgRkVSQUxfRlVOQ1RJT049RnVuY3Rpb247JGjigI1fb25jZS5GRVJBTF9GVU5DVElPTihGRVJBTF9GVU5DVElPTik7XG5cbmNvbnN0ICAgICAgICBub0V2YWxFdmFsdWF0ZT0gICgpPT4gIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAnQ2Fubm90IGV2YWwgd2l0aCBldmFsVGFtaW5nIHNldCB0byBcIm5vRXZhbFwiIChTRVNfTk9fRVZBTCknKTtcblxuIH07JGjigI1fb25jZS5ub0V2YWxFdmFsdWF0ZShub0V2YWxFdmFsdWF0ZSk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzFdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAdHlwZWRlZiB7cmVhZG9ubHkgYW55W119IExvZ0FyZ3NcbiAqXG4gKiBUaGlzIGlzIGFuIGFycmF5IHN1aXRhYmxlIHRvIGJlIHVzZWQgYXMgYXJndW1lbnRzIG9mIGEgY29uc29sZVxuICogbGV2ZWwgbWVzc2FnZSAqYWZ0ZXIqIHRoZSBmb3JtYXQgc3RyaW5nIGFyZ3VtZW50LiBJdCBpcyB0aGUgcmVzdWx0IG9mXG4gKiBhIGBkZXRhaWxzYCB0ZW1wbGF0ZSBzdHJpbmcgYW5kIGNvbnNpc3RzIG9mIGFsdGVybmF0aW5nIGxpdGVyYWwgc3RyaW5nc1xuICogYW5kIHN1YnN0aXR1dGlvbiB2YWx1ZXMsIHN0YXJ0aW5nIHdpdGggYSBsaXRlcmFsIHN0cmluZy4gQXQgbGVhc3QgdGhhdFxuICogZmlyc3QgbGl0ZXJhbCBzdHJpbmcgaXMgYWx3YXlzIHByZXNlbnQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTm90ZUNhbGxiYWNrXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7TG9nQXJnc30gbm90ZUxvZ0FyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFN0YWNrU3RyaW5nXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2dnZWRFcnJvckhhbmRsZXJcbiAqXG4gKiBVc2VkIHRvIHBhcmFtZXRlcml6ZSBgbWFrZUNhdXNhbENvbnNvbGVgIHRvIGdpdmUgaXQgYWNjZXNzIHRvIHBvdGVudGlhbGx5XG4gKiBoaWRkZW4gaW5mb3JtYXRpb24gdG8gYXVnbWVudCB0aGUgbG9nZ2luZyBvZiBlcnJvcnMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRTdGFja1N0cmluZ30gZ2V0U3RhY2tTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gc3RyaW5nfSB0YWdFcnJvclxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSByZXNldEVycm9yVGFnTnVtIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seVxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiAoTG9nQXJncyB8IHVuZGVmaW5lZCl9IGdldE1lc3NhZ2VMb2dBcmdzXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogRXJyb3IpID0+IChMb2dBcmdzIHwgdW5kZWZpbmVkKX0gdGFrZU1lc3NhZ2VMb2dBcmdzXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogRXJyb3IsIGNhbGxiYWNrPzogTm90ZUNhbGxiYWNrKSA9PiBMb2dBcmdzW10gfSB0YWtlTm90ZUxvZ0FyZ3NBcnJheVxuICovXG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQHR5cGVkZWYge3JlYWRvbmx5IFtzdHJpbmcsIC4uLmFueVtdXX0gTG9nUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2dnaW5nQ29uc29sZUtpdFxuICogQHByb3BlcnR5IHtWaXJ0dWFsQ29uc29sZX0gbG9nZ2luZ0NvbnNvbGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gcmVhZG9ubHkgTG9nUmVjb3JkW119IHRha2VMb2dcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IE1ha2VMb2dnaW5nQ29uc29sZUtpdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbj19IHNob3VsZFJlc2V0Rm9yRGVidWdnaW5nXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUxvZ2dpbmdDb25zb2xlS2l0XG4gKlxuICogQSBsb2dnaW5nIGNvbnNvbGUganVzdCBhY2N1bXVsYXRlcyB0aGUgY29udGVudHMgb2YgYWxsIHdoaXRlbGlzdGVkIGNhbGxzLFxuICogbWFraW5nIHRoZW0gYXZhaWxhYmxlIHRvIGNhbGxlcnMgb2YgYHRha2VMb2coKWAuIENhbGxpbmcgYHRha2VMb2coKWBcbiAqIGNvbnN1bWVzIHRoZXNlLCBzbyBsYXRlciBjYWxscyB0byBgdGFrZUxvZygpYCB3aWxsIG9ubHkgcHJvdmlkZSBhIGxvZyBvZlxuICogY2FsbHMgdGhhdCBoYXZlIGhhcHBlbmVkIHNpbmNlIHRoZW4uXG4gKlxuICogQHBhcmFtIHtMb2dnZWRFcnJvckhhbmRsZXJ9IGxvZ2dlZEVycm9ySGFuZGxlclxuICogQHBhcmFtIHtNYWtlTG9nZ2luZ0NvbnNvbGVLaXRPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge0xvZ2dpbmdDb25zb2xlS2l0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgTk9URTogJ0VSUk9SX05PVEU6JywgTUVTU0FHRTogJ0VSUk9SX01FU1NBR0U6JyB9fSBFcnJvckluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFcnJvckluZm9ba2V5b2YgRXJyb3JJbmZvXX0gRXJyb3JJbmZvS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VDYXVzYWxDb25zb2xlXG4gKlxuICogTWFrZXMgYSBjYXVzYWwgY29uc29sZSB3cmFwcGVyIG9mIGEgYGJhc2VDb25zb2xlYCwgd2hlcmUgdGhlIGNhdXNhbCBjb25zb2xlXG4gKiBjYWxscyBtZXRob2RzIG9mIHRoZSBgbG9nZ2VkRXJyb3JIYW5kbGVyYCB0byBjdXN0b21pemUgaG93IGl0IGhhbmRsZXMgbG9nZ2VkXG4gKiBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtWaXJ0dWFsQ29uc29sZX0gYmFzZUNvbnNvbGVcbiAqIEBwYXJhbSB7TG9nZ2VkRXJyb3JIYW5kbGVyfSBsb2dnZWRFcnJvckhhbmRsZXJcbiAqIEByZXR1cm5zIHtWaXJ0dWFsQ29uc29sZX1cbiAqL1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFNldCxTdHJpbmcsYXJyYXlKb2luLGFycmF5U2xpY2UsZnJlZXplLGlzLGlzRXJyb3Isc2V0QWRkLHNldEhhcyxzdHJpbmdJbmNsdWRlcyxzdHJpbmdTdGFydHNXaXRoLHN0cmluZ2lmeUpzb24sdG9TdHJpbmdUYWdTeW1ib2w7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiU2V0XCIsIFskaOKAjV9hID0+IChTZXQgPSAkaOKAjV9hKV1dLFtcIlN0cmluZ1wiLCBbJGjigI1fYSA9PiAoU3RyaW5nID0gJGjigI1fYSldXSxbXCJhcnJheUpvaW5cIiwgWyRo4oCNX2EgPT4gKGFycmF5Sm9pbiA9ICRo4oCNX2EpXV0sW1wiYXJyYXlTbGljZVwiLCBbJGjigI1fYSA9PiAoYXJyYXlTbGljZSA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcImlzXCIsIFskaOKAjV9hID0+IChpcyA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvclwiLCBbJGjigI1fYSA9PiAoaXNFcnJvciA9ICRo4oCNX2EpXV0sW1wic2V0QWRkXCIsIFskaOKAjV9hID0+IChzZXRBZGQgPSAkaOKAjV9hKV1dLFtcInNldEhhc1wiLCBbJGjigI1fYSA9PiAoc2V0SGFzID0gJGjigI1fYSldXSxbXCJzdHJpbmdJbmNsdWRlc1wiLCBbJGjigI1fYSA9PiAoc3RyaW5nSW5jbHVkZXMgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1N0YXJ0c1dpdGhcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1N0YXJ0c1dpdGggPSAkaOKAjV9hKV1dLFtcInN0cmluZ2lmeUpzb25cIiwgWyRo4oCNX2EgPT4gKHN0cmluZ2lmeUpzb24gPSAkaOKAjV9hKV1dLFtcInRvU3RyaW5nVGFnU3ltYm9sXCIsIFskaOKAjV9hID0+ICh0b1N0cmluZ1RhZ1N5bWJvbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogSm9pbnMgRW5nbGlzaCB0ZXJtcyB3aXRoIGNvbW1hcyBhbmQgYW4gb3B0aW9uYWwgY29uanVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHsoc3RyaW5nIHwgU3RyaW5nYWJsZVBheWxvYWQpW119IHRlcm1zXG4gKiBAcGFyYW0ge1wiYW5kXCIgfCBcIm9yXCJ9IGNvbmp1bmN0aW9uXG4gKi9cbmNvbnN0ICAgICAgICBlbkpvaW49ICAodGVybXMsIGNvbmp1bmN0aW9uKT0+ICB7XG4gIGlmKCB0ZXJtcy5sZW5ndGg9PT0gIDApIHtcbiAgICByZXR1cm4gJyhub25lKSc7XG4gICB9ZWxzZSBpZiggdGVybXMubGVuZ3RoPT09ICAxKSB7XG4gICAgcmV0dXJuIHRlcm1zWzBdO1xuICAgfWVsc2UgaWYoIHRlcm1zLmxlbmd0aD09PSAgMikge1xuICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXT0gIHRlcm1zO1xuICAgIHJldHVybiAgYCR7Zmlyc3R9ICR7Y29uanVuY3Rpb259ICR7c2Vjb25kfWA7XG4gICB9ZWxzZSB7XG4gICAgcmV0dXJuICBgJHthcnJheUpvaW4oYXJyYXlTbGljZSh0ZXJtcywwLCAtMSksICcsICcpIH0sICR7Y29uanVuY3Rpb259ICR7XG4gICAgICB0ZXJtc1t0ZXJtcy5sZW5ndGgtICAxXVxuICAgICB9YDtcbiAgIH1cbiB9O1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2ZcbiAqIHJlc3VsdCwgZS5nLiwgXCJhbiBvYmplY3RcIiB2cy4gXCJhIG51bWJlclwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi8kaOKAjV9vbmNlLmVuSm9pbihlbkpvaW4pO1xuY29uc3QgYW49ICAoc3RyKT0+e1xuICBzdHI9ICAgYCR7c3RyfWA7XG4gIGlmKCBzdHIubGVuZ3RoPj0gIDEmJiAgc3RyaW5nSW5jbHVkZXMoJ2FlaW91QUVJT1UnLCBzdHJbMF0pKSB7XG4gICAgcmV0dXJuICBgYW4gJHtzdHJ9YDtcbiAgIH1cbiAgcmV0dXJuICBgYSAke3N0cn1gO1xuIH07JGjigI1fb25jZS5hbihhbik7XG5mcmVlemUoYW4pO1xuXG5cbi8qKlxuICogTGlrZSBgSlNPTi5zdHJpbmdpZnlgIGJ1dCBkb2VzIG5vdCBibG93IHVwIGlmIGdpdmVuIGEgY3ljbGUgb3IgYSBiaWdpbnQuXG4gKiBUaGlzIGlzIG5vdFxuICogaW50ZW5kZWQgdG8gYmUgYSBzZXJpYWxpemF0aW9uIHRvIHN1cHBvcnQgYW55IHVzZWZ1bCB1bnNlcmlhbGl6YXRpb24sXG4gKiBvciBhbnkgcHJvZ3JhbW1hdGljIHVzZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4gVGhlIHN0cmluZyBpcyBpbnRlbmRlZFxuICogKm9ubHkqIGZvciBzaG93aW5nIGEgaHVtYW4gdW5kZXIgYmVuaWduIGNvbmRpdGlvbnMsIGluIG9yZGVyIHRvIGJlXG4gKiBpbmZvcm1hdGl2ZSBlbm91Z2ggZm9yIHNvbWVcbiAqIGxvZ2dpbmcgcHVycG9zZXMuIEFzIHN1Y2gsIHRoaXMgYGJlc3RFZmZvcnRTdHJpbmdpZnlgIGhhcyBhblxuICogaW1wcmVjaXNlIHNwZWNpZmljYXRpb24gYW5kIG1heSBjaGFuZ2Ugb3ZlciB0aW1lLlxuICpcbiAqIFRoZSBjdXJyZW50IGBiZXN0RWZmb3J0U3RyaW5naWZ5YCBwb3NzaWJseSBlbWl0cyB0b28gbWFueSBcInNlZW5cIlxuICogbWFya2luZ3M6IE5vdCBvbmx5IGZvciBjeWNsZXMsIGJ1dCBhbHNvIGZvciByZXBlYXRlZCBzdWJ0cmVlcyBieVxuICogb2JqZWN0IGlkZW50aXR5LlxuICpcbiAqIEFzIGEgYmVzdCBlZmZvcnQgb25seSBmb3IgZGlhZ25vc3RpYyBpbnRlcnByZXRhdGlvbiBieSBodW1hbnMsXG4gKiBgYmVzdEVmZm9ydFN0cmluZ2lmeWAgYWxzbyB0dXJucyB2YXJpb3VzIGNhc2VzIHRoYXQgbm9ybWFsXG4gKiBgSlNPTi5zdHJpbmdpZnlgIHNraXBzIG9yIGVycm9ycyBvbiwgbGlrZSBgdW5kZWZpbmVkYCBvciBiaWdpbnRzLFxuICogaW50byBzdHJpbmdzIHRoYXQgY29udmV5IHRoZWlyIG1lYW5pbmcuIFRvIGRpc3Rpbmd1aXNoIHRoaXMgZnJvbVxuICogc3RyaW5ncyBpbiB0aGUgaW5wdXQsIHRoZXNlIHN5bnRoZXNpemVkIHN0cmluZ3MgYWx3YXlzIGJlZ2luIGFuZFxuICogZW5kIHdpdGggc3F1YXJlIGJyYWNrZXRzLiBUbyBkaXN0aW5ndWlzaCB0aG9zZSBzdHJpbmdzIGZyb20gYW5cbiAqIGlucHV0IHN0cmluZyB3aXRoIHNxdWFyZSBicmFja2V0cywgYW5kIGlucHV0IHN0cmluZyB0aGF0IHN0YXJ0c1xuICogd2l0aCBhbiBvcGVuIHNxdWFyZSBicmFja2V0IGBbYCBpcyBpdHNlbGYgcGxhY2VkIGluIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGF5bG9hZFxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBzcGFjZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGJlc3RFZmZvcnRTdHJpbmdpZnk9ICAocGF5bG9hZCwgc3BhY2VzPSAgdW5kZWZpbmVkKT0+ICB7XG4gIGNvbnN0IHNlZW5TZXQ9ICBuZXcgU2V0KCk7XG4gIGNvbnN0IHJlcGxhY2VyPSAgKF8sIHZhbCk9PiAge1xuICAgIHN3aXRjaCggdHlwZW9mIHZhbCl7XG4gICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgIGlmKCB2YWw9PT0gIG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHNldEhhcyhzZWVuU2V0LCB2YWwpKSB7XG4gICAgICAgICAgcmV0dXJuICdbU2Vlbl0nO1xuICAgICAgICAgfVxuICAgICAgICBzZXRBZGQoc2VlblNldCwgdmFsKTtcbiAgICAgICAgaWYoIGlzRXJyb3IodmFsKSkge1xuICAgICAgICAgIHJldHVybiAgYFske3ZhbC5uYW1lfTogJHt2YWwubWVzc2FnZX1dYDtcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHRvU3RyaW5nVGFnU3ltYm9sIGluIHZhbCkge1xuICAgICAgICAgIC8vIEZvciB0aGUgYnVpbHQtaW5zIHRoYXQgaGF2ZSBvciBpbmhlcml0IGEgYFN5bWJvbC50b1N0cmluZ1RhZ2AtbmFtZWRcbiAgICAgICAgICAvLyBwcm9wZXJ0eSwgbW9zdCBvZiB0aGVtIGluaGVyaXQgdGhlIGRlZmF1bHQgYHRvU3RyaW5nYCBtZXRob2QsXG4gICAgICAgICAgLy8gd2hpY2ggd2lsbCBwcmludCBpbiBhIHNpbWlsYXIgbWFubmVyOiBgXCJbb2JqZWN0IEZvb11cImAgdnNcbiAgICAgICAgICAvLyBgXCJbRm9vXVwiYC4gVGhlIGV4Y2VwdGlvbnMgYXJlXG4gICAgICAgICAgLy8gICAgKiBgU3ltYm9sLnByb3RvdHlwZWAsIGBCaWdJbnQucHJvdG90eXBlYCwgYFN0cmluZy5wcm90b3R5cGVgXG4gICAgICAgICAgLy8gICAgICB3aGljaCBkb24ndCBtYXR0ZXIgdG8gdXMgc2luY2Ugd2UgaGFuZGxlIHByaW1pdGl2ZXNcbiAgICAgICAgICAvLyAgICAgIHNlcGFyYXRlbHkgYW5kIHdlIGRvbid0IGNhcmUgYWJvdXQgcHJpbWl0aXZlIHdyYXBwZXIgb2JqZWN0cy5cbiAgICAgICAgICAvLyAgICAqIFRPRE9cbiAgICAgICAgICAvLyAgICAgIGBEYXRlLnByb3RvdHlwZWAsIGBUeXBlZEFycmF5LnByb3RvdHlwZWAuXG4gICAgICAgICAgLy8gICAgICBIbW1tLCB3ZSBwcm9iYWJseSBzaG91bGQgbWFrZSBzcGVjaWFsIGNhc2VzIGZvciB0aGVzZS4gV2UncmVcbiAgICAgICAgICAvLyAgICAgIG5vdCB1c2luZyB0aGVzZSB5ZXQsIHNvIGl0J3Mgbm90IHVyZ2VudC4gQnV0IG90aGVycyB3aWxsIHJ1blxuICAgICAgICAgIC8vICAgICAgaW50byB0aGVzZS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE9uY2UgIzIwMTggaXMgY2xvc2VkLCB0aGUgb25seSBvYmplY3RzIGluIG91ciBjb2RlIHRoYXQgaGF2ZSBvclxuICAgICAgICAgIC8vIGluaGVyaXQgYSBgU3ltYm9sLnRvU3RyaW5nVGFnYC1uYW1lZCBwcm9wZXJ0eSBhcmUgcmVtb3RhYmxlc1xuICAgICAgICAgIC8vIG9yIHRoZWlyIHJlbW90ZSBwcmVzZW5jZXMuXG4gICAgICAgICAgLy8gVGhpcyBwcmludGluZyB3aWxsIGRvIGEgZ29vZCBqb2IgZm9yIHRoZXNlIHdpdGhvdXRcbiAgICAgICAgICAvLyB2aW9sYXRpbmcgYWJzdHJhY3Rpb24gbGF5ZXJpbmcuIFRoaXMgYmVoYXZpb3IgbWFrZXMgc2Vuc2VcbiAgICAgICAgICAvLyBwdXJlbHkgaW4gdGVybXMgb2YgSmF2YVNjcmlwdCBjb25jZXB0cy4gVGhhdCdzIHNvbWUgb2YgdGhlXG4gICAgICAgICAgLy8gbW90aXZhdGlvbiBmb3IgY2hvb3NpbmcgdGhhdCByZXByZXNlbnRhdGlvbiBvZiByZW1vdGFibGVzXG4gICAgICAgICAgLy8gYW5kIHRoZWlyIHJlbW90ZSBwcmVzZW5jZXMgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICAgICAgICAgIHJldHVybiAgYFske3ZhbFt0b1N0cmluZ1RhZ1N5bWJvbF19XWA7XG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgfVxuICAgICAgY2FzZSAnZnVuY3Rpb24nOiB7XG4gICAgICAgIHJldHVybiAgYFtGdW5jdGlvbiAke3ZhbC5uYW1lfHwgJzxhbm9uPicgfV1gO1xuICAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYoIHN0cmluZ1N0YXJ0c1dpdGgodmFsLCAnWycpKSB7XG4gICAgICAgICAgcmV0dXJuICBgWyR7dmFsfV1gO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIHJldHVybiAgYFske1N0cmluZyh2YWwpfV1gO1xuICAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuICBgWyR7dmFsfW5dYDtcbiAgICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIGlmKCBpcyh2YWwsIE5hTikpIHtcbiAgICAgICAgICByZXR1cm4gJ1tOYU5dJztcbiAgICAgICAgIH1lbHNlIGlmKCB2YWw9PT0gIEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICdbSW5maW5pdHldJztcbiAgICAgICAgIH1lbHNlIGlmKCB2YWw9PT0gIC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnWy1JbmZpbml0eV0nO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICB9fVxuXG4gICB9O1xuICB0cnkge1xuICAgIHJldHVybiBzdHJpbmdpZnlKc29uKHBheWxvYWQsIHJlcGxhY2VyLCBzcGFjZXMpO1xuICAgfWNhdGNoKCBfZXJyKSB7XG4gICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgbW9yZSBmYW5jeSBoZXJlIGlmIHRoZXJlIGlzIGFueVxuICAgIC8vIGNoYW5jZSB0aGF0IG1pZ2h0IHRocm93LCB1bmxlc3MgeW91IHN1cnJvdW5kIHRoYXRcbiAgICAvLyB3aXRoIGFub3RoZXIgdHJ5LWNhdGNoLXJlY292ZXJ5LiBGb3IgZXhhbXBsZSxcbiAgICAvLyB0aGUgY2F1Z2h0IHRoaW5nIG1pZ2h0IGJlIGEgcHJveHkgb3Igb3RoZXIgZXhvdGljXG4gICAgLy8gb2JqZWN0IHJhdGhlciB0aGFuIGFuIGVycm9yLiBUaGUgcHJveHkgbWlnaHQgdGhyb3dcbiAgICAvLyB3aGVuZXZlciBpdCBpcyBwb3NzaWJsZSBmb3IgaXQgdG8uXG4gICAgcmV0dXJuICdbU29tZXRoaW5nIHRoYXQgZmFpbGVkIHRvIHN0cmluZ2lmeV0nO1xuICAgfVxuIH07JGjigI1fb25jZS5iZXN0RWZmb3J0U3RyaW5naWZ5KGJlc3RFZmZvcnRTdHJpbmdpZnkpO1xuZnJlZXplKGJlc3RFZmZvcnRTdHJpbmdpZnkpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3IgQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBmbGFnfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gQXNzZXJ0TWFrZUVycm9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmc9fSBlcnJvck5hbWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBkZXRhaWxzIHRvIHRoZSBjb25zb2xlIGFuZFxuICogcmFpc2luZyBhbiBleGNlcHRpb24gd2l0aCBqdXN0IHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLy8gVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLlxuLy8gVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCB0aGV5IGJyZWFrIHdpdGhcbi8vIFR5cGVzY3JpcHQgNC4wLlxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBGdW5jdGlvbn1cbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgdGhpcyBlcnJvciB3aXRoIHRoZXNlIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlLCBsaWtlIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7fX0gRGV0YWlsc1Rva2VuXG4gKiBBIGNhbGwgdG8gdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIG1ha2VzIGFuZCByZXR1cm5zIGEgZnJlc2ggZGV0YWlsc1xuICogdG9rZW4sIHdoaWNoIGlzIGEgZnJvemVuIGVtcHR5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGF0XG4gKiBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBleHByZXNzaW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8IERldGFpbHNUb2tlbn0gRGV0YWlsc1xuICogRWl0aGVyIGEgcGxhaW4gc3RyaW5nLCBvciBtYWRlIGJ5IHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCB0YWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdHJpbmdhYmxlUGF5bG9hZFxuICogSG9sZHMgdGhlIHBheWxvYWQgcGFzc2VkIHRvIHF1b3RlIHNvIHRoYXQgaXRzIHByaW50ZWQgZm9ybSBpcyB2aXNpYmxlLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IHRvU3RyaW5nIEhvdyB0byBwcmludCB0aGUgcGF5bG9hZFxuICovXG5cbi8qKlxuICogVG8gXCJkZWNsYXNzaWZ5XCIgYW5kIHF1b3RlIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHVzZWQgaW4gYVxuICogZGV0YWlsc2AuLi5gIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgc3RhdGVzIHRoYXQgdGhlIGFyZ3VtZW50IHNob3VsZCBhcHBlYXIgcXVvdGVkXG4gKiAoYXMgaWYgd2l0aCBgSlNPTi5zdHJpbmdpZnlgKSwgaW4gdGhlIGVycm9yIG1lc3NhZ2Ugb2YgdGhlIHRocm93biBlcnJvci4gVGhlXG4gKiBwYXlsb2FkIGl0c2VsZiBpcyBzdGlsbCBwYXNzZWQgdW5xdW90ZWQgdG8gdGhlIGNvbnNvbGUgYXMgaXQgd291bGQgYmVcbiAqIHdpdGhvdXQgYHF1b3RlYC5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHRoZSBleGFtcGxlIGluIHRoZSBgZGV0YWlsc2AgY29tbWVudCwgc2F5IGluc3RlYWQgdGhhdCB0aGVcbiAqIGNvbG9yIHRoZSBza3kgaXMgc3VwcG9zZWQgdG8gYmUgaXMgYWxzbyBjb21wdXRlZC4gU2F5IHRoYXQgd2Ugc3RpbGwgZG9uJ3RcbiAqIHdhbnQgdG8gcmV2ZWFsIHRoZSBza3kncyBhY3R1YWwgY29sb3IsIGJ1dCB3ZSBkbyB3YW50IHRoZSB0aHJvd24gZXJyb3Inc1xuICogbWVzc2FnZSB0byByZXZlYWwgd2hhdCBjb2xvciB0aGUgc2t5IHdhcyBzdXBwb3NlZCB0byBiZTpcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZXF1YWwoXG4gKiAgIHNreS5jb2xvcixcbiAqICAgY29sb3IsXG4gKiAgIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSAke3F1b3RlKGNvbG9yKX1gLFxuICogKTtcbiAqIGBgYFxuICpcbiAqIC8vIFRPRE8gVXBkYXRlIFNFUy1zaGltIHRvIG5ldyBjb252ZW50aW9uLCB3aGVyZSBgZGV0YWlsc2AgaXNcbiAqIC8vIHJlbmFtZWQgdG8gYFhgIHJhdGhlciB0aGFuIGBkYC5cbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgcXVvdGVgIHRvIGBxYCBhbmRcbiAqIGBkZXRhaWxzYCB0byBgZGBcbiAqIGBgYGpzXG4gKiBjb25zdCB7IGRldGFpbHM6IGQsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7XG4gKiBgYGBcbiAqIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBhc3NlcnQuZXF1YWwoXG4gKiAgIHNreS5jb2xvcixcbiAqICAgY29sb3IsXG4gKiAgIGRgJHtza3kuY29sb3J9IHNob3VsZCBiZSAke3EoY29sb3IpfWAsXG4gKiApO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKT19IHNwYWNlc1xuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfSBUaGUgZGVjbGFzc2lmaWVkIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYWlzZVxuICpcbiAqIFRvIG1ha2UgYW4gYGFzc2VydGAgd2hpY2ggdGVybWluYXRlcyBzb21lIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uXG4gKiBsaWtlIGEgdHJhbnNhY3Rpb24sIHZhdCwgb3IgcHJvY2VzcywgY2FsbCBgbWFrZUFzc2VydGAgd2l0aCBhIGBSYWlzZWBcbiAqIGNhbGxiYWNrLCB3aGVyZSB0aGF0IGNhbGxiYWNrIGFjdHVhbGx5IHBlcmZvcm1zIHRoYXQgbGFyZ2VyIHRlcm1pbmF0aW9uLlxuICogSWYgcG9zc2libGUsIHRoZSBjYWxsYmFjayBzaG91bGQgYWxzbyByZXBvcnQgaXRzIGByZWFzb25gIHBhcmFtZXRlciBhc1xuICogdGhlIGFsbGVnZWQgcmVhc29uIGZvciB0aGUgdGVybWluYXRpb24uXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUFzc2VydFxuICpcbiAqIE1ha2VzIGFuZCByZXR1cm5zIGFuIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNoYXJlcyB0aGUgYm9va2tlZXBpbmdcbiAqIHN0YXRlIGRlZmluZWQgYnkgdGhpcyBtb2R1bGUgd2l0aCBvdGhlciBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3RzIG1hZGUgYnlcbiAqIGBtYWtlQXNzZXJ0YC4gVGhpcyBzdGF0ZSBpcyBwZXItbW9kdWxlLWluc3RhbmNlIGFuZCBpcyBleHBvc2VkIGJ5IHRoZVxuICogYGxvZ2dlZEVycm9ySGFuZGxlcmAgYWJvdmUuIFdlIHJlZmVyIHRvIGBhc3NlcnRgIGFzIGEgXCJmdW5jdGlvbiBvYmplY3RcIlxuICogYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGEgZnVuY3Rpb24sIGJ1dCBhbHNvIGhhcyBtZXRob2RzIHRoYXRcbiAqIGNhbiBiZSBjYWxsZWQuXG4gKlxuICogSWYgYG9wdFJhaXNlYCBpcyBwcm92aWRlZCwgdGhlIHJldHVybmVkIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB3aWxsIGNhbGxcbiAqIGBvcHRSYWlzZShyZWFzb24pYCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLiBUaGlzIGVuYWJsZXMgYG9wdFJhaXNlYCB0b1xuICogZW5nYWdlIGluIGV2ZW4gbW9yZSB2aW9sZW50IHRlcm1pbmF0aW9uIGJlaGF2aW9yLCBsaWtlIHRlcm1pbmF0aW5nIHRoZSB2YXQsXG4gKiB0aGF0IHByZXZlbnRzIGV4ZWN1dGlvbiBmcm9tIHJlYWNoaW5nIHRoZSBmb2xsb3dpbmcgdGhyb3cuIEhvd2V2ZXIsIGlmXG4gKiBgb3B0UmFpc2VgIHJldHVybnMgbm9ybWFsbHksIHdoaWNoIHdvdWxkIGJlIHVudXN1YWwsIHRoZSB0aHJvdyBmb2xsb3dpbmdcbiAqIGBvcHRSYWlzZShyZWFzb24pYCB3b3VsZCBzdGlsbCBoYXBwZW4uXG4gKlxuICogQHBhcmFtIHtSYWlzZT19IG9wdFJhaXNlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSB1bnJlZGFjdGVkXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgdGhlIHJlYWwgZGV0YWlscyB0b1xuICogdGhlIGNvbnNvbGUgYnV0IGluY2x1ZGUgb25seSB0aGUgdHlwZW9mIGluZm9ybWF0aW9uIGluIHRoZSB0aHJvd24gZXJyb3JcbiAqIHRvIHByZXZlbnQgcmV2ZWFsaW5nIHNlY3JldHMgdXAgdGhlIGV4Y2VwdGlvbmFsIHBhdGguIEluIHRoZSBleGFtcGxlXG4gKiBhYm92ZSwgdGhlIHRocm93biBlcnJvciBtYXkgcmV2ZWFsIG9ubHkgdGhhdCBgc2t5LmNvbG9yYCBpcyBhIHN0cmluZyxcbiAqIHdoZXJlYXMgdGhlIHNhbWUgZGlhZ25vc3RpYyBwcmludGVkIHRvIHRoZSBjb25zb2xlIHJldmVhbHMgdGhhdCB0aGVcbiAqIHNreSB3YXMgZ3JlZW4uXG4gKlxuICogVGhlIGByYXdgIG1lbWJlciBvZiBhIGB0ZW1wbGF0ZWAgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGBzdHJpbmdbXWAgY2FuIGFsc28gYmUgdXNlZCBhcyBhIHRlbXBsYXRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICogVGhlIGBGYWlsYCB0YW1wbGF0ZSB0YWcgc3VwcG9ydHMgcmVwbGFjaW5nIHBhdHRlcm5zIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZCwgWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYGpzXG4gKiBjb25kIHx8IGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIHdpdGggcGF0dGVybnMgbGlrZVxuICogYGBganNcbiAqIGNvbmQgfHwgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIFt3ZWFrbmVzcyBpbiBjdXJyZW50XG4gKiBUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUxNDI2KSwgdGhlIGB8fGBcbiAqIHBhdHRlcm5zIGFyZSBub3QgYXMgcG93ZXJmdWwgYXMgdGhlIGBhc3NlcnQoLi4uKWAgY2FsbCBhdCBlbmFibGluZyBzdGF0aWNcbiAqIHJlYXNvbmluZy4gT2YgdGhlIGB8fGAsIGFnYWluIGR1ZSB0byB3ZWFrbmVzc2VzIGluIGN1cnJlbnQgVHlwZVNjcmlwdCxcbiAqIHRoZVxuICogYGBganNcbiAqIGNvbmQgfHwgRmFpbGAuLi5jb21wbGFpbnQuLi5gXG4gKiBgYGBcbiAqIHBhdHRlcm4gaXMgbm90IGFzIHBvd2VyZnVsIGFzIHRoZVxuICogYGBganNcbiAqIGNvbmQgfHwgYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogYXQgZW5hYmxpbmcgc3RhdGljIHJlc29uaW5nLiBEZXNwaXRlIHRoZXNlIHByb2JsZW1zLCB3ZSBkbyBub3Qgd2FudCB0b1xuICogcmV0dXJuIHRvIHRoZVxuICogYGBganNcbiAqIGFzc2VydChjb25kLCBYYC4uLmNvbXBsYWludC4uLmApXG4gKiBgYGBcbiAqIHN0eWxlIGJlY2F1c2Ugb2YgdGhlIHN1YnN0YW50aWFsIG92ZXJoZWFkIGluXG4gKiBldmFsdWF0aW5nIHRoZSBgWGAgdGVtcGxhdGUgaW4gdGhlIHR5cGljYWwgYHRydWVgIGNhc2Ugd2hlcmUgaXQgaXMgbm90XG4gKiBuZWVkZWQuIEFuZCB3ZSBkbyBub3Qgd2FudCB0byByZXR1cm4gdG8gdGhlXG4gKiBgYGBqc1xuICogYXNzZXJ0LmZhaWwoWGAuLi5jb21wbGFpbnQuLi5gKWBcbiAqIGBgYFxuICogYmVjYXVzZSBvZiB0aGUgdmVyYm9zaXR5IGFuZCBsb3NzIG9mIHJlYWRhYmlsaXR5LiBJbnN0ZWFkLCB1bnRpbC91bmxlc3NcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsIGZvciB0aG9zZVxuICogbmV3LXN0eWxlIGFzc2VydGlvbnMgd2hlcmUgdGhpcyBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcgaXMgYSBwcm9ibGVtLFxuICogaW5zdGVhZCBleHByZXNzIHRoZSBhc3NlcnRpb24gYXNcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZCkge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kKSB7XG4gKiAgICAgLy8gYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWRcbiAqICAgICB0aHJvdyBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICogVGhpcyBhdm9pZCB0aGUgVHlwZVNjcmlwdCBidWdzIHRoYXQgY2F1c2UgdGhlIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyxcbiAqIGJ1dCB3aXRoIG5vIGxvc3Mgb2YgZWZmaWNpZW5jeSBhbmQgbGl0dGxlIGxvc3Mgb2YgcmVhZGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBWaXJ0dWFsQ29uc29sZVxuICogQHByb3BlcnR5IHtDb25zb2xlWydkZWJ1ZyddfSBkZWJ1Z1xuICogQHByb3BlcnR5IHtDb25zb2xlWydsb2cnXX0gbG9nXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2luZm8nXX0gaW5mb1xuICogQHByb3BlcnR5IHtDb25zb2xlWyd3YXJuJ119IHdhcm5cbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZXJyb3InXX0gZXJyb3JcbiAqXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3RyYWNlJ119IHRyYWNlXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2RpcnhtbCddfSBkaXJ4bWxcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZ3JvdXAnXX0gZ3JvdXBcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZ3JvdXBDb2xsYXBzZWQnXX0gZ3JvdXBDb2xsYXBzZWRcbiAqXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ2Fzc2VydCddfSBhc3NlcnRcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsndGltZUxvZyddfSB0aW1lTG9nXG4gKlxuICogQHByb3BlcnR5IHtDb25zb2xlWydjbGVhciddfSBjbGVhclxuICogQHByb3BlcnR5IHtDb25zb2xlWydjb3VudCddfSBjb3VudFxuICogQHByb3BlcnR5IHtDb25zb2xlWydjb3VudFJlc2V0J119IGNvdW50UmVzZXRcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsnZGlyJ119IGRpclxuICogQHByb3BlcnR5IHtDb25zb2xlWydncm91cEVuZCddfSBncm91cEVuZFxuICpcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsndGFibGUnXX0gdGFibGVcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsndGltZSddfSB0aW1lXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3RpbWVFbmQnXX0gdGltZUVuZFxuICogQHByb3BlcnR5IHtDb25zb2xlWyd0aW1lU3RhbXAnXX0gdGltZVN0YW1wXG4gKi9cblxuLyogVGhpcyBpcyBkZWxpYmVyYXRlbHkgKm5vdCogSlNEb2MsIGl0IGlzIGEgcmVndWxhciBjb21tZW50LlxuICpcbiAqIFRPRE86IFdlJ2QgbGlrZSB0byBhZGQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIHRvIHRoZSBhYm92ZVxuICogVmlydHVhbENvbnNvbGUsIGJ1dCB0aGV5IGN1cnJlbnRseSBjYXVzZSBjb25mbGljdHMgd2hlcmVcbiAqIHNvbWUgVHlwZXNjcmlwdCBpbXBsZW1lbnRhdGlvbnMgZG9uJ3QgaGF2ZSB0aGVzZSBwcm9wZXJ0aWVzXG4gKiBvbiB0aGUgQ29uc29sZSB0eXBlLlxuICpcbiAqIEBwcm9wZXJ0eSB7Q29uc29sZVsncHJvZmlsZSddfSBwcm9maWxlXG4gKiBAcHJvcGVydHkge0NvbnNvbGVbJ3Byb2ZpbGVFbmQnXX0gcHJvZmlsZUVuZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydkZWJ1ZycgfCAnbG9nJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcid9IExvZ1NldmVyaXR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb25zb2xlRmlsdGVyXG4gKiBAcHJvcGVydHkgeyhzZXZlcml0eTogTG9nU2V2ZXJpdHkpID0+IGJvb2xlYW59IGNhbkxvZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEZpbHRlckNvbnNvbGVcbiAqIEBwYXJhbSB7VmlydHVhbENvbnNvbGV9IGJhc2VDb25zb2xlXG4gKiBAcGFyYW0ge0NvbnNvbGVGaWx0ZXJ9IGZpbHRlclxuICogQHBhcmFtIHtzdHJpbmc9fSB0b3BpY1xuICogQHJldHVybnMge1ZpcnR1YWxDb25zb2xlfVxuICovXG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzRdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUmFuZ2VFcnJvcixUeXBlRXJyb3IsV2Vha01hcCxhcnJheUpvaW4sYXJyYXlNYXAsYXJyYXlQb3AsYXJyYXlQdXNoLGFzc2lnbixmcmVlemUsZ2xvYmFsVGhpcyxpcyxpc0Vycm9yLHN0cmluZ0luZGV4T2Ysc3RyaW5nUmVwbGFjZSxzdHJpbmdTbGljZSxzdHJpbmdTdGFydHNXaXRoLHdlYWttYXBEZWxldGUsd2Vha21hcEdldCx3ZWFrbWFwSGFzLHdlYWttYXBTZXQsYW4sYmVzdEVmZm9ydFN0cmluZ2lmeTskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb21tb25zLmpzXCIsIFtbXCJSYW5nZUVycm9yXCIsIFskaOKAjV9hID0+IChSYW5nZUVycm9yID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiV2Vha01hcFwiLCBbJGjigI1fYSA9PiAoV2Vha01hcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlKb2luXCIsIFskaOKAjV9hID0+IChhcnJheUpvaW4gPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQb3BcIiwgWyRo4oCNX2EgPT4gKGFycmF5UG9wID0gJGjigI1fYSldXSxbXCJhcnJheVB1c2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5UHVzaCA9ICRo4oCNX2EpXV0sW1wiYXNzaWduXCIsIFskaOKAjV9hID0+IChhc3NpZ24gPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXSxbXCJpc1wiLCBbJGjigI1fYSA9PiAoaXMgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3IgPSAkaOKAjV9hKV1dLFtcInN0cmluZ0luZGV4T2ZcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ0luZGV4T2YgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1JlcGxhY2VcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1JlcGxhY2UgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1NsaWNlXCIsIFskaOKAjV9hID0+IChzdHJpbmdTbGljZSA9ICRo4oCNX2EpXV0sW1wic3RyaW5nU3RhcnRzV2l0aFwiLCBbJGjigI1fYSA9PiAoc3RyaW5nU3RhcnRzV2l0aCA9ICRo4oCNX2EpXV0sW1wid2Vha21hcERlbGV0ZVwiLCBbJGjigI1fYSA9PiAod2Vha21hcERlbGV0ZSA9ICRo4oCNX2EpXV0sW1wid2Vha21hcEdldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcEdldCA9ICRo4oCNX2EpXV0sW1wid2Vha21hcEhhc1wiLCBbJGjigI1fYSA9PiAod2Vha21hcEhhcyA9ICRo4oCNX2EpXV0sW1wid2Vha21hcFNldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcFNldCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0cmluZ2lmeS11dGlscy5qc1wiLCBbW1wiYW5cIiwgWyRo4oCNX2EgPT4gKGFuID0gJGjigI1fYSldXSxbXCJiZXN0RWZmb3J0U3RyaW5naWZ5XCIsIFskaOKAjV9hID0+IChiZXN0RWZmb3J0U3RyaW5naWZ5ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gRm9yIG91ciBpbnRlcm5hbCBkZWJ1Z2dpbmcgcHVycG9zZXMsIHVuY29tbWVudFxuLy8gY29uc3QgaW50ZXJuYWxEZWJ1Z0NvbnNvbGUgPSBjb25zb2xlO1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8U3RyaW5nYWJsZVBheWxvYWQsIGFueT59ICovXG5jb25zdCBkZWNsYXNzaWZpZXJzPSAgbmV3IFdlYWtNYXAoKTtcblxuLyoqIEB0eXBlIHtBc3NlcnRRdW90ZX0gKi9cbmNvbnN0IHF1b3RlPSAgKHBheWxvYWQsIHNwYWNlcz0gIHVuZGVmaW5lZCk9PiAge1xuICBjb25zdCByZXN1bHQ9ICBmcmVlemUoe1xuICAgIHRvU3RyaW5nOiBmcmVlemUoKCk9PiAgYmVzdEVmZm9ydFN0cmluZ2lmeShwYXlsb2FkLCBzcGFjZXMpKX0pO1xuXG4gIHdlYWttYXBTZXQoZGVjbGFzc2lmaWVycywgcmVzdWx0LCBwYXlsb2FkKTtcbiAgcmV0dXJuIHJlc3VsdDtcbiB9O1xuZnJlZXplKHF1b3RlKTtcblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIaWRkZW5EZXRhaWxzXG4gKlxuICogQ2FwdHVyZXMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBzdHJpbmcgdGFnLlxuICpcbiAqIEBwcm9wZXJ0eSB7VGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXX0gdGVtcGxhdGVcbiAqIEBwcm9wZXJ0eSB7YW55W119IGFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPERldGFpbHNUb2tlbiwgSGlkZGVuRGV0YWlscz59XG4gKlxuICogTWFwcyBmcm9tIGEgZGV0YWlscyB0b2tlbiB3aGljaCBhIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHJldHVybmVkXG4gKiB0byBhIHJlY29yZCBvZiB0aGUgY29udGVudHMgb2YgdGhhdCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cbmNvbnN0IGhpZGRlbkRldGFpbHNNYXA9ICBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7SGlkZGVuRGV0YWlsc30gaGlkZGVuRGV0YWlsc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0TWVzc2FnZVN0cmluZz0gICh7IHRlbXBsYXRlLCBhcmdzfSk9PiAgIHtcbiAgY29uc3QgcGFydHM9ICBbdGVtcGxhdGVbMF1dO1xuICBmb3IoIGxldCBpPSAgMDsgaTwgIGFyZ3MubGVuZ3RoOyBpKz0gIDEpIHtcbiAgICBjb25zdCBhcmc9ICBhcmdzW2ldO1xuICAgIGxldCBhcmdTdHI7XG4gICAgaWYoIHdlYWttYXBIYXMoZGVjbGFzc2lmaWVycywgYXJnKSkge1xuICAgICAgYXJnU3RyPSAgIGAke2FyZ31gO1xuICAgICB9ZWxzZSBpZiggaXNFcnJvcihhcmcpKSB7XG4gICAgICBhcmdTdHI9ICAgYCgke2FuKGFyZy5uYW1lKX0pYDtcbiAgICAgfWVsc2Uge1xuICAgICAgYXJnU3RyPSAgIGAoJHthbih0eXBlb2YgYXJnKX0pYDtcbiAgICAgfVxuICAgIGFycmF5UHVzaChwYXJ0cywgYXJnU3RyLCB0ZW1wbGF0ZVtpKyAgMV0pO1xuICAgfVxuICByZXR1cm4gYXJyYXlKb2luKHBhcnRzLCAnJyk7XG4gfTtcblxuLyoqXG4gKiBHaXZlIGRldGFpbHNUb2tlbnMgYSB0b1N0cmluZyBiZWhhdmlvci4gVG8gbWluaW1pemUgdGhlIG92ZXJoZWFkIG9mXG4gKiBjcmVhdGluZyBuZXcgZGV0YWlsc1Rva2Vucywgd2UgZG8gdGhpcyB3aXRoIGFuXG4gKiBpbmhlcml0ZWQgYHRoaXNgIHNlbnNpdGl2ZSBgdG9TdHJpbmdgIG1ldGhvZCwgZXZlbiB0aG91Z2ggd2Ugbm9ybWFsbHlcbiAqIGF2b2lkIGB0aGlzYCBzZW5zaXRpdml0eS4gVG8gcHJvdGVjdCB0aGUgbWV0aG9kIGZyb20gaW5hcHByb3ByaWF0ZVxuICogYHRoaXNgIGFwcGxpY2F0aW9uLCBpdCBkb2VzIHNvbWV0aGluZyBpbnRlcmVzdGluZyBvbmx5IGZvciBvYmplY3RzXG4gKiByZWdpc3RlcmVkIGluIGByZWRhY3RlZERldGFpbHNgLCB3aGljaCBzaG91bGQgYmUgZXhhY3RseSB0aGUgZGV0YWlsc1Rva2Vucy5cbiAqXG4gKiBUaGUgcHJpbnRpbmcgYmVoYXZpb3IgbXVzdCBub3QgcmV2ZWFsIGFueXRoaW5nIHJlZGFjdGVkLCBzbyB3ZSBqdXN0IHVzZVxuICogdGhlIHNhbWUgYGdldE1lc3NhZ2VTdHJpbmdgIHdlIHVzZSB0byBjb25zdHJ1Y3QgdGhlIHJlZGFjdGVkIG1lc3NhZ2VcbiAqIHN0cmluZyBmb3IgYSB0aHJvd24gYXNzZXJ0aW9uIGVycm9yLlxuICovXG5jb25zdCBEZXRhaWxzVG9rZW5Qcm90bz0gIGZyZWV6ZSh7XG4gIHRvU3RyaW5nKCkge1xuICAgIGNvbnN0IGhpZGRlbkRldGFpbHM9ICB3ZWFrbWFwR2V0KGhpZGRlbkRldGFpbHNNYXAsIHRoaXMpO1xuICAgIGlmKCBoaWRkZW5EZXRhaWxzPT09ICB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAnW05vdCBhIERldGFpbHNUb2tlbl0nO1xuICAgICB9XG4gICAgcmV0dXJuIGdldE1lc3NhZ2VTdHJpbmcoaGlkZGVuRGV0YWlscyk7XG4gICB9fSk7XG5cbmZyZWV6ZShEZXRhaWxzVG9rZW5Qcm90by50b1N0cmluZyk7XG5cbi8qKlxuICogTm9ybWFsbHkgdGhpcyBpcyB0aGUgZnVuY3Rpb24gZXhwb3J0ZWQgYXMgYGFzc2VydC5kZXRhaWxzYCBhbmQgb2Z0ZW5cbiAqIHNwZWxsZWQgYGRgLiBIb3dldmVyLCBpZiB0aGUgYHtlcnJvclRhbWluZzogJ3Vuc2FmZSd9YCBvcHRpb24gaXMgZ2l2ZW4gdG9cbiAqIGBsb2NrZG93bmAsIHRoZW4gYHVucmVkYWN0ZWREZXRhaWxzYCBpcyB1c2VkIGluc3RlYWQuXG4gKlxuICogVGhlcmUgYXJlIHNvbWUgdW5jb25kaXRpb25hbCB1c2VzIG9mIGByZWRhY3RlZERldGFpbHNgIGluIHRoaXMgbW9kdWxlLiBBbGxcbiAqIG9mIHRoZW0gc2hvdWxkIGJlIHVzZXMgd2hlcmUgdGhlIHRlbXBsYXRlIGxpdGVyYWwgaGFzIG5vIHJlZGFjdGVkXG4gKiBzdWJzdGl0dXRpb24gdmFsdWVzLiBJbiB0aG9zZSBjYXNlcywgdGhlIHR3byBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAdHlwZSB7RGV0YWlsc1RhZ31cbiAqL1xuY29uc3QgcmVkYWN0ZWREZXRhaWxzPSAgKHRlbXBsYXRlLCAuLi5hcmdzKT0+ICB7XG4gIC8vIEtlZXAgaW4gbWluZCB0aGF0IHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhbGxzIHRvIGBkZXRhaWxzYCBjcmVhdGVzXG4gIC8vIGEgZGV0YWlscyB0b2tlbiB0aGF0IGlzIG5ldmVyIHVzZWQsIHNvIHRoaXMgcGF0aCBtdXN0IHJlbWFpbiBhcyBmYXN0IGFzXG4gIC8vIHBvc3NpYmxlLiBIZW5jZSB3ZSBzdG9yZSB3aGF0IHdlJ3ZlIGdvdCB3aXRoIGxpdHRsZSBwcm9jZXNzaW5nLCBwb3N0cG9uaW5nXG4gIC8vIGFsbCB0aGUgd29yayB0byBoYXBwZW4gb25seSBpZiBuZWVkZWQsIGZvciBleGFtcGxlLCBpZiBhbiBhc3NlcnRpb24gZmFpbHMuXG4gIGNvbnN0IGRldGFpbHNUb2tlbj0gIGZyZWV6ZSh7IF9fcHJvdG9fXzogRGV0YWlsc1Rva2VuUHJvdG99KTtcbiAgd2Vha21hcFNldChoaWRkZW5EZXRhaWxzTWFwLCBkZXRhaWxzVG9rZW4sIHsgdGVtcGxhdGUsIGFyZ3N9KTtcbiAgcmV0dXJuIGRldGFpbHNUb2tlbjtcbiB9O1xuZnJlZXplKHJlZGFjdGVkRGV0YWlscyk7XG5cbi8qKlxuICogYHVucmVkYWN0ZWREZXRhaWxzYCBpcyBsaWtlIGBkZXRhaWxzYCBleGNlcHQgdGhhdCBpdCBkb2VzIG5vdCByZWRhY3RcbiAqIGFueXRoaW5nLiBJdCBhY3RzIGxpa2UgYGRldGFpbHNgIHdvdWxkIGFjdCBpZiBhbGwgc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogd2VyZSB3cmFwcGVkIHdpdGggdGhlIGBxdW90ZWAgZnVuY3Rpb24gYWJvdmUgKHRoZSBmdW5jdGlvbiBub3JtYWxseVxuICogc3BlbGxlZCBgcWApLiBJZiB0aGUgYHtlcnJvclRhbWluZzogJ3Vuc2FmZSd9YCBvcHRpb24gaXMgZ2l2ZW4gdG9cbiAqIGBsb2NrZG93bmAsIHRoZW4gdGhlIGxvY2tkb3duLXNoaW0gYXJyYW5nZXMgZm9yIHRoZSBnbG9iYWwgYGFzc2VydGAgdG8gYmVcbiAqIG9uZSB3aG9zZSBgZGV0YWlsc2AgcHJvcGVydHkgaXMgYHVucmVkYWN0ZWREZXRhaWxzYC5cbiAqIFRoaXMgc2V0dGluZyBvcHRpbWl6ZXMgdGhlIGRlYnVnZ2luZyBhbmQgdGVzdGluZyBleHBlcmllbmNlIGF0IHRoZSBwcmljZVxuICogb2Ygc2FmZXR5LiBgdW5yZWRhY3RlZERldGFpbHNgIGFsc28gc2FjcmlmaWNlcyB0aGUgc3BlZWQgb2YgYGRldGFpbHNgLFxuICogd2hpY2ggaXMgdXN1YWxseSBmaW5lIGluIGRlYnVnZ2luZyBhbmQgdGVzdGluZy5cbiAqXG4gKiBAdHlwZSB7RGV0YWlsc1RhZ31cbiAqL1xuY29uc3QgdW5yZWRhY3RlZERldGFpbHM9ICAodGVtcGxhdGUsIC4uLmFyZ3MpPT4gIHtcbiAgYXJncz0gIGFycmF5TWFwKGFyZ3MsIChhcmcpPT5cbiAgICB3ZWFrbWFwSGFzKGRlY2xhc3NpZmllcnMsIGFyZyk/ICBhcmc6ICBxdW90ZShhcmcpKTtcblxuICByZXR1cm4gcmVkYWN0ZWREZXRhaWxzKHRlbXBsYXRlLCAuLi5hcmdzKTtcbiB9OyRo4oCNX29uY2UudW5yZWRhY3RlZERldGFpbHModW5yZWRhY3RlZERldGFpbHMpO1xuZnJlZXplKHVucmVkYWN0ZWREZXRhaWxzKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SGlkZGVuRGV0YWlsc30gaGlkZGVuRGV0YWlsc1xuICogQHJldHVybnMge0xvZ0FyZ3N9XG4gKi9cbmNvbnN0IGdldExvZ0FyZ3M9ICAoeyB0ZW1wbGF0ZSwgYXJnc30pPT4gICB7XG4gIGNvbnN0IGxvZ0FyZ3M9ICBbdGVtcGxhdGVbMF1dO1xuICBmb3IoIGxldCBpPSAgMDsgaTwgIGFyZ3MubGVuZ3RoOyBpKz0gIDEpIHtcbiAgICBsZXQgYXJnPSAgYXJnc1tpXTtcbiAgICBpZiggd2Vha21hcEhhcyhkZWNsYXNzaWZpZXJzLCBhcmcpKSB7XG4gICAgICBhcmc9ICB3ZWFrbWFwR2V0KGRlY2xhc3NpZmllcnMsIGFyZyk7XG4gICAgIH1cbiAgICAvLyBSZW1vdmUgdGhlIGV4dHJhIHNwYWNlcyAoc2luY2UgY29uc29sZS5lcnJvciBwdXRzIHRoZW1cbiAgICAvLyBiZXR3ZWVuIGVhY2ggY2F1c2UpLlxuICAgIGNvbnN0IHByaW9yV2l0aG91dFNwYWNlPSAgc3RyaW5nUmVwbGFjZShhcnJheVBvcChsb2dBcmdzKXx8ICAnJywgLyAkLywgJycpO1xuICAgIGlmKCBwcmlvcldpdGhvdXRTcGFjZSE9PSAgJycpIHtcbiAgICAgIGFycmF5UHVzaChsb2dBcmdzLCBwcmlvcldpdGhvdXRTcGFjZSk7XG4gICAgIH1cbiAgICBjb25zdCBuZXh0V2l0aG91dFNwYWNlPSAgc3RyaW5nUmVwbGFjZSh0ZW1wbGF0ZVtpKyAgMV0sIC9eIC8sICcnKTtcbiAgICBhcnJheVB1c2gobG9nQXJncywgYXJnLCBuZXh0V2l0aG91dFNwYWNlKTtcbiAgIH1cbiAgaWYoIGxvZ0FyZ3NbbG9nQXJncy5sZW5ndGgtICAxXT09PSAgJycpIHtcbiAgICBhcnJheVBvcChsb2dBcmdzKTtcbiAgIH1cbiAgcmV0dXJuIGxvZ0FyZ3M7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxFcnJvciwgTG9nQXJncz59XG4gKlxuICogTWFwcyBmcm9tIGFuIGVycm9yIG9iamVjdCB0byB0aGUgbG9nIGFyZ3MgdGhhdCBhcmUgYSBtb3JlIGluZm9ybWF0aXZlXG4gKiBhbHRlcm5hdGl2ZSBtZXNzYWdlIGZvciB0aGF0IGVycm9yLiBXaGVuIGxvZ2dpbmcgdGhlIGVycm9yLCB0aGVzZVxuICogbG9nIGFyZ3Mgc2hvdWxkIGJlIHByZWZlcnJlZCB0byBgZXJyb3IubWVzc2FnZWAuXG4gKi9cbmNvbnN0IGhpZGRlbk1lc3NhZ2VMb2dBcmdzPSAgbmV3IFdlYWtNYXAoKTtcblxuLy8gU28gZWFjaCBlcnJvciB0YWcgd2lsbCBiZSB1bmlxdWUuXG5sZXQgZXJyb3JUYWdOdW09ICAwO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEVycm9yLCBzdHJpbmc+fVxuICovXG5jb25zdCBlcnJvclRhZ3M9ICBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRFcnJvck5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHRhZ0Vycm9yPSAgKGVyciwgb3B0RXJyb3JOYW1lPSAgZXJyLm5hbWUpPT4gIHtcbiAgbGV0IGVycm9yVGFnPSAgd2Vha21hcEdldChlcnJvclRhZ3MsIGVycik7XG4gIGlmKCBlcnJvclRhZyE9PSAgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVycm9yVGFnO1xuICAgfVxuICBlcnJvclRhZ051bSs9ICAxO1xuICBlcnJvclRhZz0gICBgJHtvcHRFcnJvck5hbWV9IyR7ZXJyb3JUYWdOdW19YDtcbiAgd2Vha21hcFNldChlcnJvclRhZ3MsIGVyciwgZXJyb3JUYWcpO1xuICByZXR1cm4gZXJyb3JUYWc7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7QXNzZXJ0TWFrZUVycm9yfVxuICovXG5jb25zdCBtYWtlRXJyb3I9ICAoXG4gIG9wdERldGFpbHM9ICByZWRhY3RlZERldGFpbHMgYEFzc2VydCBmYWlsZWRgLFxuICBFcnJvckNvbnN0cnVjdG9yPSAgZ2xvYmFsVGhpcy5FcnJvcixcbiAgeyBlcnJvck5hbWU9ICB1bmRlZmluZWR9PSAgIHt9KT0+XG4gICAgIHtcbiAgaWYoIHR5cGVvZiBvcHREZXRhaWxzPT09ICAnc3RyaW5nJykge1xuICAgIC8vIElmIGl0IGlzIGEgc3RyaW5nLCB1c2UgaXQgYXMgdGhlIGxpdGVyYWwgcGFydCBvZiB0aGUgdGVtcGxhdGUgc29cbiAgICAvLyBpdCBkb2Vzbid0IGdldCBxdW90ZWQuXG4gICAgb3B0RGV0YWlscz0gIHJlZGFjdGVkRGV0YWlscyhbb3B0RGV0YWlsc10pO1xuICAgfVxuICBjb25zdCBoaWRkZW5EZXRhaWxzPSAgd2Vha21hcEdldChoaWRkZW5EZXRhaWxzTWFwLCBvcHREZXRhaWxzKTtcbiAgaWYoIGhpZGRlbkRldGFpbHM9PT0gIHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgZGV0YWlscyAke3F1b3RlKG9wdERldGFpbHMpfWApO1xuICAgfVxuICBjb25zdCBtZXNzYWdlU3RyaW5nPSAgZ2V0TWVzc2FnZVN0cmluZyhoaWRkZW5EZXRhaWxzKTtcbiAgY29uc3QgZXJyb3I9ICBuZXcgRXJyb3JDb25zdHJ1Y3RvcihtZXNzYWdlU3RyaW5nKTtcbiAgd2Vha21hcFNldChoaWRkZW5NZXNzYWdlTG9nQXJncywgZXJyb3IsIGdldExvZ0FyZ3MoaGlkZGVuRGV0YWlscykpO1xuICBpZiggZXJyb3JOYW1lIT09ICB1bmRlZmluZWQpIHtcbiAgICB0YWdFcnJvcihlcnJvciwgZXJyb3JOYW1lKTtcbiAgIH1cbiAgLy8gVGhlIG5leHQgbGluZSBpcyBhIHBhcnRpY3VsYXJseSBmcnVpdGZ1bCBwbGFjZSB0byBwdXQgYSBicmVha3BvaW50LlxuICByZXR1cm4gZXJyb3I7XG4gfTtcbmZyZWV6ZShtYWtlRXJyb3IpO1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEVycm9yLCBMb2dBcmdzW10+fVxuICpcbiAqIE1hcHMgZnJvbSBhbiBlcnJvciB0byBhbiBhcnJheSBvZiBsb2cgYXJncywgd2hlcmUgZWFjaCBsb2cgYXJncyBpc1xuICogcmVtZW1iZXJlZCBhcyBhbiBhbm5vdGF0aW9uIG9uIHRoYXQgZXJyb3IuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLFxuICogdG8ga2VlcCB0cmFjayBvZiBhZGRpdGlvbmFsIGNhdXNlcyBvZiB0aGUgZXJyb3IuIFRoZSBlbGVtZW50cyBvZiBhbnlcbiAqIGxvZyBhcmdzIG1heSBpbmNsdWRlIGVycm9ycyB3aGljaCBhcmUgYXNzb2NpYXRlZCB3aXRoIGZ1cnRoZXIgYW5ub3RhdGlvbnMuXG4gKiBBbiBhdWdtZW50ZWQgY29uc29sZSwgbGlrZSB0aGUgY2F1c2FsIGNvbnNvbGUgb2YgYGNvbnNvbGUuanNgLCBjb3VsZFxuICogdGhlbiByZXRyaWV2ZSB0aGUgZ3JhcGggb2Ygc3VjaCBhbm5vdGF0aW9ucy5cbiAqL1xuY29uc3QgaGlkZGVuTm90ZUxvZ0FyZ3NBcnJheXM9ICBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEVycm9yLCBOb3RlQ2FsbGJhY2tbXT59XG4gKlxuICogQW4gYXVnbWVudGVkIGNvbnNvbGUgd2lsbCBub3JtYWxseSBvbmx5IHRha2UgdGhlIGhpZGRlbiBub3RlQXJncyBhcnJheSBvbmNlLFxuICogd2hlbiBpdCBsb2dzIHRoZSBlcnJvciBiZWluZyBhbm5vdGF0ZWQuIE9uY2UgdGhhdCBoYXBwZW5zLCBmdXJ0aGVyXG4gKiBhbm5vdGF0aW9ucyBvZiB0aGF0IGVycm9yIHNob3VsZCBnbyB0byB0aGUgY29uc29sZSBpbW1lZGlhdGVseS4gV2UgYXJyYW5nZVxuICogdGhhdCBieSBhY2NlcHRpbmcgYSBub3RlLWNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gdGhlIGNvbnNvbGUgYXMgYW4gb3B0aW9uYWxcbiAqIHBhcnQgb2YgdGhhdCB0YWtpbmcgb3BlcmF0aW9uLiBOb3JtYWxseSB0aGVyZSB3aWxsIG9ubHkgYmUgYXQgbW9zdCBvbmVcbiAqIGNhbGxiYWNrIHBlciBlcnJvciwgYnV0IHRoYXQgZGVwZW5kcyBvbiBjb25zb2xlIGJlaGF2aW9yIHdoaWNoIHdlIHNob3VsZCBub3RcbiAqIGFzc3VtZS4gV2UgbWFrZSB0aGlzIGFuIGFycmF5IG9mIGNhbGxiYWNrcyBzbyBtdWx0aXBsZSByZWdpc3RyYXRpb25zXG4gKiBhcmUgaW5kZXBlbmRlbnQuXG4gKi9cbmNvbnN0IGhpZGRlbk5vdGVDYWxsYmFja0FycmF5cz0gIG5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7QXNzZXJ0Tm90ZX0gKi9cbmNvbnN0IG5vdGU9ICAoZXJyb3IsIGRldGFpbHNOb3RlKT0+ICB7XG4gIGlmKCB0eXBlb2YgZGV0YWlsc05vdGU9PT0gICdzdHJpbmcnKSB7XG4gICAgLy8gSWYgaXQgaXMgYSBzdHJpbmcsIHVzZSBpdCBhcyB0aGUgbGl0ZXJhbCBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZSBzb1xuICAgIC8vIGl0IGRvZXNuJ3QgZ2V0IHF1b3RlZC5cbiAgICBkZXRhaWxzTm90ZT0gIHJlZGFjdGVkRGV0YWlscyhbZGV0YWlsc05vdGVdKTtcbiAgIH1cbiAgY29uc3QgaGlkZGVuRGV0YWlscz0gIHdlYWttYXBHZXQoaGlkZGVuRGV0YWlsc01hcCwgZGV0YWlsc05vdGUpO1xuICBpZiggaGlkZGVuRGV0YWlscz09PSAgdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYHVucmVjb2duaXplZCBkZXRhaWxzICR7cXVvdGUoZGV0YWlsc05vdGUpfWApO1xuICAgfVxuICBjb25zdCBsb2dBcmdzPSAgZ2V0TG9nQXJncyhoaWRkZW5EZXRhaWxzKTtcbiAgY29uc3QgY2FsbGJhY2tzPSAgd2Vha21hcEdldChoaWRkZW5Ob3RlQ2FsbGJhY2tBcnJheXMsIGVycm9yKTtcbiAgaWYoIGNhbGxiYWNrcyE9PSAgdW5kZWZpbmVkKSB7XG4gICAgZm9yKCBjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrKGVycm9yLCBsb2dBcmdzKTtcbiAgICAgfVxuICAgfWVsc2Uge1xuICAgIGNvbnN0IGxvZ0FyZ3NBcnJheT0gIHdlYWttYXBHZXQoaGlkZGVuTm90ZUxvZ0FyZ3NBcnJheXMsIGVycm9yKTtcbiAgICBpZiggbG9nQXJnc0FycmF5IT09ICB1bmRlZmluZWQpIHtcbiAgICAgIGFycmF5UHVzaChsb2dBcmdzQXJyYXksIGxvZ0FyZ3MpO1xuICAgICB9ZWxzZSB7XG4gICAgICB3ZWFrbWFwU2V0KGhpZGRlbk5vdGVMb2dBcmdzQXJyYXlzLCBlcnJvciwgW2xvZ0FyZ3NdKTtcbiAgICAgfVxuICAgfVxuIH07XG5mcmVlemUobm90ZSk7XG5cbi8qKlxuICogVGhlIHVucHJpdmlsZWdlZCBmb3JtIHRoYXQganVzdCB1c2VzIHRoZSBkZSBmYWN0byBgZXJyb3Iuc3RhY2tgIHByb3BlcnR5LlxuICogVGhlIHN0YXJ0IGNvbXBhcnRtZW50IG5vcm1hbGx5IGhhcyBhIHByaXZpbGVnZWQgYGdsb2JhbFRoaXMuZ2V0U3RhY2tTdHJpbmdgXG4gKiB3aGljaCBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHByZXNlbnQuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlZmF1bHRHZXRTdGFja1N0cmluZz0gIChlcnJvcik9PntcbiAgaWYoICEoJ3N0YWNrJ2luICBlcnJvcikpIHtcbiAgICByZXR1cm4gJyc7XG4gICB9XG4gIGNvbnN0IHN0YWNrU3RyaW5nPSAgIGAke2Vycm9yLnN0YWNrfWA7XG4gIGNvbnN0IHBvcz0gIHN0cmluZ0luZGV4T2Yoc3RhY2tTdHJpbmcsICdcXG4nKTtcbiAgaWYoIHN0cmluZ1N0YXJ0c1dpdGgoc3RhY2tTdHJpbmcsICcgJyl8fCAgcG9zPT09ICAtMSkge1xuICAgIHJldHVybiBzdGFja1N0cmluZztcbiAgIH1cbiAgcmV0dXJuIHN0cmluZ1NsaWNlKHN0YWNrU3RyaW5nLCBwb3MrICAxKTsgLy8gZXhjbHVkZSB0aGUgaW5pdGlhbCBuZXdsaW5lXG4gfTtcblxuLyoqIEB0eXBlIHtMb2dnZWRFcnJvckhhbmRsZXJ9ICovXG5jb25zdCBsb2dnZWRFcnJvckhhbmRsZXI9ICB7XG4gIGdldFN0YWNrU3RyaW5nOiBnbG9iYWxUaGlzLmdldFN0YWNrU3RyaW5nfHwgIGRlZmF1bHRHZXRTdGFja1N0cmluZyxcbiAgdGFnRXJyb3I6IChlcnJvcik9PnRhZ0Vycm9yKGVycm9yKSxcbiAgcmVzZXRFcnJvclRhZ051bTogKCk9PiAge1xuICAgIGVycm9yVGFnTnVtPSAgMDtcbiAgIH0sXG4gIGdldE1lc3NhZ2VMb2dBcmdzOiAoZXJyb3IpPT53ZWFrbWFwR2V0KGhpZGRlbk1lc3NhZ2VMb2dBcmdzLCBlcnJvciksXG4gIHRha2VNZXNzYWdlTG9nQXJnczogKGVycm9yKT0+e1xuICAgIGNvbnN0IHJlc3VsdD0gIHdlYWttYXBHZXQoaGlkZGVuTWVzc2FnZUxvZ0FyZ3MsIGVycm9yKTtcbiAgICB3ZWFrbWFwRGVsZXRlKGhpZGRlbk1lc3NhZ2VMb2dBcmdzLCBlcnJvcik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgIH0sXG4gIHRha2VOb3RlTG9nQXJnc0FycmF5OiAoZXJyb3IsIGNhbGxiYWNrKT0+ICB7XG4gICAgY29uc3QgcmVzdWx0PSAgd2Vha21hcEdldChoaWRkZW5Ob3RlTG9nQXJnc0FycmF5cywgZXJyb3IpO1xuICAgIHdlYWttYXBEZWxldGUoaGlkZGVuTm90ZUxvZ0FyZ3NBcnJheXMsIGVycm9yKTtcbiAgICBpZiggY2FsbGJhY2shPT0gIHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY2FsbGJhY2tzPSAgd2Vha21hcEdldChoaWRkZW5Ob3RlQ2FsbGJhY2tBcnJheXMsIGVycm9yKTtcbiAgICAgIGlmKCBjYWxsYmFja3MpIHtcbiAgICAgICAgYXJyYXlQdXNoKGNhbGxiYWNrcywgY2FsbGJhY2spO1xuICAgICAgIH1lbHNlIHtcbiAgICAgICAgd2Vha21hcFNldChoaWRkZW5Ob3RlQ2FsbGJhY2tBcnJheXMsIGVycm9yLCBbY2FsbGJhY2tdKTtcbiAgICAgICB9XG4gICAgIH1cbiAgICByZXR1cm4gcmVzdWx0fHwgIFtdO1xuICAgfX07JGjigI1fb25jZS5sb2dnZWRFcnJvckhhbmRsZXIobG9nZ2VkRXJyb3JIYW5kbGVyKTtcblxuZnJlZXplKGxvZ2dlZEVycm9ySGFuZGxlcik7XG5cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqXG4gKiBAdHlwZSB7TWFrZUFzc2VydH1cbiAqL1xuY29uc3QgbWFrZUFzc2VydD0gIChvcHRSYWlzZT0gIHVuZGVmaW5lZCwgdW5yZWRhY3RlZD0gIGZhbHNlKT0+ICB7XG4gIGNvbnN0IGRldGFpbHM9ICB1bnJlZGFjdGVkPyAgdW5yZWRhY3RlZERldGFpbHM6ICByZWRhY3RlZERldGFpbHM7XG4gIC8qKiBAdHlwZSB7QXNzZXJ0RmFpbH0gKi9cbiAgY29uc3QgZmFpbD0gIChcbiAgICBvcHREZXRhaWxzPSAgZGV0YWlscyBgQXNzZXJ0IGZhaWxlZGAsXG4gICAgRXJyb3JDb25zdHJ1Y3Rvcj0gIGdsb2JhbFRoaXMuRXJyb3IpPT5cbiAgICAgICB7XG4gICAgY29uc3QgcmVhc29uPSAgbWFrZUVycm9yKG9wdERldGFpbHMsIEVycm9yQ29uc3RydWN0b3IpO1xuICAgIGlmKCBvcHRSYWlzZSE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICBvcHRSYWlzZShyZWFzb24pO1xuICAgICB9XG4gICAgdGhyb3cgcmVhc29uO1xuICAgfTtcbiAgZnJlZXplKGZhaWwpO1xuXG4gIC8qKiBAdHlwZSB7RmFpbFRhZ30gKi9cbiAgY29uc3QgRmFpbD0gICh0ZW1wbGF0ZSwgLi4uYXJncyk9PiAgZmFpbChkZXRhaWxzKHRlbXBsYXRlLCAuLi5hcmdzKSk7XG5cbiAgLy8gRG9uJ3QgZnJlZXplIG9yIGV4cG9ydCBgYmFzZUFzc2VydGAgdW50aWwgd2UgYWRkIG1ldGhvZHMuXG4gIC8vIFRPRE8gSWYgSSBjaGFuZ2UgdGhpcyBmcm9tIGEgYGZ1bmN0aW9uYCBmdW5jdGlvbiB0byBhbiBhcnJvd1xuICAvLyBmdW5jdGlvbiwgSSBzZWVtIHRvIGdldCB0eXBlIGVycm9ycyBmcm9tIFR5cGVTY3JpcHQuIFdoeT9cbiAgLyoqIEB0eXBlIHtCYXNlQXNzZXJ0fSAqL1xuICBmdW5jdGlvbiBiYXNlQXNzZXJ0KFxuICAgIGZsYWcsXG4gICAgb3B0RGV0YWlscz0gIGRldGFpbHMgYENoZWNrIGZhaWxlZGAsXG4gICAgRXJyb3JDb25zdHJ1Y3Rvcj0gIGdsb2JhbFRoaXMuRXJyb3IpXG4gICAge1xuICAgIGlmKCAhZmxhZykge1xuICAgICAgdGhyb3cgZmFpbChvcHREZXRhaWxzLCBFcnJvckNvbnN0cnVjdG9yKTtcbiAgICAgfVxuICAgfVxuXG4gIC8qKiBAdHlwZSB7QXNzZXJ0RXF1YWx9ICovXG4gIGNvbnN0IGVxdWFsPSAgKFxuICAgIGFjdHVhbCxcbiAgICBleHBlY3RlZCxcbiAgICBvcHREZXRhaWxzPSAgZGV0YWlscyBgRXhwZWN0ZWQgJHthY3R1YWx9IGlzIHNhbWUgYXMgJHtleHBlY3RlZH1gLFxuICAgIEVycm9yQ29uc3RydWN0b3I9ICBSYW5nZUVycm9yKT0+XG4gICAgICAge1xuICAgIGJhc2VBc3NlcnQoaXMoYWN0dWFsLCBleHBlY3RlZCksIG9wdERldGFpbHMsIEVycm9yQ29uc3RydWN0b3IpO1xuICAgfTtcbiAgZnJlZXplKGVxdWFsKTtcblxuICAvKiogQHR5cGUge0Fzc2VydFR5cGVvZn0gKi9cbiAgY29uc3QgYXNzZXJ0VHlwZW9mPSAgKHNwZWNpbWVuLCB0eXBlbmFtZSwgb3B0RGV0YWlscyk9PiAge1xuICAgIGJhc2VBc3NlcnQoXG4gICAgICB0eXBlb2YgdHlwZW5hbWU9PT0gICdzdHJpbmcnLFxuICAgICAgZGV0YWlscyBgJHtxdW90ZSh0eXBlbmFtZSl9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuICAgIGlmKCBvcHREZXRhaWxzPT09ICB1bmRlZmluZWQpIHtcbiAgICAgIC8vIExpa2VcbiAgICAgIC8vIGBgYGpzXG4gICAgICAvLyBvcHREZXRhaWxzID0gZGV0YWlsc2Ake3NwZWNpbWVufSBtdXN0IGJlICR7cXVvdGUoYW4odHlwZW5hbWUpKX1gO1xuICAgICAgLy8gYGBgXG4gICAgICAvLyBleGNlcHQgaXQgcHV0cyB0aGUgdHlwZW5hbWUgaW50byB0aGUgbGl0ZXJhbCBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZVxuICAgICAgLy8gc28gaXQgZG9lc24ndCBnZXQgcXVvdGVkLlxuICAgICAgb3B0RGV0YWlscz0gIGRldGFpbHMoWycnLCAgYCBtdXN0IGJlICR7YW4odHlwZW5hbWUpfWBdLHNwZWNpbWVuKTtcbiAgICAgfVxuICAgIGVxdWFsKHR5cGVvZiBzcGVjaW1lbiwgdHlwZW5hbWUsIG9wdERldGFpbHMsIFR5cGVFcnJvcik7XG4gICB9O1xuICBmcmVlemUoYXNzZXJ0VHlwZW9mKTtcblxuICAvKiogQHR5cGUge0Fzc2VydFN0cmluZ30gKi9cbiAgY29uc3QgYXNzZXJ0U3RyaW5nPSAgKHNwZWNpbWVuLCBvcHREZXRhaWxzKT0+XG4gICAgYXNzZXJ0VHlwZW9mKHNwZWNpbWVuLCAnc3RyaW5nJywgb3B0RGV0YWlscyk7XG5cbiAgLy8gTm90ZSB0aGF0IFwiYXNzZXJ0ID09PSBiYXNlQXNzZXJ0XCJcbiAgLyoqIEB0eXBlIHtBc3NlcnR9ICovXG4gIGNvbnN0IGFzc2VydD0gIGFzc2lnbihiYXNlQXNzZXJ0LCB7XG4gICAgZXJyb3I6IG1ha2VFcnJvcixcbiAgICBmYWlsLFxuICAgIGVxdWFsLFxuICAgIHR5cGVvZjogYXNzZXJ0VHlwZW9mLFxuICAgIHN0cmluZzogYXNzZXJ0U3RyaW5nLFxuICAgIG5vdGUsXG4gICAgZGV0YWlscyxcbiAgICBGYWlsLFxuICAgIHF1b3RlLFxuICAgIG1ha2VBc3NlcnR9KTtcblxuICByZXR1cm4gZnJlZXplKGFzc2VydCk7XG4gfTskaOKAjV9vbmNlLm1ha2VBc3NlcnQobWFrZUFzc2VydCk7XG5mcmVlemUobWFrZUFzc2VydCk7XG5cblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBhc3NlcnQ9ICBtYWtlQXNzZXJ0KCk7JGjigI1fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbNV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9FVkFMLGNyZWF0ZSxkZWZpbmVQcm9wZXJ0aWVzLGZyZWV6ZSxhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9FVkFMXCIsIFskaOKAjV9hID0+IChGRVJBTF9FVkFMID0gJGjigI1fYSldXSxbXCJjcmVhdGVcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZSA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCB7IEZhaWx9PSAgIGFzc2VydDtcblxuLy8gV2UgYXR0ZW1wdCB0byBmcnVzdHJhdGUgc3RhY2sgYnVtcGluZyBhdHRhY2tzIG9uIHRoZSBzYWZlIGV2YWx1YXRvclxuLy8gKGBtYWtlLXNhZmUtZXZhbHVhdG9yLmpzYCkuXG4vLyBBIHN0YWNrIGJ1bXBpbmcgYXR0YWNrIGZvcmNlcyBhbiBBUEkgY2FsbCB0byB0aHJvdyBhIHN0YWNrIG92ZXJmbG93XG4vLyBgUmFuZ2VFcnJvcmAgYXQgYW4gaW5vcHBvcnR1bmUgdGltZS5cbi8vIFRoZSBhdHRhY2tlciBhcnJhbmdlcyBmb3IgdGhlIHN0YWNrIHRvIGJlIHN1ZmZpY2llbnRseSBkZWVwIHRoYXQgdGhlIEFQSVxuLy8gY29uc3VtZXMgZXhhY3RseSBlbm91Z2ggc3RhY2sgZnJhbWVzIHRvIHRocm93IGFuIGV4Y2VwdGlvbi5cbi8vXG4vLyBGb3IgdGhlIHNhZmUgZXZhbHVhdG9yLCBhbiBleGNlcHRpb24gdGhyb3duIGJldHdlZW4gYWRkaW5nIGFuZCB0aGVuIGRlbGV0aW5nXG4vLyBgZXZhbGAgb24gYGV2YWxTY29wZWAgY291bGQgbGVhayB0aGUgcmVhbCBgZXZhbGAgdG8gYW4gYXR0YWNrZXIncyBsZXhpY2FsXG4vLyBzY29wZS5cbi8vIFRoaXMgd291bGQgYmUgc3VmZmljaWVudGx5IGRpc2FzdHJvdXMgdGhhdCB3ZSBndWFyZCBhZ2FpbnN0IGl0IHR3aWNlLlxuLy8gRmlyc3QsIHdlIGRlbGV0ZSBgZXZhbGAgZnJvbSBgZXZhbFNjb3BlYCBpbW1lZGlhdGVseSBiZWZvcmUgcmVuZGVyaW5nIGl0IHRvXG4vLyB0aGUgZ3Vlc3QgcHJvZ3JhbSdzIGxleGljYWwgc2NvcGUuXG4vL1xuLy8gSWYgdGhlIGF0dGFja2VyIG1hbmFnZXMgdG8gYXJyYW5nZSBmb3IgYGV2YWxgIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhZnRlciB3ZVxuLy8gY2FsbCBgYWxsb3dOZXh0RXZhbFRvQmVVbnNhZmVgIGJ1dCBiZWZvcmUgdGhlIGd1ZXN0IHByb2dyYW0gYWNjZXNzZXMgYGV2YWxgLFxuLy8gaXQgd291bGQgYmUgYWJsZSB0byBhY2Nlc3MgYGV2YWxgIG9uY2UgbW9yZSBpbiBpdHMgb3duIGNvZGUuXG4vLyBBbHRob3VnaCB0aGV5IGNvdWxkIGRvIG5vIGhhcm0gd2l0aCBhIGRpcmVjdCBgZXZhbGAsIHRoZXkgd291bGQgYmUgYWJsZSB0b1xuLy8gZXNjYXBlIHRvIHRoZSB0cnVlIGdsb2JhbCBzY29wZSB3aXRoIGFuIGluZGlyZWN0IGBldmFsYC5cbi8vXG4vLyAgIHByZXBhcmVTdGFjayhkZXB0aCwgKCkgPT4ge1xuLy8gICAgIChldmFsKSgnJyk7XG4vLyAgIH0pO1xuLy8gICBjb25zdCB1bnNhZmVFdmFsID0gKGV2YWwpO1xuLy8gICBjb25zdCBzYWZlRXZhbCA9IChldmFsKTtcbi8vICAgY29uc3QgcmVhbEdsb2JhbCA9IHVuc2FmZUV2YWwoJ2dsb2JhbFRoaXMnKTtcbi8vXG4vLyBUbyBwcm90ZWN0IGFnYWluc3QgdGhhdCBjYXNlLCB3ZSBhbHNvIGRlbGV0ZSBgZXZhbGAgZnJvbSB0aGUgYGV2YWxTY29wZWAgaW5cbi8vIGEgYGZpbmFsbHlgIGJsb2NrIHN1cnJvdW5kaW5nIHRoZSBjYWxsIHRvIHRoZSBzYWZlIGV2YWx1YXRvci5cbi8vIFRoZSBvbmx5IHdheSB0byByZWFjaCB0aGlzIGNhc2UgaXMgaWYgYGV2YWxgIHJlbWFpbnMgb24gYGV2YWxTY29wZWAgZHVlIHRvXG4vLyBhbiBhdHRhY2ssIHNvIHdlIGFzc3VtZSB0aGF0IGF0dGFjayB3b3VsZCBoYXZlIGhhdmUgaW52YWxpZGVkIG91ciBpc29sYXRpb25cbi8vIGFuZCByZXZva2UgYWxsIGZ1dHVyZSBhY2Nlc3MgdG8gdGhlIGV2YWx1YXRvci5cbi8vXG4vLyBUbyBkZWZlYXQgYSBzdGFjayBidW1waW5nIGF0dGFjaywgd2UgbXVzdCB1c2UgZmV3ZXIgc3RhY2sgZnJhbWVzIHRvIHJlY292ZXJcbi8vIGluIHRoYXQgYGZpbmFsbHlgIGJsb2NrIHRoYW4gd2UgdXNlZCBpbiB0aGUgYHRyeWAgYmxvY2suXG4vLyBXZSBoYXZlIG5vIHJlbGlhYmxlIGd1YXJhbnRlZXMgYWJvdXQgaG93IG1hbnkgc3RhY2sgZnJhbWVzIGEgYmxvY2sgb2Zcbi8vIEphdmFTY3JpcHQgd2lsbCBjb25zdW1lLlxuLy8gRnVuY3Rpb24gaW5saW5pbmcsIHRhaWwtY2FsbCBvcHRpbWl6YXRpb24sIHZhcmlhdGlvbnMgaW4gdGhlIHNpemUgb2YgYSBzdGFja1xuLy8gZnJhbWUsIGFuZCBibG9jayBzY29wZXMgbWF5IGFmZmVjdCB0aGUgZGVwdGggb2YgdGhlIHN0YWNrLlxuLy8gVGhlIG9ubHkgbnVtYmVyIG9mIGFjY2VwdGFibGUgc3RhY2sgZnJhbWVzIHRvIHVzZSBpbiB0aGUgZmluYWxseSBibG9jayBpc1xuLy8gemVyby5cbi8vIFdlIG9ubHkgdXNlIHByb3BlcnR5IGFzc2lnbm1lbnQgYW5kIGRlbGV0aW9uIGluIHRoZSBzYWZlIGV2YWx1YXRvcidzXG4vLyBgZmluYWxseWAgYmxvY2suXG4vLyBXZSB1c2UgYGRlbGV0ZSBldmFsU2NvcGUuZXZhbGAgdG8gd2l0aGhvbGQgdGhlIGV2YWx1YXRvci5cbi8vIFdlIGFzc2lnbiBhbiBlbnZlbG9wZSBvYmplY3Qgb3ZlciBgZXZhbFNjb3BlS2l0LnJldm9rZWRgIHRvIHJldm9rZSB0aGVcbi8vIGV2YWx1YXRvci5cbi8vXG4vLyBUaGlzIGlzIHdoeSB3ZSBzdXBwbHkgYSBtZWFuaW5nZnVsbHkgbmFtZWQgZnVuY3Rpb24gZm9yXG4vLyBgYWxsb3dOZXh0RXZhbFRvQmVVbnNhZmVgIGJ1dCBkbyBub3QgcHJvdmlkZSBhIGNvcnJlc3BvbmRpbmdcbi8vIGByZXZva2VBY2Nlc3NUb1Vuc2FmZUV2YWxgIG9yIGV2ZW4gc2ltcGx5IGByZXZva2VgLlxuLy8gVGhlc2UgcmVjb3Zlcnkgcm91dGluZXMgYXJlIGV4cHJlc3NlZCBpbmxpbmUgaW4gdGhlIHNhZmUgZXZhbHVhdG9yLlxuXG5jb25zdCAgICAgICAgbWFrZUV2YWxTY29wZUtpdD0gICgpPT4gIHtcbiAgY29uc3QgZXZhbFNjb3BlPSAgY3JlYXRlKG51bGwpO1xuICBjb25zdCBvbmVUaW1lRXZhbFByb3BlcnRpZXM9ICBmcmVlemUoe1xuICAgIGV2YWw6IHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgZGVsZXRlIGV2YWxTY29wZS5ldmFsO1xuICAgICAgICByZXR1cm4gRkVSQUxfRVZBTDtcbiAgICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuXG4gIGNvbnN0IGV2YWxTY29wZUtpdD0gIHtcbiAgICBldmFsU2NvcGUsXG4gICAgYWxsb3dOZXh0RXZhbFRvQmVVbnNhZmUoKSB7XG4gICAgICBpZiggZXZhbFNjb3BlS2l0LnJldm9rZWQhPT0gIG51bGwpIHtcbiAgICAgICAgRmFpbCBgYSBoYW5kbGVyIGRpZCBub3QgcmVzZXQgYWxsb3dOZXh0RXZhbFRvQmVVbnNhZmUgJHt0aGlzLnJldm9rZWQuZXJyfWA7XG4gICAgICAgfVxuICAgICAgLy8gQWxsb3cgbmV4dCByZWZlcmVuY2UgdG8gZXZhbCBwcm9kdWNlIHRoZSB1bnNhZmUgRkVSQUxfRVZBTC5cbiAgICAgIC8vIFdlIGF2b2lkIGRlZmluZVByb3BlcnR5IGJlY2F1c2UgaXQgY29uc3VtZXMgYW4gZXh0cmEgc3RhY2sgZnJhbWUgdGFtaW5nXG4gICAgICAvLyBpdHMgcmV0dXJuIHZhbHVlLlxuICAgICAgZGVmaW5lUHJvcGVydGllcyhldmFsU2NvcGUsIG9uZVRpbWVFdmFsUHJvcGVydGllcyk7XG4gICAgIH0sXG4gICAgcmV2b2tlZDogbnVsbH07XG5cblxuICByZXR1cm4gZXZhbFNjb3BlS2l0O1xuIH07JGjigI1fb25jZS5tYWtlRXZhbFNjb3BlS2l0KG1ha2VFdmFsU2NvcGVLaXQpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s2XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFycmF5RmlsdGVyLGFycmF5SW5jbHVkZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGdldE93blByb3BlcnR5TmFtZXMsb2JqZWN0SGFzT3duUHJvcGVydHkscmVnZXhwVGVzdDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcImFycmF5RmlsdGVyXCIsIFskaOKAjV9hID0+IChhcnJheUZpbHRlciA9ICRo4oCNX2EpXV0sW1wiYXJyYXlJbmNsdWRlc1wiLCBbJGjigI1fYSA9PiAoYXJyYXlJbmNsdWRlcyA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5TmFtZXNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5TmFtZXMgPSAkaOKAjV9hKV1dLFtcIm9iamVjdEhhc093blByb3BlcnR5XCIsIFskaOKAjV9hID0+IChvYmplY3RIYXNPd25Qcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wicmVnZXhwVGVzdFwiLCBbJGjigI1fYSA9PiAocmVnZXhwVGVzdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICoga2V5d29yZHNcbiAqIEluIEphdmFTY3JpcHQgeW91IGNhbm5vdCB1c2UgdGhlc2UgcmVzZXJ2ZWQgd29yZHMgYXMgdmFyaWFibGVzLlxuICogU2VlIDExLjYuMSBJZGVudGlmaWVyIE5hbWVzXG4gKi9cbmNvbnN0IGtleXdvcmRzPSAgW1xuICAvLyAxMS42LjIuMSBLZXl3b3Jkc1xuICAnYXdhaXQnLFxuICAnYnJlYWsnLFxuICAnY2FzZScsXG4gICdjYXRjaCcsXG4gICdjbGFzcycsXG4gICdjb25zdCcsXG4gICdjb250aW51ZScsXG4gICdkZWJ1Z2dlcicsXG4gICdkZWZhdWx0JyxcbiAgJ2RlbGV0ZScsXG4gICdkbycsXG4gICdlbHNlJyxcbiAgJ2V4cG9ydCcsXG4gICdleHRlbmRzJyxcbiAgJ2ZpbmFsbHknLFxuICAnZm9yJyxcbiAgJ2Z1bmN0aW9uJyxcbiAgJ2lmJyxcbiAgJ2ltcG9ydCcsXG4gICdpbicsXG4gICdpbnN0YW5jZW9mJyxcbiAgJ25ldycsXG4gICdyZXR1cm4nLFxuICAnc3VwZXInLFxuICAnc3dpdGNoJyxcbiAgJ3RoaXMnLFxuICAndGhyb3cnLFxuICAndHJ5JyxcbiAgJ3R5cGVvZicsXG4gICd2YXInLFxuICAndm9pZCcsXG4gICd3aGlsZScsXG4gICd3aXRoJyxcbiAgJ3lpZWxkJyxcblxuICAvLyBBbHNvIHJlc2VydmVkIHdoZW4gcGFyc2luZyBzdHJpY3QgbW9kZSBjb2RlXG4gICdsZXQnLFxuICAnc3RhdGljJyxcblxuICAvLyAxMS42LjIuMiBGdXR1cmUgUmVzZXJ2ZWQgV29yZHNcbiAgJ2VudW0nLFxuXG4gIC8vIEFsc28gcmVzZXJ2ZWQgd2hlbiBwYXJzaW5nIHN0cmljdCBtb2RlIGNvZGVcbiAgJ2ltcGxlbWVudHMnLFxuICAncGFja2FnZScsXG4gICdwcm90ZWN0ZWQnLFxuICAnaW50ZXJmYWNlJyxcbiAgJ3ByaXZhdGUnLFxuICAncHVibGljJyxcblxuICAvLyBSZXNlcnZlZCBidXQgbm90IG1lbnRpb25lZCBpbiBzcGVjc1xuICAnYXdhaXQnLFxuXG4gICdudWxsJyxcbiAgJ3RydWUnLFxuICAnZmFsc2UnLFxuXG4gICd0aGlzJyxcbiAgJ2FyZ3VtZW50cyddO1xuXG5cbi8qKlxuICogaWRlbnRpZmllclBhdHRlcm5cbiAqIFNpbXBsaWZpZWQgdmFsaWRhdGlvbiBvZiBpZGVudGlmaWVyIG5hbWVzOiBtYXkgb25seSBjb250YWluIGFscGhhbnVtZXJpY1xuICogY2hhcmFjdGVycyAob3IgXCIkXCIgb3IgXCJfXCIpLCBhbmQgbWF5IG5vdCBzdGFydCB3aXRoIGEgZGlnaXQuIFRoaXMgaXMgc2FmZVxuICogYW5kIGRvZXMgbm90IHJlZHVjZXMgdGhlIGNvbXBhdGliaWxpdHkgb2YgdGhlIHNoaW0uIFRoZSBtb3RpdmF0aW9uIGZvclxuICogdGhpcyBsaW1pdGF0aW9uIHdhcyB0byBkZWNyZWFzZSB0aGUgY29tcGxleGl0eSBvZiB0aGUgaW1wbGVtZW50YXRpb24sXG4gKiBhbmQgdG8gbWFpbnRhaW4gYSByZXNvbmFibGUgbGV2ZWwgb2YgcGVyZm9ybWFuY2UuXG4gKiBOb3RlOiBcXHcgaXMgZXF1aXZhbGVudCBbYS16QS1aXzAtOV1cbiAqIFNlZSAxMS42LjEgSWRlbnRpZmllciBOYW1lc1xuICovXG5jb25zdCBpZGVudGlmaWVyUGF0dGVybj0gIC9eW2EtekEtWl8kXVtcXHckXSokLztcblxuLyoqXG4gKiBpc1ZhbGlkSWRlbnRpZmllck5hbWUoKVxuICogV2hhdCB2YXJpYWJsZSBuYW1lcyBtaWdodCBpdCBicmluZyBpbnRvIHNjb3BlPyBUaGVzZSBpbmNsdWRlIGFsbFxuICogcHJvcGVydHkgbmFtZXMgd2hpY2ggY2FuIGJlIHZhcmlhYmxlIG5hbWVzLCBpbmNsdWRpbmcgdGhlIG5hbWVzXG4gKiBvZiBpbmhlcml0ZWQgcHJvcGVydGllcy4gSXQgZXhjbHVkZXMgc3ltYm9scyBhbmQgbmFtZXMgd2hpY2ggYXJlXG4gKiBrZXl3b3Jkcy4gV2UgZHJvcCBzeW1ib2xzIHNhZmVseS4gQ3VycmVudGx5LCB0aGlzIHNoaW0gcmVmdXNlc1xuICogc2VydmljZSBpZiBhbnkgb2YgdGhlIG5hbWVzIGFyZSBrZXl3b3JkcyBvciBrZXl3b3JkLWxpa2UuIFRoaXMgaXNcbiAqIHNhZmUgYW5kIG9ubHkgcHJldmVudCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuY29uc3QgICAgICAgIGlzVmFsaWRJZGVudGlmaWVyTmFtZT0gIChuYW1lKT0+e1xuICAvLyBFbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIGlkZW50aWZpZXIuIFdlIHVzZSByZWdleHBUZXN0IHJhdGhlciB0aGFuXG4gIC8vIC8uLi8udGVzdCgpIHRvIGd1YXJkIGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgUmVnRXhwIGhhcyBiZWVuIHBvaXNvbmVkLlxuICByZXR1cm4oXG4gICAgbmFtZSE9PSAgJ2V2YWwnJiZcbiAgICAhYXJyYXlJbmNsdWRlcyhrZXl3b3JkcywgbmFtZSkmJlxuICAgIHJlZ2V4cFRlc3QoaWRlbnRpZmllclBhdHRlcm4sIG5hbWUpKTtcblxuIH07XG5cbi8qXG4gKiBpc0ltbXV0YWJsZURhdGFQcm9wZXJ0eVxuICovJGjigI1fb25jZS5pc1ZhbGlkSWRlbnRpZmllck5hbWUoaXNWYWxpZElkZW50aWZpZXJOYW1lKTtcblxuZnVuY3Rpb24gaXNJbW11dGFibGVEYXRhUHJvcGVydHkob2JqLCBuYW1lKSB7XG4gIGNvbnN0IGRlc2M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lKTtcbiAgcmV0dXJuKFxuICAgIC8vXG4gICAgLy8gVGhlIGdldHRlcnMgd2lsbCBub3QgaGF2ZSAud3JpdGFibGUsIGRvbid0IGxldCB0aGUgZmFsc3luZXNzIG9mXG4gICAgLy8gJ3VuZGVmaW5lZCcgdHJpY2sgdXM6IHRlc3Qgd2l0aCA9PT0gZmFsc2UsIG5vdCAhIC4gSG93ZXZlciBkZXNjcmlwdG9yc1xuICAgIC8vIGluaGVyaXQgZnJvbSB0aGUgKHBvdGVudGlhbGx5IHBvaXNvbmVkKSBnbG9iYWwgb2JqZWN0LCBzbyB3ZSBtaWdodCBzZWVcbiAgICAvLyBleHRyYSBwcm9wZXJ0aWVzIHdoaWNoIHdlcmVuJ3QgcmVhbGx5IHRoZXJlLiBBY2Nlc3NvciBwcm9wZXJ0aWVzIGhhdmVcbiAgICAvLyAnZ2V0L3NldC9lbnVtZXJhYmxlL2NvbmZpZ3VyYWJsZScsIHdoaWxlIGRhdGEgcHJvcGVydGllcyBoYXZlXG4gICAgLy8gJ3ZhbHVlL3dyaXRhYmxlL2VudW1lcmFibGUvY29uZmlndXJhYmxlJy5cbiAgICBkZXNjLmNvbmZpZ3VyYWJsZT09PSAgZmFsc2UmJlxuICAgIGRlc2Mud3JpdGFibGU9PT0gIGZhbHNlJiZcbiAgICAvL1xuICAgIC8vIENoZWNrcyBmb3IgZGF0YSBwcm9wZXJ0aWVzIGJlY2F1c2UgdGhleSdyZSB0aGUgb25seSBvbmVzIHdlIGNhblxuICAgIC8vIG9wdGltaXplIChhY2Nlc3NvcnMgYXJlIG1vc3QgbGlrZWx5IG5vbi1jb25zdGFudCkuIERlc2NyaXB0b3JzIGNhbid0XG4gICAgLy8gY2FuJ3QgaGF2ZSBhY2Nlc3NvcnMgYW5kIHZhbHVlIHByb3BlcnRpZXMgYXQgdGhlIHNhbWUgdGltZSwgdGhlcmVmb3JlXG4gICAgLy8gdGhpcyBjaGVjayBpcyBzdWZmaWNpZW50LiBVc2luZyBleHBsaWNpdCBvd24gcHJvcGVydHkgZGVhbCB3aXRoIHRoZVxuICAgIC8vIGNhc2Ugd2hlcmUgT2JqZWN0LnByb3RvdHlwZSBoYXMgYmVlbiBwb2lzb25lZC5cbiAgICBvYmplY3RIYXNPd25Qcm9wZXJ0eShkZXNjLCAndmFsdWUnKSk7XG5cbiB9XG5cbi8qKlxuICogZ2V0U2NvcGVDb25zdGFudHMoKVxuICogV2hhdCB2YXJpYWJsZSBuYW1lcyBtaWdodCBpdCBicmluZyBpbnRvIHNjb3BlPyBUaGVzZSBpbmNsdWRlIGFsbFxuICogcHJvcGVydHkgbmFtZXMgd2hpY2ggY2FuIGJlIHZhcmlhYmxlIG5hbWVzLCBpbmNsdWRpbmcgdGhlIG5hbWVzXG4gKiBvZiBpbmhlcml0ZWQgcHJvcGVydGllcy4gSXQgZXhjbHVkZXMgc3ltYm9scyBhbmQgbmFtZXMgd2hpY2ggYXJlXG4gKiBrZXl3b3Jkcy4gV2UgZHJvcCBzeW1ib2xzIHNhZmVseS4gQ3VycmVudGx5LCB0aGlzIHNoaW0gcmVmdXNlc1xuICogc2VydmljZSBpZiBhbnkgb2YgdGhlIG5hbWVzIGFyZSBrZXl3b3JkcyBvciBrZXl3b3JkLWxpa2UuIFRoaXMgaXNcbiAqIHNhZmUgYW5kIG9ubHkgcHJldmVudCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGdsb2JhbE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZUxleGljYWxzXG4gKi9cbmNvbnN0ICAgICAgICBnZXRTY29wZUNvbnN0YW50cz0gIChnbG9iYWxPYmplY3QsIG1vZHVsZUxleGljYWxzPSAge30pPT4gIHtcbiAgLy8gZ2V0T3duUHJvcGVydHlOYW1lcygpIGRvZXMgaWdub3JlIFN5bWJvbHMgc28gd2UgZG9uJ3QgbmVlZCB0b1xuICAvLyBmaWx0ZXIgdGhlbSBvdXQuXG4gIGNvbnN0IGdsb2JhbE9iamVjdE5hbWVzPSAgZ2V0T3duUHJvcGVydHlOYW1lcyhnbG9iYWxPYmplY3QpO1xuICBjb25zdCBtb2R1bGVMZXhpY2FsTmFtZXM9ICBnZXRPd25Qcm9wZXJ0eU5hbWVzKG1vZHVsZUxleGljYWxzKTtcblxuICAvLyBDb2xsZWN0IGFsbCB2YWxpZCAmIGltbXV0YWJsZSBpZGVudGlmaWVycyBmcm9tIHRoZSBlbmRvd21lbnRzLlxuICBjb25zdCBtb2R1bGVMZXhpY2FsQ29uc3RhbnRzPSAgYXJyYXlGaWx0ZXIoXG4gICAgbW9kdWxlTGV4aWNhbE5hbWVzLFxuICAgIChuYW1lKT0+XG4gICAgICBpc1ZhbGlkSWRlbnRpZmllck5hbWUobmFtZSkmJlxuICAgICAgaXNJbW11dGFibGVEYXRhUHJvcGVydHkobW9kdWxlTGV4aWNhbHMsIG5hbWUpKTtcblxuXG4gIC8vIENvbGxlY3QgYWxsIHZhbGlkICYgaW1tdXRhYmxlIGlkZW50aWZpZXJzIGZyb20gdGhlIGdsb2JhbCB0aGF0XG4gIC8vIGFyZSBhbHNvIG5vdCBwcmVzZW50IGluIHRoZSBlbmRvd21lbnRzIChpbW11dGFibGUgb3Igbm90KS5cbiAgY29uc3QgZ2xvYmFsT2JqZWN0Q29uc3RhbnRzPSAgYXJyYXlGaWx0ZXIoXG4gICAgZ2xvYmFsT2JqZWN0TmFtZXMsXG4gICAgKG5hbWUpPT5cbiAgICAgIC8vIENhbid0IGRlZmluZSBhIGNvbnN0YW50OiBpdCB3b3VsZCBwcmV2ZW50IGFcbiAgICAgIC8vIGxvb2t1cCBvbiB0aGUgZW5kb3dtZW50cy5cbiAgICAgICFhcnJheUluY2x1ZGVzKG1vZHVsZUxleGljYWxOYW1lcywgbmFtZSkmJlxuICAgICAgaXNWYWxpZElkZW50aWZpZXJOYW1lKG5hbWUpJiZcbiAgICAgIGlzSW1tdXRhYmxlRGF0YVByb3BlcnR5KGdsb2JhbE9iamVjdCwgbmFtZSkpO1xuXG5cbiAgcmV0dXJuIHtcbiAgICBnbG9iYWxPYmplY3RDb25zdGFudHMsXG4gICAgbW9kdWxlTGV4aWNhbENvbnN0YW50c307XG5cbiB9OyRo4oCNX29uY2UuZ2V0U2NvcGVDb25zdGFudHMoZ2V0U2NvcGVDb25zdGFudHMpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s3XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZFUkFMX0ZVTkNUSU9OLGFycmF5Sm9pbixhcHBseSxnZXRTY29wZUNvbnN0YW50czskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX0ZVTkNUSU9OXCIsIFskaOKAjV9hID0+IChGRVJBTF9GVU5DVElPTiA9ICRo4oCNX2EpXV0sW1wiYXJyYXlKb2luXCIsIFskaOKAjV9hID0+IChhcnJheUpvaW4gPSAkaOKAjV9hKV1dLFtcImFwcGx5XCIsIFskaOKAjV9hID0+IChhcHBseSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Njb3BlLWNvbnN0YW50cy5qc1wiLCBbW1wiZ2V0U2NvcGVDb25zdGFudHNcIiwgWyRo4oCNX2EgPT4gKGdldFNjb3BlQ29uc3RhbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogYnVpbGRPcHRpbWl6ZXIoKVxuICogR2l2ZW4gYW4gYXJyYXkgb2YgaWRlbnRpZmllcnMsIHRoZSBvcHRpbWl6ZXIgcmV0dXJucyBhIGBjb25zdGAgZGVjbGFyYXRpb25cbiAqIGRlc3RydWN0dXJpbmcgYHRoaXMuJHtuYW1lfWAuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb25zdGFudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkT3B0aW1pemVyKGNvbnN0YW50cywgbmFtZSkge1xuICAvLyBObyBuZWVkIHRvIGJ1aWxkIGFuIG9wdGltaXplciB3aGVuIHRoZXJlIGFyZSBubyBjb25zdGFudHMuXG4gIGlmKCBjb25zdGFudHMubGVuZ3RoPT09ICAwKSByZXR1cm4gJyc7XG4gIC8vIFVzZSAndGhpcycgdG8gYXZvaWQgZ29pbmcgdGhyb3VnaCB0aGUgc2NvcGUgcHJveHksIHdoaWNoIGlzIHVubmVjZXNzYXJ5XG4gIC8vIHNpbmNlIHRoZSBvcHRpbWl6ZXIgb25seSBuZWVkcyByZWZlcmVuY2VzIHRvIHRoZSBzYWZlIGdsb2JhbC5cbiAgLy8gRGVzdHJ1Y3R1cmUgdGhlIGNvbnN0YW50cyBmcm9tIHRoZSB0YXJnZXQgc2NvcGUgb2JqZWN0LlxuICByZXR1cm4gIGBjb25zdCB7JHthcnJheUpvaW4oY29uc3RhbnRzLCcsJykgfX0gPSB0aGlzLiR7bmFtZX07YDtcbiB9XG5cbi8qKlxuICogbWFrZUV2YWx1YXRlKClcbiAqIENyZWF0ZSBhbiAnZXZhbHVhdGUnIGZ1bmN0aW9uIHdpdGggdGhlIGNvcnJlY3Qgb3B0aW1pemVyIGluc2VydGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dC5ldmFsU2NvcGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0Lm1vZHVsZUxleGljYWxzXG4gKiBAcGFyYW0ge29iamVjdH0gY29udGV4dC5nbG9iYWxPYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0LnNjb3BlVGVybWluYXRvclxuICovXG5jb25zdCAgICAgICAgbWFrZUV2YWx1YXRlPSAgKGNvbnRleHQpPT57XG4gIGNvbnN0IHsgZ2xvYmFsT2JqZWN0Q29uc3RhbnRzLCBtb2R1bGVMZXhpY2FsQ29uc3RhbnRzfT0gICBnZXRTY29wZUNvbnN0YW50cyhcbiAgICBjb250ZXh0Lmdsb2JhbE9iamVjdCxcbiAgICBjb250ZXh0Lm1vZHVsZUxleGljYWxzKTtcblxuICBjb25zdCBnbG9iYWxPYmplY3RPcHRpbWl6ZXI9ICBidWlsZE9wdGltaXplcihcbiAgICBnbG9iYWxPYmplY3RDb25zdGFudHMsXG4gICAgJ2dsb2JhbE9iamVjdCcpO1xuXG4gIGNvbnN0IG1vZHVsZUxleGljYWxPcHRpbWl6ZXI9ICBidWlsZE9wdGltaXplcihcbiAgICBtb2R1bGVMZXhpY2FsQ29uc3RhbnRzLFxuICAgICdtb2R1bGVMZXhpY2FscycpO1xuXG5cbiAgLy8gQ3JlYXRlIGEgZnVuY3Rpb24gaW4gc2xvcHB5IG1vZGUsIHNvIHRoYXQgd2UgY2FuIHVzZSAnd2l0aCcuIEl0IHJldHVybnNcbiAgLy8gYSBmdW5jdGlvbiBpbiBzdHJpY3QgbW9kZSB0aGF0IGV2YWx1YXRlcyB0aGUgcHJvdmlkZWQgY29kZSB1c2luZyBkaXJlY3RcbiAgLy8gZXZhbCwgYW5kIHRodXMgaW4gc3RyaWN0IG1vZGUgaW4gdGhlIHNhbWUgc2NvcGUuIFdlIG11c3QgYmUgdmVyeSBjYXJlZnVsXG4gIC8vIHRvIG5vdCBjcmVhdGUgbmV3IG5hbWVzIGluIHRoaXMgc2NvcGVcblxuICAvLyAxOiB3ZSB1c2UgbXVsdGlwbGUgbmVzdGVkICd3aXRoJyB0byBjYXRjaCBhbGwgZnJlZSB2YXJpYWJsZSBuYW1lcy4gVGhlXG4gIC8vIGB0aGlzYCB2YWx1ZSBvZiB0aGUgb3V0ZXIgc2xvcHB5IGZ1bmN0aW9uIGhvbGRzIHRoZSBkaWZmZXJlbnQgc2NvcGVcbiAgLy8gbGF5ZXJzLCBmcm9tIGlubmVyIHRvIG91dGVyOlxuICAvLyAgICBhKSBgZXZhbFNjb3BlYCB3aGljaCBtdXN0IHJlbGVhc2UgdGhlIGBGRVJBTF9FVkFMYCBhcyAnZXZhbCcgb25jZSBmb3JcbiAgLy8gICAgICAgZXZlcnkgaW52b2NhdGlvbiBvZiB0aGUgaW5uZXIgYGV2YWx1YXRlYCBmdW5jdGlvbiBpbiBvcmRlciB0b1xuICAvLyAgICAgICB0cmlnZ2VyIGRpcmVjdCBldmFsLiBUaGUgZGlyZWN0IGV2YWwgc2VtYW50aWNzIGlzIHdoYXQgYWxsb3dzIHRoZVxuICAvLyAgICAgICBldmFsdWF0ZWQgY29kZSB0byBsb29rdXAgZnJlZSB2YXJpYWJsZSBuYW1lcyBvbiB0aGUgb3RoZXIgc2NvcGVcbiAgLy8gICAgICAgb2JqZWN0cyBhbmQgbm90IGluIGdsb2JhbCBzY29wZS5cbiAgLy8gICAgYikgYG1vZHVsZUxleGljYWxzYCB3aGljaCBwcm92aWRlIGEgd2F5IHRvIGludHJvZHVjZSBmcmVlIHZhcmlhYmxlc1xuICAvLyAgICAgICB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBnbG9iYWxPYmplY3QuXG4gIC8vICAgIGMpIGBnbG9iYWxPYmplY3RgIGlzIHRoZSBnbG9iYWwgc2NvcGUgb2JqZWN0IG9mIHRoZSBldmFsdWF0b3IsIGFrYSB0aGVcbiAgLy8gICAgICAgQ29tcGFydG1lbnQncyBgZ2xvYmFsVGhpc2AuXG4gIC8vICAgIGQpIGBzY29wZVRlcm1pbmF0b3JgIGlzIGEgcHJveHkgb2JqZWN0IHdoaWNoIHByZXZlbnRzIGZyZWUgdmFyaWFibGVcbiAgLy8gICAgICAgbG9va3VwcyB0byBlc2NhcGUgdG8gdGhlIHN0YXJ0IGNvbXBhcnRtZW50J3MgZ2xvYmFsIG9iamVjdC5cbiAgLy8gMjogYG9wdGltaXplcmBzIGNhdGNoIGNvbnN0YW50IHZhcmlhYmxlIG5hbWVzIGZvciBzcGVlZC5cbiAgLy8gMzogVGhlIGlubmVyIHN0cmljdCBgZXZhbHVhdGVgIGZ1bmN0aW9uIHNob3VsZCBiZSBwYXNzZWQgdHdvIHBhcmFtZXRlcnM6XG4gIC8vICAgIGEpIGl0cyBhcmd1bWVudHNbMF0gaXMgdGhlIHNvdXJjZSB0byBiZSBkaXJlY3RseSBldmFsdWF0ZWQuXG4gIC8vICAgIGIpIGl0cyAndGhpcycgaXMgdGhlIHRoaXMgYmluZGluZyBzZWVuIGJ5IHRoZSBjb2RlIGJlaW5nXG4gIC8vICAgICAgIGRpcmVjdGx5IGV2YWx1YXRlZCAodGhlIGdsb2JhbE9iamVjdCkuXG5cbiAgLy8gTm90ZXM6XG4gIC8vIC0gVGhlIGBvcHRpbWl6ZXJgIHN0cmluZ3Mgb25seSBsb29rdXAgdmFsdWVzIG9uIHRoZSBgZ2xvYmFsT2JqZWN0YCBhbmRcbiAgLy8gICBgbW9kdWxlTGV4aWNhbHNgIG9iamVjdHMgYnkgY29uc3RydWN0LiBLZXl3b3JkcyBsaWtlICdmdW5jdGlvbicgYXJlXG4gIC8vICAgcmVzZXJ2ZWQgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIGEgdmFyaWFibGUsIHNvIHRoZXkgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlXG4gIC8vICAgb3B0aW1pemVyLiBGdXJ0aGVybW9yZSB0byBwcmV2ZW50IHNoYWRvd2luZyAnZXZhbCcsIHdoaWxlIGEgdmFsaWRcbiAgLy8gICBpZGVudGlmaWVyLCB0aGF0IG5hbWUgaXMgYWxzbyBleHBsaWNpdGx5IGV4Y2x1ZGVkLlxuICAvLyAtIHdoZW4gJ2V2YWwnIGlzIGxvb2tlZCB1cCBpbiB0aGUgYGV2YWxTY29wZWAsIHRoZSBwb3dlcmZ1bCB1bnNhZmUgZXZhbFxuICAvLyAgIGludHJpbnNpYyBpcyByZXR1cm5lZCBhZnRlciBhdXRvbWF0aWNhbGx5IHJlbW92aW5nIGl0IGZyb20gdGhlXG4gIC8vICAgYGV2YWxTY29wZWAuIEFueSBmdXJ0aGVyIHJlZmVyZW5jZSB0byAnZXZhbCcgaW4gdGhlIGV2YWx1YXRlIHN0cmluZyB3aWxsXG4gIC8vICAgZ2V0IHRoZSB0YW1lZCBldmFsdWF0b3IgZnJvbSB0aGUgYGdsb2JhbE9iamVjdGAsIGlmIGFueS5cblxuICAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvODE2XG4gIC8vIFRoZSBvcHRpbWl6ZXIgY3VycmVudGx5IHJ1bnMgdW5kZXIgc2xvcHB5IG1vZGUsIGFuZCBhbHRob3VnaCB3ZSBkb3VidCB0aGF0XG4gIC8vIHRoZXJlIGlzIGFueSB2dWxuZXJhYmlsaXR5IGludHJvZHVjZWQganVzdCBieSBydW5uaW5nIHRoZSBvcHRpbWl6ZXJcbiAgLy8gc2xvcHB5LCB3ZSBhcmUgbXVjaCBtb3JlIGNvbmZpZGVudCBpbiB0aGUgc2VtYW50aWNzIG9mIHN0cmljdCBtb2RlLlxuICAvLyBUaGUgYGV2YWx1YXRlYCBmdW5jdGlvbiBjYW4gYmUgYW5kIGlzIHJldXNlZCBhY3Jvc3MgbXVsdGlwbGUgZXZhbHVhdGlvbnMuXG4gIC8vIFNpbmNlIHRoZSBvcHRpbWl6ZXIgc2hvdWxkIG5vdCBiZSByZS1ldmFsdWF0ZWQgZXZlcnkgdGltZSwgaXQgY2Fubm90IGJlXG4gIC8vIGluc2lkZSB0aGUgYGV2YWx1YXRlYCBjbG9zdXJlLiBXaGlsZSB3ZSBjb3VsZCBwb3RlbnRpYWxseSBuZXN0IGFuXG4gIC8vIGludGVybWVkaWF0ZSBsYXllciBvZiBgKCkgPT4geyd1c2Ugc3RyaWN0JzsgJHtvcHRpbWl6ZXJzfTsgLi4uYCwgaXRcbiAgLy8gZG9lc24ndCBzZWVtIHdvcnRoIHRoZSBvdmVyaGVhZCBhbmQgY29tcGxleGl0eS5cbiAgY29uc3QgZXZhbHVhdGVGYWN0b3J5PSAgRkVSQUxfRlVOQ1RJT04oIGBcbiAgICB3aXRoICh0aGlzLnNjb3BlVGVybWluYXRvcikge1xuICAgICAgd2l0aCAodGhpcy5nbG9iYWxPYmplY3QpIHtcbiAgICAgICAgd2l0aCAodGhpcy5tb2R1bGVMZXhpY2Fscykge1xuICAgICAgICAgIHdpdGggKHRoaXMuZXZhbFNjb3BlKSB7XG4gICAgICAgICAgICAke2dsb2JhbE9iamVjdE9wdGltaXplciB9XG4gICAgICAgICAgICAke21vZHVsZUxleGljYWxPcHRpbWl6ZXIgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAndXNlIHN0cmljdCc7XG4gICAgICAgICAgICAgIHJldHVybiBldmFsKGFyZ3VtZW50c1swXSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgYCk7XG5cbiAgcmV0dXJuIGFwcGx5KGV2YWx1YXRlRmFjdG9yeSwgY29udGV4dCwgW10pO1xuIH07JGjigI1fb25jZS5tYWtlRXZhbHVhdGUobWFrZUV2YWx1YXRlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbOF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQcm94eSxTdHJpbmcsVHlwZUVycm9yLFJlZmVyZW5jZUVycm9yLGNyZWF0ZSxmcmVlemUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnbG9iYWxUaGlzLGltbXV0YWJsZU9iamVjdCxhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJQcm94eVwiLCBbJGjigI1fYSA9PiAoUHJveHkgPSAkaOKAjV9hKV1dLFtcIlN0cmluZ1wiLCBbJGjigI1fYSA9PiAoU3RyaW5nID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiUmVmZXJlbmNlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFJlZmVyZW5jZUVycm9yID0gJGjigI1fYSldXSxbXCJjcmVhdGVcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZSA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAkaOKAjV9hKV1dLFtcImdsb2JhbFRoaXNcIiwgWyRo4oCNX2EgPT4gKGdsb2JhbFRoaXMgPSAkaOKAjV9hKV1dLFtcImltbXV0YWJsZU9iamVjdFwiLCBbJGjigI1fYSA9PiAoaW1tdXRhYmxlT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBGYWlsLCBxdW90ZTogcX09ICAgYXNzZXJ0O1xuXG4vKipcbiAqIGFsd2F5c1Rocm93SGFuZGxlclxuICogVGhpcyBpcyBhbiBvYmplY3QgdGhhdCB0aHJvd3MgaWYgYW55IHByb3BlcnR5IGlzIGNhbGxlZC4gSXQncyB1c2VkIGFzXG4gKiBhIHByb3h5IGhhbmRsZXIgd2hpY2ggdGhyb3dzIG9uIGFueSB0cmFwIGNhbGxlZC5cbiAqIEl0J3MgbWFkZSBmcm9tIGEgcHJveHkgd2l0aCBhIGdldCB0cmFwIHRoYXQgdGhyb3dzLiBJdCdzIHNhZmUgdG9cbiAqIGNyZWF0ZSBvbmUgYW5kIHNoYXJlIGl0IGJldHdlZW4gYWxsIFByb3h5IGhhbmRsZXJzLlxuICovXG5jb25zdCAgICAgICAgYWx3YXlzVGhyb3dIYW5kbGVyPSAgbmV3IFByb3h5KFxuICBpbW11dGFibGVPYmplY3QsXG4gIGZyZWV6ZSh7XG4gICAgZ2V0KF9zaGFkb3csIHByb3ApIHtcbiAgICAgIEZhaWwgYFBsZWFzZSByZXBvcnQgdW5leHBlY3RlZCBzY29wZSBoYW5kbGVyIHRyYXA6ICR7cShTdHJpbmcocHJvcCkpfWA7XG4gICAgIH19KSk7XG5cblxuXG4vKlxuICogc2NvcGVQcm94eUhhbmRsZXJQcm9wZXJ0aWVzXG4gKiBzY29wZVRlcm1pbmF0b3JIYW5kbGVyIG1hbmFnZXMgYSBzdHJpY3RTY29wZVRlcm1pbmF0b3IgUHJveHkgd2hpY2ggc2VydmVzIGFzXG4gKiB0aGUgZmluYWwgc2NvcGUgYm91bmRhcnkgdGhhdCB3aWxsIGFsd2F5cyByZXR1cm4gXCJ1bmRlZmluZWRcIiBpbiBvcmRlclxuICogdG8gcHJldmVudCBhY2Nlc3MgdG8gXCJzdGFydCBjb21wYXJ0bWVudCBnbG9iYWxzXCIuXG4gKi8kaOKAjV9vbmNlLmFsd2F5c1Rocm93SGFuZGxlcihhbHdheXNUaHJvd0hhbmRsZXIpO1xuY29uc3Qgc2NvcGVQcm94eUhhbmRsZXJQcm9wZXJ0aWVzPSAge1xuICBnZXQoX3NoYWRvdywgX3Byb3ApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgfSxcblxuICBzZXQoX3NoYWRvdywgcHJvcCwgX3ZhbHVlKSB7XG4gICAgLy8gV2Ugc2hvdWxkIG9ubHkgaGl0IHRoaXMgaWYgdGhlIGhhcygpIGhvb2sgcmV0dXJuZWQgdHJ1ZSBtYXRjaGVzIHRoZSB2OFxuICAgIC8vIFJlZmVyZW5jZUVycm9yIG1lc3NhZ2UgXCJVbmNhdWdodCBSZWZlcmVuY2VFcnJvcjogeHl6IGlzIG5vdCBkZWZpbmVkXCJcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoIGAke1N0cmluZyhwcm9wKX0gaXMgbm90IGRlZmluZWRgKTtcbiAgIH0sXG5cbiAgaGFzKF9zaGFkb3csIHByb3ApIHtcbiAgICAvLyB3ZSBtdXN0IGF0IGxlYXN0IHJldHVybiB0cnVlIGZvciBhbGwgcHJvcGVydGllcyBvbiB0aGUgcmVhbG0gZ2xvYmFsVGhpc1xuICAgIHJldHVybiBwcm9wIGluIGdsb2JhbFRoaXM7XG4gICB9LFxuXG4gIC8vIG5vdGU6IHRoaXMgaXMgbGlrZWx5IGEgYnVnIG9mIHNhZmFyaVxuICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTk1NTM0XG4gIGdldFByb3RvdHlwZU9mKCkge1xuICAgIHJldHVybiBudWxsO1xuICAgfSxcblxuICAvLyBDaGlwIGhhcyBzZWVuIHRoaXMgaGFwcGVuIHNpbmdsZSBzdGVwcGluZyB1bmRlciB0aGUgQ2hyb21lL3Y4IGRlYnVnZ2VyLlxuICAvLyBUT0RPIHJlY29yZCBob3cgdG8gcmVsaWFibHkgcmVwcm9kdWNlLCBhbmQgdG8gdGVzdCBpZiB0aGlzIGZpeCBoZWxwcy5cbiAgLy8gVE9ETyByZXBvcnQgYXMgYnVnIHRvIHY4IG9yIENocm9tZSwgYW5kIHJlY29yZCBpc3N1ZSBsaW5rIGhlcmUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdGFyZ2V0LCBwcm9wKSB7XG4gICAgLy8gQ29lcmNlIHdpdGggYFN0cmluZ2AgaW4gY2FzZSBwcm9wIGlzIGEgc3ltYm9sLlxuICAgIGNvbnN0IHF1b3RlZFByb3A9ICBxKFN0cmluZyhwcm9wKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAgYGdldE93blByb3BlcnR5RGVzY3JpcHRvciB0cmFwIG9uIHNjb3BlVGVybWluYXRvckhhbmRsZXIgZm9yICR7cXVvdGVkUHJvcH1gLFxuICAgICAgbmV3IFR5cGVFcnJvcigpLnN0YWNrKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICB9fTtcblxuXG4vLyBUaGUgc2NvcGUgaGFuZGxlcidzIHByb3RvdHlwZSBpcyBhIHByb3h5IHRoYXQgdGhyb3dzIGlmIGFueSB0cmFwIG90aGVyXG4vLyB0aGFuIGdldC9zZXQvaGFzIGFyZSBydW4gKGxpa2UgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgYXBwbHksXG4vLyBnZXRQcm90b3R5cGVPZikuXG5jb25zdCAgICAgICAgc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcj0gIGZyZWV6ZShcbiAgY3JlYXRlKFxuICAgIGFsd2F5c1Rocm93SGFuZGxlcixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllcykpKTskaOKAjV9vbmNlLnN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIoc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcik7XG5cblxuXG5jb25zdCAgICAgICAgc3RyaWN0U2NvcGVUZXJtaW5hdG9yPSAgbmV3IFByb3h5KFxuICBpbW11dGFibGVPYmplY3QsXG4gIHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIpOyRo4oCNX29uY2Uuc3RyaWN0U2NvcGVUZXJtaW5hdG9yKHN0cmljdFNjb3BlVGVybWluYXRvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzldID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUHJveHksY3JlYXRlLGZyZWV6ZSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGltbXV0YWJsZU9iamVjdCxyZWZsZWN0U2V0LHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIsYWx3YXlzVGhyb3dIYW5kbGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiUHJveHlcIiwgWyRo4oCNX2EgPT4gKFByb3h5ID0gJGjigI1fYSldXSxbXCJjcmVhdGVcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZSA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAkaOKAjV9hKV1dLFtcImltbXV0YWJsZU9iamVjdFwiLCBbJGjigI1fYSA9PiAoaW1tdXRhYmxlT2JqZWN0ID0gJGjigI1fYSldXSxbXCJyZWZsZWN0U2V0XCIsIFskaOKAjV9hID0+IChyZWZsZWN0U2V0ID0gJGjigI1fYSldXV1dLFtcIi4vc3RyaWN0LXNjb3BlLXRlcm1pbmF0b3IuanNcIiwgW1tcInN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXJcIiwgWyRo4oCNX2EgPT4gKHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIgPSAkaOKAjV9hKV1dLFtcImFsd2F5c1Rocm93SGFuZGxlclwiLCBbJGjigI1fYSA9PiAoYWx3YXlzVGhyb3dIYW5kbGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuICogY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcigpXG4gKiBzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyIG1hbmFnZXMgYSBzY29wZVRlcm1pbmF0b3IgUHJveHkgd2hpY2ggc2VydmVzIGFzXG4gKiB0aGUgZmluYWwgc2NvcGUgYm91bmRhcnkgdGhhdCB3aWxsIGFsd2F5cyByZXR1cm4gXCJ1bmRlZmluZWRcIiBpbiBvcmRlclxuICogdG8gcHJldmVudCBhY2Nlc3MgdG8gXCJzdGFydCBjb21wYXJ0bWVudCBnbG9iYWxzXCIuIFdoZW4gXCJzbG9wcHlHbG9iYWxzTW9kZVwiXG4gKiBpcyB0cnVlLCB0aGUgUHJveHkgd2lsbCBwZXJmb3JtIHNldHMgb24gdGhlIFwiZ2xvYmFsT2JqZWN0XCIuXG4gKi9cbmNvbnN0ICAgICAgICBjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yPSAgKGdsb2JhbE9iamVjdCk9PntcbiAgY29uc3Qgc2NvcGVQcm94eUhhbmRsZXJQcm9wZXJ0aWVzPSAge1xuICAgIC8vIGluaGVyaXQgc2NvcGVUZXJtaW5hdG9yIGJlaGF2aW9yXG4gICAgLi4uc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcixcblxuICAgIC8vIFJlZGlyZWN0IHNldCBwcm9wZXJ0aWVzIHRvIHRoZSBnbG9iYWxPYmplY3QuXG4gICAgc2V0KF9zaGFkb3csIHByb3AsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVmbGVjdFNldChnbG9iYWxPYmplY3QsIHByb3AsIHZhbHVlKTtcbiAgICAgfSxcblxuICAgIC8vIEFsd2F5cyBjbGFpbSB0byBoYXZlIGEgcG90ZW50aWFsIHByb3BlcnR5IGluIG9yZGVyIHRvIGJlIHRoZSByZWNpcGllbnQgb2YgYSBzZXRcbiAgICBoYXMoX3NoYWRvdywgX3Byb3ApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgICB9fTtcblxuXG4gIC8vIFRoZSBzY29wZSBoYW5kbGVyJ3MgcHJvdG90eXBlIGlzIGEgcHJveHkgdGhhdCB0aHJvd3MgaWYgYW55IHRyYXAgb3RoZXJcbiAgLy8gdGhhbiBnZXQvc2V0L2hhcyBhcmUgcnVuIChsaWtlIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGFwcGx5LFxuICAvLyBnZXRQcm90b3R5cGVPZikuXG4gIGNvbnN0IHNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3JIYW5kbGVyPSAgZnJlZXplKFxuICAgIGNyZWF0ZShcbiAgICAgIGFsd2F5c1Rocm93SGFuZGxlcixcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc2NvcGVQcm94eUhhbmRsZXJQcm9wZXJ0aWVzKSkpO1xuXG5cblxuICBjb25zdCBzbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yPSAgbmV3IFByb3h5KFxuICAgIGltbXV0YWJsZU9iamVjdCxcbiAgICBzbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9ySGFuZGxlcik7XG5cblxuICByZXR1cm4gc2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcjtcbiB9OyRo4oCNX29uY2UuY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcihjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTBdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfUkVHX0VYUCxyZWdleHBFeGVjLHN0cmluZ1NsaWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfUkVHX0VYUFwiLCBbJGjigI1fYSA9PiAoRkVSQUxfUkVHX0VYUCA9ICRo4oCNX2EpXV0sW1wicmVnZXhwRXhlY1wiLCBbJGjigI1fYSA9PiAocmVnZXhwRXhlYyA9ICRo4oCNX2EpXV0sW1wic3RyaW5nU2xpY2VcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1NsaWNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8vIENhcHR1cmVzIGEga2V5IGFuZCB2YWx1ZSBvZiB0aGUgZm9ybSAja2V5PXZhbHVlIG9yIEBrZXk9dmFsdWVcbmNvbnN0IHNvdXJjZU1ldGFFbnRyeVJlZ0V4cD1cbiAgJ1xcXFxzKltAI11cXFxccyooW2EtekEtWl1bYS16QS1aMC05XSopXFxcXHMqPVxcXFxzKihbXlxcXFxzXFxcXCpdKiknO1xuLy8gQ2FwdHVyZXMgZWl0aGVyIGEgb25lLWxpbmUgb3IgbXVsdGktbGluZSBjb21tZW50IGNvbnRhaW5pbmdcbi8vIG9uZSAja2V5PXZhbHVlIG9yIEBrZXk9dmFsdWUuXG4vLyBQcm9kdWNlcyB0d28gcGFpcnMgb2YgY2FwdHVyZSBncm91cHMsIGJ1dCB0aGUgaW5pdGlhbCB0d28gbWF5IGJlIHVuZGVmaW5lZC5cbi8vIE9uIGFjY291bnQgb2YgdGhlIG1lY2hhbmljcyBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBzY2FubmluZyBmcm9tIHRoZSBlbmRcbi8vIGRvZXMgbm90IGFsbG93IHVzIHRvIGNhcHR1cmUgZXZlcnkgcGFpciwgc28gZ2V0U291cmNlVVJMIG11c3QgY2FwdHVyZSBhbmRcbi8vIHRyaW0gdW50aWwgdGhlcmUgYXJlIG5vIG1hdGNoaW5nIGNvbW1lbnRzLlxuY29uc3Qgc291cmNlTWV0YUVudHJpZXNSZWdFeHA9ICBuZXcgRkVSQUxfUkVHX0VYUChcbiAgIGAoPzpcXFxccyovLyR7c291cmNlTWV0YUVudHJ5UmVnRXhwfXwvXFxcXCoke3NvdXJjZU1ldGFFbnRyeVJlZ0V4cH1cXFxccypcXFxcKi8pXFxcXHMqJGApO1xuXG5cbmNvbnN0ICAgICAgICBnZXRTb3VyY2VVUkw9ICAoc3JjKT0+e1xuICBsZXQgc291cmNlVVJMPSAgJzx1bmtub3duPic7XG5cbiAgLy8gT3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBsYXN0IG9uZSBvciB0d28gY29tbWVudHMgd2l0aCBrZXkgdmFsdWVcbiAgLy8gcGFpcnMgYXQgdGhlIGVuZCBvZiB0aGUgc291cmNlLCBhdm9pZGluZyBhIHNjYW4gb3ZlciB0aGUgZW50aXJlIGxlbmd0aCBvZlxuICAvLyB0aGUgc3RyaW5nLCBidXQgYXQgdGhlIGV4cGVuc2Ugb2YgYmVpbmcgYWJsZSB0byBjYXB0dXJlIGFsbCB0aGUgKGtleSxcbiAgLy8gdmFsdWUpIHBhaXIgbWV0YSBjb21tZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UsIHdoaWNoIG1heSBpbmNsdWRlXG4gIC8vIHNvdXJjZU1hcFVSTCBpbiBhZGRpdGlvbiB0byBzb3VyY2VVUkwuXG4gIC8vIFNvLCB3ZSBzdWJsaW1hdGUgdGhlIGNvbW1lbnRzIG91dCBvZiB0aGUgc291cmNlIHVudGlsIG5vIHNvdXJjZSBvciBub1xuICAvLyBjb21tZW50cyByZW1haW4uXG4gIHdoaWxlKCBzcmMubGVuZ3RoPiAgMCkge1xuICAgIGNvbnN0IG1hdGNoPSAgcmVnZXhwRXhlYyhzb3VyY2VNZXRhRW50cmllc1JlZ0V4cCwgc3JjKTtcbiAgICBpZiggbWF0Y2g9PT0gIG51bGwpIHtcbiAgICAgIGJyZWFrO1xuICAgICB9XG4gICAgc3JjPSAgc3RyaW5nU2xpY2Uoc3JjLCAwLCBzcmMubGVuZ3RoLSAgbWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgIC8vIFdlIHNraXAgJDAgc2luY2UgaXQgY29udGFpbnMgdGhlIGVudGlyZSBtYXRjaC5cbiAgICAvLyBUaGUgbWF0Y2ggY29udGFpbnMgZm91ciBjYXB0dXJlIGdyb3VwcyxcbiAgICAvLyB0d28gKGtleSwgdmFsdWUpIHBhaXJzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAvLyBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIC8vIE9uIHRoZSBvZmYtY2hhbmNlIHNvbWVvbmUgcHV0IHR3byBzb3VyY2VVUkwgY29tbWVudHMgaW4gdGhlaXIgY29kZSB3aXRoXG4gICAgLy8gZGlmZmVyZW50IGNvbW1lbnRpbmcgY29udmVudGlvbnMsIHRoZSBsYXR0ZXIgaGFzIHByZWNlZGVuY2UuXG4gICAgaWYoIG1hdGNoWzNdPT09ICAnc291cmNlVVJMJykge1xuICAgICAgc291cmNlVVJMPSAgbWF0Y2hbNF07XG4gICAgIH1lbHNlIGlmKCBtYXRjaFsxXT09PSAgJ3NvdXJjZVVSTCcpIHtcbiAgICAgIHNvdXJjZVVSTD0gIG1hdGNoWzJdO1xuICAgICB9XG4gICB9XG5cbiAgcmV0dXJuIHNvdXJjZVVSTDtcbiB9OyRo4oCNX29uY2UuZ2V0U291cmNlVVJMKGdldFNvdXJjZVVSTCk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzExXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZFUkFMX1JFR19FWFAsU3ludGF4RXJyb3Isc3RyaW5nUmVwbGFjZSxzdHJpbmdTZWFyY2gsc3RyaW5nU2xpY2Usc3RyaW5nU3BsaXQsZ2V0U291cmNlVVJMOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiRkVSQUxfUkVHX0VYUFwiLCBbJGjigI1fYSA9PiAoRkVSQUxfUkVHX0VYUCA9ICRo4oCNX2EpXV0sW1wiU3ludGF4RXJyb3JcIiwgWyRo4oCNX2EgPT4gKFN5bnRheEVycm9yID0gJGjigI1fYSldXSxbXCJzdHJpbmdSZXBsYWNlXCIsIFskaOKAjV9hID0+IChzdHJpbmdSZXBsYWNlID0gJGjigI1fYSldXSxbXCJzdHJpbmdTZWFyY2hcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1NlYXJjaCA9ICRo4oCNX2EpXV0sW1wic3RyaW5nU2xpY2VcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ1NsaWNlID0gJGjigI1fYSldXSxbXCJzdHJpbmdTcGxpdFwiLCBbJGjigI1fYSA9PiAoc3RyaW5nU3BsaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9nZXQtc291cmNlLXVybC5qc1wiLCBbW1wiZ2V0U291cmNlVVJMXCIsIFskaOKAjV9hID0+IChnZXRTb3VyY2VVUkwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEZpbmQgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiB0aGUgZ2l2ZW4gcGF0dGVybiBhbmQgcmV0dXJuXG4gKiB0aGUgbG9jYXRpb24gYXMgdGhlIGFwcHJveGltYXRlIGxpbmUgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRMaW5lTnVtYmVyKHNyYywgcGF0dGVybikge1xuICBjb25zdCBpbmRleD0gIHN0cmluZ1NlYXJjaChzcmMsIHBhdHRlcm4pO1xuICBpZiggaW5kZXg8ICAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICAgfVxuXG4gIC8vIFRoZSBpbXBvcnRQYXR0ZXJuIGluY2lkZW50YWxseSBjYXB0dXJlcyBhbiBpbml0aWFsIFxcbiBpblxuICAvLyBhbiBhdHRlbXB0IHRvIHJlamVjdCBhIC4gcHJlZml4LCBzbyB3ZSBuZWVkIHRvIG9mZnNldFxuICAvLyB0aGUgbGluZSBudW1iZXIgaW4gdGhhdCBjYXNlLlxuICBjb25zdCBhZGp1c3RtZW50PSAgc3JjW2luZGV4XT09PSAgJ1xcbic/ICAxOiAgMDtcblxuICByZXR1cm4gc3RyaW5nU3BsaXQoc3RyaW5nU2xpY2Uoc3JjLCAwLCBpbmRleCksICdcXG4nKS5sZW5ndGgrICBhZGp1c3RtZW50O1xuIH1cblxuLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuY29uc3QgaHRtbENvbW1lbnRQYXR0ZXJuPSAgbmV3IEZFUkFMX1JFR19FWFAoIGAoPzokeyc8J30hLS18LS0keyc+J30pYCwnZycpO1xuXG4vKipcbiAqIENvbnNlcnZhdGl2ZWx5IHJlamVjdCB0aGUgc291cmNlIHRleHQgaWYgaXQgbWF5IGNvbnRhaW4gdGV4dCB0aGF0IHNvbWVcbiAqIEphdmFTY3JpcHQgcGFyc2VycyBtYXkgdHJlYXQgYXMgYW4gaHRtbC1saWtlIGNvbW1lbnQuIFRvIHJlamVjdCB3aXRob3V0XG4gKiBwYXJzaW5nLCBgcmVqZWN0SHRtbENvbW1lbnRzYCB3aWxsIGFsc28gcmVqZWN0IHNvbWUgb3RoZXIgdGV4dCBhcyB3ZWxsLlxuICpcbiAqIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvOS4wL2luZGV4Lmh0bWwjc2VjLWh0bWwtbGlrZS1jb21tZW50c1xuICogZXhwbGFpbnMgdGhhdCBKYXZhU2NyaXB0IHBhcnNlcnMgbWF5IG9yIG1heSBub3QgcmVjb2duaXplIGh0bWxcbiAqIGNvbW1lbnQgdG9rZW5zIFwiPFwiIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiIS0tXCIgYW5kIFwiLS1cIlxuICogaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCI+XCIgaW4gbm9uLW1vZHVsZSBzb3VyY2UgdGV4dCwgYW5kIHRyZWF0XG4gKiB0aGVtIGFzIGEga2luZCBvZiBsaW5lIGNvbW1lbnQuIFNpbmNlIG90aGVyd2lzZSBib3RoIG9mIHRoZXNlIGNhblxuICogYXBwZWFyIGluIG5vcm1hbCBKYXZhU2NyaXB0IHNvdXJjZSBjb2RlIGFzIGEgc2VxdWVuY2Ugb2Ygb3BlcmF0b3JzLFxuICogd2UgaGF2ZSB0aGUgdGVycmlmeWluZyBwb3NzaWJpbGl0eSBvZiB0aGUgc2FtZSBzb3VyY2UgY29kZSBwYXJzaW5nXG4gKiBvbmUgd2F5IG9uIG9uZSBjb3JyZWN0IEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24sIGFuZCBhbm90aGVyIHdheVxuICogb24gYW5vdGhlci5cbiAqXG4gKiBUaGlzIHNoaW0gdGFrZXMgdGhlIGNvbnNlcnZhdGl2ZSBzdHJhdGVneSBvZiBqdXN0IHJlamVjdGluZyBzb3VyY2VcbiAqIHRleHQgdGhhdCBjb250YWlucyB0aGVzZSBzdHJpbmdzIGFueXdoZXJlLiBOb3RlIHRoYXQgdGhpcyB2ZXJ5XG4gKiBzb3VyY2UgZmlsZSBpcyB3cml0dGVuIHN0cmFuZ2VseSB0byBhdm9pZCBtZW50aW9uaW5nIHRoZXNlXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncyBleHBsaWNpdGx5LlxuICpcbiAqIFdlIGRvIG5vdCB3cml0ZSB0aGUgcmVnZXhwIGluIGEgc3RyYWlnaHRmb3J3YXJkIHdheSwgc28gdGhhdCBhblxuICogYXBwYXJlbm50IGh0bWwgY29tbWVudCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhpcyBmaWxlLiBUaHVzLCB3ZSBhdm9pZFxuICogcmVqZWN0aW9uIGJ5IHRoZSBvdmVybHkgZWFnZXIgcmVqZWN0RGFuZ2Vyb3VzU291cmNlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgcmVqZWN0SHRtbENvbW1lbnRzPSAgKHNyYyk9PntcbiAgY29uc3QgbGluZU51bWJlcj0gIGdldExpbmVOdW1iZXIoc3JjLCBodG1sQ29tbWVudFBhdHRlcm4pO1xuICBpZiggbGluZU51bWJlcjwgIDApIHtcbiAgICByZXR1cm4gc3JjO1xuICAgfVxuICBjb25zdCBuYW1lPSAgZ2V0U291cmNlVVJMKHNyYyk7XG4gIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgYFBvc3NpYmxlIEhUTUwgY29tbWVudCByZWplY3RlZCBhdCAke25hbWV9OiR7bGluZU51bWJlcn0uIChTRVNfSFRNTF9DT01NRU5UX1JFSkVDVEVEKWApO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCB0cmFuc2Zvcm0gdG8gcGxhY2UgYWhlYWQgb2YgYHJlamVjdEh0bWxDb21tZW50c2AgdG8gZXZhZGUgKnRoYXQqXG4gKiByZWplY3Rpb24uIEhvd2V2ZXIsIGl0IG1heSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uXG4gKlxuICogVGhpcyBldmFzaW9uIHJlcGxhY2VzIGVhY2ggYWxsZWdlZCBodG1sIGNvbW1lbnQgd2l0aCB0aGUgc3BhY2Utc2VwYXJhdGVkXG4gKiBKYXZhU2NyaXB0IG9wZXJhdG9yIHNlcXVlbmNlIHRoYXQgaXQgbWF5IG1lYW4sIGFzc3VtaW5nIHRoYXQgaXQgYXBwZWFyc1xuICogb3V0c2lkZSBvZiBhIGNvbW1lbnQgb3IgbGl0ZXJhbCBzdHJpbmcsIGluIHNvdXJjZSBjb2RlIHdoZXJlIHRoZSBKU1xuICogcGFyc2VyIG1ha2VzIG5vIHNwZWNpYWwgY2FzZSBmb3IgaHRtbCBjb21tZW50cyAobGlrZSBtb2R1bGUgc291cmNlIGNvZGUpLlxuICogSW4gdGhhdCBjYXNlLCB0aGlzIGV2YXNpb24gcHJlc2VydmVzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLCB0aG91Z2ggaXRcbiAqIGRvZXMgY2hhbmdlIHRoZSBzb3VjZSBjb2x1bW4gbnVtYmVycyBvbiBlYWNoIGVmZmVjdGVkIGxpbmUuXG4gKlxuICogSWYgdGhlIGh0bWwgY29tbWVudCBhcHBlYXJlZCBpbiBhIGxpdGVyYWwgKGEgc3RyaW5nIGxpdGVyYWwsIHJlZ2V4cCBsaXRlcmFsLFxuICogb3IgYSB0ZW1wbGF0ZSBsaXRlcmFsKSwgdGhlbiB0aGlzIGV2YXNpb24gd2lsbCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlXG4gKiBwcm9ncmFtIGJ5IGNoYW5naW5nIHRoZSB0ZXh0IG9mIHRoYXQgbGl0ZXJhbC5cbiAqXG4gKiBJZiB0aGUgaHRtbCBjb21tZW50IGFwcGVhcmVkIGluIGEgSmF2YVNjcmlwdCBjb21tZW50LCB0aGVuIHRoaXMgZXZhc2lvbiBkb2VzXG4gKiBub3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIGJlY2F1c2UgaXQgb25seSBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZlxuICogdGhvc2UgY29tbWVudHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UucmVqZWN0SHRtbENvbW1lbnRzKHJlamVjdEh0bWxDb21tZW50cyk7XG5jb25zdCAgICAgICAgZXZhZGVIdG1sQ29tbWVudFRlc3Q9ICAoc3JjKT0+e1xuICBjb25zdCByZXBsYWNlRm49ICAobWF0Y2gpPT4gbWF0Y2hbMF09PT0gICc8Jz8gICc8ICEgLS0nOiAgJy0tID4nO1xuICByZXR1cm4gc3RyaW5nUmVwbGFjZShzcmMsIGh0bWxDb21tZW50UGF0dGVybiwgcmVwbGFjZUZuKTtcbiB9O1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuJGjigI1fb25jZS5ldmFkZUh0bWxDb21tZW50VGVzdChldmFkZUh0bWxDb21tZW50VGVzdCk7XG5jb25zdCBpbXBvcnRQYXR0ZXJuPSAgbmV3IEZFUkFMX1JFR19FWFAoXG4gICcoXnxbXi5dKVxcXFxiaW1wb3J0KFxcXFxzKig/OlxcXFwofC9bLypdKSknLFxuICAnZycpO1xuXG5cbi8qKlxuICogQ29uc2VydmF0aXZlbHkgcmVqZWN0IHRoZSBzb3VyY2UgdGV4dCBpZiBpdCBtYXkgY29udGFpbiBhIGR5bmFtaWNcbiAqIGltcG9ydCBleHByZXNzaW9uLiBUbyByZWplY3Qgd2l0aG91dCBwYXJzaW5nLCBgcmVqZWN0SW1wb3J0RXhwcmVzc2lvbnNgIHdpbGxcbiAqIGFsc28gcmVqZWN0IHNvbWUgb3RoZXIgdGV4dCBhcyB3ZWxsLlxuICpcbiAqIFRoZSBwcm9wb3NlZCBkeW5hbWljIGltcG9ydCBleHByZXNzaW9uIGlzIHRoZSBvbmx5IHN5bnRheCBjdXJyZW50bHlcbiAqIHByb3Bvc2VkLCB0aGF0IGNhbiBhcHBlYXIgaW4gbm9uLW1vZHVsZSBKYXZhU2NyaXB0IGNvZGUsIHRoYXRcbiAqIGVuYWJsZXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgb3V0c2lkZSB3b3JsZCB0aGF0IGNhbm5vdCBiZVxuICogc3VwcHJlc3NlZCBvciBpbnRlcmNlcHRlZCB3aXRob3V0IHBhcnNpbmcgYW5kIHJld3JpdGluZy4gSW5zdGVhZCxcbiAqIHRoaXMgc2hpbSBjb25zZXJ2YXRpdmVseSByZWplY3RzIGFueSBzb3VyY2UgdGV4dCB0aGF0IHNlZW1zIHRvXG4gKiBjb250YWluIHN1Y2ggYW4gZXhwcmVzc2lvbi4gVG8gZG8gdGhpcyBzYWZlbHkgd2l0aG91dCBwYXJzaW5nLCB3ZVxuICogbXVzdCBhbHNvIHJlamVjdCBzb21lIHZhbGlkIHByb2dyYW1zLCBpLmUuLCB0aG9zZSBjb250YWluaW5nXG4gKiBhcHBhcmVudCBpbXBvcnQgZXhwcmVzc2lvbnMgaW4gbGl0ZXJhbCBzdHJpbmdzIG9yIGNvbW1lbnRzLlxuICpcbiAqIFRoZSBjdXJyZW50IGNvbnNlcnZhdGl2ZSBydWxlIGxvb2tzIGZvciB0aGUgaWRlbnRpZmllciBcImltcG9ydFwiXG4gKiBmb2xsb3dlZCBieSBlaXRoZXIgYW4gb3BlbiBwYXJlbiBvciBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIHRoZVxuICogYmVnaW5uaW5nIG9mIGEgY29tbWVudC4gV2UgYXNzdW1lIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gd29ycnlcbiAqIGFib3V0IGh0bWwgY29tbWVudCBzeW50YXggYmVjYXVzZSB0aGF0IHdhcyBhbHJlYWR5IHJlamVjdGVkIGJ5XG4gKiByZWplY3RIdG1sQ29tbWVudHMuXG4gKlxuICogdGhpcyBcXHMgKm11c3QqIG1hdGNoIGFsbCBraW5kcyBvZiBzeW50YXgtZGVmaW5lZCB3aGl0ZXNwYWNlLiBJZiBlLmcuXG4gKiBVKzIwMjggKExJTkUgU0VQQVJBVE9SKSBvciBVKzIwMjkgKFBBUkFHUkFQSCBTRVBBUkFUT1IpIGlzIHRyZWF0ZWQgYXNcbiAqIHdoaXRlc3BhY2UgYnkgdGhlIHBhcnNlciwgYnV0IG5vdCBtYXRjaGVkIGJ5IC9cXHMvLCB0aGVuIHRoaXMgd291bGQgYWRtaXRcbiAqIGFuIGF0dGFjayBsaWtlOiBpbXBvcnRcXHUyMDI4KCdwb3dlci5qcycpIC4gV2UncmUgdHJ5aW5nIHRvIGRpc3Rpbmd1aXNoXG4gKiBzb21ldGhpbmcgbGlrZSB0aGF0IGZyb20gc29tZXRoaW5nIGxpa2UgaW1wb3J0bm90cmVhbGx5KCdwb3dlci5qcycpIHdoaWNoXG4gKiBpcyBwZXJmZWN0bHkgc2FmZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3JjXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgcmVqZWN0SW1wb3J0RXhwcmVzc2lvbnM9ICAoc3JjKT0+e1xuICBjb25zdCBsaW5lTnVtYmVyPSAgZ2V0TGluZU51bWJlcihzcmMsIGltcG9ydFBhdHRlcm4pO1xuICBpZiggbGluZU51bWJlcjwgIDApIHtcbiAgICByZXR1cm4gc3JjO1xuICAgfVxuICBjb25zdCBuYW1lPSAgZ2V0U291cmNlVVJMKHNyYyk7XG4gIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgYFBvc3NpYmxlIGltcG9ydCBleHByZXNzaW9uIHJlamVjdGVkIGF0ICR7bmFtZX06JHtsaW5lTnVtYmVyfS4gKFNFU19JTVBPUlRfUkVKRUNURUQpYCk7XG5cbiB9O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIHRyYW5zZm9ybSB0byBwbGFjZSBhaGVhZCBvZiBgcmVqZWN0SW1wb3J0RXhwcmVzc2lvbnNgIHRvIGV2YWRlXG4gKiAqdGhhdCogcmVqZWN0aW9uLiBIb3dldmVyLCBpdCBtYXkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuICpcbiAqIFRoaXMgZXZhc2lvbiByZXBsYWNlcyBlYWNoIHN1c3BpY2lvdXMgYGltcG9ydGAgaWRlbnRpZmllciB3aXRoIGBfX2ltcG9ydF9fYC5cbiAqIElmIHRoZSBhbGxlZ2VkIGltcG9ydCBleHByZXNzaW9uIGFwcGVhcnMgaW4gYSBKYXZhU2NyaXB0IGNvbW1lbnQsIHRoaXNcbiAqIGV2YXNpb24gd2lsbCBub3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLiBJZiBpdCBhcHBlYXJzIGluIGFcbiAqIGxpdGVyYWwgKHN0cmluZyBsaXRlcmFsLCByZWdleHAgbGl0ZXJhbCwgb3IgYSB0ZW1wbGF0ZSBsaXRlcmFsKSwgdGhlbiB0aGlzXG4gKiBldmFzaW9uIHdpbGwgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGF0IGxpdGVyYWwuIElmIGl0IGFwcGVhcnMgYXMgY29kZVxuICogd2hlcmUgaXQgd291bGQgYmUgcGFyc2VkIGFzIGFuIGV4cHJlc3Npb24sIHRoZW4gaXQgbWlnaHQgb3IgbWlnaHQgbm90IGNoYW5nZVxuICogdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0sIGRlcGVuZGluZyBvbiB0aGUgYmluZGluZywgaWYgYW55LCBvZiB0aGUgbGV4aWNhbFxuICogdmFyaWFibGUgYF9faW1wb3J0X19gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcmNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLnJlamVjdEltcG9ydEV4cHJlc3Npb25zKHJlamVjdEltcG9ydEV4cHJlc3Npb25zKTtcbmNvbnN0ICAgICAgICBldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0PSAgKHNyYyk9PntcbiAgY29uc3QgcmVwbGFjZUZuPSAgKF8sIHAxLCBwMik9PiAgIGAke3AxfV9faW1wb3J0X18ke3AyfWA7XG4gIHJldHVybiBzdHJpbmdSZXBsYWNlKHNyYywgaW1wb3J0UGF0dGVybiwgcmVwbGFjZUZuKTtcbiB9O1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuJGjigI1fb25jZS5ldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0KGV2YWRlSW1wb3J0RXhwcmVzc2lvblRlc3QpO1xuY29uc3Qgc29tZURpcmVjdEV2YWxQYXR0ZXJuPSAgbmV3IEZFUkFMX1JFR19FWFAoXG4gICcoXnxbXi5dKVxcXFxiZXZhbChcXFxccypcXFxcKCknLFxuICAnZycpO1xuXG5cbi8qKlxuICogSGV1cmlzdGljYWxseSByZWplY3Qgc29tZSB0ZXh0IHRoYXQgc2VlbXMgdG8gY29udGFpbiBhIGRpcmVjdCBldmFsXG4gKiBleHByZXNzaW9uLCB3aXRoIGJvdGggZmFsc2UgcG9zaXRpdmVzIGFuZCBmYWxzZSBuZWdhdml2ZXMuIFRvIHJlamVjdCB3aXRob3V0XG4gKiBwYXJzaW5nLCBgcmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9uc2AgbWF5IHdpbGwgYWxzbyByZWplY3Qgc29tZSBvdGhlclxuICogdGV4dCBhcyB3ZWxsLiBJdCBtYXkgYWxzbyBhY2NlcHQgc291cmNlIHRleHQgdGhhdCBjb250YWlucyBhIGRpcmVjdCBldmFsXG4gKiB3cml0dGVuIG9kZGx5LCBzdWNoIGFzIGAoZXZhbCkoc3JjKWAuIFRoaXMgZmFsc2UgbmVnYXRpdmUgaXMgbm90IGEgc2VjdXJpdHlcbiAqIHZ1bG5lcmFiaWxpdHkuIFJhdGhlciBpdCBpcyBhIGNvbXBhdCBoYXphcmQgYmVjYXVzZSBpdCB3aWxsIGV4ZWN1dGUgYXNcbiAqIGFuIGluZGlyZWN0IGV2YWwgdW5kZXIgdGhlIFNFUy1zaGltIGJ1dCBhcyBhIGRpcmVjdCBldmFsIG9uIHBsYXRmb3JtcyB0aGF0XG4gKiBzdXBwb3J0IFNFUyBkaXJlY3RseSAobGlrZSBYUykuXG4gKlxuICogVGhlIHNoaW0gY2Fubm90IGNvcnJlY3RseSBlbXVsYXRlIGEgZGlyZWN0IGV2YWwgYXMgZXhwbGFpbmVkIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL3JlYWxtcy1zaGltL2lzc3Vlcy8xMlxuICogSWYgd2UgZGlkIG5vdCByZWplY3QgZGlyZWN0IGV2YWwgc3ludGF4LCB3ZSB3b3VsZFxuICogYWNjaWRlbnRhbGx5IGV2YWx1YXRlIHRoZXNlIHdpdGggYW4gZW11bGF0aW9uIG9mIGluZGlyZWN0IGV2YWwuIFRvXG4gKiBwcmV2ZW50IGZ1dHVyZSBjb21wYXRpYmlsaXR5IHByb2JsZW1zLCBpbiBzaGlmdGluZyBmcm9tIHVzZSBvZiB0aGVcbiAqIHNoaW0gdG8gZ2VudWluZSBwbGF0Zm9ybSBzdXBwb3J0IGZvciB0aGUgcHJvcG9zYWwsIHdlIHNob3VsZFxuICogaW5zdGVhZCBzdGF0aWNhbGx5IHJlamVjdCBjb2RlIHRoYXQgc2VlbXMgdG8gY29udGFpbiBhIGRpcmVjdCBldmFsXG4gKiBleHByZXNzaW9uLlxuICpcbiAqIEFzIHdpdGggdGhlIGR5bmFtaWMgaW1wb3J0IGV4cHJlc3Npb24sIHRvIGF2b2lkIGEgZnVsbCBwYXJzZSwgd2UgZG9cbiAqIHRoaXMgYXBwcm94aW1hdGVseSB3aXRoIGEgcmVnZXhwLCB0aGF0IHdpbGwgYWxzbyByZWplY3Qgc3RyaW5nc1xuICogdGhhdCBhcHBlYXIgc2FmZWx5IGluIGNvbW1lbnRzIG9yIHN0cmluZ3MuIFVubGlrZSBkeW5hbWljIGltcG9ydCxcbiAqIGlmIHdlIG1pc3Mgc29tZSwgdGhpcyBvbmx5IGNyZWF0ZXMgZnV0dXJlIGNvbXBhdCBwcm9ibGVtcywgbm90XG4gKiBzZWN1cml0eSBwcm9ibGVtcy4gVGh1cywgd2UgYXJlIG9ubHkgdHJ5aW5nIHRvIGNhdGNoIGlubm9jZW50XG4gKiBvY2N1cnJlbmNlcywgbm90IG1hbGljaW91cyBvbmUuIEluIHBhcnRpY3VsYXIsIGAoZXZhbCkoLi4uKWAgaXNcbiAqIGRpcmVjdCBldmFsIHN5bnRheCB0aGF0IHdvdWxkIG5vdCBiZSBjYXVnaHQgYnkgdGhlIGZvbGxvd2luZyByZWdleHAuXG4gKlxuICogRXhwb3J0ZWQgZm9yIHVuaXQgdGVzdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNyY1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnM9ICAoc3JjKT0+e1xuICBjb25zdCBsaW5lTnVtYmVyPSAgZ2V0TGluZU51bWJlcihzcmMsIHNvbWVEaXJlY3RFdmFsUGF0dGVybik7XG4gIGlmKCBsaW5lTnVtYmVyPCAgMCkge1xuICAgIHJldHVybiBzcmM7XG4gICB9XG4gIGNvbnN0IG5hbWU9ICBnZXRTb3VyY2VVUkwoc3JjKTtcbiAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgICBgUG9zc2libGUgZGlyZWN0IGV2YWwgZXhwcmVzc2lvbiByZWplY3RlZCBhdCAke25hbWV9OiR7bGluZU51bWJlcn0uIChTRVNfRVZBTF9SRUpFQ1RFRClgKTtcblxuIH07XG5cbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8qKlxuICogQSB0cmFuc2Zvcm0gdGhhdCBidW5kbGVzIHRvZ2V0aGVyIHRoZSB0cmFuc2Zvcm1zIHRoYXQgbXVzdCB1bmNvbmRpdGlvbmFsbHlcbiAqIGhhcHBlbiBsYXN0IGluIG9yZGVyIHRvIGVuc3VyZSBzYWZlIGV2YWx1YXRpb24gd2l0aG91dCBwYXJzaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLnJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnMocmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9ucyk7XG5jb25zdCAgICAgICAgbWFuZGF0b3J5VHJhbnNmb3Jtcz0gIChzb3VyY2UpPT57XG4gIHNvdXJjZT0gIHJlamVjdEh0bWxDb21tZW50cyhzb3VyY2UpO1xuICBzb3VyY2U9ICByZWplY3RJbXBvcnRFeHByZXNzaW9ucyhzb3VyY2UpO1xuICByZXR1cm4gc291cmNlO1xuIH07XG5cbi8qKlxuICogU3RhcnRpbmcgd2l0aCBgc291cmNlYCwgYXBwbHkgZWFjaCB0cmFuc2Zvcm0gdG8gdGhlIHJlc3VsdCBvZiB0aGVcbiAqIHByZXZpb3VzIG9uZSwgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgdHJhbnNmb3JtYXRpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHsoKHN0cjogc3RyaW5nKSA9PiBzdHJpbmcpW119IHRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLm1hbmRhdG9yeVRyYW5zZm9ybXMobWFuZGF0b3J5VHJhbnNmb3Jtcyk7XG5jb25zdCAgICAgICAgYXBwbHlUcmFuc2Zvcm1zPSAgKHNvdXJjZSwgdHJhbnNmb3Jtcyk9PiAge1xuICBmb3IoIGNvbnN0IHRyYW5zZm9ybSBvZiB0cmFuc2Zvcm1zKSB7XG4gICAgc291cmNlPSAgdHJhbnNmb3JtKHNvdXJjZSk7XG4gICB9XG4gIHJldHVybiBzb3VyY2U7XG4gfTskaOKAjV9vbmNlLmFwcGx5VHJhbnNmb3JtcyhhcHBseVRyYW5zZm9ybXMpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1sxMl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhcHBseSxmcmVlemUsc3RyaWN0U2NvcGVUZXJtaW5hdG9yLGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3IsbWFrZUV2YWxTY29wZUtpdCxhcHBseVRyYW5zZm9ybXMsbWFuZGF0b3J5VHJhbnNmb3JtcyxtYWtlRXZhbHVhdGUsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiYXBwbHlcIiwgWyRo4oCNX2EgPT4gKGFwcGx5ID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0cmljdC1zY29wZS10ZXJtaW5hdG9yLmpzXCIsIFtbXCJzdHJpY3RTY29wZVRlcm1pbmF0b3JcIiwgWyRo4oCNX2EgPT4gKHN0cmljdFNjb3BlVGVybWluYXRvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3Nsb3BweS1nbG9iYWxzLXNjb3BlLXRlcm1pbmF0b3IuanNcIiwgW1tcImNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3JcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9ldmFsLXNjb3BlLmpzXCIsIFtbXCJtYWtlRXZhbFNjb3BlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRXZhbFNjb3BlS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNmb3Jtcy5qc1wiLCBbW1wiYXBwbHlUcmFuc2Zvcm1zXCIsIFskaOKAjV9hID0+IChhcHBseVRyYW5zZm9ybXMgPSAkaOKAjV9hKV1dLFtcIm1hbmRhdG9yeVRyYW5zZm9ybXNcIiwgWyRo4oCNX2EgPT4gKG1hbmRhdG9yeVRyYW5zZm9ybXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlLWV2YWx1YXRlLmpzXCIsIFtbXCJtYWtlRXZhbHVhdGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VFdmFsdWF0ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBGYWlsfT0gICBhc3NlcnQ7XG5cbi8qKlxuICogbWFrZVNhZmVFdmFsdWF0b3IoKVxuICogQnVpbGQgdGhlIGxvdy1sZXZlbCBvcGVyYXRpb24gdXNlZCBieSBhbGwgZXZhbHVhdG9yczpcbiAqIGV2YWwoKSwgRnVuY3Rpb24oKSwgQ29tcGFydG1lbnQucHJvdG90eXBlLmV2YWx1YXRlKCkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zLmdsb2JhbE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLm1vZHVsZUxleGljYWxzXVxuICogQHBhcmFtIHtBcnJheTxUcmFuc2Zvcm0+fSBbb3B0aW9ucy5nbG9iYWxUcmFuc2Zvcm1zXVxuICogQHBhcmFtIHtib29sfSBbb3B0aW9ucy5zbG9wcHlHbG9iYWxzTW9kZV1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTYWZlRXZhbHVhdG9yPSAgKHtcbiAgZ2xvYmFsT2JqZWN0LFxuICBtb2R1bGVMZXhpY2Fscz0gIHt9LFxuICBnbG9iYWxUcmFuc2Zvcm1zPSAgW10sXG4gIHNsb3BweUdsb2JhbHNNb2RlPSAgZmFsc2V9PVxuICAgIHt9KT0+ICB7XG4gIGNvbnN0IHNjb3BlVGVybWluYXRvcj0gIHNsb3BweUdsb2JhbHNNb2RlP1xuICAgICAgY3JlYXRlU2xvcHB5R2xvYmFsc1Njb3BlVGVybWluYXRvcihnbG9iYWxPYmplY3QpOlxuICAgICAgc3RyaWN0U2NvcGVUZXJtaW5hdG9yO1xuICBjb25zdCBldmFsU2NvcGVLaXQ9ICBtYWtlRXZhbFNjb3BlS2l0KCk7XG4gIGNvbnN0IHsgZXZhbFNjb3BlfT0gICBldmFsU2NvcGVLaXQ7XG5cbiAgY29uc3QgZXZhbHVhdGVDb250ZXh0PSAgZnJlZXplKHtcbiAgICBldmFsU2NvcGUsXG4gICAgbW9kdWxlTGV4aWNhbHMsXG4gICAgZ2xvYmFsT2JqZWN0LFxuICAgIHNjb3BlVGVybWluYXRvcn0pO1xuXG5cbiAgLy8gRGVmZXIgY3JlYXRpbmcgdGhlIGFjdHVhbCBldmFsdWF0b3IgdG8gZmlyc3QgdXNlLlxuICAvLyBDcmVhdGluZyBhIGNvbXBhcnRtZW50IHNob3VsZCBiZSBwb3NzaWJsZSBpbiBuby1ldmFsIGVudmlyb25tZW50c1xuICAvLyBJdCBhbHNvIGFsbG93cyBtb3JlIGdsb2JhbCBjb25zdGFudHMgdG8gYmUgY2FwdHVyZWQgYnkgdGhlIG9wdGltaXplclxuICBsZXQgZXZhbHVhdGU7XG4gIGNvbnN0IHByb3ZpZGVFdmFsdWF0ZT0gICgpPT4gIHtcbiAgICBpZiggIWV2YWx1YXRlKSB7XG4gICAgICBldmFsdWF0ZT0gIG1ha2VFdmFsdWF0ZShldmFsdWF0ZUNvbnRleHQpO1xuICAgICB9XG4gICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtBcnJheTxUcmFuc2Zvcm0+fSBbb3B0aW9ucy5sb2NhbFRyYW5zZm9ybXNdXG4gICAqL1xuICBjb25zdCBzYWZlRXZhbHVhdGU9ICAoc291cmNlLCB7IGxvY2FsVHJhbnNmb3Jtcz0gIFtdfT0gICB7fSk9PiAge1xuICAgIHByb3ZpZGVFdmFsdWF0ZSgpO1xuXG4gICAgLy8gRXhlY3V0ZSB0aGUgbWFuZGF0b3J5IHRyYW5zZm9ybXMgbGFzdCB0byBlbnN1cmUgdGhhdCBhbnkgcmV3cml0dGVuIGNvZGVcbiAgICAvLyBtZWV0cyB0aG9zZSBtYW5kYXRvcnkgcmVxdWlyZW1lbnRzLlxuICAgIHNvdXJjZT0gIGFwcGx5VHJhbnNmb3Jtcyhzb3VyY2UsIFtcbiAgICAgIC4uLmxvY2FsVHJhbnNmb3JtcyxcbiAgICAgIC4uLmdsb2JhbFRyYW5zZm9ybXMsXG4gICAgICBtYW5kYXRvcnlUcmFuc2Zvcm1zXSk7XG5cblxuICAgIGxldCBlcnI7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEFsbG93IG5leHQgcmVmZXJlbmNlIHRvIGV2YWwgcHJvZHVjZSB0aGUgdW5zYWZlIEZFUkFMX0VWQUwuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgZXZhbFNjb3BlS2l0LmFsbG93TmV4dEV2YWxUb0JlVW5zYWZlKCk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IFwidGhpc1wiIHJlc29sdmVzIHRvIHRoZSBzYWZlIGdsb2JhbC5cbiAgICAgIHJldHVybiBhcHBseShldmFsdWF0ZSwgZ2xvYmFsT2JqZWN0LCBbc291cmNlXSk7XG4gICAgIH1jYXRjaCggZSkge1xuICAgICAgLy8gc3Rhc2ggdGhlIGNoaWxkLWNvZGUgZXJyb3IgaW4gaG9wZXMgb2YgZGVidWdnaW5nIHRoZSBpbnRlcm5hbCBmYWlsdXJlXG4gICAgICBlcnI9ICBlO1xuICAgICAgdGhyb3cgZTtcbiAgICAgfWZpbmFsbHkge1xuICAgICAgY29uc3QgdW5zYWZlRXZhbFdhc1N0aWxsRXhwb3NlZD0oICdldmFsJ2luICBldmFsU2NvcGUpO1xuICAgICAgZGVsZXRlIGV2YWxTY29wZS5ldmFsO1xuICAgICAgaWYoIHVuc2FmZUV2YWxXYXNTdGlsbEV4cG9zZWQpIHtcbiAgICAgICAgLy8gQmFycmluZyBhIGRlZmVjdCBpbiB0aGUgU0VTIHNoaW0sIHRoZSBldmFsU2NvcGUgc2hvdWxkIGFsbG93IHRoZVxuICAgICAgICAvLyBwb3dlcmZ1bCwgdW5zYWZlICBgZXZhbGAgdG8gYmUgdXNlZCBieSBgZXZhbHVhdGVgIGV4YWN0bHkgb25jZSwgYXMgdGhlXG4gICAgICAgIC8vIHZlcnkgZmlyc3QgbmFtZSB0aGF0IGl0IGF0dGVtcHRzIHRvIGFjY2VzcyBmcm9tIHRoZSBsZXhpY2FsIHNjb3BlLlxuICAgICAgICAvLyBBIGRlZmVjdCBpbiB0aGUgU0VTIHNoaW0gY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGFmdGVyIHdlIHNldFxuICAgICAgICAvLyBgZXZhbFNjb3BlLmV2YWxgIGFuZCBiZWZvcmUgYGV2YWx1YXRlYCBjYWxscyBgZXZhbGAgaW50ZXJuYWxseS5cbiAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIFNFUyBpcyB2ZXJ5IGJyb2tlbi5cbiAgICAgICAgLy8gVGhpcyBjb25kaXRpb24gaXMgb25lIHdoZXJlIHRoaXMgdmF0IGlzIG5vdyBob3BlbGVzc2x5IGNvbmZ1c2VkLCBhbmRcbiAgICAgICAgLy8gdGhlIHZhdCBhcyBhIHdob2xlIHNob3VsZCBiZSBhYm9ydGVkLlxuICAgICAgICAvLyBObyBmdXJ0aGVyIGNvZGUgc2hvdWxkIHJ1bi5cbiAgICAgICAgLy8gQWxsIGltbWVkaWF0ZWx5IHJlYWNoYWJsZSBzdGF0ZSBzaG91bGQgYmUgYWJhbmRvbmVkLlxuICAgICAgICAvLyBIb3dldmVyLCB0aGF0IGlzIG5vdCB5ZXQgcG9zc2libGUsIHNvIHdlIGF0IGxlYXN0IHByZXZlbnQgZnVydGhlclxuICAgICAgICAvLyB2YXJpYWJsZSByZXNvbHV0aW9uIHZpYSB0aGUgc2NvcGVIYW5kbGVyLCBhbmQgdGhyb3cgYW4gZXJyb3Igd2l0aFxuICAgICAgICAvLyBkaWFnbm9zdGljIGluZm8gaW5jbHVkaW5nIHRoZSB0aHJvd24gZXJyb3IgaWYgYW55IGZyb20gZXZhbHVhdGluZyB0aGVcbiAgICAgICAgLy8gc291cmNlIGNvZGUuXG4gICAgICAgIGV2YWxTY29wZUtpdC5yZXZva2VkPSAgeyBlcnJ9O1xuICAgICAgICAvLyBUT0RPIEEgR09PRCBQTEFDRSBUTyBQQU5JQygpLCBpLmUuLCBraWxsIHRoZSB2YXQgaW5jYXJuYXRpb24uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2lzc3Vlcy80OTBcbiAgICAgICAgRmFpbCBgaGFuZGxlciBkaWQgbm90IHJlc2V0IGFsbG93TmV4dEV2YWxUb0JlVW5zYWZlICR7ZXJyfWA7XG4gICAgICAgfVxuICAgICB9XG4gICB9O1xuXG4gIHJldHVybiB7IHNhZmVFdmFsdWF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VTYWZlRXZhbHVhdG9yKG1ha2VTYWZlRXZhbHVhdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTNdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgVHlwZUVycm9yLGFycmF5UHVzaCxjcmVhdGUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxldmFkZUh0bWxDb21tZW50VGVzdCxldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0LHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnMsbWFrZVNhZmVFdmFsdWF0b3I7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImNyZWF0ZVwiLCBbJGjigI1fYSA9PiAoY3JlYXRlID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNmb3Jtcy5qc1wiLCBbW1wiZXZhZGVIdG1sQ29tbWVudFRlc3RcIiwgWyRo4oCNX2EgPT4gKGV2YWRlSHRtbENvbW1lbnRUZXN0ID0gJGjigI1fYSldXSxbXCJldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0XCIsIFskaOKAjV9hID0+IChldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0ID0gJGjigI1fYSldXSxbXCJyZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zXCIsIFskaOKAjV9hID0+IChyZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZS1zYWZlLWV2YWx1YXRvci5qc1wiLCBbW1wibWFrZVNhZmVFdmFsdWF0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VTYWZlRXZhbHVhdG9yID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBwcm92aWRlQ29tcGFydG1lbnRFdmFsdWF0b3I9ICAoY29tcGFydG1lbnRGaWVsZHMsIG9wdGlvbnMpPT4gIHtcbiAgY29uc3Qge1xuICAgIHNsb3BweUdsb2JhbHNNb2RlPSAgZmFsc2UsXG4gICAgX19tb2R1bGVTaGltTGV4aWNhbHNfXz0gIHVuZGVmaW5lZH09XG4gICAgICBvcHRpb25zO1xuXG4gIGxldCBzYWZlRXZhbHVhdGU7XG5cbiAgaWYoIF9fbW9kdWxlU2hpbUxleGljYWxzX189PT0gIHVuZGVmaW5lZCYmICAhc2xvcHB5R2xvYmFsc01vZGUpIHtcbiAgICAoeyBzYWZlRXZhbHVhdGV9PSAgIGNvbXBhcnRtZW50RmllbGRzKTtcbiAgIH1lbHNlIHtcbiAgICAvLyBUaGUgc2NvcGUgcHJveHkgb3IgZ2xvYmFsIGxleGljYWxzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGVcbiAgICAvLyBzaGFyZWQgZXZhbHVhdG9yIHNvIHdlIG5lZWQgdG8gYnVpbGQgYSBuZXcgb25lXG5cbiAgICBsZXQgeyBnbG9iYWxUcmFuc2Zvcm1zfT0gICBjb21wYXJ0bWVudEZpZWxkcztcbiAgICBjb25zdCB7IGdsb2JhbE9iamVjdH09ICAgY29tcGFydG1lbnRGaWVsZHM7XG5cbiAgICBsZXQgbW9kdWxlTGV4aWNhbHM7XG4gICAgaWYoIF9fbW9kdWxlU2hpbUxleGljYWxzX18hPT0gIHVuZGVmaW5lZCkge1xuICAgICAgLy8gV2hlbiB1c2luZyBgZXZhbHVhdGVgIGZvciBFU00gbW9kdWxlcywgYXMgc2hvdWxkIG9ubHkgb2NjdXIgZnJvbSB0aGVcbiAgICAgIC8vIG1vZHVsZS1zaGltJ3MgbW9kdWxlLWluc3RhbmNlLmpzLCB3ZSBkbyBub3QgcmV2ZWFsIHRoZSBTRVMtc2hpbSdzXG4gICAgICAvLyBtb2R1bGUtdG8tcHJvZ3JhbSB0cmFuc2xhdGlvbiwgYXMgdGhpcyBpcyBub3Qgc3RhbmRhcmRpemFibGUgYmVoYXZpb3IuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgYGxvY2FsVHJhbnNmb3Jtc2Agd2lsbCBjb21lIGZyb20gdGhlIGBfX3NoaW1UcmFuc2Zvcm1zX19gXG4gICAgICAvLyBDb21wYXJ0bWVudCBvcHRpb24gaW4gdGhpcyBjYXNlLCB3aGljaCBpcyBhIG5vbi1zdGFuZGFyZGl6YWJsZSBlc2NhcGVcbiAgICAgIC8vIGhhdGNoIHNvIHByb2dyYW1zIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgdGhlIFNFUy1zaGltXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiBtYXkgb3B0LWluIHRvIHVzZSB0aGUgc2FtZSB0cmFuc2Zvcm1zIGZvciBgZXZhbHVhdGVgXG4gICAgICAvLyBhbmQgYGltcG9ydGAsIGF0IHRoZSBleHBlbnNlIG9mIGJlaW5nIHRpZ2h0bHkgY291cGxlZCB0byBTRVMtc2hpbS5cbiAgICAgIGdsb2JhbFRyYW5zZm9ybXM9ICB1bmRlZmluZWQ7XG5cbiAgICAgIG1vZHVsZUxleGljYWxzPSAgY3JlYXRlKFxuICAgICAgICBudWxsLFxuICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKF9fbW9kdWxlU2hpbUxleGljYWxzX18pKTtcblxuICAgICB9XG5cbiAgICAoeyBzYWZlRXZhbHVhdGV9PSAgIG1ha2VTYWZlRXZhbHVhdG9yKHtcbiAgICAgIGdsb2JhbE9iamVjdCxcbiAgICAgIG1vZHVsZUxleGljYWxzLFxuICAgICAgZ2xvYmFsVHJhbnNmb3JtcyxcbiAgICAgIHNsb3BweUdsb2JhbHNNb2RlfSkpO1xuXG4gICB9XG5cbiAgcmV0dXJuIHsgc2FmZUV2YWx1YXRlfTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUNvbXBhcnRtZW50RXZhbHVhdG9yKHByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvcik7XG5cbmNvbnN0ICAgICAgICBjb21wYXJ0bWVudEV2YWx1YXRlPSAgKGNvbXBhcnRtZW50RmllbGRzLCBzb3VyY2UsIG9wdGlvbnMpPT4gIHtcbiAgLy8gUGVyZm9ybSB0aGlzIGNoZWNrIGZpcnN0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IHNhbml0aXppbmcuXG4gIC8vIFRPRE8gTWF5YmUgcmVsYXggc3RyaW5nIGNoZWNrIGFuZCBjb2VyY2UgaW5zdGVhZDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZHluYW1pYy1jb2RlLWJyYW5kLWNoZWNrc1xuICBpZiggdHlwZW9mIHNvdXJjZSE9PSAgJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBvZiBldmFsdWF0ZSgpIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgIH1cblxuICAvLyBFeHRyYWN0IG9wdGlvbnMsIGFuZCBzaGFsbG93LWNsb25lIHRyYW5zZm9ybXMuXG4gIGNvbnN0IHtcbiAgICB0cmFuc2Zvcm1zPSAgW10sXG4gICAgX19ldmFkZUh0bWxDb21tZW50VGVzdF9fPSAgZmFsc2UsXG4gICAgX19ldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0X189ICBmYWxzZSxcbiAgICBfX3JlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnNfXz0gIHRydWUgIC8vIE5vdGUgZGVmYXVsdCBvblxufT0gICAgb3B0aW9ucztcbiAgY29uc3QgbG9jYWxUcmFuc2Zvcm1zPSAgWy4uLnRyYW5zZm9ybXNdO1xuICBpZiggX19ldmFkZUh0bWxDb21tZW50VGVzdF9fPT09ICB0cnVlKSB7XG4gICAgYXJyYXlQdXNoKGxvY2FsVHJhbnNmb3JtcywgZXZhZGVIdG1sQ29tbWVudFRlc3QpO1xuICAgfVxuICBpZiggX19ldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0X189PT0gIHRydWUpIHtcbiAgICBhcnJheVB1c2gobG9jYWxUcmFuc2Zvcm1zLCBldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0KTtcbiAgIH1cbiAgaWYoIF9fcmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9uc19fPT09ICB0cnVlKSB7XG4gICAgYXJyYXlQdXNoKGxvY2FsVHJhbnNmb3JtcywgcmVqZWN0U29tZURpcmVjdEV2YWxFeHByZXNzaW9ucyk7XG4gICB9XG5cbiAgY29uc3QgeyBzYWZlRXZhbHVhdGV9PSAgIHByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvcihcbiAgICBjb21wYXJ0bWVudEZpZWxkcyxcbiAgICBvcHRpb25zKTtcblxuXG4gIHJldHVybiBzYWZlRXZhbHVhdGUoc291cmNlLCB7XG4gICAgbG9jYWxUcmFuc2Zvcm1zfSk7XG5cbiB9OyRo4oCNX29uY2UuY29tcGFydG1lbnRFdmFsdWF0ZShjb21wYXJ0bWVudEV2YWx1YXRlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTRdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIG1ha2VFdmFsRnVuY3Rpb24oKVxuICogQSBzYWZlIHZlcnNpb24gb2YgdGhlIG5hdGl2ZSBldmFsIGZ1bmN0aW9uIHdoaWNoIHJlbGllcyBvblxuICogdGhlIHNhZmV0eSBvZiBzYWZlRXZhbHVhdGUgZm9yIGNvbmZpbmVtZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNhZmVFdmFsdWF0ZVxuICovXG5jb25zdCAgICAgICAgbWFrZUV2YWxGdW5jdGlvbj0gIChzYWZlRXZhbHVhdGUpPT57XG4gIC8vIFdlIHVzZSB0aGUgdGhlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCB0byBjcmVhdGUgYW4gZXZhbCB3aXRob3V0IGFcbiAgLy8gW1tDb25zdHJ1Y3RdXSBiZWhhdmlvciAoc3VjaCB0aGF0IHRoZSBpbnZvY2F0aW9uIFwibmV3IGV2YWwoKVwiIHRocm93c1xuICAvLyBUeXBlRXJyb3I6IGV2YWwgaXMgbm90IGEgY29uc3RydWN0b3JcIiksIGJ1dCB3aGljaCBzdGlsbCBhY2NlcHRzIGFcbiAgLy8gJ3RoaXMnIGJpbmRpbmcuXG4gIGNvbnN0IG5ld0V2YWw9ICB7XG4gICAgZXZhbChzb3VyY2UpIHtcbiAgICAgIGlmKCB0eXBlb2Ygc291cmNlIT09ICAnc3RyaW5nJykge1xuICAgICAgICAvLyBBcyBwZXIgdGhlIHJ1bnRpbWUgc2VtYW50aWMgb2YgUGVyZm9ybUV2YWwgW0VDTUFTY3JpcHQgMTguMi4xLjFdOlxuICAgICAgICAvLyBJZiBUeXBlKHNvdXJjZSkgaXMgbm90IFN0cmluZywgcmV0dXJuIHNvdXJjZS5cbiAgICAgICAgLy8gVE9ETyBSZWNlbnQgcHJvcG9zYWxzIGZyb20gTWlrZSBTYW11ZWwgbWF5IGNoYW5nZSB0aGlzIG5vbi1zdHJpbmdcbiAgICAgICAgLy8gcnVsZS4gVHJhY2suXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgfVxuICAgICAgcmV0dXJuIHNhZmVFdmFsdWF0ZShzb3VyY2UpO1xuICAgICB9fS5cbiAgICBldmFsO1xuXG4gIHJldHVybiBuZXdFdmFsO1xuIH07JGjigI1fb25jZS5tYWtlRXZhbEZ1bmN0aW9uKG1ha2VFdmFsRnVuY3Rpb24pO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1sxNV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9GVU5DVElPTixhcnJheUpvaW4sYXJyYXlQb3AsZGVmaW5lUHJvcGVydGllcyxnZXRQcm90b3R5cGVPZixhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9GVU5DVElPTlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRlVOQ1RJT04gPSAkaOKAjV9hKV1dLFtcImFycmF5Sm9pblwiLCBbJGjigI1fYSA9PiAoYXJyYXlKb2luID0gJGjigI1fYSldXSxbXCJhcnJheVBvcFwiLCBbJGjigI1fYSA9PiAoYXJyYXlQb3AgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcImdldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChnZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCB7IEZhaWx9PSAgIGFzc2VydDtcblxuLypcbiAqIG1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yKClcbiAqIEEgc2FmZSB2ZXJzaW9uIG9mIHRoZSBuYXRpdmUgRnVuY3Rpb24gd2hpY2ggcmVsaWVzIG9uXG4gKiB0aGUgc2FmZXR5IG9mIHNhZmVFdmFsdWF0ZSBmb3IgY29uZmluZW1lbnQuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRnVuY3Rpb25Db25zdHJ1Y3Rvcj0gIChzYWZlRXZhbHVhdGUpPT57XG4gIC8vIERlZmluZSBhbiB1bnVzZWQgcGFyYW1ldGVyIHRvIGVuc3VyZSBGdW5jdGlvbi5sZW5ndGggPT09IDFcbiAgY29uc3QgbmV3RnVuY3Rpb249ICBmdW5jdGlvbiBGdW5jdGlvbihfYm9keSkge1xuICAgIC8vIFNhbml0aXplIGFsbCBwYXJhbWV0ZXJzIGF0IHRoZSBlbnRyeSBwb2ludC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgY29uc3QgYm9keVRleHQ9ICAgYCR7YXJyYXlQb3AoYXJndW1lbnRzKXx8ICcnIH1gO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICBjb25zdCBwYXJhbWV0ZXJzPSAgIGAke2FycmF5Sm9pbihhcmd1bWVudHMsJywnKSB9YDtcblxuICAgIC8vIEFyZSBwYXJhbWV0ZXJzIGFuZCBib2R5VGV4dCB2YWxpZCBjb2RlLCBvciBpcyBzb21lb25lXG4gICAgLy8gYXR0ZW1wdGluZyBhbiBpbmplY3Rpb24gYXR0YWNrPyBUaGlzIHdpbGwgdGhyb3cgYSBTeW50YXhFcnJvciBpZjpcbiAgICAvLyAtIHBhcmFtZXRlcnMgZG9lc24ndCBwYXJzZSBhcyBwYXJhbWV0ZXJzXG4gICAgLy8gLSBib2R5VGV4dCBkb2Vzbid0IHBhcnNlIGFzIGEgZnVuY3Rpb24gYm9keVxuICAgIC8vIC0gZWl0aGVyIGNvbnRhaW4gYSBjYWxsIHRvIHN1cGVyKCkgb3IgcmVmZXJlbmNlcyBhIHN1cGVyIHByb3BlcnR5LlxuICAgIC8vXG4gICAgLy8gSXQgc2VlbXMgdGhhdCBYUyBtYXkgc3RpbGwgYmUgdnVsbmVyYWJsZSB0byB0aGUgYXR0YWNrIGV4cGxhaW5lZCBhdFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L2VjbWEyNjIvcHVsbC8yMzc0I2lzc3VlY29tbWVudC04MTM3Njk3MTBcbiAgICAvLyB3aGVyZSBgbmV3IEZ1bmN0aW9uKCcvKicsICcqLyApIHsnKWAgd291bGQgaW5jb3JyZWN0bHkgdmFsaWRhdGUuXG4gICAgLy8gQmVmb3JlIHdlIHdvcnJpZWQgYWJvdXQgdGhpcywgd2UgY2hlY2sgdGhlIHBhcmFtZXRlcnMgYW5kIGJvZHlUZXh0XG4gICAgLy8gdG9nZXRoZXIgaW4gb25lIGNhbGxcbiAgICAvLyBgYGBqc1xuICAgIC8vIG5ldyBGRVJBTF9GVU5DVElPTihwYXJhbWV0ZXJzLCBib2R5VGVzdCk7XG4gICAgLy8gYGBgXG4gICAgLy8gSG93ZXZlciwgdGhpcyBjaGVjayBpcyB2dWxuZXJhYmxlIHRvIHRoYXQgYnVnLiBBc2lkZSBmcm9tIHRoYXQgY2FzZSxcbiAgICAvLyBhbGwgZW5naW5lcyBkbyBzZWVtIHRvIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzLCB0YWtlbiBieSB0aGVtc2VsdmVzLFxuICAgIC8vIGNvcnJlY3RseS4gQW5kIGFsbCBlbmdpbmVzIGRvIHNlZW0gdG8gdmFsaWRhdGUgdGhlIGJvZHlUZXh0LCB0YWtlblxuICAgIC8vIGJ5IGl0c2VsZiBjb3JyZWN0bHkuIFNvIHdpdGggdGhlIGZvbGxvd2luZyB0d28gY2hlY2tzLCBTRVMgYnVpbGRzIGFcbiAgICAvLyBjb3JyZWN0IHNhZmUgYEZ1bmN0aW9uYCBjb25zdHJ1Y3RvciBieSBjb21wb3NpbmcgdHdvIGNhbGxzIHRvIGFuXG4gICAgLy8gb3JpZ2luYWwgdW5zYWZlIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgdGhhdCBtYXkgc3VmZmVyIGZyb20gdGhpcyBidWdcbiAgICAvLyBidXQgaXMgb3RoZXJ3aXNlIGNvcnJlY3RseSB2YWxpZGF0aW5nLlxuICAgIC8vXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgIG5ldyBGRVJBTF9GVU5DVElPTihwYXJhbWV0ZXJzLCAnJyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ld1xuICAgIG5ldyBGRVJBTF9GVU5DVElPTihib2R5VGV4dCk7XG5cbiAgICAvLyBTYWZlIHRvIGJlIGNvbWJpbmVkLiBEZWZlYXQgcG90ZW50aWFsIHRyYWlsaW5nIGNvbW1lbnRzLlxuICAgIC8vIFRPRE86IHNpbmNlIHdlIGNyZWF0ZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24sIHRoZSAndGhpcycgdmFsdWVcbiAgICAvLyBpc24ndCBib3VuZCB0byB0aGUgZ2xvYmFsIG9iamVjdCBhcyBwZXIgc3BlY3MsIGJ1dCBzZXQgYXMgdW5kZWZpbmVkLlxuICAgIGNvbnN0IHNyYz0gICBgKGZ1bmN0aW9uIGFub255bW91cygke3BhcmFtZXRlcnN9XFxuKSB7XFxuJHtib2R5VGV4dH1cXG59KWA7XG4gICAgcmV0dXJuIHNhZmVFdmFsdWF0ZShzcmMpO1xuICAgfTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKG5ld0Z1bmN0aW9uLCB7XG4gICAgLy8gRW5zdXJlIHRoYXQgYW55IGZ1bmN0aW9uIGNyZWF0ZWQgaW4gYW55IGV2YWx1YXRvciBpbiBhIHJlYWxtIGlzIGFuXG4gICAgLy8gaW5zdGFuY2Ugb2YgRnVuY3Rpb24gaW4gYW55IGV2YWx1YXRvciBvZiB0aGUgc2FtZSByZWFsbS5cbiAgICBwcm90b3R5cGU6IHtcbiAgICAgIHZhbHVlOiBGRVJBTF9GVU5DVElPTi5wcm90b3R5cGUsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9fSk7XG5cblxuXG4gIC8vIEFzc2VydCBpZGVudGl0eSBvZiBGdW5jdGlvbi5fX3Byb3RvX18gYWNjcm9zcyBhbGwgY29tcGFydG1lbnRzXG4gIGdldFByb3RvdHlwZU9mKEZFUkFMX0ZVTkNUSU9OKT09PSAgRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlfHxcbiAgICBGYWlsIGBGdW5jdGlvbiBwcm90b3R5cGUgaXMgdGhlIHNhbWUgYWNjcm9zcyBjb21wYXJ0bWVudHNgO1xuICBnZXRQcm90b3R5cGVPZihuZXdGdW5jdGlvbik9PT0gIEZFUkFMX0ZVTkNUSU9OLnByb3RvdHlwZXx8XG4gICAgRmFpbCBgRnVuY3Rpb24gY29uc3RydWN0b3IgcHJvdG90eXBlIGlzIHRoZSBzYW1lIGFjY3Jvc3MgY29tcGFydG1lbnRzYDtcblxuICByZXR1cm4gbmV3RnVuY3Rpb247XG4gfTskaOKAjV9vbmNlLm1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yKG1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTZdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgKi9cbi8qKlxuICogQGZpbGUgRXhwb3J0cyB7QGNvZGUgd2hpdGVsaXN0fSwgYSByZWN1cnNpdmVseSBkZWZpbmVkXG4gKiBKU09OIHJlY29yZCBlbnVtZXJhdGluZyBhbGwgaW50cmluc2ljcyBhbmQgdGhlaXIgcHJvcGVydGllc1xuICogYWNjb3JkaW5nIHRvIEVDTUEgc3BlY3MuXG4gKlxuICogQGF1dGhvciBKRiBQYXJhZGlzXG4gKiBAYXV0aG9yIE1hcmsgUy4gTWlsbGVyXG4gKi9cblxuLyogZXNsaW50IG1heC1saW5lczogMCAqL1xuXG4vKipcbiAqIGNvbnN0YW50UHJvcGVydGllc1xuICogbm9uLWNvbmZpZ3VyYWJsZSwgbm9uLXdyaXRhYmxlIGRhdGEgcHJvcGVydGllcyBvZiBhbGwgZ2xvYmFsIG9iamVjdHMuXG4gKiBNdXN0IGJlIHBvd2VybGVzcy5cbiAqIE1hcHMgZnJvbSBwcm9wZXJ0eSBuYW1lIHRvIHRoZSBhY3R1YWwgdmFsdWVcbiAqL1xuY29uc3QgICAgICAgIGNvbnN0YW50UHJvcGVydGllcz0gIHtcbiAgLy8gKioqIFZhbHVlIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBJbmZpbml0eSxcbiAgTmFOLFxuICB1bmRlZmluZWR9O1xuXG5cbi8qKlxuICogdW5pdmVyc2FsUHJvcGVydHlOYW1lc1xuICogUHJvcGVydGllcyBvZiBhbGwgZ2xvYmFsIG9iamVjdHMuXG4gKiBNdXN0IGJlIHBvd2VybGVzcy5cbiAqIE1hcHMgZnJvbSBwcm9wZXJ0eSBuYW1lIHRvIHRoZSBpbnRyaW5zaWMgbmFtZSBpbiB0aGUgd2hpdGVsaXN0LlxuICovJGjigI1fb25jZS5jb25zdGFudFByb3BlcnRpZXMoY29uc3RhbnRQcm9wZXJ0aWVzKTtcbmNvbnN0ICAgICAgICB1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzPSAge1xuICAvLyAqKiogRnVuY3Rpb24gUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIGlzRmluaXRlOiAnaXNGaW5pdGUnLFxuICBpc05hTjogJ2lzTmFOJyxcbiAgcGFyc2VGbG9hdDogJ3BhcnNlRmxvYXQnLFxuICBwYXJzZUludDogJ3BhcnNlSW50JyxcblxuICBkZWNvZGVVUkk6ICdkZWNvZGVVUkknLFxuICBkZWNvZGVVUklDb21wb25lbnQ6ICdkZWNvZGVVUklDb21wb25lbnQnLFxuICBlbmNvZGVVUkk6ICdlbmNvZGVVUkknLFxuICBlbmNvZGVVUklDb21wb25lbnQ6ICdlbmNvZGVVUklDb21wb25lbnQnLFxuXG4gIC8vICoqKiBDb25zdHJ1Y3RvciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgQXJyYXk6ICdBcnJheScsXG4gIEFycmF5QnVmZmVyOiAnQXJyYXlCdWZmZXInLFxuICBCaWdJbnQ6ICdCaWdJbnQnLFxuICBCaWdJbnQ2NEFycmF5OiAnQmlnSW50NjRBcnJheScsXG4gIEJpZ1VpbnQ2NEFycmF5OiAnQmlnVWludDY0QXJyYXknLFxuICBCb29sZWFuOiAnQm9vbGVhbicsXG4gIERhdGFWaWV3OiAnRGF0YVZpZXcnLFxuICBFdmFsRXJyb3I6ICdFdmFsRXJyb3InLFxuICBGbG9hdDMyQXJyYXk6ICdGbG9hdDMyQXJyYXknLFxuICBGbG9hdDY0QXJyYXk6ICdGbG9hdDY0QXJyYXknLFxuICBJbnQ4QXJyYXk6ICdJbnQ4QXJyYXknLFxuICBJbnQxNkFycmF5OiAnSW50MTZBcnJheScsXG4gIEludDMyQXJyYXk6ICdJbnQzMkFycmF5JyxcbiAgTWFwOiAnTWFwJyxcbiAgTnVtYmVyOiAnTnVtYmVyJyxcbiAgT2JqZWN0OiAnT2JqZWN0JyxcbiAgUHJvbWlzZTogJ1Byb21pc2UnLFxuICBQcm94eTogJ1Byb3h5JyxcbiAgUmFuZ2VFcnJvcjogJ1JhbmdlRXJyb3InLFxuICBSZWZlcmVuY2VFcnJvcjogJ1JlZmVyZW5jZUVycm9yJyxcbiAgU2V0OiAnU2V0JyxcbiAgU3RyaW5nOiAnU3RyaW5nJyxcbiAgU3ltYm9sOiAnU3ltYm9sJyxcbiAgU3ludGF4RXJyb3I6ICdTeW50YXhFcnJvcicsXG4gIFR5cGVFcnJvcjogJ1R5cGVFcnJvcicsXG4gIFVpbnQ4QXJyYXk6ICdVaW50OEFycmF5JyxcbiAgVWludDhDbGFtcGVkQXJyYXk6ICdVaW50OENsYW1wZWRBcnJheScsXG4gIFVpbnQxNkFycmF5OiAnVWludDE2QXJyYXknLFxuICBVaW50MzJBcnJheTogJ1VpbnQzMkFycmF5JyxcbiAgVVJJRXJyb3I6ICdVUklFcnJvcicsXG4gIFdlYWtNYXA6ICdXZWFrTWFwJyxcbiAgV2Vha1NldDogJ1dlYWtTZXQnLFxuXG4gIC8vICoqKiBPdGhlciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgSlNPTjogJ0pTT04nLFxuICBSZWZsZWN0OiAnUmVmbGVjdCcsXG5cbiAgLy8gKioqIEFubmV4IEJcblxuICBlc2NhcGU6ICdlc2NhcGUnLFxuICB1bmVzY2FwZTogJ3VuZXNjYXBlJyxcblxuICAvLyBFU05leHRcblxuICBsb2NrZG93bjogJ2xvY2tkb3duJyxcbiAgaGFyZGVuOiAnaGFyZGVuJyxcbiAgSGFuZGxlZFByb21pc2U6ICdIYW5kbGVkUHJvbWlzZScgIC8vIFRPRE86IFVudGlsIFByb21pc2UuZGVsZWdhdGUgKHNlZSBiZWxvdykuXG59O1xuXG4vKipcbiAqIGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzXG4gKiBUaG9zZSBmb3VuZCBvbmx5IG9uIHRoZSBpbml0aWFsIGdsb2JhbCwgaS5lLiwgdGhlIGdsb2JhbCBvZiB0aGVcbiAqIHN0YXJ0IGNvbXBhcnRtZW50LCBhcyB3ZWxsIGFzIGFueSBjb21wYXJ0bWVudHMgY3JlYXRlZCBiZWZvcmUgbG9ja2Rvd24uXG4gKiBUaGVzZSBtYXkgcHJvdmlkZSBtdWNoIG9mIHRoZSBwb3dlciBwcm92aWRlZCBieSB0aGUgb3JpZ2luYWwuXG4gKiBNYXBzIGZyb20gcHJvcGVydHkgbmFtZSB0byB0aGUgaW50cmluc2ljIG5hbWUgaW4gdGhlIHdoaXRlbGlzdC5cbiAqLyRo4oCNX29uY2UudW5pdmVyc2FsUHJvcGVydHlOYW1lcyh1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzKTtcbmNvbnN0ICAgICAgICBpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lcz0gIHtcbiAgLy8gKioqIENvbnN0cnVjdG9yIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBEYXRlOiAnJUluaXRpYWxEYXRlJScsXG4gIEVycm9yOiAnJUluaXRpYWxFcnJvciUnLFxuICBSZWdFeHA6ICclSW5pdGlhbFJlZ0V4cCUnLFxuXG4gIC8vICoqKiBPdGhlciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgTWF0aDogJyVJbml0aWFsTWF0aCUnLFxuXG4gIC8vIEVTTmV4dFxuXG4gIC8vIEZyb20gRXJyb3Itc3RhY2sgcHJvcG9zYWxcbiAgLy8gT25seSBvbiBpbml0aWFsIGdsb2JhbC4gTm8gY29ycmVzcG9uZGluZ1xuICAvLyBwb3dlcmxlc3MgZm9ybSBmb3Igb3RoZXIgZ2xvYmFscy5cbiAgZ2V0U3RhY2tTdHJpbmc6ICclSW5pdGlhbEdldFN0YWNrU3RyaW5nJSdcblxuICAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vaXNzdWVzLzU1MVxuICAvLyBOZWVkIGluaXRpYWwgV2Vha1JlZiBhbmQgRmluYWxpemF0aW9uR3JvdXAgaW5cbiAgLy8gc3RhcnQgY29tcGFydG1lbnQgb25seS5cbn07XG5cbi8qKlxuICogc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lc1xuICogVGhvc2UgZm91bmQgb25seSBvbiB0aGUgZ2xvYmFscyBvZiBuZXcgY29tcGFydG1lbnRzIGNyZWF0ZWQgYWZ0ZXIgbG9ja2Rvd24sXG4gKiB3aGljaCBtdXN0IHRoZXJlZm9yZSBiZSBwb3dlcmxlc3MuXG4gKiBNYXBzIGZyb20gcHJvcGVydHkgbmFtZSB0byB0aGUgaW50cmluc2ljIG5hbWUgaW4gdGhlIHdoaXRlbGlzdC5cbiAqLyRo4oCNX29uY2UuaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXMoaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXMpO1xuY29uc3QgICAgICAgIHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXM9ICB7XG4gIC8vICoqKiBDb25zdHJ1Y3RvciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgRGF0ZTogJyVTaGFyZWREYXRlJScsXG4gIEVycm9yOiAnJVNoYXJlZEVycm9yJScsXG4gIFJlZ0V4cDogJyVTaGFyZWRSZWdFeHAlJyxcblxuICAvLyAqKiogT3RoZXIgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIE1hdGg6ICclU2hhcmVkTWF0aCUnfTtcblxuXG4vKipcbiAqIHVuaXF1ZUdsb2JhbFByb3BlcnR5TmFtZXNcbiAqIFRob3NlIG1hZGUgc2VwYXJhdGVseSBmb3IgZWFjaCBnbG9iYWwsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBnbG9iYWxcbiAqIG9mIHRoZSBzdGFydCBjb21wYXJ0bWVudC5cbiAqIE1hcHMgZnJvbSBwcm9wZXJ0eSBuYW1lIHRvIHRoZSBpbnRyaW5zaWMgbmFtZSBpbiB0aGUgd2hpdGVsaXN0XG4gKiAod2hpY2ggaXMgY3VycmVudGx5IGFsd2F5cyB0aGUgc2FtZSkuXG4gKi8kaOKAjV9vbmNlLnNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMoc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lcyk7XG5jb25zdCAgICAgICAgdW5pcXVlR2xvYmFsUHJvcGVydHlOYW1lcz0gIHtcbiAgLy8gKioqIFZhbHVlIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBnbG9iYWxUaGlzOiAnJVVuaXF1ZUdsb2JhbFRoaXMlJyxcblxuICAvLyAqKiogRnVuY3Rpb24gUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIGV2YWw6ICclVW5pcXVlRXZhbCUnLFxuXG4gIC8vICoqKiBDb25zdHJ1Y3RvciBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG5cbiAgRnVuY3Rpb246ICclVW5pcXVlRnVuY3Rpb24lJyxcblxuICAvLyAqKiogT3RoZXIgUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIC8vIEVTTmV4dFxuXG4gIENvbXBhcnRtZW50OiAnJVVuaXF1ZUNvbXBhcnRtZW50JSdcbiAgLy8gQWNjb3JkaW5nIHRvIGN1cnJlbnQgYWdyZWVtZW50cywgZXZlbnR1YWxseSB0aGUgUmVhbG0gY29uc3RydWN0b3IgdG9vLlxuICAvLyAnUmVhbG0nLFxufTtcblxuLy8gQWxsIHRoZSBcInN1YmNsYXNzZXNcIiBvZiBFcnJvci4gVGhlc2UgYXJlIGNvbGxlY3RpdmVseSByZXByZXNlbnRlZCBpbiB0aGVcbi8vIEVDTUFTY3JpcHQgc3BlYyBieSB0aGUgbWV0YSB2YXJpYWJsZSBOYXRpdmVFcnJvci5cbi8vIFRPRE8gQWRkIEFnZ3JlZ2F0ZUVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vaXNzdWVzLzU1MFxuJGjigI1fb25jZS51bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzKHVuaXF1ZUdsb2JhbFByb3BlcnR5TmFtZXMpO2NvbnN0IE5hdGl2ZUVycm9ycz1bXG4gIEV2YWxFcnJvcixcbiAgUmFuZ2VFcnJvcixcbiAgUmVmZXJlbmNlRXJyb3IsXG4gIFN5bnRheEVycm9yLFxuICBUeXBlRXJyb3IsXG4gIFVSSUVycm9yXTtcblxuXG4vKipcbiAqIDxwPkVhY2ggSlNPTiByZWNvcmQgZW51bWVyYXRlcyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIHByb3BlcnRpZXMgb25cbiAqICAgIHNvbWUgY29ycmVzcG9uZGluZyBpbnRyaW5zaWMgb2JqZWN0LlxuICpcbiAqIDxwPkFsbCByZWNvcmRzIGFyZSBtYWRlIG9mIGtleS12YWx1ZSBwYWlycyB3aGVyZSB0aGUga2V5XG4gKiAgICBpcyB0aGUgcHJvcGVydHkgdG8gcHJvY2VzcywgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgYXNzb2NpYXRlZFxuICogICAgZGlzcG9zaXRpb25zIGEuay5hLiB0aGUgXCJwZXJtaXRcIi4gVGhvc2UgcGVybWl0cyBjYW4gYmU6XG4gKiA8dWw+XG4gKiA8bGk+VGhlIGJvb2xlYW4gdmFsdWUgXCJmYWxzZVwiLCBpbiB3aGljaCBjYXNlIHRoaXMgcHJvcGVydHkgaXNcbiAqICAgICBibGFja2xpc3RlZCBhbmQgc2ltcGx5IHJlbW92ZWQuIFByb3BlcnRpZXMgbm90IG1lbnRpb25lZFxuICogICAgIGFyZSBhbHNvIGNvbnNpZGVyZWQgYmxhY2tsaXN0ZWQgYW5kIGFyZSByZW1vdmVkLlxuICogPGxpPkEgc3RyaW5nIHZhbHVlIGVxdWFsIHRvIGEgcHJpbWl0aXZlIChcIm51bWJlclwiLCBcInN0cmluZ1wiLCBldGMpLFxuICogICAgIGluIHdoaWNoIGNhc2UgdGhlIHByb3BlcnR5IGlzIHdoaXRlbGlzdGVkIGlmIGl0cyB2YWx1ZSBwcm9wZXJ0eVxuICogICAgIGlzIHR5cGVvZiB0aGUgZ2l2ZW4gdHlwZS4gRm9yIGV4YW1wbGUsIHtAY29kZSBcIkluZmluaXR5XCJ9IGxlYWRzIHRvXG4gKiAgICAgXCJudW1iZXJcIiBhbmQgcHJvcGVydHkgdmFsdWVzIHRoYXQgZmFpbCB7QGNvZGUgdHlwZW9mIFwibnVtYmVyXCJ9LlxuICogICAgIGFyZSByZW1vdmVkLlxuICogPGxpPkEgc3RyaW5nIHZhbHVlIGVxdWFsIHRvIGFuIGludGluc2ljIG5hbWUgKFwiT2JqZWN0UHJvdG90eXBlXCIsXG4gKiAgICAgXCJBcnJheVwiLCBldGMpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9wZXJ0eSB3aGl0ZWxpc3RlZCBpZiBpdHNcbiAqICAgICB2YWx1ZSBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmZpbmdcbiAqICAgICBpbnRyaW5zaWNzLiBGb3IgZXhhbXBsZSwge0Bjb2RlIE1hcC5wcm90b3R5cGV9IGxlYWRzIHRvXG4gKiAgICAgXCJNYXBQcm90b3R5cGVcIiBhbmQgdGhlIHByb3BlcnR5IGlzIHJlbW92ZWQgaWYgaXRzIHZhbHVlIGlzXG4gKiAgICAgbm90IGVxdWFsIHRvICVNYXBQcm90b3R5cGUlXG4gKiA8bGk+QW5vdGhlciByZWNvcmQsIGluIHdoaWNoIGNhc2UgdGhpcyBwcm9wZXJ0eSBpcyBzaW1wbHlcbiAqICAgICB3aGl0ZWxpc3RlZCBhbmQgdGhhdCBuZXh0IHJlY29yZCByZXByZXNlbnRzIHRoZSBkaXNwb3NpdGlvbiBvZlxuICogICAgIHRoZSBvYmplY3Qgd2hpY2ggaXMgaXRzIHZhbHVlLiBGb3IgZXhhbXBsZSwge0Bjb2RlIFwiT2JqZWN0XCJ9XG4gKiAgICAgbGVhZHMgdG8gYW5vdGhlciByZWNvcmQgZXhwbGFpbmluZyB3aGF0IHByb3BlcnRpZXMge0Bjb2RlXG4gKiAgICAgXCJPYmplY3RcIn0gbWF5IGhhdmUgYW5kIGhvdyBlYWNoIHN1Y2ggcHJvcGVydHkgc2hvdWxkIGJlIHRyZWF0ZWQuXG4gKlxuICogPHA+Tm90ZXM6XG4gKiA8bGk+XCJbW1Byb3RvXV1cIiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBcIltbUHJvdG90eXBlXV1cIiBpbnRlcm5hbFxuICogICAgIHNsb3QsIHdoaWNoIHNheXMgd2hpY2ggb2JqZWN0IHRoaXMgb2JqZWN0IGluaGVyaXRzIGZyb20uXG4gKiA8bGk+XCItLXByb3RvLS1cIiBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBcIl9fcHJvdG9fX1wiIHByb3BlcnR5IG5hbWUsXG4gKiAgICAgd2hpY2ggaXMgdGhlIG5hbWUgb2YgYW4gYWNjZXNzb3IgcHJvcGVydHkgb24gT2JqZWN0LnByb3RvdHlwZS5cbiAqICAgICBJbiBwcmFjdGljZSwgaXQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIFtbUHJvdG9dXSBpbnRlcm5hbCBzbG90LFxuICogICAgIGJ1dCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBpbnRlcm5hbCBzbG90IGl0c2VsZi4gV2UgdXNlXG4gKiAgICAgXCItLXByb3RvLS1cIiByYXRoZXIgdGhhbiBcIl9fcHJvdG9fX1wiIGJlbG93IGJlY2F1c2UgXCJfX3Byb3RvX19cIlxuICogICAgIGluIGFuIG9iamVjdCBsaXRlcmFsIGlzIHNwZWNpYWwgc3ludGF4IHJhdGhlciB0aGFuIGEgbm9ybWFsXG4gKiAgICAgcHJvcGVydHkgZGVmaW5pdGlvbi5cbiAqIDxsaT5cIk9iamVjdFByb3RvdHlwZVwiIGlzIHRoZSBkZWZhdWx0IFwiW1tQcm90b11dXCIgKHdoZW4gbm90IHNwZWNpZmllZCkuXG4gKiA8bGk+Q29uc3RhbnRzIFwiZm5cIiBhbmQgXCJnZXR0ZXJcIiBhcmUgdXNlZCB0byBrZWVwIHRoZSBzdHJ1Y3R1cmUgRFJZLlxuICogPGxpPlN5bWJvbCBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgYXMgZm9sbG93OlxuICogICAgIDxsaT5XZWxsLWtub3duIHN5bWJvbHMgdXNlIHRoZSBcIkBAbmFtZVwiIGZvcm0uXG4gKiAgICAgPGxpPlJlZ2lzdGVyZWQgc3ltYm9scyB1c2UgdGhlIFwiUmVnaXN0ZXJlZFN5bWJvbChrZXkpXCIgZm9ybS5cbiAqICAgICA8bGk+VW5pcXVlIHN5bWJvbHMgdXNlIHRoZSBcIlVuaXF1ZVN5bWJvbChkZXNjcmlwdGlvbilcIiBmb3JtLlxuICovXG5cbi8vIEZ1bmN0aW9uIEluc3RhbmNlc1xuJGjigI1fb25jZS5OYXRpdmVFcnJvcnMoTmF0aXZlRXJyb3JzKTtjb25zdCBGdW5jdGlvbkluc3RhbmNlPXtcbiAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgbGVuZ3RoOiAnbnVtYmVyJyxcbiAgbmFtZTogJ3N0cmluZydcbiAgLy8gRG8gbm90IHNwZWNpZnkgXCJwcm90b3R5cGVcIiBoZXJlLCBzaW5jZSBvbmx5IEZ1bmN0aW9uIGluc3RhbmNlcyB0aGF0IGNhblxuICAvLyBiZSB1c2VkIGFzIGEgY29uc3RydWN0b3IgaGF2ZSBhIHByb3RvdHlwZSBwcm9wZXJ0eS4gRm9yIGNvbnN0cnVjdG9ycyxcbiAgLy8gc2luY2UgcHJvdG90eXBlIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljLCB3ZSBkZWZpbmUgaXQgdGhlcmUuXG59O1xuXG4vLyBBc3luY0Z1bmN0aW9uIEluc3RhbmNlc1xuJGjigI1fb25jZS5GdW5jdGlvbkluc3RhbmNlKEZ1bmN0aW9uSW5zdGFuY2UpO2NvbnN0IEFzeW5jRnVuY3Rpb25JbnN0YW5jZT17XG4gIC8vIFRoaXMgcHJvcGVydHkgaXMgbm90IG1lbnRpb25lZCBpbiBFQ01BIDI2MiwgYnV0IGlzIHByZXNlbnQgaW4gVjggYW5kXG4gIC8vIG5lY2Vzc2FyeSBmb3IgbG9ja2Rvd24gdG8gc3VjY2VlZC5cbiAgJ1tbUHJvdG9dXSc6ICclQXN5bmNGdW5jdGlvblByb3RvdHlwZSUnfTtcblxuXG4vLyBBbGlhc2VzXG5jb25zdCBmbj0gIEZ1bmN0aW9uSW5zdGFuY2U7XG5jb25zdCBhc3luY0ZuPSAgQXN5bmNGdW5jdGlvbkluc3RhbmNlO1xuXG5jb25zdCBnZXR0ZXI9ICB7XG4gIGdldDogZm4sXG4gIHNldDogJ3VuZGVmaW5lZCd9O1xuXG5cbi8vIFBvc3NpYmxlIGJ1dCBub3QgZW5jb3VudGVyZWQgaW4gdGhlIHNwZWNzXG4vLyBleHBvcnQgY29uc3Qgc2V0dGVyID0ge1xuLy8gICBnZXQ6ICd1bmRlZmluZWQnLFxuLy8gICBzZXQ6IGZuLFxuLy8gfTtcblxuY29uc3QgYWNjZXNzb3I9ICB7XG4gIGdldDogZm4sXG4gIHNldDogZm59O1xuXG5cbmNvbnN0ICAgICAgICBpc0FjY2Vzc29yUGVybWl0PSAgKHBlcm1pdCk9PntcbiAgcmV0dXJuIHBlcm1pdD09PSAgZ2V0dGVyfHwgIHBlcm1pdD09PSAgYWNjZXNzb3I7XG4gfTtcblxuLy8gTmF0aXZlRXJyb3IgT2JqZWN0IFN0cnVjdHVyZVxuJGjigI1fb25jZS5pc0FjY2Vzc29yUGVybWl0KGlzQWNjZXNzb3JQZXJtaXQpO2Z1bmN0aW9uIE5hdGl2ZUVycm9yKHByb3RvdHlwZSl7XG4gIHJldHVybiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgTmF0aXZlRXJyb3IgQ29uc3RydWN0b3JzXG4gICAgJ1tbUHJvdG9dXSc6ICclU2hhcmVkRXJyb3IlJyxcblxuICAgIC8vIE5hdGl2ZUVycm9yLnByb3RvdHlwZVxuICAgIHByb3RvdHlwZX07XG5cbiB9XG5cbmZ1bmN0aW9uIE5hdGl2ZUVycm9yUHJvdG90eXBlKGNvbnN0cnVjdG9yKSB7XG4gIHJldHVybiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgTmF0aXZlRXJyb3IgUHJvdG90eXBlIE9iamVjdHNcbiAgICAnW1tQcm90b11dJzogJyVFcnJvclByb3RvdHlwZSUnLFxuICAgIGNvbnN0cnVjdG9yLFxuICAgIG1lc3NhZ2U6ICdzdHJpbmcnLFxuICAgIG5hbWU6ICdzdHJpbmcnLFxuICAgIC8vIFJlZHVuZGFudGx5IHByZXNlbnQgb25seSBvbiB2OC4gU2FmZSB0byByZW1vdmUuXG4gICAgdG9TdHJpbmc6IGZhbHNlLFxuICAgIC8vIFN1cGVyZmx1b3VzbHkgcHJlc2VudCBpbiBzb21lIHZlcnNpb25zIG9mIFY4LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L25vdGVzL2Jsb2IvbWFzdGVyL21lZXRpbmdzLzIwMjEtMTAvb2N0LTI2Lm1kIzp+OnRleHQ9SG93ZXZlciUyQyUyMENocm9tZSUyMDkzLGFuZCUyMG5vZGUlMjAxNi4xMS5cbiAgICBjYXVzZTogZmFsc2V9O1xuXG4gfVxuXG4vLyBUaGUgVHlwZWRBcnJheSBDb25zdHJ1Y3RvcnNcbmZ1bmN0aW9uIFR5cGVkQXJyYXkocHJvdG90eXBlKSB7XG4gIHJldHVybiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgVHlwZWRBcnJheSBDb25zdHJ1Y3RvcnNcbiAgICAnW1tQcm90b11dJzogJyVUeXBlZEFycmF5JScsXG4gICAgQllURVNfUEVSX0VMRU1FTlQ6ICdudW1iZXInLFxuICAgIHByb3RvdHlwZX07XG5cbiB9XG5cbmZ1bmN0aW9uIFR5cGVkQXJyYXlQcm90b3R5cGUoY29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBUeXBlZEFycmF5IFByb3RvdHlwZSBPYmplY3RzXG4gICAgJ1tbUHJvdG9dXSc6ICclVHlwZWRBcnJheVByb3RvdHlwZSUnLFxuICAgIEJZVEVTX1BFUl9FTEVNRU5UOiAnbnVtYmVyJyxcbiAgICBjb25zdHJ1Y3Rvcn07XG5cbiB9XG5cbi8vIFdpdGhvdXQgTWF0aC5yYW5kb21cbmNvbnN0IFNoYXJlZE1hdGg9ICB7XG4gIEU6ICdudW1iZXInLFxuICBMTjEwOiAnbnVtYmVyJyxcbiAgTE4yOiAnbnVtYmVyJyxcbiAgTE9HMTBFOiAnbnVtYmVyJyxcbiAgTE9HMkU6ICdudW1iZXInLFxuICBQSTogJ251bWJlcicsXG4gIFNRUlQxXzI6ICdudW1iZXInLFxuICBTUVJUMjogJ251bWJlcicsXG4gICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZycsXG4gIGFiczogZm4sXG4gIGFjb3M6IGZuLFxuICBhY29zaDogZm4sXG4gIGFzaW46IGZuLFxuICBhc2luaDogZm4sXG4gIGF0YW46IGZuLFxuICBhdGFuaDogZm4sXG4gIGF0YW4yOiBmbixcbiAgY2JydDogZm4sXG4gIGNlaWw6IGZuLFxuICBjbHozMjogZm4sXG4gIGNvczogZm4sXG4gIGNvc2g6IGZuLFxuICBleHA6IGZuLFxuICBleHBtMTogZm4sXG4gIGZsb29yOiBmbixcbiAgZnJvdW5kOiBmbixcbiAgaHlwb3Q6IGZuLFxuICBpbXVsOiBmbixcbiAgbG9nOiBmbixcbiAgbG9nMXA6IGZuLFxuICBsb2cxMDogZm4sXG4gIGxvZzI6IGZuLFxuICBtYXg6IGZuLFxuICBtaW46IGZuLFxuICBwb3c6IGZuLFxuICByb3VuZDogZm4sXG4gIHNpZ246IGZuLFxuICBzaW46IGZuLFxuICBzaW5oOiBmbixcbiAgc3FydDogZm4sXG4gIHRhbjogZm4sXG4gIHRhbmg6IGZuLFxuICB0cnVuYzogZm4sXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gIGlkaXY6IGZhbHNlLFxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICBpZGl2bW9kOiBmYWxzZSxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgaW1vZDogZmFsc2UsXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gIGltdWxkaXY6IGZhbHNlLFxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICBpcmVtOiBmYWxzZSxcbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgbW9kOiBmYWxzZX07XG5cblxuY29uc3QgICAgICAgIHdoaXRlbGlzdD0gIHtcbiAgLy8gRUNNQSBodHRwczovL3RjMzkuZXMvZWNtYTI2MlxuXG4gIC8vIFRoZSBpbnRyaW5zaWNzIG9iamVjdCBoYXMgbm8gcHJvdG90eXBlIHRvIGF2b2lkIGNvbmZsaWN0cy5cbiAgJ1tbUHJvdG9dXSc6IG51bGwsXG5cbiAgLy8gJVRocm93VHlwZUVycm9yJVxuICAnJVRocm93VHlwZUVycm9yJSc6IGZuLFxuXG4gIC8vICoqKiBUaGUgR2xvYmFsIE9iamVjdFxuXG4gIC8vICoqKiBWYWx1ZSBQcm9wZXJ0aWVzIG9mIHRoZSBHbG9iYWwgT2JqZWN0XG4gIEluZmluaXR5OiAnbnVtYmVyJyxcbiAgTmFOOiAnbnVtYmVyJyxcbiAgdW5kZWZpbmVkOiAndW5kZWZpbmVkJyxcblxuICAvLyAqKiogRnVuY3Rpb24gUHJvcGVydGllcyBvZiB0aGUgR2xvYmFsIE9iamVjdFxuXG4gIC8vIGV2YWxcbiAgJyVVbmlxdWVFdmFsJSc6IGZuLFxuICBpc0Zpbml0ZTogZm4sXG4gIGlzTmFOOiBmbixcbiAgcGFyc2VGbG9hdDogZm4sXG4gIHBhcnNlSW50OiBmbixcbiAgZGVjb2RlVVJJOiBmbixcbiAgZGVjb2RlVVJJQ29tcG9uZW50OiBmbixcbiAgZW5jb2RlVVJJOiBmbixcbiAgZW5jb2RlVVJJQ29tcG9uZW50OiBmbixcblxuICAvLyAqKiogRnVuZGFtZW50YWwgT2JqZWN0c1xuXG4gIE9iamVjdDoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE9iamVjdCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgYXNzaWduOiBmbixcbiAgICBjcmVhdGU6IGZuLFxuICAgIGRlZmluZVByb3BlcnRpZXM6IGZuLFxuICAgIGRlZmluZVByb3BlcnR5OiBmbixcbiAgICBlbnRyaWVzOiBmbixcbiAgICBmcmVlemU6IGZuLFxuICAgIGZyb21FbnRyaWVzOiBmbixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZuLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZuLFxuICAgIGdldE93blByb3BlcnR5TmFtZXM6IGZuLFxuICAgIGdldE93blByb3BlcnR5U3ltYm9sczogZm4sXG4gICAgZ2V0UHJvdG90eXBlT2Y6IGZuLFxuICAgIGhhc093bjogZm4sXG4gICAgaXM6IGZuLFxuICAgIGlzRXh0ZW5zaWJsZTogZm4sXG4gICAgaXNGcm96ZW46IGZuLFxuICAgIGlzU2VhbGVkOiBmbixcbiAgICBrZXlzOiBmbixcbiAgICBwcmV2ZW50RXh0ZW5zaW9uczogZm4sXG4gICAgcHJvdG90eXBlOiAnJU9iamVjdFByb3RvdHlwZSUnLFxuICAgIHNlYWw6IGZuLFxuICAgIHNldFByb3RvdHlwZU9mOiBmbixcbiAgICB2YWx1ZXM6IGZufSxcblxuXG4gICclT2JqZWN0UHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBPYmplY3QgUHJvdG90eXBlIE9iamVjdFxuICAgICdbW1Byb3RvXV0nOiBudWxsLFxuICAgIGNvbnN0cnVjdG9yOiAnT2JqZWN0JyxcbiAgICBoYXNPd25Qcm9wZXJ0eTogZm4sXG4gICAgaXNQcm90b3R5cGVPZjogZm4sXG4gICAgcHJvcGVydHlJc0VudW1lcmFibGU6IGZuLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdmFsdWVPZjogZm4sXG5cbiAgICAvLyBBbm5leCBCOiBBZGRpdGlvbmFsIFByb3BlcnRpZXMgb2YgdGhlIE9iamVjdC5wcm90b3R5cGUgT2JqZWN0XG5cbiAgICAvLyBTZWUgbm90ZSBpbiBoZWFkZXIgYWJvdXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBbW1Byb3RvXV0gYW5kIC0tcHJvdG8tLVxuICAgIC8vIHNwZWNpYWwgbm90YXRpb25zLlxuICAgICctLXByb3RvLS0nOiBhY2Nlc3NvcixcbiAgICBfX2RlZmluZUdldHRlcl9fOiBmbixcbiAgICBfX2RlZmluZVNldHRlcl9fOiBmbixcbiAgICBfX2xvb2t1cEdldHRlcl9fOiBmbixcbiAgICBfX2xvb2t1cFNldHRlcl9fOiBmbn0sXG5cblxuICAnJVVuaXF1ZUZ1bmN0aW9uJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBGdW5jdGlvbiBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJUZ1bmN0aW9uUHJvdG90eXBlJSd9LFxuXG5cbiAgJyVJbmVydEZ1bmN0aW9uJSc6IHtcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVGdW5jdGlvblByb3RvdHlwZSUnfSxcblxuXG4gICclRnVuY3Rpb25Qcm90b3R5cGUlJzoge1xuICAgIGFwcGx5OiBmbixcbiAgICBiaW5kOiBmbixcbiAgICBjYWxsOiBmbixcbiAgICBjb25zdHJ1Y3RvcjogJyVJbmVydEZ1bmN0aW9uJScsXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgICdAQGhhc0luc3RhbmNlJzogZm4sXG4gICAgLy8gcHJvcG9zZWQgYnV0IG5vdCB5ZXQgc3RkIHlldC4gVG8gYmUgcmVtb3ZlZCBpZiB0aGVyZVxuICAgIGNhbGxlcjogZmFsc2UsXG4gICAgLy8gcHJvcG9zZWQgYnV0IG5vdCB5ZXQgc3RkIHlldC4gVG8gYmUgcmVtb3ZlZCBpZiB0aGVyZVxuICAgIGFyZ3VtZW50czogZmFsc2V9LFxuXG5cbiAgQm9vbGVhbjoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEJvb2xlYW4gQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVCb29sZWFuUHJvdG90eXBlJSd9LFxuXG5cbiAgJyVCb29sZWFuUHJvdG90eXBlJSc6IHtcbiAgICBjb25zdHJ1Y3RvcjogJ0Jvb2xlYW4nLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICB2YWx1ZU9mOiBmbn0sXG5cblxuICBTeW1ib2w6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBTeW1ib2wgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGFzeW5jSXRlcmF0b3I6ICdzeW1ib2wnLFxuICAgIGZvcjogZm4sXG4gICAgaGFzSW5zdGFuY2U6ICdzeW1ib2wnLFxuICAgIGlzQ29uY2F0U3ByZWFkYWJsZTogJ3N5bWJvbCcsXG4gICAgaXRlcmF0b3I6ICdzeW1ib2wnLFxuICAgIGtleUZvcjogZm4sXG4gICAgbWF0Y2g6ICdzeW1ib2wnLFxuICAgIG1hdGNoQWxsOiAnc3ltYm9sJyxcbiAgICBwcm90b3R5cGU6ICclU3ltYm9sUHJvdG90eXBlJScsXG4gICAgcmVwbGFjZTogJ3N5bWJvbCcsXG4gICAgc2VhcmNoOiAnc3ltYm9sJyxcbiAgICBzcGVjaWVzOiAnc3ltYm9sJyxcbiAgICBzcGxpdDogJ3N5bWJvbCcsXG4gICAgdG9QcmltaXRpdmU6ICdzeW1ib2wnLFxuICAgIHRvU3RyaW5nVGFnOiAnc3ltYm9sJyxcbiAgICB1bnNjb3BhYmxlczogJ3N5bWJvbCd9LFxuXG5cbiAgJyVTeW1ib2xQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFN5bWJvbCBQcm90b3R5cGUgT2JqZWN0XG4gICAgY29uc3RydWN0b3I6ICdTeW1ib2wnLFxuICAgIGRlc2NyaXB0aW9uOiBnZXR0ZXIsXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHZhbHVlT2Y6IGZuLFxuICAgICdAQHRvUHJpbWl0aXZlJzogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJUluaXRpYWxFcnJvciUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRXJyb3IgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVFcnJvclByb3RvdHlwZSUnLFxuICAgIC8vIE5vbiBzdGFuZGFyZCwgdjggb25seSwgdXNlZCBieSB0YXBcbiAgICBjYXB0dXJlU3RhY2tUcmFjZTogZm4sXG4gICAgLy8gTm9uIHN0YW5kYXJkLCB2OCBvbmx5LCB1c2VkIGJ5IHRhcCwgdGFtZWQgdG8gYWNjZXNzb3JcbiAgICBzdGFja1RyYWNlTGltaXQ6IGFjY2Vzc29yLFxuICAgIC8vIE5vbiBzdGFuZGFyZCwgdjggb25seSwgdXNlZCBieSBzZXZlcmFsLCB0YW1lZCB0byBhY2Nlc3NvclxuICAgIHByZXBhcmVTdGFja1RyYWNlOiBhY2Nlc3Nvcn0sXG5cblxuICAnJVNoYXJlZEVycm9yJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBFcnJvciBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJUVycm9yUHJvdG90eXBlJScsXG4gICAgLy8gTm9uIHN0YW5kYXJkLCB2OCBvbmx5LCB1c2VkIGJ5IHRhcFxuICAgIGNhcHR1cmVTdGFja1RyYWNlOiBmbixcbiAgICAvLyBOb24gc3RhbmRhcmQsIHY4IG9ubHksIHVzZWQgYnkgdGFwLCB0YW1lZCB0byBhY2Nlc3NvclxuICAgIHN0YWNrVHJhY2VMaW1pdDogYWNjZXNzb3IsXG4gICAgLy8gTm9uIHN0YW5kYXJkLCB2OCBvbmx5LCB1c2VkIGJ5IHNldmVyYWwsIHRhbWVkIHRvIGFjY2Vzc29yXG4gICAgcHJlcGFyZVN0YWNrVHJhY2U6IGFjY2Vzc29yfSxcblxuXG4gICclRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiAnJVNoYXJlZEVycm9yJScsXG4gICAgbWVzc2FnZTogJ3N0cmluZycsXG4gICAgbmFtZTogJ3N0cmluZycsXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIC8vIHByb3Bvc2VkIGRlLWZhY3RvLCBhc3N1bWVkIFRPRE9cbiAgICAvLyBTZWVuIG9uIEZGIE5pZ2h0bHkgODguMGExXG4gICAgYXQ6IGZhbHNlLFxuICAgIC8vIFNlZW4gb24gRkYgYW5kIFhTXG4gICAgc3RhY2s6IGFjY2Vzc29yLFxuICAgIC8vIFN1cGVyZmx1b3VzbHkgcHJlc2VudCBpbiBzb21lIHZlcnNpb25zIG9mIFY4LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L25vdGVzL2Jsb2IvbWFzdGVyL21lZXRpbmdzLzIwMjEtMTAvb2N0LTI2Lm1kIzp+OnRleHQ9SG93ZXZlciUyQyUyMENocm9tZSUyMDkzLGFuZCUyMG5vZGUlMjAxNi4xMS5cbiAgICBjYXVzZTogZmFsc2V9LFxuXG5cbiAgLy8gTmF0aXZlRXJyb3JcblxuICBFdmFsRXJyb3I6IE5hdGl2ZUVycm9yKCclRXZhbEVycm9yUHJvdG90eXBlJScpLFxuICBSYW5nZUVycm9yOiBOYXRpdmVFcnJvcignJVJhbmdlRXJyb3JQcm90b3R5cGUlJyksXG4gIFJlZmVyZW5jZUVycm9yOiBOYXRpdmVFcnJvcignJVJlZmVyZW5jZUVycm9yUHJvdG90eXBlJScpLFxuICBTeW50YXhFcnJvcjogTmF0aXZlRXJyb3IoJyVTeW50YXhFcnJvclByb3RvdHlwZSUnKSxcbiAgVHlwZUVycm9yOiBOYXRpdmVFcnJvcignJVR5cGVFcnJvclByb3RvdHlwZSUnKSxcbiAgVVJJRXJyb3I6IE5hdGl2ZUVycm9yKCclVVJJRXJyb3JQcm90b3R5cGUlJyksXG5cbiAgJyVFdmFsRXJyb3JQcm90b3R5cGUlJzogTmF0aXZlRXJyb3JQcm90b3R5cGUoJ0V2YWxFcnJvcicpLFxuICAnJVJhbmdlRXJyb3JQcm90b3R5cGUlJzogTmF0aXZlRXJyb3JQcm90b3R5cGUoJ1JhbmdlRXJyb3InKSxcbiAgJyVSZWZlcmVuY2VFcnJvclByb3RvdHlwZSUnOiBOYXRpdmVFcnJvclByb3RvdHlwZSgnUmVmZXJlbmNlRXJyb3InKSxcbiAgJyVTeW50YXhFcnJvclByb3RvdHlwZSUnOiBOYXRpdmVFcnJvclByb3RvdHlwZSgnU3ludGF4RXJyb3InKSxcbiAgJyVUeXBlRXJyb3JQcm90b3R5cGUlJzogTmF0aXZlRXJyb3JQcm90b3R5cGUoJ1R5cGVFcnJvcicpLFxuICAnJVVSSUVycm9yUHJvdG90eXBlJSc6IE5hdGl2ZUVycm9yUHJvdG90eXBlKCdVUklFcnJvcicpLFxuXG4gIC8vICoqKiBOdW1iZXJzIGFuZCBEYXRlc1xuXG4gIE51bWJlcjoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIE51bWJlciBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgRVBTSUxPTjogJ251bWJlcicsXG4gICAgaXNGaW5pdGU6IGZuLFxuICAgIGlzSW50ZWdlcjogZm4sXG4gICAgaXNOYU46IGZuLFxuICAgIGlzU2FmZUludGVnZXI6IGZuLFxuICAgIE1BWF9TQUZFX0lOVEVHRVI6ICdudW1iZXInLFxuICAgIE1BWF9WQUxVRTogJ251bWJlcicsXG4gICAgTUlOX1NBRkVfSU5URUdFUjogJ251bWJlcicsXG4gICAgTUlOX1ZBTFVFOiAnbnVtYmVyJyxcbiAgICBOYU46ICdudW1iZXInLFxuICAgIE5FR0FUSVZFX0lORklOSVRZOiAnbnVtYmVyJyxcbiAgICBwYXJzZUZsb2F0OiBmbixcbiAgICBwYXJzZUludDogZm4sXG4gICAgUE9TSVRJVkVfSU5GSU5JVFk6ICdudW1iZXInLFxuICAgIHByb3RvdHlwZTogJyVOdW1iZXJQcm90b3R5cGUlJ30sXG5cblxuICAnJU51bWJlclByb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgTnVtYmVyIFByb3RvdHlwZSBPYmplY3RcbiAgICBjb25zdHJ1Y3RvcjogJ051bWJlcicsXG4gICAgdG9FeHBvbmVudGlhbDogZm4sXG4gICAgdG9GaXhlZDogZm4sXG4gICAgdG9Mb2NhbGVTdHJpbmc6IGZuLFxuICAgIHRvUHJlY2lzaW9uOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdmFsdWVPZjogZm59LFxuXG5cbiAgQmlnSW50OiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQmlnSW50IENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBhc0ludE46IGZuLFxuICAgIGFzVWludE46IGZuLFxuICAgIHByb3RvdHlwZTogJyVCaWdJbnRQcm90b3R5cGUlJyxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICAgIGJpdExlbmd0aDogZmFsc2UsXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgICBmcm9tQXJyYXlCdWZmZXI6IGZhbHNlfSxcblxuXG4gICclQmlnSW50UHJvdG90eXBlJSc6IHtcbiAgICBjb25zdHJ1Y3RvcjogJ0JpZ0ludCcsXG4gICAgdG9Mb2NhbGVTdHJpbmc6IGZuLFxuICAgIHRvU3RyaW5nOiBmbixcbiAgICB2YWx1ZU9mOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gICclSW5pdGlhbE1hdGglJzoge1xuICAgIC4uLlNoYXJlZE1hdGgsXG4gICAgLy8gcmFuZG9tIGlzIHN0YW5kYXJkIGJ1dCBvbWl0dGVkIGZyb20gU2hhcmVkTWF0aFxuICAgIHJhbmRvbTogZm59LFxuXG5cbiAgJyVTaGFyZWRNYXRoJSc6IFNoYXJlZE1hdGgsXG5cbiAgJyVJbml0aWFsRGF0ZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRGF0ZSBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgbm93OiBmbixcbiAgICBwYXJzZTogZm4sXG4gICAgcHJvdG90eXBlOiAnJURhdGVQcm90b3R5cGUlJyxcbiAgICBVVEM6IGZufSxcblxuXG4gICclU2hhcmVkRGF0ZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgRGF0ZSBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgbm93OiBmbixcbiAgICBwYXJzZTogZm4sXG4gICAgcHJvdG90eXBlOiAnJURhdGVQcm90b3R5cGUlJyxcbiAgICBVVEM6IGZufSxcblxuXG4gICclRGF0ZVByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6ICclU2hhcmVkRGF0ZSUnLFxuICAgIGdldERhdGU6IGZuLFxuICAgIGdldERheTogZm4sXG4gICAgZ2V0RnVsbFllYXI6IGZuLFxuICAgIGdldEhvdXJzOiBmbixcbiAgICBnZXRNaWxsaXNlY29uZHM6IGZuLFxuICAgIGdldE1pbnV0ZXM6IGZuLFxuICAgIGdldE1vbnRoOiBmbixcbiAgICBnZXRTZWNvbmRzOiBmbixcbiAgICBnZXRUaW1lOiBmbixcbiAgICBnZXRUaW1lem9uZU9mZnNldDogZm4sXG4gICAgZ2V0VVRDRGF0ZTogZm4sXG4gICAgZ2V0VVRDRGF5OiBmbixcbiAgICBnZXRVVENGdWxsWWVhcjogZm4sXG4gICAgZ2V0VVRDSG91cnM6IGZuLFxuICAgIGdldFVUQ01pbGxpc2Vjb25kczogZm4sXG4gICAgZ2V0VVRDTWludXRlczogZm4sXG4gICAgZ2V0VVRDTW9udGg6IGZuLFxuICAgIGdldFVUQ1NlY29uZHM6IGZuLFxuICAgIHNldERhdGU6IGZuLFxuICAgIHNldEZ1bGxZZWFyOiBmbixcbiAgICBzZXRIb3VyczogZm4sXG4gICAgc2V0TWlsbGlzZWNvbmRzOiBmbixcbiAgICBzZXRNaW51dGVzOiBmbixcbiAgICBzZXRNb250aDogZm4sXG4gICAgc2V0U2Vjb25kczogZm4sXG4gICAgc2V0VGltZTogZm4sXG4gICAgc2V0VVRDRGF0ZTogZm4sXG4gICAgc2V0VVRDRnVsbFllYXI6IGZuLFxuICAgIHNldFVUQ0hvdXJzOiBmbixcbiAgICBzZXRVVENNaWxsaXNlY29uZHM6IGZuLFxuICAgIHNldFVUQ01pbnV0ZXM6IGZuLFxuICAgIHNldFVUQ01vbnRoOiBmbixcbiAgICBzZXRVVENTZWNvbmRzOiBmbixcbiAgICB0b0RhdGVTdHJpbmc6IGZuLFxuICAgIHRvSVNPU3RyaW5nOiBmbixcbiAgICB0b0pTT046IGZuLFxuICAgIHRvTG9jYWxlRGF0ZVN0cmluZzogZm4sXG4gICAgdG9Mb2NhbGVTdHJpbmc6IGZuLFxuICAgIHRvTG9jYWxlVGltZVN0cmluZzogZm4sXG4gICAgdG9TdHJpbmc6IGZuLFxuICAgIHRvVGltZVN0cmluZzogZm4sXG4gICAgdG9VVENTdHJpbmc6IGZuLFxuICAgIHZhbHVlT2Y6IGZuLFxuICAgICdAQHRvUHJpbWl0aXZlJzogZm4sXG5cbiAgICAvLyBBbm5leCBCOiBBZGRpdGlvbmFsIFByb3BlcnRpZXMgb2YgdGhlIERhdGUucHJvdG90eXBlIE9iamVjdFxuICAgIGdldFllYXI6IGZuLFxuICAgIHNldFllYXI6IGZuLFxuICAgIHRvR01UU3RyaW5nOiBmbn0sXG5cblxuICAvLyBUZXh0IFByb2Nlc3NpbmdcblxuICBTdHJpbmc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBTdHJpbmcgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGZyb21DaGFyQ29kZTogZm4sXG4gICAgZnJvbUNvZGVQb2ludDogZm4sXG4gICAgcHJvdG90eXBlOiAnJVN0cmluZ1Byb3RvdHlwZSUnLFxuICAgIHJhdzogZm4sXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2RkYWJsZS1PcGVuU291cmNlL21vZGRhYmxlL2lzc3Vlcy81MjNcbiAgICBmcm9tQXJyYXlCdWZmZXI6IGZhbHNlfSxcblxuXG4gICclU3RyaW5nUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBTdHJpbmcgUHJvdG90eXBlIE9iamVjdFxuICAgIGxlbmd0aDogJ251bWJlcicsXG4gICAgYXQ6IGZuLFxuICAgIGNoYXJBdDogZm4sXG4gICAgY2hhckNvZGVBdDogZm4sXG4gICAgY29kZVBvaW50QXQ6IGZuLFxuICAgIGNvbmNhdDogZm4sXG4gICAgY29uc3RydWN0b3I6ICdTdHJpbmcnLFxuICAgIGVuZHNXaXRoOiBmbixcbiAgICBpbmNsdWRlczogZm4sXG4gICAgaW5kZXhPZjogZm4sXG4gICAgbGFzdEluZGV4T2Y6IGZuLFxuICAgIGxvY2FsZUNvbXBhcmU6IGZuLFxuICAgIG1hdGNoOiBmbixcbiAgICBtYXRjaEFsbDogZm4sXG4gICAgbm9ybWFsaXplOiBmbixcbiAgICBwYWRFbmQ6IGZuLFxuICAgIHBhZFN0YXJ0OiBmbixcbiAgICByZXBlYXQ6IGZuLFxuICAgIHJlcGxhY2U6IGZuLFxuICAgIHJlcGxhY2VBbGw6IGZuLCAvLyBFUzIwMjFcbiAgICBzZWFyY2g6IGZuLFxuICAgIHNsaWNlOiBmbixcbiAgICBzcGxpdDogZm4sXG4gICAgc3RhcnRzV2l0aDogZm4sXG4gICAgc3Vic3RyaW5nOiBmbixcbiAgICB0b0xvY2FsZUxvd2VyQ2FzZTogZm4sXG4gICAgdG9Mb2NhbGVVcHBlckNhc2U6IGZuLFxuICAgIHRvTG93ZXJDYXNlOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdG9VcHBlckNhc2U6IGZuLFxuICAgIHRyaW06IGZuLFxuICAgIHRyaW1FbmQ6IGZuLFxuICAgIHRyaW1TdGFydDogZm4sXG4gICAgdmFsdWVPZjogZm4sXG4gICAgJ0BAaXRlcmF0b3InOiBmbixcblxuICAgIC8vIEFubmV4IEI6IEFkZGl0aW9uYWwgUHJvcGVydGllcyBvZiB0aGUgU3RyaW5nLnByb3RvdHlwZSBPYmplY3RcbiAgICBzdWJzdHI6IGZuLFxuICAgIGFuY2hvcjogZm4sXG4gICAgYmlnOiBmbixcbiAgICBibGluazogZm4sXG4gICAgYm9sZDogZm4sXG4gICAgZml4ZWQ6IGZuLFxuICAgIGZvbnRjb2xvcjogZm4sXG4gICAgZm9udHNpemU6IGZuLFxuICAgIGl0YWxpY3M6IGZuLFxuICAgIGxpbms6IGZuLFxuICAgIHNtYWxsOiBmbixcbiAgICBzdHJpa2U6IGZuLFxuICAgIHN1YjogZm4sXG4gICAgc3VwOiBmbixcbiAgICB0cmltTGVmdDogZm4sXG4gICAgdHJpbVJpZ2h0OiBmbixcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICAgIGNvbXBhcmU6IGZhbHNlfSxcblxuXG4gICclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzoge1xuICAgICdbW1Byb3RvXV0nOiAnJUl0ZXJhdG9yUHJvdG90eXBlJScsXG4gICAgbmV4dDogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJUluaXRpYWxSZWdFeHAlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFJlZ0V4cCBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJVJlZ0V4cFByb3RvdHlwZSUnLFxuICAgICdAQHNwZWNpZXMnOiBnZXR0ZXIsXG5cbiAgICAvLyBUaGUgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmVnZXhwLWxlZ2FjeS1mZWF0dXJlc1xuICAgIC8vIGFyZSBhbGwgb3B0aW9uYWwsIHVuc2FmZSwgYW5kIG9taXR0ZWRcbiAgICBpbnB1dDogZmFsc2UsXG4gICAgJF86IGZhbHNlLFxuICAgIGxhc3RNYXRjaDogZmFsc2UsXG4gICAgJyQmJzogZmFsc2UsXG4gICAgbGFzdFBhcmVuOiBmYWxzZSxcbiAgICAnJCsnOiBmYWxzZSxcbiAgICBsZWZ0Q29udGV4dDogZmFsc2UsXG4gICAgJyRgJzogZmFsc2UsXG4gICAgcmlnaHRDb250ZXh0OiBmYWxzZSxcbiAgICBcIiQnXCI6IGZhbHNlLFxuICAgICQxOiBmYWxzZSxcbiAgICAkMjogZmFsc2UsXG4gICAgJDM6IGZhbHNlLFxuICAgICQ0OiBmYWxzZSxcbiAgICAkNTogZmFsc2UsXG4gICAgJDY6IGZhbHNlLFxuICAgICQ3OiBmYWxzZSxcbiAgICAkODogZmFsc2UsXG4gICAgJDk6IGZhbHNlfSxcblxuXG4gICclU2hhcmVkUmVnRXhwJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBSZWdFeHAgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVSZWdFeHBQcm90b3R5cGUlJyxcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyfSxcblxuXG4gICclUmVnRXhwUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBSZWdFeHAgUHJvdG90eXBlIE9iamVjdFxuICAgIGNvbnN0cnVjdG9yOiAnJVNoYXJlZFJlZ0V4cCUnLFxuICAgIGV4ZWM6IGZuLFxuICAgIGRvdEFsbDogZ2V0dGVyLFxuICAgIGZsYWdzOiBnZXR0ZXIsXG4gICAgZ2xvYmFsOiBnZXR0ZXIsXG4gICAgaWdub3JlQ2FzZTogZ2V0dGVyLFxuICAgICdAQG1hdGNoJzogZm4sXG4gICAgJ0BAbWF0Y2hBbGwnOiBmbixcbiAgICBtdWx0aWxpbmU6IGdldHRlcixcbiAgICAnQEByZXBsYWNlJzogZm4sXG4gICAgJ0BAc2VhcmNoJzogZm4sXG4gICAgc291cmNlOiBnZXR0ZXIsXG4gICAgJ0BAc3BsaXQnOiBmbixcbiAgICBzdGlja3k6IGdldHRlcixcbiAgICB0ZXN0OiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdW5pY29kZTogZ2V0dGVyLFxuXG4gICAgLy8gQW5uZXggQjogQWRkaXRpb25hbCBQcm9wZXJ0aWVzIG9mIHRoZSBSZWdFeHAucHJvdG90eXBlIE9iamVjdFxuICAgIGNvbXBpbGU6IGZhbHNlLCAvLyBVTlNBRkUgYW5kIHN1cHByZXNzZWQuXG4gICAgLy8gU2VlbiBvbiBGRiBOaWdodGx5IDg4LjBhMSwgQ2hyb21lIENhbmFyeSA5MS4wLjQ0NDYuMCxcbiAgICAvLyBTYWZhcmkgVGVjaCBQcmV2aWV3IFJlbGVhc2UgMTIyIChTYWZhcmkgMTQuMiwgV2ViS2l0IDE2NjEyLjEuNi4yKVxuICAgIGhhc0luZGljZXM6IGZhbHNlfSxcblxuXG4gICclUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFRoZSAlUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuICAgICdbW1Byb3RvXV0nOiAnJUl0ZXJhdG9yUHJvdG90eXBlJScsXG4gICAgbmV4dDogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAvLyBJbmRleGVkIENvbGxlY3Rpb25zXG5cbiAgQXJyYXk6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBcnJheSBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgZnJvbTogZm4sXG4gICAgaXNBcnJheTogZm4sXG4gICAgb2Y6IGZuLFxuICAgIHByb3RvdHlwZTogJyVBcnJheVByb3RvdHlwZSUnLFxuICAgICdAQHNwZWNpZXMnOiBnZXR0ZXIsXG5cbiAgICAvLyBTdGFnZSAzOlxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9wcm9wb3NhbC1yZWxhdGl2ZS1pbmRleGluZy1tZXRob2QvXG4gICAgYXQ6IGZufSxcblxuXG4gICclQXJyYXlQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEFycmF5IFByb3RvdHlwZSBPYmplY3RcbiAgICBhdDogZm4sXG4gICAgbGVuZ3RoOiAnbnVtYmVyJyxcbiAgICBjb25jYXQ6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnQXJyYXknLFxuICAgIGNvcHlXaXRoaW46IGZuLFxuICAgIGVudHJpZXM6IGZuLFxuICAgIGV2ZXJ5OiBmbixcbiAgICBmaWxsOiBmbixcbiAgICBmaWx0ZXI6IGZuLFxuICAgIGZpbmQ6IGZuLFxuICAgIGZpbmRJbmRleDogZm4sXG4gICAgZmxhdDogZm4sXG4gICAgZmxhdE1hcDogZm4sXG4gICAgZm9yRWFjaDogZm4sXG4gICAgaW5jbHVkZXM6IGZuLFxuICAgIGluZGV4T2Y6IGZuLFxuICAgIGpvaW46IGZuLFxuICAgIGtleXM6IGZuLFxuICAgIGxhc3RJbmRleE9mOiBmbixcbiAgICBtYXA6IGZuLFxuICAgIHBvcDogZm4sXG4gICAgcHVzaDogZm4sXG4gICAgcmVkdWNlOiBmbixcbiAgICByZWR1Y2VSaWdodDogZm4sXG4gICAgcmV2ZXJzZTogZm4sXG4gICAgc2hpZnQ6IGZuLFxuICAgIHNsaWNlOiBmbixcbiAgICBzb21lOiBmbixcbiAgICBzb3J0OiBmbixcbiAgICBzcGxpY2U6IGZuLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdW5zaGlmdDogZm4sXG4gICAgdmFsdWVzOiBmbixcbiAgICAnQEBpdGVyYXRvcic6IGZuLFxuICAgICdAQHVuc2NvcGFibGVzJzoge1xuICAgICAgJ1tbUHJvdG9dXSc6IG51bGwsXG4gICAgICBjb3B5V2l0aGluOiAnYm9vbGVhbicsXG4gICAgICBlbnRyaWVzOiAnYm9vbGVhbicsXG4gICAgICBmaWxsOiAnYm9vbGVhbicsXG4gICAgICBmaW5kOiAnYm9vbGVhbicsXG4gICAgICBmaW5kSW5kZXg6ICdib29sZWFuJyxcbiAgICAgIGZsYXQ6ICdib29sZWFuJyxcbiAgICAgIGZsYXRNYXA6ICdib29sZWFuJyxcbiAgICAgIGluY2x1ZGVzOiAnYm9vbGVhbicsXG4gICAgICBrZXlzOiAnYm9vbGVhbicsXG4gICAgICB2YWx1ZXM6ICdib29sZWFuJyxcbiAgICAgIC8vIEZhaWxlZCB0YzM5IHByb3Bvc2FsXG4gICAgICAvLyBTZWVuIG9uIEZGIE5pZ2h0bHkgODguMGExXG4gICAgICBhdDogZmFsc2UsXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtYXJyYXktZmluZC1mcm9tLWxhc3RcbiAgICAgIGZpbmRMYXN0OiAnYm9vbGVhbicsXG4gICAgICBmaW5kTGFzdEluZGV4OiAnYm9vbGVhbid9LFxuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWFycmF5LWZpbmQtZnJvbS1sYXN0XG4gICAgZmluZExhc3Q6IGZuLFxuICAgIGZpbmRMYXN0SW5kZXg6IGZufSxcblxuXG4gICclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgLy8gVGhlICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVJdGVyYXRvclByb3RvdHlwZSUnLFxuICAgIG5leHQ6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgLy8gKioqIFR5cGVkQXJyYXkgT2JqZWN0c1xuXG4gICclVHlwZWRBcnJheSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgJVR5cGVkQXJyYXklIEludHJpbnNpYyBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGZyb206IGZuLFxuICAgIG9mOiBmbixcbiAgICBwcm90b3R5cGU6ICclVHlwZWRBcnJheVByb3RvdHlwZSUnLFxuICAgICdAQHNwZWNpZXMnOiBnZXR0ZXJ9LFxuXG5cbiAgJyVUeXBlZEFycmF5UHJvdG90eXBlJSc6IHtcbiAgICBhdDogZm4sXG4gICAgYnVmZmVyOiBnZXR0ZXIsXG4gICAgYnl0ZUxlbmd0aDogZ2V0dGVyLFxuICAgIGJ5dGVPZmZzZXQ6IGdldHRlcixcbiAgICBjb25zdHJ1Y3RvcjogJyVUeXBlZEFycmF5JScsXG4gICAgY29weVdpdGhpbjogZm4sXG4gICAgZW50cmllczogZm4sXG4gICAgZXZlcnk6IGZuLFxuICAgIGZpbGw6IGZuLFxuICAgIGZpbHRlcjogZm4sXG4gICAgZmluZDogZm4sXG4gICAgZmluZEluZGV4OiBmbixcbiAgICBmb3JFYWNoOiBmbixcbiAgICBpbmNsdWRlczogZm4sXG4gICAgaW5kZXhPZjogZm4sXG4gICAgam9pbjogZm4sXG4gICAga2V5czogZm4sXG4gICAgbGFzdEluZGV4T2Y6IGZuLFxuICAgIGxlbmd0aDogZ2V0dGVyLFxuICAgIG1hcDogZm4sXG4gICAgcmVkdWNlOiBmbixcbiAgICByZWR1Y2VSaWdodDogZm4sXG4gICAgcmV2ZXJzZTogZm4sXG4gICAgc2V0OiBmbixcbiAgICBzbGljZTogZm4sXG4gICAgc29tZTogZm4sXG4gICAgc29ydDogZm4sXG4gICAgc3ViYXJyYXk6IGZuLFxuICAgIHRvTG9jYWxlU3RyaW5nOiBmbixcbiAgICB0b1N0cmluZzogZm4sXG4gICAgdmFsdWVzOiBmbixcbiAgICAnQEBpdGVyYXRvcic6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogZ2V0dGVyLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1hcnJheS1maW5kLWZyb20tbGFzdFxuICAgIGZpbmRMYXN0OiBmbixcbiAgICBmaW5kTGFzdEluZGV4OiBmbn0sXG5cblxuICAvLyBUaGUgVHlwZWRBcnJheSBDb25zdHJ1Y3RvcnNcblxuICBCaWdJbnQ2NEFycmF5OiBUeXBlZEFycmF5KCclQmlnSW50NjRBcnJheVByb3RvdHlwZSUnKSxcbiAgQmlnVWludDY0QXJyYXk6IFR5cGVkQXJyYXkoJyVCaWdVaW50NjRBcnJheVByb3RvdHlwZSUnKSxcbiAgRmxvYXQzMkFycmF5OiBUeXBlZEFycmF5KCclRmxvYXQzMkFycmF5UHJvdG90eXBlJScpLFxuICBGbG9hdDY0QXJyYXk6IFR5cGVkQXJyYXkoJyVGbG9hdDY0QXJyYXlQcm90b3R5cGUlJyksXG4gIEludDE2QXJyYXk6IFR5cGVkQXJyYXkoJyVJbnQxNkFycmF5UHJvdG90eXBlJScpLFxuICBJbnQzMkFycmF5OiBUeXBlZEFycmF5KCclSW50MzJBcnJheVByb3RvdHlwZSUnKSxcbiAgSW50OEFycmF5OiBUeXBlZEFycmF5KCclSW50OEFycmF5UHJvdG90eXBlJScpLFxuICBVaW50MTZBcnJheTogVHlwZWRBcnJheSgnJVVpbnQxNkFycmF5UHJvdG90eXBlJScpLFxuICBVaW50MzJBcnJheTogVHlwZWRBcnJheSgnJVVpbnQzMkFycmF5UHJvdG90eXBlJScpLFxuICBVaW50OEFycmF5OiBUeXBlZEFycmF5KCclVWludDhBcnJheVByb3RvdHlwZSUnKSxcbiAgVWludDhDbGFtcGVkQXJyYXk6IFR5cGVkQXJyYXkoJyVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUnKSxcblxuICAnJUJpZ0ludDY0QXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnQmlnSW50NjRBcnJheScpLFxuICAnJUJpZ1VpbnQ2NEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0JpZ1VpbnQ2NEFycmF5JyksXG4gICclRmxvYXQzMkFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0Zsb2F0MzJBcnJheScpLFxuICAnJUZsb2F0NjRBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdGbG9hdDY0QXJyYXknKSxcbiAgJyVJbnQxNkFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0ludDE2QXJyYXknKSxcbiAgJyVJbnQzMkFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ0ludDMyQXJyYXknKSxcbiAgJyVJbnQ4QXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnSW50OEFycmF5JyksXG4gICclVWludDE2QXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnVWludDE2QXJyYXknKSxcbiAgJyVVaW50MzJBcnJheVByb3RvdHlwZSUnOiBUeXBlZEFycmF5UHJvdG90eXBlKCdVaW50MzJBcnJheScpLFxuICAnJVVpbnQ4QXJyYXlQcm90b3R5cGUlJzogVHlwZWRBcnJheVByb3RvdHlwZSgnVWludDhBcnJheScpLFxuICAnJVVpbnQ4Q2xhbXBlZEFycmF5UHJvdG90eXBlJSc6IFR5cGVkQXJyYXlQcm90b3R5cGUoJ1VpbnQ4Q2xhbXBlZEFycmF5JyksXG5cbiAgLy8gKioqIEtleWVkIENvbGxlY3Rpb25zXG5cbiAgTWFwOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgTWFwIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyLFxuICAgIHByb3RvdHlwZTogJyVNYXBQcm90b3R5cGUlJ30sXG5cblxuICAnJU1hcFByb3RvdHlwZSUnOiB7XG4gICAgY2xlYXI6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnTWFwJyxcbiAgICBkZWxldGU6IGZuLFxuICAgIGVudHJpZXM6IGZuLFxuICAgIGZvckVhY2g6IGZuLFxuICAgIGdldDogZm4sXG4gICAgaGFzOiBmbixcbiAgICBrZXlzOiBmbixcbiAgICBzZXQ6IGZuLFxuICAgIHNpemU6IGdldHRlcixcbiAgICB2YWx1ZXM6IGZuLFxuICAgICdAQGl0ZXJhdG9yJzogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAvLyBUaGUgJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVJdGVyYXRvclByb3RvdHlwZSUnLFxuICAgIG5leHQ6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgU2V0OiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgU2V0IENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclU2V0UHJvdG90eXBlJScsXG4gICAgJ0BAc3BlY2llcyc6IGdldHRlcn0sXG5cblxuICAnJVNldFByb3RvdHlwZSUnOiB7XG4gICAgYWRkOiBmbixcbiAgICBjbGVhcjogZm4sXG4gICAgY29uc3RydWN0b3I6ICdTZXQnLFxuICAgIGRlbGV0ZTogZm4sXG4gICAgZW50cmllczogZm4sXG4gICAgZm9yRWFjaDogZm4sXG4gICAgaGFzOiBmbixcbiAgICBrZXlzOiBmbixcbiAgICBzaXplOiBnZXR0ZXIsXG4gICAgdmFsdWVzOiBmbixcbiAgICAnQEBpdGVyYXRvcic6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVTZXRJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgLy8gVGhlICVTZXRJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclSXRlcmF0b3JQcm90b3R5cGUlJyxcbiAgICBuZXh0OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIFdlYWtNYXA6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBXZWFrTWFwIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICBwcm90b3R5cGU6ICclV2Vha01hcFByb3RvdHlwZSUnfSxcblxuXG4gICclV2Vha01hcFByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6ICdXZWFrTWFwJyxcbiAgICBkZWxldGU6IGZuLFxuICAgIGdldDogZm4sXG4gICAgaGFzOiBmbixcbiAgICBzZXQ6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgV2Vha1NldDoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFdlYWtTZXQgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVXZWFrU2V0UHJvdG90eXBlJSd9LFxuXG5cbiAgJyVXZWFrU2V0UHJvdG90eXBlJSc6IHtcbiAgICBhZGQ6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnV2Vha1NldCcsXG4gICAgZGVsZXRlOiBmbixcbiAgICBoYXM6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgLy8gKioqIFN0cnVjdHVyZWQgRGF0YVxuXG4gIEFycmF5QnVmZmVyOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXJyYXlCdWZmZXIgQ29uc3RydWN0b3JcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGlzVmlldzogZm4sXG4gICAgcHJvdG90eXBlOiAnJUFycmF5QnVmZmVyUHJvdG90eXBlJScsXG4gICAgJ0BAc3BlY2llcyc6IGdldHRlcixcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01vZGRhYmxlLU9wZW5Tb3VyY2UvbW9kZGFibGUvaXNzdWVzLzUyM1xuICAgIGZyb21TdHJpbmc6IGZhbHNlLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gICAgZnJvbUJpZ0ludDogZmFsc2V9LFxuXG5cbiAgJyVBcnJheUJ1ZmZlclByb3RvdHlwZSUnOiB7XG4gICAgYnl0ZUxlbmd0aDogZ2V0dGVyLFxuICAgIGNvbnN0cnVjdG9yOiAnQXJyYXlCdWZmZXInLFxuICAgIHNsaWNlOiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZGFibGUtT3BlblNvdXJjZS9tb2RkYWJsZS9pc3N1ZXMvNTIzXG4gICAgY29uY2F0OiBmYWxzZSxcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcmVzaXphYmxlYXJyYXlidWZmZXJcbiAgICB0cmFuc2ZlcjogZm4sXG4gICAgcmVzaXplOiBmbixcbiAgICByZXNpemFibGU6IGdldHRlcixcbiAgICBtYXhCeXRlTGVuZ3RoOiBnZXR0ZXJ9LFxuXG5cbiAgLy8gU2hhcmVkQXJyYXlCdWZmZXIgT2JqZWN0c1xuICBTaGFyZWRBcnJheUJ1ZmZlcjogZmFsc2UsIC8vIFVOU0FGRSBhbmQgcHVycG9zZWx5IHN1cHByZXNzZWQuXG4gICclU2hhcmVkQXJyYXlCdWZmZXJQcm90b3R5cGUlJzogZmFsc2UsIC8vIFVOU0FGRSBhbmQgcHVycG9zZWx5IHN1cHByZXNzZWQuXG5cbiAgRGF0YVZpZXc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBEYXRhVmlldyBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgQllURVNfUEVSX0VMRU1FTlQ6ICdudW1iZXInLCAvLyBOb24gc3RkIGJ1dCB1bmRlbGV0YWJsZSBvbiBTYWZhcmkuXG4gICAgcHJvdG90eXBlOiAnJURhdGFWaWV3UHJvdG90eXBlJSd9LFxuXG5cbiAgJyVEYXRhVmlld1Byb3RvdHlwZSUnOiB7XG4gICAgYnVmZmVyOiBnZXR0ZXIsXG4gICAgYnl0ZUxlbmd0aDogZ2V0dGVyLFxuICAgIGJ5dGVPZmZzZXQ6IGdldHRlcixcbiAgICBjb25zdHJ1Y3RvcjogJ0RhdGFWaWV3JyxcbiAgICBnZXRCaWdJbnQ2NDogZm4sXG4gICAgZ2V0QmlnVWludDY0OiBmbixcbiAgICBnZXRGbG9hdDMyOiBmbixcbiAgICBnZXRGbG9hdDY0OiBmbixcbiAgICBnZXRJbnQ4OiBmbixcbiAgICBnZXRJbnQxNjogZm4sXG4gICAgZ2V0SW50MzI6IGZuLFxuICAgIGdldFVpbnQ4OiBmbixcbiAgICBnZXRVaW50MTY6IGZuLFxuICAgIGdldFVpbnQzMjogZm4sXG4gICAgc2V0QmlnSW50NjQ6IGZuLFxuICAgIHNldEJpZ1VpbnQ2NDogZm4sXG4gICAgc2V0RmxvYXQzMjogZm4sXG4gICAgc2V0RmxvYXQ2NDogZm4sXG4gICAgc2V0SW50ODogZm4sXG4gICAgc2V0SW50MTY6IGZuLFxuICAgIHNldEludDMyOiBmbixcbiAgICBzZXRVaW50ODogZm4sXG4gICAgc2V0VWludDE2OiBmbixcbiAgICBzZXRVaW50MzI6IGZuLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgLy8gQXRvbWljc1xuICBBdG9taWNzOiBmYWxzZSwgLy8gVU5TQUZFIGFuZCBzdXBwcmVzc2VkLlxuXG4gIEpTT046IHtcbiAgICBwYXJzZTogZm4sXG4gICAgc3RyaW5naWZ5OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vICoqKiBDb250cm9sIEFic3RyYWN0aW9uIE9iamVjdHNcblxuICAnJUl0ZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICAvLyBUaGUgJUl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcbiAgICAnQEBpdGVyYXRvcic6IGZufSxcblxuXG4gICclQXN5bmNJdGVyYXRvclByb3RvdHlwZSUnOiB7XG4gICAgLy8gVGhlICVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcbiAgICAnQEBhc3luY0l0ZXJhdG9yJzogZm59LFxuXG5cbiAgJyVJbmVydEdlbmVyYXRvckZ1bmN0aW9uJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmF0b3JGdW5jdGlvbiBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUluZXJ0RnVuY3Rpb24lJyxcbiAgICBwcm90b3R5cGU6ICclR2VuZXJhdG9yJSd9LFxuXG5cbiAgJyVHZW5lcmF0b3IlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYXRvckZ1bmN0aW9uIFByb3RvdHlwZSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGNvbnN0cnVjdG9yOiAnJUluZXJ0R2VuZXJhdG9yRnVuY3Rpb24lJyxcbiAgICBwcm90b3R5cGU6ICclR2VuZXJhdG9yUHJvdG90eXBlJScsXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICAnJUluZXJ0QXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUluZXJ0RnVuY3Rpb24lJyxcbiAgICBwcm90b3R5cGU6ICclQXN5bmNHZW5lcmF0b3IlJ30sXG5cblxuICAnJUFzeW5jR2VuZXJhdG9yJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBc3luY0dlbmVyYXRvckZ1bmN0aW9uIFByb3RvdHlwZSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGNvbnN0cnVjdG9yOiAnJUluZXJ0QXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnLFxuICAgIHByb3RvdHlwZTogJyVBc3luY0dlbmVyYXRvclByb3RvdHlwZSUnLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgJyVHZW5lcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYXRvciBQcm90b3R5cGUgT2JqZWN0XG4gICAgJ1tbUHJvdG9dXSc6ICclSXRlcmF0b3JQcm90b3R5cGUlJyxcbiAgICBjb25zdHJ1Y3RvcjogJyVHZW5lcmF0b3IlJyxcbiAgICBuZXh0OiBmbixcbiAgICByZXR1cm46IGZuLFxuICAgIHRocm93OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gICclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzoge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIEFzeW5jR2VuZXJhdG9yIFByb3RvdHlwZSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJScsXG4gICAgY29uc3RydWN0b3I6ICclQXN5bmNHZW5lcmF0b3IlJyxcbiAgICBuZXh0OiBmbixcbiAgICByZXR1cm46IGZuLFxuICAgIHRocm93OiBmbixcbiAgICAnQEB0b1N0cmluZ1RhZyc6ICdzdHJpbmcnfSxcblxuXG4gIC8vIFRPRE86IFRvIGJlIHJlcGxhY2VkIHdpdGggUHJvbWlzZS5kZWxlZ2F0ZVxuICAvL1xuICAvLyBUaGUgSGFuZGxlZFByb21pc2UgZ2xvYmFsIHZhcmlhYmxlIHNoaW1tZWQgYnkgYEBhZ29yaWMvZXZlbnR1YWwtc2VuZC9zaGltYFxuICAvLyBpbXBsZW1lbnRzIGFuIGluaXRpYWwgdmVyc2lvbiBvZiB0aGUgZXZlbnR1YWwgc2VuZCBzcGVjaWZpY2F0aW9uIGF0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1ldmVudHVhbC1zZW5kXG4gIC8vXG4gIC8vIFdlIHdpbGwgbGlrZWx5IGNoYW5nZSB0aGlzIHRvIGFkZCBhIHByb3BlcnR5IHRvIFByb21pc2UgY2FsbGVkXG4gIC8vIFByb21pc2UuZGVsZWdhdGUgYW5kIHB1dCBzdGF0aWMgbWV0aG9kcyBvbiBpdCwgd2hpY2ggd2lsbCBuZWNlc3NpdGF0ZVxuICAvLyBhbm90aGVyIHdoaXRlbGlzdCBjaGFuZ2UgdG8gdXBkYXRlIHRvIHRoZSBjdXJyZW50IHByb3Bvc2VkIHN0YW5kYXJkLlxuICBIYW5kbGVkUHJvbWlzZToge1xuICAgICdbW1Byb3RvXV0nOiAnUHJvbWlzZScsXG4gICAgYXBwbHlGdW5jdGlvbjogZm4sXG4gICAgYXBwbHlGdW5jdGlvblNlbmRPbmx5OiBmbixcbiAgICBhcHBseU1ldGhvZDogZm4sXG4gICAgYXBwbHlNZXRob2RTZW5kT25seTogZm4sXG4gICAgZ2V0OiBmbixcbiAgICBnZXRTZW5kT25seTogZm4sXG4gICAgcHJvdG90eXBlOiAnJVByb21pc2VQcm90b3R5cGUlJyxcbiAgICByZXNvbHZlOiBmbn0sXG5cblxuICBQcm9taXNlOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgUHJvbWlzZSBDb25zdHJ1Y3RvclxuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgYWxsOiBmbixcbiAgICBhbGxTZXR0bGVkOiBmbixcbiAgICAvLyBUbyB0cmFuc2l0aW9uIGZyb20gYGZhbHNlYCB0byBgZm5gIG9uY2Ugd2UgYWxzbyBoYXZlIGBBZ2dyZWdhdGVFcnJvcmBcbiAgICAvLyBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vaXNzdWVzLzU1MFxuICAgIGFueTogZmFsc2UsIC8vIEVTMjAyMVxuICAgIHByb3RvdHlwZTogJyVQcm9taXNlUHJvdG90eXBlJScsXG4gICAgcmFjZTogZm4sXG4gICAgcmVqZWN0OiBmbixcbiAgICByZXNvbHZlOiBmbixcbiAgICAnQEBzcGVjaWVzJzogZ2V0dGVyfSxcblxuXG4gICclUHJvbWlzZVByb3RvdHlwZSUnOiB7XG4gICAgLy8gUHJvcGVydGllcyBvZiB0aGUgUHJvbWlzZSBQcm90b3R5cGUgT2JqZWN0XG4gICAgY2F0Y2g6IGZuLFxuICAgIGNvbnN0cnVjdG9yOiAnUHJvbWlzZScsXG4gICAgZmluYWxseTogZm4sXG4gICAgdGhlbjogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJyxcbiAgICAvLyBOb24tc3RhbmRhcmQsIHVzZWQgaW4gbm9kZSB0byBwcmV2ZW50IGFzeW5jX2hvb2tzIGZyb20gYnJlYWtpbmdcbiAgICAnVW5pcXVlU3ltYm9sKGFzeW5jX2lkX3N5bWJvbCknOiBhY2Nlc3NvcixcbiAgICAnVW5pcXVlU3ltYm9sKHRyaWdnZXJfYXN5bmNfaWRfc3ltYm9sKSc6IGFjY2Vzc29yLFxuICAgICdVbmlxdWVTeW1ib2woZGVzdHJveWVkKSc6IGFjY2Vzc29yfSxcblxuXG4gICclSW5lcnRBc3luY0Z1bmN0aW9uJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBc3luY0Z1bmN0aW9uIENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclSW5lcnRGdW5jdGlvbiUnLFxuICAgIHByb3RvdHlwZTogJyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSd9LFxuXG5cbiAgJyVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSc6IHtcbiAgICAvLyBQcm9wZXJ0aWVzIG9mIHRoZSBBc3luY0Z1bmN0aW9uIFByb3RvdHlwZSBPYmplY3RcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIGNvbnN0cnVjdG9yOiAnJUluZXJ0QXN5bmNGdW5jdGlvbiUnLFxuICAgICdAQHRvU3RyaW5nVGFnJzogJ3N0cmluZyd9LFxuXG5cbiAgLy8gUmVmbGVjdGlvblxuXG4gIFJlZmxlY3Q6IHtcbiAgICAvLyBUaGUgUmVmbGVjdCBPYmplY3RcbiAgICAvLyBOb3QgYSBmdW5jdGlvbiBvYmplY3QuXG4gICAgYXBwbHk6IGZuLFxuICAgIGNvbnN0cnVjdDogZm4sXG4gICAgZGVmaW5lUHJvcGVydHk6IGZuLFxuICAgIGRlbGV0ZVByb3BlcnR5OiBmbixcbiAgICBnZXQ6IGZuLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZm4sXG4gICAgZ2V0UHJvdG90eXBlT2Y6IGZuLFxuICAgIGhhczogZm4sXG4gICAgaXNFeHRlbnNpYmxlOiBmbixcbiAgICBvd25LZXlzOiBmbixcbiAgICBwcmV2ZW50RXh0ZW5zaW9uczogZm4sXG4gICAgc2V0OiBmbixcbiAgICBzZXRQcm90b3R5cGVPZjogZm4sXG4gICAgJ0BAdG9TdHJpbmdUYWcnOiAnc3RyaW5nJ30sXG5cblxuICBQcm94eToge1xuICAgIC8vIFByb3BlcnRpZXMgb2YgdGhlIFByb3h5IENvbnN0cnVjdG9yXG4gICAgJ1tbUHJvdG9dXSc6ICclRnVuY3Rpb25Qcm90b3R5cGUlJyxcbiAgICByZXZvY2FibGU6IGZufSxcblxuXG4gIC8vIEFwcGVuZGl4IEJcblxuICAvLyBBbm5leCBCOiBBZGRpdGlvbmFsIFByb3BlcnRpZXMgb2YgdGhlIEdsb2JhbCBPYmplY3RcblxuICBlc2NhcGU6IGZuLFxuICB1bmVzY2FwZTogZm4sXG5cbiAgLy8gUHJvcG9zZWRcblxuICAnJVVuaXF1ZUNvbXBhcnRtZW50JSc6IHtcbiAgICAnW1tQcm90b11dJzogJyVGdW5jdGlvblByb3RvdHlwZSUnLFxuICAgIHByb3RvdHlwZTogJyVDb21wYXJ0bWVudFByb3RvdHlwZSUnLFxuICAgIHRvU3RyaW5nOiBmbn0sXG5cblxuICAnJUluZXJ0Q29tcGFydG1lbnQlJzoge1xuICAgICdbW1Byb3RvXV0nOiAnJUZ1bmN0aW9uUHJvdG90eXBlJScsXG4gICAgcHJvdG90eXBlOiAnJUNvbXBhcnRtZW50UHJvdG90eXBlJScsXG4gICAgdG9TdHJpbmc6IGZufSxcblxuXG4gICclQ29tcGFydG1lbnRQcm90b3R5cGUlJzoge1xuICAgIGNvbnN0cnVjdG9yOiAnJUluZXJ0Q29tcGFydG1lbnQlJyxcbiAgICBldmFsdWF0ZTogZm4sXG4gICAgZ2xvYmFsVGhpczogZ2V0dGVyLFxuICAgIG5hbWU6IGdldHRlcixcbiAgICAvLyBTaG91bGQgdGhpcyBiZSBwcm9wb3NlZD9cbiAgICB0b1N0cmluZzogZm4sXG4gICAgaW1wb3J0OiBhc3luY0ZuLFxuICAgIGxvYWQ6IGFzeW5jRm4sXG4gICAgaW1wb3J0Tm93OiBmbixcbiAgICBtb2R1bGU6IGZufSxcblxuXG4gIGxvY2tkb3duOiBmbixcbiAgaGFyZGVuOiBmbixcblxuICAnJUluaXRpYWxHZXRTdGFja1N0cmluZyUnOiBmbn07JGjigI1fb25jZS53aGl0ZWxpc3Qod2hpdGVsaXN0KTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMTddID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgVHlwZUVycm9yLGFzc2lnbixjcmVhdGUsZGVmaW5lUHJvcGVydHksZW50cmllcyxmcmVlemUsb2JqZWN0SGFzT3duUHJvcGVydHksdW5zY29wYWJsZXNTeW1ib2wsbWFrZUV2YWxGdW5jdGlvbixtYWtlRnVuY3Rpb25Db25zdHJ1Y3Rvcixjb25zdGFudFByb3BlcnRpZXMsdW5pdmVyc2FsUHJvcGVydHlOYW1lczskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhc3NpZ25cIiwgWyRo4oCNX2EgPT4gKGFzc2lnbiA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnR5XCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiZW50cmllc1wiLCBbJGjigI1fYSA9PiAoZW50cmllcyA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcIm9iamVjdEhhc093blByb3BlcnR5XCIsIFskaOKAjV9hID0+IChvYmplY3RIYXNPd25Qcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1widW5zY29wYWJsZXNTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKHVuc2NvcGFibGVzU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZS1ldmFsLWZ1bmN0aW9uLmpzXCIsIFtbXCJtYWtlRXZhbEZ1bmN0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlRXZhbEZ1bmN0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZS1mdW5jdGlvbi1jb25zdHJ1Y3Rvci5qc1wiLCBbW1wibWFrZUZ1bmN0aW9uQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJjb25zdGFudFByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGNvbnN0YW50UHJvcGVydGllcyA9ICRo4oCNX2EpXV0sW1widW5pdmVyc2FsUHJvcGVydHlOYW1lc1wiLCBbJGjigI1fYSA9PiAodW5pdmVyc2FsUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFRoZSBob3N0J3Mgb3JkaW5hcnkgZ2xvYmFsIG9iamVjdCBpcyBub3QgcHJvdmlkZWQgYnkgYSBgd2l0aGAgYmxvY2ssIHNvXG4gKiBhc3NpZ25pbmcgdG8gU3ltYm9sLnVuc2NvcGFibGVzIGhhcyBubyBlZmZlY3QuXG4gKiBTaW5jZSB0aGlzIHNoaW0gdXNlcyBgd2l0aGAgYmxvY2tzIHRvIGNyZWF0ZSBhIGNvbmZpbmVkIGxleGljYWwgc2NvcGUgZm9yXG4gKiBndWVzdCBwcm9ncmFtcywgd2UgY2Fubm90IGVtdWxhdGUgdGhlIHByb3BlciBiZWhhdmlvci5cbiAqIFdpdGggdGhpcyBzaGltLCBhc3NpZ25pbmcgU3ltYm9sLnVuc2NvcGFibGVzIGNhdXNlcyB0aGUgZ2l2ZW4gbGV4aWNhbFxuICogbmFtZXMgdG8gZmFsbCB0aHJvdWdoIHRvIHRoZSB0ZXJtaW5hbCBzY29wZSBwcm94eS5cbiAqIEJ1dCwgd2UgY2FuIGluc3RhbGwgdGhpcyBzZXR0ZXIgdG8gcHJldmVudCBhIHByb2dyYW0gZnJvbSBwcm9jZWRpbmcgb25cbiAqIHRoaXMgZmFsc2UgYXNzdW1wdGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZ2xvYmFsT2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBzZXRHbG9iYWxPYmplY3RTeW1ib2xVbnNjb3BhYmxlcz0gIChnbG9iYWxPYmplY3QpPT57XG4gIGRlZmluZVByb3BlcnR5KFxuICAgIGdsb2JhbE9iamVjdCxcbiAgICB1bnNjb3BhYmxlc1N5bWJvbCxcbiAgICBmcmVlemUoXG4gICAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCB7XG4gICAgICAgIHNldDogZnJlZXplKCgpPT4gIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgIGBDYW5ub3Qgc2V0IFN5bWJvbC51bnNjb3BhYmxlcyBvZiBhIENvbXBhcnRtZW50J3MgZ2xvYmFsVGhpc2ApO1xuXG4gICAgICAgICB9KSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9KSkpO1xuXG5cblxuIH07XG5cbi8qKlxuICogc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzKClcbiAqIEluaXRpYWxpemVzIGEgbmV3IGdsb2JhbCBvYmplY3QgdXNpbmcgYSBwcm9jZXNzIHNpbWlsYXIgdG8gRUNNQSBzcGVjaWZpY2F0aW9uc1xuICogKFNldERlZmF1bHRHbG9iYWxCaW5kaW5ncykuIFRoaXMgcHJvY2VzcyBpcyBzcGxpdCBiZXR3ZWVuIHRoaXMgZnVuY3Rpb24gYW5kXG4gKiBgc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXNgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqLyRo4oCNX29uY2Uuc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMoc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMpO1xuY29uc3QgICAgICAgIHNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcz0gIChnbG9iYWxPYmplY3QpPT57XG4gIGZvciggY29uc3QgW25hbWUsIGNvbnN0YW50XW9mICBlbnRyaWVzKGNvbnN0YW50UHJvcGVydGllcykpIHtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsIG5hbWUsIHtcbiAgICAgIHZhbHVlOiBjb25zdGFudCxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX0pO1xuXG4gICB9XG4gfTtcblxuLyoqXG4gKiBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllcygpXG4gKiBDcmVhdGUgbmV3IGdsb2JhbCBvYmplY3QgdXNpbmcgYSBwcm9jZXNzIHNpbWlsYXIgdG8gRUNNQSBzcGVjaWZpY2F0aW9uc1xuICogKHBvcnRpb25zIG9mIFNldFJlYWxtR2xvYmFsT2JqZWN0IGFuZCBTZXREZWZhdWx0R2xvYmFsQmluZGluZ3MpLlxuICogYG5ld0dsb2JhbFByb3BlcnR5TmFtZXNgIHNob3VsZCBiZSBlaXRoZXIgYGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzYCBvclxuICogYHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXNgLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBnbG9iYWxPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbTFcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbTEuaW50cmluc2ljc1xuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtMS5uZXdHbG9iYWxQcm9wZXJ0eU5hbWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbTEubWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3JcbiAqIEBwYXJhbSB7KE9iamVjdCkgPT4gdm9pZH0gcGFyYW0xLm1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uXG4gKi8kaOKAjV9vbmNlLnNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllcyhzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXMpO1xuY29uc3QgICAgICAgIHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzPSAgKFxuICBnbG9iYWxPYmplY3QsXG4gIHtcbiAgICBpbnRyaW5zaWNzLFxuICAgIG5ld0dsb2JhbFByb3BlcnR5TmFtZXMsXG4gICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IsXG4gICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb259KT0+XG5cbiAgICAge1xuICBmb3IoIGNvbnN0IFtuYW1lLCBpbnRyaW5zaWNOYW1lXW9mICBlbnRyaWVzKHVuaXZlcnNhbFByb3BlcnR5TmFtZXMpKSB7XG4gICAgaWYoIG9iamVjdEhhc093blByb3BlcnR5KGludHJpbnNpY3MsIGludHJpbnNpY05hbWUpKSB7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsIG5hbWUsIHtcbiAgICAgICAgdmFsdWU6IGludHJpbnNpY3NbaW50cmluc2ljTmFtZV0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgICAgfVxuICAgfVxuXG4gIGZvciggY29uc3QgW25hbWUsIGludHJpbnNpY05hbWVdb2YgIGVudHJpZXMobmV3R2xvYmFsUHJvcGVydHlOYW1lcykpIHtcbiAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoaW50cmluc2ljcywgaW50cmluc2ljTmFtZSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbE9iamVjdCwgbmFtZSwge1xuICAgICAgICB2YWx1ZTogaW50cmluc2ljc1tpbnRyaW5zaWNOYW1lXSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWV9KTtcblxuICAgICB9XG4gICB9XG5cbiAgY29uc3QgcGVyQ29tcGFydG1lbnRHbG9iYWxzPSAge1xuICAgIGdsb2JhbFRoaXM6IGdsb2JhbE9iamVjdH07XG5cblxuICBwZXJDb21wYXJ0bWVudEdsb2JhbHMuQ29tcGFydG1lbnQ9ICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcihcbiAgICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcixcbiAgICBpbnRyaW5zaWNzLFxuICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuXG4gIC8vIFRPRE8gVGhlc2Ugc2hvdWxkIHN0aWxsIGJlIHRhbWVkIGFjY29yZGluZyB0byB0aGUgd2hpdGVsaXN0IGJlZm9yZVxuICAvLyBiZWluZyBtYWRlIGF2YWlsYWJsZS5cbiAgZm9yKCBjb25zdCBbbmFtZSwgdmFsdWVdb2YgIGVudHJpZXMocGVyQ29tcGFydG1lbnRHbG9iYWxzKSkge1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbE9iamVjdCwgbmFtZSwge1xuICAgICAgdmFsdWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgICBpZiggdHlwZW9mIHZhbHVlPT09ICAnZnVuY3Rpb24nKSB7XG4gICAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbih2YWx1ZSk7XG4gICAgIH1cbiAgIH1cbiB9O1xuXG4vKipcbiAqIHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMoKVxuICogU2V0IHRoZSBldmFsIGFuZCB0aGUgRnVuY3Rpb24gZXZhbHVhdG9yIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHdpdGggZ2l2ZW4gZXZhbFRhbWluZyBwb2xpY3kuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGdsb2JhbE9iamVjdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXZhbHVhdG9yXG4gKiBAcGFyYW0geyhPYmplY3QpID0+IHZvaWR9IG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uXG4gKi8kaOKAjV9vbmNlLnNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzKHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzKTtcbmNvbnN0ICAgICAgICBzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzPSAgKFxuICBnbG9iYWxPYmplY3QsXG4gIGV2YWx1YXRvcixcbiAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24pPT5cbiAgICAge1xuICB7XG4gICAgY29uc3QgZj0gIG1ha2VFdmFsRnVuY3Rpb24oZXZhbHVhdG9yKTtcbiAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbihmKTtcbiAgICBkZWZpbmVQcm9wZXJ0eShnbG9iYWxPYmplY3QsICdldmFsJywge1xuICAgICAgdmFsdWU6IGYsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgIH1cbiAge1xuICAgIGNvbnN0IGY9ICBtYWtlRnVuY3Rpb25Db25zdHJ1Y3RvcihldmFsdWF0b3IpO1xuICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKGYpO1xuICAgIGRlZmluZVByb3BlcnR5KGdsb2JhbE9iamVjdCwgJ0Z1bmN0aW9uJywge1xuICAgICAgdmFsdWU6IGYsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgIH1cbiB9OyRo4oCNX29uY2Uuc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycyhzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMThdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUmVmZXJlbmNlRXJyb3IsVHlwZUVycm9yLE1hcCxTZXQsYXJyYXlKb2luLGFycmF5TWFwLGFycmF5UHVzaCxjcmVhdGUsZnJlZXplLG1hcEdldCxtYXBIYXMsbWFwU2V0LHNldEFkZCxwcm9taXNlQ2F0Y2gscHJvbWlzZVRoZW4sdmFsdWVzLHdlYWttYXBHZXQsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiUmVmZXJlbmNlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFJlZmVyZW5jZUVycm9yID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiTWFwXCIsIFskaOKAjV9hID0+IChNYXAgPSAkaOKAjV9hKV1dLFtcIlNldFwiLCBbJGjigI1fYSA9PiAoU2V0ID0gJGjigI1fYSldXSxbXCJhcnJheUpvaW5cIiwgWyRo4oCNX2EgPT4gKGFycmF5Sm9pbiA9ICRo4oCNX2EpXV0sW1wiYXJyYXlNYXBcIiwgWyRo4oCNX2EgPT4gKGFycmF5TWFwID0gJGjigI1fYSldXSxbXCJhcnJheVB1c2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5UHVzaCA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJtYXBHZXRcIiwgWyRo4oCNX2EgPT4gKG1hcEdldCA9ICRo4oCNX2EpXV0sW1wibWFwSGFzXCIsIFskaOKAjV9hID0+IChtYXBIYXMgPSAkaOKAjV9hKV1dLFtcIm1hcFNldFwiLCBbJGjigI1fYSA9PiAobWFwU2V0ID0gJGjigI1fYSldXSxbXCJzZXRBZGRcIiwgWyRo4oCNX2EgPT4gKHNldEFkZCA9ICRo4oCNX2EpXV0sW1wicHJvbWlzZUNhdGNoXCIsIFskaOKAjV9hID0+IChwcm9taXNlQ2F0Y2ggPSAkaOKAjV9hKV1dLFtcInByb21pc2VUaGVuXCIsIFskaOKAjV9hID0+IChwcm9taXNlVGhlbiA9ICRo4oCNX2EpXV0sW1widmFsdWVzXCIsIFskaOKAjV9hID0+ICh2YWx1ZXMgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgZGV0YWlsczogZCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuY29uc3Qgbm9vcD0gICgpPT4gIHsgfTtcblxuLy8gYG1ha2VBbGlhc2AgY29uc3RydWN0cyBjb21wYXJ0bWVudCBzcGVjaWZpZXIgdHVwbGVzIGZvciB0aGUgYGFsaWFzZXNgXG4vLyBwcml2YXRlIGZpZWxkIG9mIGNvbXBhcnRtZW50cy5cbi8vIFRoZXNlIGFsaWFzZXMgYWxsb3cgYSBjb21wYXJ0bWVudCB0byBhbGlhcyBhbiBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyIHRvIGFcbi8vIG1vZHVsZSBzcGVjaWZpZXIgaW4gYW4gZXh0ZXJuYWwgY29tcGFydG1lbnQsIGFuZCBhbHNvIHRvIGNyZWF0ZSBpbnRlcm5hbFxuLy8gYWxpYXNlcy5cbi8vIEJvdGggYXJlIGZhY2lsaXRhdGVkIGJ5IHRoZSBtb2R1bGVNYXAgQ29tcGFydG1lbnQgY29uc3RydWN0b3Igb3B0aW9uLlxuY29uc3QgICAgICAgIG1ha2VBbGlhcz0gIChjb21wYXJ0bWVudCwgc3BlY2lmaWVyKT0+XG4gIGZyZWV6ZSh7XG4gICAgY29tcGFydG1lbnQsXG4gICAgc3BlY2lmaWVyfSk7XG5cblxuLy8gYHJlc29sdmVBbGxgIHByZS1jb21wdXRlcyByZXNvbHV0aW9ucyBvZiBhbGwgaW1wb3J0cyB3aXRoaW4gdGhlIGNvbXBhcnRtZW50XG4vLyBpbiB3aGljaCBhIG1vZHVsZSB3YXMgbG9hZGVkLlxuJGjigI1fb25jZS5tYWtlQWxpYXMobWFrZUFsaWFzKTtjb25zdCByZXNvbHZlQWxsPShpbXBvcnRzLHJlc29sdmVIb29rLGZ1bGxSZWZlcnJlclNwZWNpZmllcik9PntcbiAgY29uc3QgcmVzb2x2ZWRJbXBvcnRzPSAgY3JlYXRlKG51bGwpO1xuICBmb3IoIGNvbnN0IGltcG9ydFNwZWNpZmllciBvZiBpbXBvcnRzKSB7XG4gICAgY29uc3QgZnVsbFNwZWNpZmllcj0gIHJlc29sdmVIb29rKGltcG9ydFNwZWNpZmllciwgZnVsbFJlZmVycmVyU3BlY2lmaWVyKTtcbiAgICByZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXT0gIGZ1bGxTcGVjaWZpZXI7XG4gICB9XG4gIHJldHVybiBmcmVlemUocmVzb2x2ZWRJbXBvcnRzKTtcbiB9O1xuXG5jb25zdCBsb2FkUmVjb3JkPSAgYXN5bmMoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZVNwZWNpZmllcixcbiAgc3RhdGljTW9kdWxlUmVjb3JkLFxuICBwZW5kaW5nSm9icyxcbiAgbW9kdWxlTG9hZHMsXG4gIGVycm9ycyxcbiAgaW1wb3J0TWV0YSk9PlxuICAgICB7XG4gIGNvbnN0IHsgcmVzb2x2ZUhvb2ssIG1vZHVsZVJlY29yZHN9PSAgIHdlYWttYXBHZXQoXG4gICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgIGNvbXBhcnRtZW50KTtcblxuXG4gIC8vIHJlc29sdmUgYWxsIGltcG9ydHMgcmVsYXRpdmUgdG8gdGhpcyByZWZlcnJlciBtb2R1bGUuXG4gIGNvbnN0IHJlc29sdmVkSW1wb3J0cz0gIHJlc29sdmVBbGwoXG4gICAgc3RhdGljTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4gICAgcmVzb2x2ZUhvb2ssXG4gICAgbW9kdWxlU3BlY2lmaWVyKTtcblxuICBjb25zdCBtb2R1bGVSZWNvcmQ9ICBmcmVlemUoe1xuICAgIGNvbXBhcnRtZW50LFxuICAgIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgIGltcG9ydE1ldGF9KTtcblxuXG4gIC8vIEVucXVldWUgam9icyB0byBsb2FkIHRoaXMgbW9kdWxlJ3Mgc2hhbGxvdyBkZXBlbmRlbmNpZXMuXG4gIGZvciggY29uc3QgZnVsbFNwZWNpZmllciBvZiB2YWx1ZXMocmVzb2x2ZWRJbXBvcnRzKSkge1xuICAgIC8vIEJlaG9sZDogcmVjdXJzaW9uLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIGNvbnN0IGRlcGVuZGVuY3lMb2FkZWQ9ICBtZW1vaXplZExvYWRXaXRoRXJyb3JBbm5vdGF0aW9uKFxuICAgICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgZnVsbFNwZWNpZmllcixcbiAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgbW9kdWxlTG9hZHMsXG4gICAgICBlcnJvcnMpO1xuXG4gICAgc2V0QWRkKFxuICAgICAgcGVuZGluZ0pvYnMsXG4gICAgICBwcm9taXNlVGhlbihkZXBlbmRlbmN5TG9hZGVkLCBub29wLCAoZXJyb3IpPT57XG4gICAgICAgIGFycmF5UHVzaChlcnJvcnMsIGVycm9yKTtcbiAgICAgICB9KSk7XG5cbiAgIH1cblxuICAvLyBNZW1vaXplLlxuICBtYXBTZXQobW9kdWxlUmVjb3JkcywgbW9kdWxlU3BlY2lmaWVyLCBtb2R1bGVSZWNvcmQpO1xuICByZXR1cm4gbW9kdWxlUmVjb3JkO1xuIH07XG5cbmNvbnN0IGxvYWRXaXRob3V0RXJyb3JBbm5vdGF0aW9uPSAgYXN5bmMoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZVNwZWNpZmllcixcbiAgcGVuZGluZ0pvYnMsXG4gIG1vZHVsZUxvYWRzLFxuICBlcnJvcnMpPT5cbiAgICAge1xuICBjb25zdCB7IGltcG9ydEhvb2ssIG1vZHVsZU1hcCwgbW9kdWxlTWFwSG9vaywgbW9kdWxlUmVjb3Jkc309ICAgd2Vha21hcEdldChcbiAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgY29tcGFydG1lbnQpO1xuXG5cbiAgLy8gRm9sbG93IG1vZHVsZU1hcCwgb3IgbW9kdWxlTWFwSG9vayBpZiBwcmVzZW50LlxuICBsZXQgYWxpYXNOYW1lc3BhY2U9ICBtb2R1bGVNYXBbbW9kdWxlU3BlY2lmaWVyXTtcbiAgaWYoIGFsaWFzTmFtZXNwYWNlPT09ICB1bmRlZmluZWQmJiAgbW9kdWxlTWFwSG9vayE9PSAgdW5kZWZpbmVkKSB7XG4gICAgYWxpYXNOYW1lc3BhY2U9ICBtb2R1bGVNYXBIb29rKG1vZHVsZVNwZWNpZmllcik7XG4gICB9XG4gIGlmKCB0eXBlb2YgYWxpYXNOYW1lc3BhY2U9PT0gICdzdHJpbmcnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGQgYENhbm5vdCBtYXAgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSB0byAke3EoXG4gICAgICAgIGFsaWFzTmFtZXNwYWNlKVxuICAgICAgICB9IGluIHBhcmVudCBjb21wYXJ0bWVudCwgbm90IHlldCBpbXBsZW1lbnRlZGAsXG4gICAgICBUeXBlRXJyb3IpO1xuXG4gICB9ZWxzZSBpZiggYWxpYXNOYW1lc3BhY2UhPT0gIHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGFsaWFzPSAgd2Vha21hcEdldChtb2R1bGVBbGlhc2VzLCBhbGlhc05hbWVzcGFjZSk7XG4gICAgaWYoIGFsaWFzPT09ICB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgZCBgQ2Fubm90IG1hcCBtb2R1bGUgJHtxKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcilcbiAgICAgICAgICB9IGJlY2F1c2UgdGhlIHZhbHVlIGlzIG5vdCBhIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSwgb3IgaXMgZnJvbSBhbm90aGVyIHJlYWxtYCxcbiAgICAgICAgUmVmZXJlbmNlRXJyb3IpO1xuXG4gICAgIH1cbiAgICAvLyBCZWhvbGQ6IHJlY3Vyc2lvbi5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICBjb25zdCBhbGlhc1JlY29yZD0gIGF3YWl0IG1lbW9pemVkTG9hZFdpdGhFcnJvckFubm90YXRpb24oXG4gICAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgICBtb2R1bGVBbGlhc2VzLFxuICAgICAgYWxpYXMuY29tcGFydG1lbnQsXG4gICAgICBhbGlhcy5zcGVjaWZpZXIsXG4gICAgICBwZW5kaW5nSm9icyxcbiAgICAgIG1vZHVsZUxvYWRzLFxuICAgICAgZXJyb3JzKTtcblxuICAgIG1hcFNldChtb2R1bGVSZWNvcmRzLCBtb2R1bGVTcGVjaWZpZXIsIGFsaWFzUmVjb3JkKTtcbiAgICByZXR1cm4gYWxpYXNSZWNvcmQ7XG4gICB9XG5cbiAgaWYoIG1hcEhhcyhtb2R1bGVSZWNvcmRzLCBtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIG1hcEdldChtb2R1bGVSZWNvcmRzLCBtb2R1bGVTcGVjaWZpZXIpO1xuICAgfVxuXG4gIGNvbnN0IHN0YXRpY01vZHVsZVJlY29yZD0gIGF3YWl0IGltcG9ydEhvb2sobW9kdWxlU3BlY2lmaWVyKTtcblxuICBpZiggc3RhdGljTW9kdWxlUmVjb3JkPT09ICBudWxsfHwgIHR5cGVvZiBzdGF0aWNNb2R1bGVSZWNvcmQhPT0gICdvYmplY3QnKSB7XG4gICAgRmFpbCBgaW1wb3J0SG9vayBtdXN0IHJldHVybiBhIHByb21pc2UgZm9yIGFuIG9iamVjdCwgZm9yIG1vZHVsZSAke3EoXG4gICAgICBtb2R1bGVTcGVjaWZpZXIpXG4gICAgICB9IGluIGNvbXBhcnRtZW50ICR7cShjb21wYXJ0bWVudC5uYW1lKX1gO1xuICAgfVxuXG4gIGlmKCBzdGF0aWNNb2R1bGVSZWNvcmQucmVjb3JkIT09ICB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21wYXJ0bWVudDogYWxpYXNDb21wYXJ0bWVudD0gIGNvbXBhcnRtZW50LFxuICAgICAgc3BlY2lmaWVyOiBhbGlhc1NwZWNpZmllcj0gIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIHJlY29yZDogYWxpYXNNb2R1bGVSZWNvcmQsXG4gICAgICBpbXBvcnRNZXRhfT1cbiAgICAgICAgc3RhdGljTW9kdWxlUmVjb3JkO1xuXG4gICAgY29uc3QgYWxpYXNSZWNvcmQ9ICBhd2FpdCBsb2FkUmVjb3JkKFxuICAgICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIGFsaWFzQ29tcGFydG1lbnQsXG4gICAgICBhbGlhc1NwZWNpZmllcixcbiAgICAgIGFsaWFzTW9kdWxlUmVjb3JkLFxuICAgICAgcGVuZGluZ0pvYnMsXG4gICAgICBtb2R1bGVMb2FkcyxcbiAgICAgIGVycm9ycyxcbiAgICAgIGltcG9ydE1ldGEpO1xuXG4gICAgbWFwU2V0KG1vZHVsZVJlY29yZHMsIG1vZHVsZVNwZWNpZmllciwgYWxpYXNSZWNvcmQpO1xuICAgIHJldHVybiBhbGlhc1JlY29yZDtcbiAgIH1cblxuICByZXR1cm4gbG9hZFJlY29yZChcbiAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgbW9kdWxlQWxpYXNlcyxcbiAgICBjb21wYXJ0bWVudCxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgc3RhdGljTW9kdWxlUmVjb3JkLFxuICAgIHBlbmRpbmdKb2JzLFxuICAgIG1vZHVsZUxvYWRzLFxuICAgIGVycm9ycyk7XG5cbiB9O1xuXG5jb25zdCBtZW1vaXplZExvYWRXaXRoRXJyb3JBbm5vdGF0aW9uPSAgYXN5bmMoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZVNwZWNpZmllcixcbiAgcGVuZGluZ0pvYnMsXG4gIG1vZHVsZUxvYWRzLFxuICBlcnJvcnMpPT5cbiAgICAge1xuICBjb25zdCB7IG5hbWU6IGNvbXBhcnRtZW50TmFtZX09ICAgd2Vha21hcEdldChcbiAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgY29tcGFydG1lbnQpO1xuXG5cbiAgLy8gUHJldmVudCBkYXRhLWxvY2sgZnJvbSByZWN1cnNpb24gaW50byBicmFuY2hlcyB2aXNpdGVkIGluIGRlcGVuZGVudCBsb2Fkcy5cbiAgbGV0IGNvbXBhcnRtZW50TG9hZGluZz0gIG1hcEdldChtb2R1bGVMb2FkcywgY29tcGFydG1lbnQpO1xuICBpZiggY29tcGFydG1lbnRMb2FkaW5nPT09ICB1bmRlZmluZWQpIHtcbiAgICBjb21wYXJ0bWVudExvYWRpbmc9ICBuZXcgTWFwKCk7XG4gICAgbWFwU2V0KG1vZHVsZUxvYWRzLCBjb21wYXJ0bWVudCwgY29tcGFydG1lbnRMb2FkaW5nKTtcbiAgIH1cbiAgbGV0IG1vZHVsZUxvYWRpbmc9ICBtYXBHZXQoY29tcGFydG1lbnRMb2FkaW5nLCBtb2R1bGVTcGVjaWZpZXIpO1xuICBpZiggbW9kdWxlTG9hZGluZyE9PSAgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1vZHVsZUxvYWRpbmc7XG4gICB9XG5cbiAgbW9kdWxlTG9hZGluZz0gIHByb21pc2VDYXRjaChcbiAgICBsb2FkV2l0aG91dEVycm9yQW5ub3RhdGlvbihcbiAgICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgbW9kdWxlTG9hZHMsXG4gICAgICBlcnJvcnMpLFxuXG4gICAgKGVycm9yKT0+e1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGFzc2VydC5ub3RlKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgZCBgJHtlcnJvci5tZXNzYWdlfSwgbG9hZGluZyAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gY29tcGFydG1lbnQgJHtxKFxuICAgICAgICAgIGNvbXBhcnRtZW50TmFtZSlcbiAgICAgICAgICB9YCk7XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgICB9KTtcblxuXG4gIG1hcFNldChjb21wYXJ0bWVudExvYWRpbmcsIG1vZHVsZVNwZWNpZmllciwgbW9kdWxlTG9hZGluZyk7XG5cbiAgcmV0dXJuIG1vZHVsZUxvYWRpbmc7XG4gfTtcblxuLypcbiAqIGBsb2FkYCBhc3luY2hyb25vdXNseSBnYXRoZXJzIHRoZSBgU3RhdGljTW9kdWxlUmVjb3JkYHMgZm9yIGEgbW9kdWxlIGFuZCBpdHNcbiAqIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzLlxuICogVGhlIG1vZHVsZSByZWNvcmRzIHJlZmVyIHRvIGVhY2ggb3RoZXIgYnkgYSByZWZlcmVuY2UgdG8gdGhlIGRlcGVuZGVuY3knc1xuICogY29tcGFydG1lbnQgYW5kIHRoZSBzcGVjaWZpZXIgb2YgdGhlIG1vZHVsZSB3aXRoaW4gaXRzIG93biBjb21wYXJ0bWVudC5cbiAqIFRoaXMgZ3JhcGggaXMgdGhlbiByZWFkeSB0byBiZSBzeW5jaHJvbm91c2x5IGxpbmtlZCBhbmQgZXhlY3V0ZWQuXG4gKi9cbmNvbnN0ICAgICAgICBsb2FkPSAgYXN5bmMoXG4gIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZVNwZWNpZmllcik9PlxuICAgICB7XG4gIGNvbnN0IHsgbmFtZTogY29tcGFydG1lbnROYW1lfT0gICB3ZWFrbWFwR2V0KFxuICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICBjb21wYXJ0bWVudCk7XG5cblxuICAvKiogQHR5cGUge1NldDxQcm9taXNlPHVuZGVmaW5lZD4+fSAqL1xuICBjb25zdCBwZW5kaW5nSm9icz0gIG5ldyBTZXQoKTtcbiAgLyoqIEB0eXBlIHtNYXA8T2JqZWN0LCBNYXA8c3RyaW5nLCBQcm9taXNlPFJlY29yZD4+fSAqL1xuICBjb25zdCBtb2R1bGVMb2Fkcz0gIG5ldyBNYXAoKTtcbiAgLyoqIEB0eXBlIHtBcnJheTxFcnJvcj59ICovXG4gIGNvbnN0IGVycm9ycz0gIFtdO1xuXG4gIGNvbnN0IGRlcGVuZGVuY3lMb2FkZWQ9ICBtZW1vaXplZExvYWRXaXRoRXJyb3JBbm5vdGF0aW9uKFxuICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICBtb2R1bGVBbGlhc2VzLFxuICAgIGNvbXBhcnRtZW50LFxuICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICBwZW5kaW5nSm9icyxcbiAgICBtb2R1bGVMb2FkcyxcbiAgICBlcnJvcnMpO1xuXG4gIHNldEFkZChcbiAgICBwZW5kaW5nSm9icyxcbiAgICBwcm9taXNlVGhlbihkZXBlbmRlbmN5TG9hZGVkLCBub29wLCAoZXJyb3IpPT57XG4gICAgICBhcnJheVB1c2goZXJyb3JzLCBlcnJvcik7XG4gICAgIH0pKTtcblxuXG4gIC8vIERyYWluIHBlbmRpbmcgam9icyBxdWV1ZS5cbiAgLy8gRWFjaCBqb2IgaXMgYSBwcm9taXNlIGZvciB1bmRlZmluZWQsIHJlZ2FyZGxlc3Mgb2Ygc3VjY2VzcyBvciBmYWlsdXJlLlxuICAvLyBCZWZvcmUgd2UgYWRkIGEgam9iIHRvIHRoZSBxdWV1ZSwgd2UgY2F0Y2ggYW55IGVycm9yIGFuZCBwdXNoIGl0IGludG8gdGhlXG4gIC8vIGBlcnJvcnNgIGFjY3VtdWxhdG9yLlxuICBmb3IoIGNvbnN0IGpvYiBvZiBwZW5kaW5nSm9icykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgYXdhaXQgam9iO1xuICAgfVxuXG4gIC8vIFRocm93IGFuIGFnZ3JlZ2F0ZSBlcnJvciBpZiB0aGVyZSB3ZXJlIGFueSBlcnJvcnMuXG4gIGlmKCBlcnJvcnMubGVuZ3RoPiAgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgYEZhaWxlZCB0byBsb2FkIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgIGNvbXBhcnRtZW50TmFtZSlcbiAgICAgICAgfSAoJHtlcnJvcnMubGVuZ3RofSB1bmRlcmx5aW5nIGZhaWx1cmVzOiAke2FycmF5Sm9pbihcbiAgICAgICAgYXJyYXlNYXAoZXJyb3JzLCAoZXJyb3IpPT5lcnJvci5tZXNzYWdlKSxcbiAgICAgICAgJywgJylcbiAgICAgICAgfWApO1xuXG4gICB9XG4gfTskaOKAjV9vbmNlLmxvYWQobG9hZCk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzE5XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VBbGlhcyxQcm94eSxUeXBlRXJyb3IsY3JlYXRlLGZyZWV6ZSxtYXBHZXQsbWFwSGFzLG1hcFNldCxvd25LZXlzLHJlZmxlY3RHZXQscmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcixyZWZsZWN0SGFzLHJlZmxlY3RJc0V4dGVuc2libGUscmVmbGVjdFByZXZlbnRFeHRlbnNpb25zLHdlYWttYXBTZXQsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vbW9kdWxlLWxvYWQuanNcIiwgW1tcIm1ha2VBbGlhc1wiLCBbJGjigI1fYSA9PiAobWFrZUFsaWFzID0gJGjigI1fYSldXV1dLFtcIi4vY29tbW9ucy5qc1wiLCBbW1wiUHJveHlcIiwgWyRo4oCNX2EgPT4gKFByb3h5ID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJtYXBHZXRcIiwgWyRo4oCNX2EgPT4gKG1hcEdldCA9ICRo4oCNX2EpXV0sW1wibWFwSGFzXCIsIFskaOKAjV9hID0+IChtYXBIYXMgPSAkaOKAjV9hKV1dLFtcIm1hcFNldFwiLCBbJGjigI1fYSA9PiAobWFwU2V0ID0gJGjigI1fYSldXSxbXCJvd25LZXlzXCIsIFskaOKAjV9hID0+IChvd25LZXlzID0gJGjigI1fYSldXSxbXCJyZWZsZWN0R2V0XCIsIFskaOKAjV9hID0+IChyZWZsZWN0R2V0ID0gJGjigI1fYSldXSxbXCJyZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChyZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJyZWZsZWN0SGFzXCIsIFskaOKAjV9hID0+IChyZWZsZWN0SGFzID0gJGjigI1fYSldXSxbXCJyZWZsZWN0SXNFeHRlbnNpYmxlXCIsIFskaOKAjV9hID0+IChyZWZsZWN0SXNFeHRlbnNpYmxlID0gJGjigI1fYSldXSxbXCJyZWZsZWN0UHJldmVudEV4dGVuc2lvbnNcIiwgWyRo4oCNX2EgPT4gKHJlZmxlY3RQcmV2ZW50RXh0ZW5zaW9ucyA9ICRo4oCNX2EpXV0sW1wid2Vha21hcFNldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcFNldCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLy8gYGRlZmVyRXhwb3J0c2AgY3JlYXRlcyBhIG1vZHVsZSdzIGV4cG9ydHMgcHJveHksIHByb3hpZWQgZXhwb3J0cywgYW5kXG4vLyBhY3RpdmF0b3IuXG4vLyBBIGBDb21wYXJ0bWVudGAgY2FuIGNyZWF0ZSBhIG1vZHVsZSBmb3IgYW55IG1vZHVsZSBzcGVjaWZpZXIsIHJlZ2FyZGxlc3Mgb2Zcbi8vIHdoZXRoZXIgaXQgaXMgbG9hZGFibGUgb3IgZXhlY3V0YWJsZSwgYW5kIHVzZSB0aGF0IG9iamVjdCBhcyBhIHRva2VuIHRoYXRcbi8vIGNhbiBiZSBmZWQgaW50byBhbm90aGVyIGNvbXBhcnRtZW50J3MgbW9kdWxlIG1hcC5cbi8vIE9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBtb2R1bGUgaGFzIGJlZW4gYW5hbHl6ZWQgaXMgaXQgcG9zc2libGUgZm9yIHRoZVxuLy8gbW9kdWxlIG5hbWVzcGFjZSBwcm94eSB0byBiZWhhdmUgcHJvcGVybHksIHNvIGl0IHRocm93cyBleGNlcHRpb25zIHVudGlsXG4vLyBhZnRlciB0aGUgY29tcGFydG1lbnQgaGFzIGJlZ3VuIGV4ZWN1dGluZyB0aGUgbW9kdWxlLlxuLy8gVGhlIG1vZHVsZSBpbnN0YW5jZSBtdXN0IGZyZWV6ZSB0aGUgcHJveGllZCBleHBvcnRzIGFuZCBhY3RpdmF0ZSB0aGUgZXhwb3J0c1xuLy8gcHJveHkgYmVmb3JlIGV4ZWN1dGluZyB0aGUgbW9kdWxlLlxuLy9cbi8vIFRoZSBtb2R1bGUgZXhwb3J0cyBwcm94eSdzIGJlaGF2aW9yIGRpZmZlcnMgZnJvbSB0aGUgRUNNQVNjcmlwdCAyNjJcbi8vIHNwZWNpZmljYXRpb24gZm9yIFwibW9kdWxlIG5hbWVzcGFjZSBleG90aWMgb2JqZWN0c1wiIG9ubHkgaW4gdGhhdCBhY2NvcmRpbmdcbi8vIHRvIHRoZSBzcGVjaWZpY2F0aW9uIHZhbHVlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGhhdmUgYSBub24td3JpdGFibGUgXCJ2YWx1ZVwiXG4vLyBhbmQgdGhpcyBpbXBsZW1lbnRhdGlvbiBtb2RlbHMgYWxsIHByb3BlcnRpZXMgd2l0aCBhY2Nlc3NvcnMuXG4vL1xuLy8gaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1tb2R1bGUtbmFtZXNwYWNlLWV4b3RpYy1vYmplY3RzXG4vL1xuY29uc3QgICAgICAgIGRlZmVyRXhwb3J0cz0gICgpPT4gIHtcbiAgbGV0IGFjdGl2ZT0gIGZhbHNlO1xuICBjb25zdCBwcm94aWVkRXhwb3J0cz0gIGNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgYWN0aXZhdGUoKSB7XG4gICAgICBhY3RpdmU9ICB0cnVlO1xuICAgICB9LFxuICAgIHByb3hpZWRFeHBvcnRzLFxuICAgIGV4cG9ydHNQcm94eTogbmV3IFByb3h5KHByb3hpZWRFeHBvcnRzLCB7XG4gICAgICBnZXQoX3RhcmdldCwgbmFtZSwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgIGBDYW5ub3QgZ2V0IHByb3BlcnR5ICR7cShcbiAgICAgICAgICAgICAgbmFtZSlcbiAgICAgICAgICAgICAgfSBvZiBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UsIHRoZSBtb2R1bGUgaGFzIG5vdCB5ZXQgYmVndW4gdG8gZXhlY3V0ZWApO1xuXG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZsZWN0R2V0KHByb3hpZWRFeHBvcnRzLCBuYW1lLCByZWNlaXZlcik7XG4gICAgICAgfSxcbiAgICAgIHNldChfdGFyZ2V0LCBuYW1lLCBfdmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgYENhbm5vdCBzZXQgcHJvcGVydHkgJHtxKG5hbWUpfSBvZiBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2VgKTtcblxuICAgICAgIH0sXG4gICAgICBoYXMoX3RhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiggIWFjdGl2ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgYENhbm5vdCBjaGVjayBwcm9wZXJ0eSAke3EoXG4gICAgICAgICAgICAgIG5hbWUpXG4gICAgICAgICAgICAgIH0sIHRoZSBtb2R1bGUgaGFzIG5vdCB5ZXQgYmVndW4gdG8gZXhlY3V0ZWApO1xuXG4gICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZsZWN0SGFzKHByb3hpZWRFeHBvcnRzLCBuYW1lKTtcbiAgICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHkoX3RhcmdldCwgbmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICBgQ2Fubm90IGRlbGV0ZSBwcm9wZXJ0eSAke3EobmFtZSl9cyBvZiBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2VgKTtcblxuICAgICAgIH0sXG4gICAgICBvd25LZXlzKF90YXJnZXQpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBlbnVtZXJhdGUga2V5cywgdGhlIG1vZHVsZSBoYXMgbm90IHlldCBiZWd1biB0byBleGVjdXRlJyk7XG5cbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG93bktleXMocHJveGllZEV4cG9ydHMpO1xuICAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3RhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiggIWFjdGl2ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgYENhbm5vdCBnZXQgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgJHtxKFxuICAgICAgICAgICAgICBuYW1lKVxuICAgICAgICAgICAgICB9LCB0aGUgbW9kdWxlIGhhcyBub3QgeWV0IGJlZ3VuIHRvIGV4ZWN1dGVgKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmbGVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm94aWVkRXhwb3J0cywgbmFtZSk7XG4gICAgICAgfSxcbiAgICAgIHByZXZlbnRFeHRlbnNpb25zKF90YXJnZXQpIHtcbiAgICAgICAgaWYoICFhY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBwcmV2ZW50IGV4dGVuc2lvbnMgb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlLCB0aGUgbW9kdWxlIGhhcyBub3QgeWV0IGJlZ3VuIHRvIGV4ZWN1dGUnKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmbGVjdFByZXZlbnRFeHRlbnNpb25zKHByb3hpZWRFeHBvcnRzKTtcbiAgICAgICB9LFxuICAgICAgaXNFeHRlbnNpYmxlKCkge1xuICAgICAgICBpZiggIWFjdGl2ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAnQ2Fubm90IGNoZWNrIGV4dGVuc2liaWxpdHkgb2YgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlLCB0aGUgbW9kdWxlIGhhcyBub3QgeWV0IGJlZ3VuIHRvIGV4ZWN1dGUnKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVmbGVjdElzRXh0ZW5zaWJsZShwcm94aWVkRXhwb3J0cyk7XG4gICAgICAgfSxcbiAgICAgIGdldFByb3RvdHlwZU9mKF90YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgfSxcbiAgICAgIHNldFByb3RvdHlwZU9mKF90YXJnZXQsIF9wcm90bykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3Qgc2V0IHByb3RvdHlwZSBvZiBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UnKTtcbiAgICAgICB9LFxuICAgICAgZGVmaW5lUHJvcGVydHkoX3RhcmdldCwgbmFtZSwgX2Rlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgYENhbm5vdCBkZWZpbmUgcHJvcGVydHkgJHtxKG5hbWUpfSBvZiBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2VgKTtcblxuICAgICAgIH0sXG4gICAgICBhcHBseShfdGFyZ2V0LCBfdGhpc0FyZywgX2FyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IGNhbGwgbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlLCBpdCBpcyBub3QgYSBmdW5jdGlvbicpO1xuXG4gICAgICAgfSxcbiAgICAgIGNvbnN0cnVjdChfdGFyZ2V0LCBfYXJncykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY29uc3RydWN0IG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSwgaXQgaXMgbm90IGEgY29uc3RydWN0b3InKTtcblxuICAgICAgIH19KX0pO1xuXG5cbiB9O1xuXG4vLyBgZ2V0RGVmZXJyZWRFeHBvcnRzYCBtZW1vaXplcyB0aGUgY3JlYXRpb24gb2YgYSBkZWZlcnJlZCBtb2R1bGUgZXhwb3J0c1xuLy8gbmFtZXNwYWNlIHByb3h5IGZvciBhbnkgYWJyaXRyYXJ5IGZ1bGwgc3BlY2lmaWVyIGluIGEgY29tcGFydG1lbnQuXG4vLyBJdCBhbHNvIHJlY29yZHMgdGhlIGNvbXBhcnRtZW50IGFuZCBzcGVjaWZpZXIgYWZmaWxpYXRlZCB3aXRoIHRoYXQgbW9kdWxlXG4vLyBleHBvcnRzIG5hbWVzcGFjZSBwcm94eSBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhbiBhbGlhcyBpbnRvIGFub3RoZXJcbi8vIGNvbXBhcnRtZW50IHdoZW4gdGhyZWFkZWQgdGhyb3VnaCBhIGNvbXBhcnRtZW50J3MgYG1vZHVsZU1hcGAgYXJndW1lbnQuXG4kaOKAjV9vbmNlLmRlZmVyRXhwb3J0cyhkZWZlckV4cG9ydHMpO2NvbnN0IGdldERlZmVycmVkRXhwb3J0cz0oXG4gIGNvbXBhcnRtZW50LFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIHNwZWNpZmllcik9PlxuICAgICB7XG4gIGNvbnN0IHsgZGVmZXJyZWRFeHBvcnRzfT0gICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHM7XG4gIGlmKCAhbWFwSGFzKGRlZmVycmVkRXhwb3J0cywgc3BlY2lmaWVyKSkge1xuICAgIGNvbnN0IGRlZmVycmVkPSAgZGVmZXJFeHBvcnRzKCk7XG4gICAgd2Vha21hcFNldChcbiAgICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgICBkZWZlcnJlZC5leHBvcnRzUHJveHksXG4gICAgICBtYWtlQWxpYXMoY29tcGFydG1lbnQsIHNwZWNpZmllcikpO1xuXG4gICAgbWFwU2V0KGRlZmVycmVkRXhwb3J0cywgc3BlY2lmaWVyLCBkZWZlcnJlZCk7XG4gICB9XG4gIHJldHVybiBtYXBHZXQoZGVmZXJyZWRFeHBvcnRzLCBzcGVjaWZpZXIpO1xuIH07JGjigI1fb25jZS5nZXREZWZlcnJlZEV4cG9ydHMoZ2V0RGVmZXJyZWRFeHBvcnRzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjBdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGdldERlZmVycmVkRXhwb3J0cyxSZWZlcmVuY2VFcnJvcixTeW50YXhFcnJvcixUeXBlRXJyb3IsYXJyYXlGb3JFYWNoLGFycmF5SW5jbHVkZXMsYXJyYXlQdXNoLGFycmF5U29tZSxhcnJheVNvcnQsY3JlYXRlLGRlZmluZVByb3BlcnR5LGVudHJpZXMsZnJlZXplLGlzQXJyYXksa2V5cyxtYXBHZXQsd2Vha21hcEdldCxyZWZsZWN0SGFzLGFzc2lnbixjb21wYXJ0bWVudEV2YWx1YXRlOyRo4oCNX2ltcG9ydHMoW1tcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCIuL21vZHVsZS1wcm94eS5qc1wiLCBbW1wiZ2V0RGVmZXJyZWRFeHBvcnRzXCIsIFskaOKAjV9hID0+IChnZXREZWZlcnJlZEV4cG9ydHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21tb25zLmpzXCIsIFtbXCJSZWZlcmVuY2VFcnJvclwiLCBbJGjigI1fYSA9PiAoUmVmZXJlbmNlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIlN5bnRheEVycm9yXCIsIFskaOKAjV9hID0+IChTeW50YXhFcnJvciA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFycmF5Rm9yRWFjaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlGb3JFYWNoID0gJGjigI1fYSldXSxbXCJhcnJheUluY2x1ZGVzXCIsIFskaOKAjV9hID0+IChhcnJheUluY2x1ZGVzID0gJGjigI1fYSldXSxbXCJhcnJheVB1c2hcIiwgWyRo4oCNX2EgPT4gKGFycmF5UHVzaCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlTb21lXCIsIFskaOKAjV9hID0+IChhcnJheVNvbWUgPSAkaOKAjV9hKV1dLFtcImFycmF5U29ydFwiLCBbJGjigI1fYSA9PiAoYXJyYXlTb3J0ID0gJGjigI1fYSldXSxbXCJjcmVhdGVcIiwgWyRo4oCNX2EgPT4gKGNyZWF0ZSA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJlbnRyaWVzXCIsIFskaOKAjV9hID0+IChlbnRyaWVzID0gJGjigI1fYSldXSxbXCJmcmVlemVcIiwgWyRo4oCNX2EgPT4gKGZyZWV6ZSA9ICRo4oCNX2EpXV0sW1wiaXNBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNBcnJheSA9ICRo4oCNX2EpXV0sW1wia2V5c1wiLCBbJGjigI1fYSA9PiAoa2V5cyA9ICRo4oCNX2EpXV0sW1wibWFwR2V0XCIsIFskaOKAjV9hID0+IChtYXBHZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dLFtcInJlZmxlY3RIYXNcIiwgWyRo4oCNX2EgPT4gKHJlZmxlY3RIYXMgPSAkaOKAjV9hKV1dLFtcImFzc2lnblwiLCBbJGjigI1fYSA9PiAoYXNzaWduID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtZXZhbHVhdGUuanNcIiwgW1tcImNvbXBhcnRtZW50RXZhbHVhdGVcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcnRtZW50RXZhbHVhdGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IHF1b3RlOiBxfT0gICBhc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlPSAgKFxuICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgY29tcGFydG1lbnQsXG4gIG1vZHVsZUFsaWFzZXMsXG4gIG1vZHVsZVNwZWNpZmllcixcbiAgcmVzb2x2ZWRJbXBvcnRzKT0+XG4gICAgIHtcbiAgY29uc3QgeyBleHBvcnRzUHJveHksIHByb3hpZWRFeHBvcnRzLCBhY3RpdmF0ZX09ICAgZ2V0RGVmZXJyZWRFeHBvcnRzKFxuICAgIGNvbXBhcnRtZW50LFxuICAgIHdlYWttYXBHZXQoY29tcGFydG1lbnRQcml2YXRlRmllbGRzLCBjb21wYXJ0bWVudCksXG4gICAgbW9kdWxlQWxpYXNlcyxcbiAgICBtb2R1bGVTcGVjaWZpZXIpO1xuXG5cbiAgY29uc3Qgbm90aWZpZXJzPSAgY3JlYXRlKG51bGwpO1xuXG4gIGlmKCBzdGF0aWNNb2R1bGVSZWNvcmQuZXhwb3J0cykge1xuICAgIGlmKFxuICAgICAgIWlzQXJyYXkoc3RhdGljTW9kdWxlUmVjb3JkLmV4cG9ydHMpfHxcbiAgICAgIGFycmF5U29tZShzdGF0aWNNb2R1bGVSZWNvcmQuZXhwb3J0cywgKG5hbWUpPT50eXBlb2YgbmFtZSE9PSAgJ3N0cmluZycpKVxuICAgICAge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgIGBTRVMgdGhpcmQtcGFydHkgc3RhdGljIG1vZHVsZSByZWNvcmQgXCJleHBvcnRzXCIgcHJvcGVydHkgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIGZvciBtb2R1bGUgJHttb2R1bGVTcGVjaWZpZXJ9YCk7XG5cbiAgICAgfVxuICAgIGFycmF5Rm9yRWFjaChzdGF0aWNNb2R1bGVSZWNvcmQuZXhwb3J0cywgKG5hbWUpPT57XG4gICAgICBsZXQgdmFsdWU9ICBwcm94aWVkRXhwb3J0c1tuYW1lXTtcbiAgICAgIGNvbnN0IHVwZGF0ZXJzPSAgW107XG5cbiAgICAgIGNvbnN0IGdldD0gICgpPT4gIHZhbHVlO1xuXG4gICAgICBjb25zdCBzZXQ9ICAobmV3VmFsdWUpPT57XG4gICAgICAgIHZhbHVlPSAgbmV3VmFsdWU7XG4gICAgICAgIGZvciggY29uc3QgdXBkYXRlciBvZiB1cGRhdGVycykge1xuICAgICAgICAgIHVwZGF0ZXIobmV3VmFsdWUpO1xuICAgICAgICAgfVxuICAgICAgIH07XG5cbiAgICAgIGRlZmluZVByb3BlcnR5KHByb3hpZWRFeHBvcnRzLCBuYW1lLCB7XG4gICAgICAgIGdldCxcbiAgICAgICAgc2V0LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSk7XG5cblxuICAgICAgbm90aWZpZXJzW25hbWVdPSAgKHVwZGF0ZSk9PntcbiAgICAgICAgYXJyYXlQdXNoKHVwZGF0ZXJzLCB1cGRhdGUpO1xuICAgICAgICB1cGRhdGUodmFsdWUpO1xuICAgICAgIH07XG4gICAgIH0pO1xuICAgIC8vIFRoaXMgaXMgZW5vdWdoIHRvIHN1cHBvcnQgaW1wb3J0ICogZnJvbSBjanMgLSB0aGUgJyonIGZpZWxkIGRvZXNuJ3QgbmVlZCB0byBiZSBpbiBleHBvcnRzIG5vciBwcm94aWVkRXhwb3J0cyBiZWNhdXNlIGltcG9ydCB3aWxsIG9ubHkgZXZlciBhY2Nlc3MgaXQgdmlhIG5vdGlmaWVyc1xuICAgIG5vdGlmaWVyc1snKiddPSAgKHVwZGF0ZSk9PntcbiAgICAgIHVwZGF0ZShwcm94aWVkRXhwb3J0cyk7XG4gICAgIH07XG4gICB9XG5cbiAgY29uc3QgbG9jYWxTdGF0ZT0gIHtcbiAgICBhY3RpdmF0ZWQ6IGZhbHNlfTtcblxuICByZXR1cm4gZnJlZXplKHtcbiAgICBub3RpZmllcnMsXG4gICAgZXhwb3J0c1Byb3h5LFxuICAgIGV4ZWN1dGUoKSB7XG4gICAgICBpZiggcmVmbGVjdEhhcyhsb2NhbFN0YXRlLCAnZXJyb3JGcm9tRXhlY3V0ZScpKSB7XG4gICAgICAgIHRocm93IGxvY2FsU3RhdGUuZXJyb3JGcm9tRXhlY3V0ZTtcbiAgICAgICB9XG4gICAgICBpZiggIWxvY2FsU3RhdGUuYWN0aXZhdGVkKSB7XG4gICAgICAgIGFjdGl2YXRlKCk7XG4gICAgICAgIGxvY2FsU3RhdGUuYWN0aXZhdGVkPSAgdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgIHN0YXRpY01vZHVsZVJlY29yZC5leGVjdXRlKFxuICAgICAgICAgICAgcHJveGllZEV4cG9ydHMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudCxcbiAgICAgICAgICAgIHJlc29sdmVkSW1wb3J0cyk7XG5cbiAgICAgICAgIH1jYXRjaCggZXJyKSB7XG4gICAgICAgICAgbG9jYWxTdGF0ZS5lcnJvckZyb21FeGVjdXRlPSAgZXJyO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH19KTtcblxuIH07XG5cbi8vIGBtYWtlTW9kdWxlSW5zdGFuY2VgIHRha2VzIGEgbW9kdWxlJ3MgY29tcGFydG1lbnQgcmVjb3JkLCB0aGUgbGl2ZSBpbXBvcnRcbi8vIG5hbWVzcGFjZSwgYW5kIGEgZ2xvYmFsIG9iamVjdDsgYW5kIHByb2R1Y2VzIGEgbW9kdWxlIGluc3RhbmNlLlxuLy8gVGhlIG1vZHVsZSBpbnN0YW5jZSBjYXJyaWVzIHRoZSBwcm94aWVkIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSAodGhlXG4vLyBcImV4cG9ydHNcIiksIG5vdGlmaWVycyB0byB1cGRhdGUgdGhlIG1vZHVsZSdzIGludGVybmFsIGltcG9ydCBuYW1lc3BhY2UsIGFuZFxuLy8gYW4gaWRlbXBvdGVudCBleGVjdXRlIGZ1bmN0aW9uLlxuLy8gVGhlIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSBpcyBhIHByb3h5IHRvIHRoZSBwcm94aWVkIGV4cG9ydHMgbmFtZXNwYWNlXG4vLyB0aGF0IHRoZSBleGVjdXRpb24gb2YgdGhlIG1vZHVsZSBpbnN0YW5jZSBwb3B1bGF0ZXMuXG4kaOKAjV9vbmNlLm1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2UobWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZSk7Y29uc3QgbWFrZU1vZHVsZUluc3RhbmNlPShcbiAgcHJpdmF0ZUZpZWxkcyxcbiAgbW9kdWxlQWxpYXNlcyxcbiAgbW9kdWxlUmVjb3JkLFxuICBpbXBvcnRlZEluc3RhbmNlcyk9PlxuICAgICB7XG4gIGNvbnN0IHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgc3RhdGljTW9kdWxlUmVjb3JkLFxuICAgIGltcG9ydE1ldGE6IG1vZHVsZVJlY29yZE1ldGF9PVxuICAgICAgbW9kdWxlUmVjb3JkO1xuICBjb25zdCB7XG4gICAgcmVleHBvcnRzOiBleHBvcnRBbGxzPSAgW10sXG4gICAgX19zeW5jTW9kdWxlUHJvZ3JhbV9fOiBmdW5jdG9yU291cmNlLFxuICAgIF9fZml4ZWRFeHBvcnRNYXBfXzogZml4ZWRFeHBvcnRNYXA9ICB7fSxcbiAgICBfX2xpdmVFeHBvcnRNYXBfXzogbGl2ZUV4cG9ydE1hcD0gIHt9LFxuICAgIF9fbmVlZHNJbXBvcnRNZXRhX186IG5lZWRzSW1wb3J0TWV0YT0gIGZhbHNlfT1cbiAgICAgIHN0YXRpY01vZHVsZVJlY29yZDtcblxuICBjb25zdCBjb21wYXJ0bWVudEZpZWxkcz0gIHdlYWttYXBHZXQocHJpdmF0ZUZpZWxkcywgY29tcGFydG1lbnQpO1xuXG4gIGNvbnN0IHsgX19zaGltVHJhbnNmb3Jtc19fLCBpbXBvcnRNZXRhSG9va309ICAgY29tcGFydG1lbnRGaWVsZHM7XG5cbiAgY29uc3QgeyBleHBvcnRzUHJveHksIHByb3hpZWRFeHBvcnRzLCBhY3RpdmF0ZX09ICAgZ2V0RGVmZXJyZWRFeHBvcnRzKFxuICAgIGNvbXBhcnRtZW50LFxuICAgIGNvbXBhcnRtZW50RmllbGRzLFxuICAgIG1vZHVsZUFsaWFzZXMsXG4gICAgbW9kdWxlU3BlY2lmaWVyKTtcblxuXG4gIC8vIHtfZXhwb3J0TmFtZV86IGdldHRlcn0gbW9kdWxlIGV4cG9ydHMgbmFtZXNwYWNlXG4gIC8vIG9iamVjdCAoZXZlbnR1YWxseSBwcm94aWVkKS5cbiAgY29uc3QgZXhwb3J0c1Byb3BzPSAgY3JlYXRlKG51bGwpO1xuXG4gIC8vIHtfbG9jYWxOYW1lXzogYWNjZXNzb3J9IHByb3h5IHRyYXBzIGZvciBtb2R1bGVMZXhpY2FscyBhbmQgbGl2ZSBiaW5kaW5ncy5cbiAgLy8gVGhlIG1vZHVsZUxleGljYWxzIG9iamVjdCBpcyBmcm96ZW4gYW5kIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnRpZXMgb2ZcbiAgLy8gbW9kdWxlTGV4aWNhbHMgbXVzdCBiZSBpbW11dGFibGUsIHNvIHdlIGNvcHkgdGhlIGRlc2NyaXB0b3JzLlxuICBjb25zdCBtb2R1bGVMZXhpY2Fscz0gIGNyZWF0ZShudWxsKTtcblxuICAvLyB7X2xvY2FsTmFtZV86IGluaXQoaW5pdFZhbHVlKSAtPiBpbml0VmFsdWV9IHVzZWQgYnkgdGhlXG4gIC8vIHJld3JpdHRlbiBjb2RlIHRvIGluaXRpYWxpemUgZXhwb3J0ZWQgZml4ZWQgYmluZGluZ3MuXG4gIGNvbnN0IG9uY2VWYXI9ICBjcmVhdGUobnVsbCk7XG5cbiAgLy8ge19sb2NhbE5hbWVfOiB1cGRhdGUobmV3VmFsdWUpfSB1c2VkIGJ5IHRoZSByZXdyaXR0ZW4gY29kZSB0b1xuICAvLyBib3RoIGluaXRpYWxpemUgYW5kIHVwZGF0ZSBsaXZlIGJpbmRpbmdzLlxuICBjb25zdCBsaXZlVmFyPSAgY3JlYXRlKG51bGwpO1xuXG4gIGNvbnN0IGltcG9ydE1ldGE9ICBjcmVhdGUobnVsbCk7XG4gIGlmKCBtb2R1bGVSZWNvcmRNZXRhKSB7XG4gICAgYXNzaWduKGltcG9ydE1ldGEsIG1vZHVsZVJlY29yZE1ldGEpO1xuICAgfVxuICBpZiggbmVlZHNJbXBvcnRNZXRhJiYgIGltcG9ydE1ldGFIb29rKSB7XG4gICAgaW1wb3J0TWV0YUhvb2sobW9kdWxlU3BlY2lmaWVyLCBpbXBvcnRNZXRhKTtcbiAgIH1cblxuICAvLyB7X2xvY2FsTmFtZV86IFt7Z2V0LCBzZXQsIG5vdGlmeX1dfSB1c2VkIHRvIG1lcmdlIGFsbCB0aGUgZXhwb3J0IHVwZGF0ZXJzLlxuICBjb25zdCBsb2NhbEdldE5vdGlmeT0gIGNyZWF0ZShudWxsKTtcblxuICAvLyB7W2ltcG9ydE5hbWU6IHN0cmluZ106IG5vdGlmeSh1cGRhdGUobmV3VmFsdWUpKX0gVXNlZCBieSBjb2RlIHRoYXQgaW1wb3J0c1xuICAvLyBvbmUgb2YgdGhpcyBtb2R1bGUncyBleHBvcnRzLCBzbyB0aGF0IHRoZWlyIHVwZGF0ZSBmdW5jdGlvbiB3aWxsXG4gIC8vIGJlIG5vdGlmaWVkIHdoZW4gdGhpcyBiaW5kaW5nIGlzIGluaXRpYWxpemVkIG9yIHVwZGF0ZWQuXG4gIGNvbnN0IG5vdGlmaWVycz0gIGNyZWF0ZShudWxsKTtcblxuICBhcnJheUZvckVhY2goZW50cmllcyhmaXhlZEV4cG9ydE1hcCksIChbZml4ZWRFeHBvcnROYW1lLCBbbG9jYWxOYW1lXV0pPT4gIHtcbiAgICBsZXQgZml4ZWRHZXROb3RpZnk9ICBsb2NhbEdldE5vdGlmeVtsb2NhbE5hbWVdO1xuICAgIGlmKCAhZml4ZWRHZXROb3RpZnkpIHtcbiAgICAgIC8vIGZpeGVkIGJpbmRpbmcgc3RhdGVcbiAgICAgIGxldCB2YWx1ZTtcbiAgICAgIGxldCB0ZHo9ICB0cnVlO1xuICAgICAgbGV0IG9wdFVwZGF0ZXJzPSAgW107XG5cbiAgICAgIC8vIHRkeiBzZW5zaXRpdmUgZ2V0dGVyXG4gICAgICBjb25zdCBnZXQ9ICAoKT0+ICB7XG4gICAgICAgIGlmKCB0ZHopIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgYGJpbmRpbmcgJHtxKGxvY2FsTmFtZSl9IG5vdCB5ZXQgaW5pdGlhbGl6ZWRgKTtcblxuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgfTtcblxuICAgICAgLy8gbGVhdmUgdGR6IG9uY2VcbiAgICAgIGNvbnN0IGluaXQ9ICBmcmVlemUoKGluaXRWYWx1ZSk9PntcbiAgICAgICAgLy8gaW5pdCB3aXRoIGluaXRWYWx1ZSBvZiBhIGRlY2xhcmVkIGNvbnN0IGJpbmRpbmcsIGFuZCByZXR1cm5cbiAgICAgICAgLy8gaXQuXG4gICAgICAgIGlmKCAhdGR6KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICBgSW50ZXJuYWw6IGJpbmRpbmcgJHtxKGxvY2FsTmFtZSl9IGFscmVhZHkgaW5pdGlhbGl6ZWRgKTtcblxuICAgICAgICAgfVxuICAgICAgICB2YWx1ZT0gIGluaXRWYWx1ZTtcbiAgICAgICAgY29uc3QgdXBkYXRlcnM9ICBvcHRVcGRhdGVycztcbiAgICAgICAgb3B0VXBkYXRlcnM9ICBudWxsO1xuICAgICAgICB0ZHo9ICBmYWxzZTtcbiAgICAgICAgZm9yKCBjb25zdCB1cGRhdGVyIG9mIHVwZGF0ZXJzKSB7XG4gICAgICAgICAgdXBkYXRlcihpbml0VmFsdWUpO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5pdFZhbHVlO1xuICAgICAgIH0pO1xuXG4gICAgICAvLyBJZiBzdGlsbCB0ZHosIHJlZ2lzdGVyIHVwZGF0ZSBmb3Igbm90aWZpY2F0aW9uIGxhdGVyLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB1cGRhdGUgbm93LlxuICAgICAgY29uc3Qgbm90aWZ5PSAgKHVwZGF0ZXIpPT57XG4gICAgICAgIGlmKCB1cGRhdGVyPT09ICBpbml0KSB7XG4gICAgICAgICAgLy8gUHJldmVudCByZWN1cnNpb24uXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuICAgICAgICBpZiggdGR6KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKG9wdFVwZGF0ZXJzLCB1cGRhdGVyKTtcbiAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICB1cGRhdGVyKHZhbHVlKTtcbiAgICAgICAgIH1cbiAgICAgICB9O1xuXG4gICAgICAvLyBOZWVkIHRoZXNlIGZvciBhZGRpdGlvbmFsIGV4cG9ydHMgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLlxuICAgICAgZml4ZWRHZXROb3RpZnk9ICB7XG4gICAgICAgIGdldCxcbiAgICAgICAgbm90aWZ5fTtcblxuICAgICAgbG9jYWxHZXROb3RpZnlbbG9jYWxOYW1lXT0gIGZpeGVkR2V0Tm90aWZ5O1xuICAgICAgb25jZVZhcltsb2NhbE5hbWVdPSAgaW5pdDtcbiAgICAgfVxuXG4gICAgZXhwb3J0c1Byb3BzW2ZpeGVkRXhwb3J0TmFtZV09ICB7XG4gICAgICBnZXQ6IGZpeGVkR2V0Tm90aWZ5LmdldCxcbiAgICAgIHNldDogdW5kZWZpbmVkLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9O1xuXG5cbiAgICBub3RpZmllcnNbZml4ZWRFeHBvcnROYW1lXT0gIGZpeGVkR2V0Tm90aWZ5Lm5vdGlmeTtcbiAgIH0pO1xuXG4gIGFycmF5Rm9yRWFjaChcbiAgICBlbnRyaWVzKGxpdmVFeHBvcnRNYXApLFxuICAgIChbbGl2ZUV4cG9ydE5hbWUsIFtsb2NhbE5hbWUsIHNldFByb3h5VHJhcF1dKT0+ICB7XG4gICAgICBsZXQgbGl2ZUdldE5vdGlmeT0gIGxvY2FsR2V0Tm90aWZ5W2xvY2FsTmFtZV07XG4gICAgICBpZiggIWxpdmVHZXROb3RpZnkpIHtcbiAgICAgICAgLy8gbGl2ZSBiaW5kaW5nIHN0YXRlXG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgbGV0IHRkej0gIHRydWU7XG4gICAgICAgIGNvbnN0IHVwZGF0ZXJzPSAgW107XG5cbiAgICAgICAgLy8gdGR6IHNlbnNpdGl2ZSBnZXR0ZXJcbiAgICAgICAgY29uc3QgZ2V0PSAgKCk9PiAge1xuICAgICAgICAgIGlmKCB0ZHopIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgIGBiaW5kaW5nICR7cShsaXZlRXhwb3J0TmFtZSl9IG5vdCB5ZXQgaW5pdGlhbGl6ZWRgKTtcblxuICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGlzIG11c3QgYmUgdXNhYmxlIGxvY2FsbHkgZm9yIHRoZSB0cmFuc2xhdGlvbiBvZiBpbml0aWFsaXppbmdcbiAgICAgICAgLy8gYSBkZWNsYXJlZCBsb2NhbCBsaXZlIGJpbmRpbmcgdmFyaWFibGUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZvciByZWV4cG9ydGVkIHZhcmlhYmxlLCB0aGlzIGlzIGFsc28gYW4gdXBkYXRlIGZ1bmN0aW9uIHRvXG4gICAgICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb24gd2l0aCB0aGUgZG93bnN0cmVhbSBpbXBvcnQsIHdoaWNoIHdlXG4gICAgICAgIC8vIG11c3QgYXNzdW1lIHRvIGJlIGxpdmUuIFRodXMsIGl0IGNhbiBiZSBjYWxsZWQgaW5kZXBlbmRlbnQgb2ZcbiAgICAgICAgLy8gdGR6IGJ1dCBhbHdheXMgbGVhdmVzIHRkei4gU3VjaCByZWV4cG9ydGluZyBjcmVhdGVzIGEgdHJlZSBvZlxuICAgICAgICAvLyBiaW5kaW5ncy4gVGhpcyBsZXRzIHRoZSB0cmVlIGJlIGhvb2tlZCB1cCBldmVuIGlmIHRoZSBpbXBvcnRlZFxuICAgICAgICAvLyBtb2R1bGUgaW5zdGFuY2UgaXNuJ3QgaW5pdGlhbGl6ZWQgeWV0LCBhcyBtYXkgaGFwcGVuIGluIGN5Y2xlcy5cbiAgICAgICAgY29uc3QgdXBkYXRlPSAgZnJlZXplKChuZXdWYWx1ZSk9PntcbiAgICAgICAgICB2YWx1ZT0gIG5ld1ZhbHVlO1xuICAgICAgICAgIHRkej0gIGZhbHNlO1xuICAgICAgICAgIGZvciggY29uc3QgdXBkYXRlciBvZiB1cGRhdGVycykge1xuICAgICAgICAgICAgdXBkYXRlcihuZXdWYWx1ZSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHRkeiBzZW5zaXRpdmUgc2V0dGVyXG4gICAgICAgIGNvbnN0IHNldD0gIChuZXdWYWx1ZSk9PntcbiAgICAgICAgICBpZiggdGR6KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgICBgYmluZGluZyAke3EobG9jYWxOYW1lKX0gbm90IHlldCBpbml0aWFsaXplZGApO1xuXG4gICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZT0gIG5ld1ZhbHVlO1xuICAgICAgICAgIGZvciggY29uc3QgdXBkYXRlciBvZiB1cGRhdGVycykge1xuICAgICAgICAgICAgdXBkYXRlcihuZXdWYWx1ZSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH07XG5cbiAgICAgICAgLy8gQWx3YXlzIHJlZ2lzdGVyIHRoZSB1cGRhdGVyIGZ1bmN0aW9uLlxuICAgICAgICAvLyBJZiBub3QgaW4gdGR6LCBhbHNvIHVwZGF0ZSBub3cuXG4gICAgICAgIGNvbnN0IG5vdGlmeT0gICh1cGRhdGVyKT0+e1xuICAgICAgICAgIGlmKCB1cGRhdGVyPT09ICB1cGRhdGUpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgcmVjdXJzaW9uLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICB9XG4gICAgICAgICAgYXJyYXlQdXNoKHVwZGF0ZXJzLCB1cGRhdGVyKTtcbiAgICAgICAgICBpZiggIXRkeikge1xuICAgICAgICAgICAgdXBkYXRlcih2YWx1ZSk7XG4gICAgICAgICAgIH1cbiAgICAgICAgIH07XG5cbiAgICAgICAgbGl2ZUdldE5vdGlmeT0gIHtcbiAgICAgICAgICBnZXQsXG4gICAgICAgICAgbm90aWZ5fTtcblxuXG4gICAgICAgIGxvY2FsR2V0Tm90aWZ5W2xvY2FsTmFtZV09ICBsaXZlR2V0Tm90aWZ5O1xuICAgICAgICBpZiggc2V0UHJveHlUcmFwKSB7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkobW9kdWxlTGV4aWNhbHMsIGxvY2FsTmFtZSwge1xuICAgICAgICAgICAgZ2V0LFxuICAgICAgICAgICAgc2V0LFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcblxuICAgICAgICAgfVxuICAgICAgICBsaXZlVmFyW2xvY2FsTmFtZV09ICB1cGRhdGU7XG4gICAgICAgfVxuXG4gICAgICBleHBvcnRzUHJvcHNbbGl2ZUV4cG9ydE5hbWVdPSAge1xuICAgICAgICBnZXQ6IGxpdmVHZXROb3RpZnkuZ2V0LFxuICAgICAgICBzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX07XG5cblxuICAgICAgbm90aWZpZXJzW2xpdmVFeHBvcnROYW1lXT0gIGxpdmVHZXROb3RpZnkubm90aWZ5O1xuICAgICB9KTtcblxuXG4gIGNvbnN0IG5vdGlmeVN0YXI9ICAodXBkYXRlKT0+e1xuICAgIHVwZGF0ZShwcm94aWVkRXhwb3J0cyk7XG4gICB9O1xuICBub3RpZmllcnNbJyonXT0gIG5vdGlmeVN0YXI7XG5cbiAgLy8gUGVyIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBtb2R1bGVGdW5jdG9yIGdlbmVyYXRlZCBmcm9tXG4gIC8vIGFuIEVTTSwgdGhlIGBpbXBvcnRzYCBmdW5jdGlvbiBnZXRzIGNhbGxlZCBvbmNlIHVwIGZyb250XG4gIC8vIHRvIHBvcHVsYXRlIG9yIGFycmFuZ2UgdGhlIHBvcHVsYXRpb24gb2YgaW1wb3J0cyBhbmQgcmVleHBvcnRzLlxuICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgcHJvZHVjZXMgYW4gYHVwZGF0ZVJlY29yZGA6IHRoZSBtZWFucyBmb3JcbiAgLy8gdGhlIGxpbmtlciB0byB1cGRhdGUgdGhlIGltcG9ydHMgYW5kIGV4cG9ydHMgb2YgdGhlIG1vZHVsZS5cbiAgLy8gVGhlIHVwZGF0ZVJlY29yZCBtdXN0IGNvbmZvcm0gdG8gbW9kdWxlQW5hbHlzaXMuaW1wb3J0c1xuICAvLyB1cGRhdGVSZWNvcmQgPSBNYXA8c3BlY2lmaWVyLCBpbXBvcnRVcGRhdGVycz5cbiAgLy8gaW1wb3J0VXBkYXRlcnMgPSBNYXA8aW1wb3J0TmFtZSwgW3VwZGF0ZShuZXdWYWx1ZSkqXT5cbiAgZnVuY3Rpb24gaW1wb3J0cyh1cGRhdGVSZWNvcmQpIHtcbiAgICAvLyBCeSB0aGUgdGltZSBpbXBvcnRzIGlzIGNhbGxlZCwgdGhlIGltcG9ydGVkSW5zdGFuY2VzIHNob3VsZCBhbHJlYWR5IGJlXG4gICAgLy8gaW5pdGlhbGl6ZWQgd2l0aCBtb2R1bGUgaW5zdGFuY2VzIHRoYXQgc2F0aXNmeVxuICAgIC8vIGltcG9ydHMuXG4gICAgLy8gaW1wb3J0ZWRJbnN0YW5jZXMgPSBNYXBbX3NwZWNpZmllcl8sIHsgbm90aWZpZXJzLCBtb2R1bGUsIGV4ZWN1dGUgfV1cbiAgICAvLyBub3RpZmllcnMgPSB7IFtpbXBvcnROYW1lOiBzdHJpbmddOiBub3RpZnkodXBkYXRlKG5ld1ZhbHVlKSl9XG5cbiAgICAvLyBleHBvcnQgKiBjYW5ub3QgZXhwb3J0IGRlZmF1bHQuXG4gICAgY29uc3QgY2FuZGlkYXRlQWxsPSAgY3JlYXRlKG51bGwpO1xuICAgIGNhbmRpZGF0ZUFsbC5kZWZhdWx0PSAgZmFsc2U7XG4gICAgZm9yKCBjb25zdCBbc3BlY2lmaWVyLCBpbXBvcnRVcGRhdGVyc11vZiAgdXBkYXRlUmVjb3JkKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZT0gIG1hcEdldChpbXBvcnRlZEluc3RhbmNlcywgc3BlY2lmaWVyKTtcbiAgICAgIC8vIFRoZSBtb2R1bGUgaW5zdGFuY2Ugb2JqZWN0IGlzIGFuIGludGVybmFsIGxpdGVyYWwsIGRvZXMgbm90IGJpbmQgdGhpcyxcbiAgICAgIC8vIGFuZCBuZXZlciByZXZlYWxlZCBvdXRzaWRlIHRoZSBTRVMgc2hpbS5cbiAgICAgIC8vIFRoZXJlIGFyZSB0d28gaW5zdGFudGlhdGlvbiBzaXRlcyBmb3IgaW5zdGFuY2VzIGFuZCB0aGV5IGFyZSBib3RoIGluXG4gICAgICAvLyB0aGlzIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBpbnN0YW5jZS5leGVjdXRlKCk7IC8vIGJvdHRvbSB1cCBjeWNsZSB0b2xlcmFudFxuICAgICAgY29uc3QgeyBub3RpZmllcnM6IGltcG9ydE5vdGlmaWVyc309ICAgaW5zdGFuY2U7XG4gICAgICBmb3IoIGNvbnN0IFtpbXBvcnROYW1lLCB1cGRhdGVyc11vZiAgaW1wb3J0VXBkYXRlcnMpIHtcbiAgICAgICAgY29uc3QgaW1wb3J0Tm90aWZ5PSAgaW1wb3J0Tm90aWZpZXJzW2ltcG9ydE5hbWVdO1xuICAgICAgICBpZiggIWltcG9ydE5vdGlmeSkge1xuICAgICAgICAgIHRocm93IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgIGBUaGUgcmVxdWVzdGVkIG1vZHVsZSAnJHtzcGVjaWZpZXJ9JyBkb2VzIG5vdCBwcm92aWRlIGFuIGV4cG9ydCBuYW1lZCAnJHtpbXBvcnROYW1lfSdgKTtcblxuICAgICAgICAgfVxuICAgICAgICBmb3IoIGNvbnN0IHVwZGF0ZXIgb2YgdXBkYXRlcnMpIHtcbiAgICAgICAgICBpbXBvcnROb3RpZnkodXBkYXRlcik7XG4gICAgICAgICB9XG4gICAgICAgfVxuICAgICAgaWYoIGFycmF5SW5jbHVkZXMoZXhwb3J0QWxscywgc3BlY2lmaWVyKSkge1xuICAgICAgICAvLyBNYWtlIGFsbCB0aGVzZSBpbXBvcnRzIGNhbmRpZGF0ZXMuXG4gICAgICAgIGZvciggY29uc3QgW2ltcG9ydE5hbWUsIGltcG9ydE5vdGlmeV1vZiAgZW50cmllcyhpbXBvcnROb3RpZmllcnMpKSB7XG4gICAgICAgICAgaWYoIGNhbmRpZGF0ZUFsbFtpbXBvcnROYW1lXT09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVBbGxbaW1wb3J0TmFtZV09ICBpbXBvcnROb3RpZnk7XG4gICAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgYSBjYW5kaWRhdGU6IHJlbW92ZSBhbWJpZ3VpdHkuXG4gICAgICAgICAgICBjYW5kaWRhdGVBbGxbaW1wb3J0TmFtZV09ICBmYWxzZTtcbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuXG4gICAgZm9yKCBjb25zdCBbaW1wb3J0TmFtZSwgbm90aWZ5XW9mICBlbnRyaWVzKGNhbmRpZGF0ZUFsbCkpIHtcbiAgICAgIGlmKCAhbm90aWZpZXJzW2ltcG9ydE5hbWVdJiYgIG5vdGlmeSE9PSAgZmFsc2UpIHtcbiAgICAgICAgbm90aWZpZXJzW2ltcG9ydE5hbWVdPSAgbm90aWZ5O1xuXG4gICAgICAgIC8vIGV4cG9ydGVkIGxpdmUgYmluZGluZyBzdGF0ZVxuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGNvbnN0IHVwZGF0ZT0gIChuZXdWYWx1ZSk9PiB2YWx1ZT0gIG5ld1ZhbHVlO1xuICAgICAgICBub3RpZnkodXBkYXRlKTtcbiAgICAgICAgZXhwb3J0c1Byb3BzW2ltcG9ydE5hbWVdPSAge1xuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9O1xuXG4gICAgICAgfVxuICAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UgYXMgcGVyIHNwZWMuXG4gICAgLy8gVGhlIG1vZHVsZSBleHBvcnRzIG5hbWVzcGFjZSB3aWxsIGJlIHdyYXBwZWQgaW4gYSBtb2R1bGUgbmFtZXNwYWNlXG4gICAgLy8gZXhwb3J0cyBwcm94eSB3aGljaCB3aWxsIHNlcnZlIGFzIGEgXCJtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2UgZXhvdGljXG4gICAgLy8gb2JqZWN0XCIuXG4gICAgLy8gU29ydGluZyBwcm9wZXJ0aWVzIGlzIG5vdCBnZW5lcmFsbHkgcmVsaWFibGUgYmVjYXVzZSBzb21lIHByb3BlcnRpZXMgbWF5XG4gICAgLy8gYmUgc3ltYm9scywgYW5kIHN5bWJvbHMgZG8gbm90IGhhdmUgYW4gaW5oZXJlbnQgcmVsYXRpdmUgb3JkZXIsIGJ1dFxuICAgIC8vIHNpbmNlIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBleHBvcnRzIG5hbWVzcGFjZSBtdXN0IGJlIGtleWVkIGJ5IGEgc3RyaW5nXG4gICAgLy8gYW5kIHRoZSBzdHJpbmcgbXVzdCBjb3JyZXNwb25kIHRvIGEgdmFsaWQgaWRlbnRpZmllciwgc29ydGluZyB0aGVzZVxuICAgIC8vIHByb3BlcnRpZXMgd29ya3MgZm9yIHRoaXMgc3BlY2lmaWMgY2FzZS5cbiAgICBhcnJheUZvckVhY2goYXJyYXlTb3J0KGtleXMoZXhwb3J0c1Byb3BzKSksIChrKT0+XG4gICAgICBkZWZpbmVQcm9wZXJ0eShwcm94aWVkRXhwb3J0cywgaywgZXhwb3J0c1Byb3BzW2tdKSk7XG5cblxuICAgIGZyZWV6ZShwcm94aWVkRXhwb3J0cyk7XG4gICAgYWN0aXZhdGUoKTtcbiAgIH1cblxuICBsZXQgb3B0RnVuY3Rvcj0gIGNvbXBhcnRtZW50RXZhbHVhdGUoY29tcGFydG1lbnRGaWVsZHMsIGZ1bmN0b3JTb3VyY2UsIHtcbiAgICBnbG9iYWxPYmplY3Q6IGNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG4gICAgdHJhbnNmb3JtczogX19zaGltVHJhbnNmb3Jtc19fLFxuICAgIF9fbW9kdWxlU2hpbUxleGljYWxzX186IG1vZHVsZUxleGljYWxzfSk7XG5cbiAgbGV0IGRpZFRocm93PSAgZmFsc2U7XG4gIGxldCB0aHJvd25FcnJvcjtcbiAgZnVuY3Rpb24gZXhlY3V0ZSgpIHtcbiAgICBpZiggb3B0RnVuY3Rvcikge1xuICAgICAgLy8gdW5pbml0aWFsaXplZFxuICAgICAgY29uc3QgZnVuY3Rvcj0gIG9wdEZ1bmN0b3I7XG4gICAgICBvcHRGdW5jdG9yPSAgbnVsbDtcbiAgICAgIC8vIGluaXRpYWxpemluZyAtIGNhbGwgd2l0aCBgdGhpc2Agb2YgYHVuZGVmaW5lZGAuXG4gICAgICB0cnkge1xuICAgICAgICBmdW5jdG9yKFxuICAgICAgICAgIGZyZWV6ZSh7XG4gICAgICAgICAgICBpbXBvcnRzOiBmcmVlemUoaW1wb3J0cyksXG4gICAgICAgICAgICBvbmNlVmFyOiBmcmVlemUob25jZVZhciksXG4gICAgICAgICAgICBsaXZlVmFyOiBmcmVlemUobGl2ZVZhciksXG4gICAgICAgICAgICBpbXBvcnRNZXRhfSkpO1xuXG5cbiAgICAgICB9Y2F0Y2goIGUpIHtcbiAgICAgICAgZGlkVGhyb3c9ICB0cnVlO1xuICAgICAgICB0aHJvd25FcnJvcj0gIGU7XG4gICAgICAgfVxuICAgICAgLy8gaW5pdGlhbGl6ZWRcbiAgICAgfVxuICAgIGlmKCBkaWRUaHJvdykge1xuICAgICAgdGhyb3cgdGhyb3duRXJyb3I7XG4gICAgIH1cbiAgIH1cblxuICByZXR1cm4gZnJlZXplKHtcbiAgICBub3RpZmllcnMsXG4gICAgZXhwb3J0c1Byb3h5LFxuICAgIGV4ZWN1dGV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTW9kdWxlSW5zdGFuY2UobWFrZU1vZHVsZUluc3RhbmNlKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjFdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LG1ha2VNb2R1bGVJbnN0YW5jZSxtYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlLE1hcCxSZWZlcmVuY2VFcnJvcixUeXBlRXJyb3IsZW50cmllcyxpc0FycmF5LGlzT2JqZWN0LG1hcEdldCxtYXBIYXMsbWFwU2V0LHdlYWttYXBHZXQ7JGjigI1faW1wb3J0cyhbW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIi4vbW9kdWxlLWluc3RhbmNlLmpzXCIsIFtbXCJtYWtlTW9kdWxlSW5zdGFuY2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VNb2R1bGVJbnN0YW5jZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAobWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbW1vbnMuanNcIiwgW1tcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJSZWZlcmVuY2VFcnJvclwiLCBbJGjigI1fYSA9PiAoUmVmZXJlbmNlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJlbnRyaWVzXCIsIFskaOKAjV9hID0+IChlbnRyaWVzID0gJGjigI1fYSldXSxbXCJpc0FycmF5XCIsIFskaOKAjV9hID0+IChpc0FycmF5ID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1hcEdldFwiLCBbJGjigI1fYSA9PiAobWFwR2V0ID0gJGjigI1fYSldXSxbXCJtYXBIYXNcIiwgWyRo4oCNX2EgPT4gKG1hcEhhcyA9ICRo4oCNX2EpXV0sW1wibWFwU2V0XCIsIFskaOKAjV9hID0+IChtYXBTZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLy8gYGxpbmtgIGNyZWF0ZXMgYE1vZHVsZUluc3RhbmNlc2AgYW5kIGBNb2R1bGVOYW1lc3BhY2VzYCBmb3IgYSBtb2R1bGUgYW5kIGl0c1xuLy8gdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgYW5kIGNvbm5lY3RzIHRoZWlyIGltcG9ydHMgYW5kIGV4cG9ydHMuXG4vLyBBZnRlciBsaW5raW5nLCB0aGUgcmVzdWx0aW5nIHdvcmtpbmcgc2V0IGlzIHJlYWR5IHRvIGJlIGV4ZWN1dGVkLlxuLy8gVGhlIGxpbmtlciBvbmx5IGNvbmNlcm5zIGl0c2VsZiB3aXRoIG1vZHVsZSBuYW1lc3BhY2VzIHRoYXQgYXJlIG9iamVjdHMgd2l0aFxuLy8gcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZWlyIGV4cG9ydHMsIHdoaWNoIHRoZSBDb21wYXJ0bWVudCBwcm94aWVzIHdpdGhcbi8vIHRoZSBhY3R1YWwgYE1vZHVsZU5hbWVzcGFjZWAuXG5jb25zdCAgICAgICAgbGluaz0gIChcbiAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICBtb2R1bGVBbGlhc2VzLFxuICBjb21wYXJ0bWVudCxcbiAgbW9kdWxlU3BlY2lmaWVyKT0+XG4gICAgIHtcbiAgY29uc3QgeyBuYW1lOiBjb21wYXJ0bWVudE5hbWUsIG1vZHVsZVJlY29yZHN9PSAgIHdlYWttYXBHZXQoXG4gICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgIGNvbXBhcnRtZW50KTtcblxuXG4gIGNvbnN0IG1vZHVsZVJlY29yZD0gIG1hcEdldChtb2R1bGVSZWNvcmRzLCBtb2R1bGVTcGVjaWZpZXIpO1xuICBpZiggbW9kdWxlUmVjb3JkPT09ICB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgYE1pc3NpbmcgbGluayB0byBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGZyb20gY29tcGFydG1lbnQgJHtxKFxuICAgICAgICBjb21wYXJ0bWVudE5hbWUpXG4gICAgICAgIH1gKTtcblxuICAgfVxuXG4gIC8vIE11dHVhbCByZWN1cnNpb24gc28gdGhlcmUncyBubyBjb25mdXNpb24gYWJvdXQgd2hpY2hcbiAgLy8gY29tcGFydG1lbnQgaXMgaW4gY29udGV4dDogdGhlIG1vZHVsZSByZWNvcmQgbWF5IGJlIGluIGFub3RoZXJcbiAgLy8gY29tcGFydG1lbnQsIGRlbm90ZWQgYnkgbW9kdWxlUmVjb3JkLmNvbXBhcnRtZW50LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgcmV0dXJuIGluc3RhbnRpYXRlKGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcywgbW9kdWxlQWxpYXNlcywgbW9kdWxlUmVjb3JkKTtcbiB9OyRo4oCNX29uY2UubGluayhsaW5rKTtcblxuZnVuY3Rpb24gaXNQcmVjb21waWxlZChzdGF0aWNNb2R1bGVSZWNvcmQpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0aWNNb2R1bGVSZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fPT09ICAnc3RyaW5nJztcbiB9XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJlY29tcGlsZWRTdGF0aWNNb2R1bGVSZWNvcmQoXG4gIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgbW9kdWxlU3BlY2lmaWVyKVxuICB7XG4gIGNvbnN0IHsgX19maXhlZEV4cG9ydE1hcF9fLCBfX2xpdmVFeHBvcnRNYXBfX309ICAgc3RhdGljTW9kdWxlUmVjb3JkO1xuICBpc09iamVjdChfX2ZpeGVkRXhwb3J0TWFwX18pfHxcbiAgICBGYWlsIGBQcm9wZXJ0eSAnX19maXhlZEV4cG9ydE1hcF9fJyBvZiBhIHByZWNvbXBpbGVkIG1vZHVsZSByZWNvcmQgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoXG4gICAgICBfX2ZpeGVkRXhwb3J0TWFwX18pXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gIGlzT2JqZWN0KF9fbGl2ZUV4cG9ydE1hcF9fKXx8XG4gICAgRmFpbCBgUHJvcGVydHkgJ19fbGl2ZUV4cG9ydE1hcF9fJyBvZiBhIHByZWNvbXBpbGVkIG1vZHVsZSByZWNvcmQgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoXG4gICAgICBfX2xpdmVFeHBvcnRNYXBfXylcbiAgICAgIH0sIGZvciBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5cbmZ1bmN0aW9uIGlzVGhpcmRQYXJ0eShzdGF0aWNNb2R1bGVSZWNvcmQpIHtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0aWNNb2R1bGVSZWNvcmQuZXhlY3V0ZT09PSAgJ2Z1bmN0aW9uJztcbiB9XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGhpcmRQYXJ0eVN0YXRpY01vZHVsZVJlY29yZChcbiAgc3RhdGljTW9kdWxlUmVjb3JkLFxuICBtb2R1bGVTcGVjaWZpZXIpXG4gIHtcbiAgY29uc3QgeyBleHBvcnRzfT0gICBzdGF0aWNNb2R1bGVSZWNvcmQ7XG4gIGlzQXJyYXkoZXhwb3J0cyl8fFxuICAgIEZhaWwgYFByb3BlcnR5ICdleHBvcnRzJyBvZiBhIHRoaXJkLXBhcnR5IHN0YXRpYyBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3EoXG4gICAgICBleHBvcnRzKVxuICAgICAgfSwgZm9yIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX1gO1xuIH1cblxuZnVuY3Rpb24gdmFsaWRhdGVTdGF0aWNNb2R1bGVSZWNvcmQoc3RhdGljTW9kdWxlUmVjb3JkLCBtb2R1bGVTcGVjaWZpZXIpIHtcbiAgaXNPYmplY3Qoc3RhdGljTW9kdWxlUmVjb3JkKXx8XG4gICAgRmFpbCBgU3RhdGljIG1vZHVsZSByZWNvcmRzIG11c3QgYmUgb2YgdHlwZSBvYmplY3QsIGdvdCAke3EoXG4gICAgICBzdGF0aWNNb2R1bGVSZWNvcmQpXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gIGNvbnN0IHsgaW1wb3J0cywgZXhwb3J0cywgcmVleHBvcnRzPSAgW119PSAgIHN0YXRpY01vZHVsZVJlY29yZDtcbiAgaXNBcnJheShpbXBvcnRzKXx8XG4gICAgRmFpbCBgUHJvcGVydHkgJ2ltcG9ydHMnIG9mIGEgc3RhdGljIG1vZHVsZSByZWNvcmQgbXVzdCBiZSBhbiBhcnJheSwgZ290ICR7cShcbiAgICAgIGltcG9ydHMpXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gIGlzQXJyYXkoZXhwb3J0cyl8fFxuICAgIEZhaWwgYFByb3BlcnR5ICdleHBvcnRzJyBvZiBhIHByZWNvbXBpbGVkIG1vZHVsZSByZWNvcmQgbXVzdCBiZSBhbiBhcnJheSwgZ290ICR7cShcbiAgICAgIGV4cG9ydHMpXG4gICAgICB9LCBmb3IgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfWA7XG4gIGlzQXJyYXkocmVleHBvcnRzKXx8XG4gICAgRmFpbCBgUHJvcGVydHkgJ3JlZXhwb3J0cycgb2YgYSBwcmVjb21waWxlZCBtb2R1bGUgcmVjb3JkIG11c3QgYmUgYW4gYXJyYXkgaWYgcHJlc2VudCwgZ290ICR7cShcbiAgICAgIHJlZXhwb3J0cylcbiAgICAgIH0sIGZvciBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5cbmNvbnN0ICAgICAgICBpbnN0YW50aWF0ZT0gIChcbiAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICBtb2R1bGVBbGlhc2VzLFxuICBtb2R1bGVSZWNvcmQpPT5cbiAgICAge1xuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnQsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHJlc29sdmVkSW1wb3J0cyxcbiAgICBzdGF0aWNNb2R1bGVSZWNvcmR9PVxuICAgICAgbW9kdWxlUmVjb3JkO1xuICBjb25zdCB7IGluc3RhbmNlc309ICAgd2Vha21hcEdldChjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsIGNvbXBhcnRtZW50KTtcblxuICAvLyBNZW1vaXplLlxuICBpZiggbWFwSGFzKGluc3RhbmNlcywgbW9kdWxlU3BlY2lmaWVyKSkge1xuICAgIHJldHVybiBtYXBHZXQoaW5zdGFuY2VzLCBtb2R1bGVTcGVjaWZpZXIpO1xuICAgfVxuXG4gIHZhbGlkYXRlU3RhdGljTW9kdWxlUmVjb3JkKHN0YXRpY01vZHVsZVJlY29yZCwgbW9kdWxlU3BlY2lmaWVyKTtcblxuICBjb25zdCBpbXBvcnRlZEluc3RhbmNlcz0gIG5ldyBNYXAoKTtcbiAgbGV0IG1vZHVsZUluc3RhbmNlO1xuICBpZiggaXNQcmVjb21waWxlZChzdGF0aWNNb2R1bGVSZWNvcmQpKSB7XG4gICAgdmFsaWRhdGVQcmVjb21waWxlZFN0YXRpY01vZHVsZVJlY29yZChzdGF0aWNNb2R1bGVSZWNvcmQsIG1vZHVsZVNwZWNpZmllcik7XG4gICAgbW9kdWxlSW5zdGFuY2U9ICBtYWtlTW9kdWxlSW5zdGFuY2UoXG4gICAgICBjb21wYXJ0bWVudFByaXZhdGVGaWVsZHMsXG4gICAgICBtb2R1bGVBbGlhc2VzLFxuICAgICAgbW9kdWxlUmVjb3JkLFxuICAgICAgaW1wb3J0ZWRJbnN0YW5jZXMpO1xuXG4gICB9ZWxzZSBpZiggaXNUaGlyZFBhcnR5KHN0YXRpY01vZHVsZVJlY29yZCkpIHtcbiAgICB2YWxpZGF0ZVRoaXJkUGFydHlTdGF0aWNNb2R1bGVSZWNvcmQoc3RhdGljTW9kdWxlUmVjb3JkLCBtb2R1bGVTcGVjaWZpZXIpO1xuICAgIG1vZHVsZUluc3RhbmNlPSAgbWFrZVRoaXJkUGFydHlNb2R1bGVJbnN0YW5jZShcbiAgICAgIGNvbXBhcnRtZW50UHJpdmF0ZUZpZWxkcyxcbiAgICAgIHN0YXRpY01vZHVsZVJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgIHJlc29sdmVkSW1wb3J0cyk7XG5cbiAgIH1lbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgIGBpbXBvcnRIb29rIG11c3QgcmV0dXJuIGEgc3RhdGljIG1vZHVsZSByZWNvcmQsIGdvdCAke3EoXG4gICAgICAgIHN0YXRpY01vZHVsZVJlY29yZClcbiAgICAgICAgfWApO1xuXG4gICB9XG5cbiAgLy8gTWVtb2l6ZS5cbiAgbWFwU2V0KGluc3RhbmNlcywgbW9kdWxlU3BlY2lmaWVyLCBtb2R1bGVJbnN0YW5jZSk7XG5cbiAgLy8gTGluayBkZXBlbmRlbmN5IG1vZHVsZXMuXG4gIGZvciggY29uc3QgW2ltcG9ydFNwZWNpZmllciwgcmVzb2x2ZWRTcGVjaWZpZXJdb2YgIGVudHJpZXMocmVzb2x2ZWRJbXBvcnRzKSkge1xuICAgIGNvbnN0IGltcG9ydGVkSW5zdGFuY2U9ICBsaW5rKFxuICAgICAgY29tcGFydG1lbnRQcml2YXRlRmllbGRzLFxuICAgICAgbW9kdWxlQWxpYXNlcyxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRTcGVjaWZpZXIpO1xuXG4gICAgbWFwU2V0KGltcG9ydGVkSW5zdGFuY2VzLCBpbXBvcnRTcGVjaWZpZXIsIGltcG9ydGVkSW5zdGFuY2UpO1xuICAgfVxuXG4gIHJldHVybiBtb2R1bGVJbnN0YW5jZTtcbiB9OyRo4oCNX29uY2UuaW5zdGFudGlhdGUoaW5zdGFudGlhdGUpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syMl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNYXAsUmVmZXJlbmNlRXJyb3IsVHlwZUVycm9yLFdlYWtNYXAsYXNzaWduLGRlZmluZVByb3BlcnRpZXMsZW50cmllcyxwcm9taXNlVGhlbix3ZWFrbWFwR2V0LHdlYWttYXBTZXQsc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMsc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzLHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzLHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMsc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lcyxsb2FkLGxpbmssZ2V0RGVmZXJyZWRFeHBvcnRzLGFzc2VydCxjb21wYXJ0bWVudEV2YWx1YXRlLG1ha2VTYWZlRXZhbHVhdG9yOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiTWFwXCIsIFskaOKAjV9hID0+IChNYXAgPSAkaOKAjV9hKV1dLFtcIlJlZmVyZW5jZUVycm9yXCIsIFskaOKAjV9hID0+IChSZWZlcmVuY2VFcnJvciA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIldlYWtNYXBcIiwgWyRo4oCNX2EgPT4gKFdlYWtNYXAgPSAkaOKAjV9hKV1dLFtcImFzc2lnblwiLCBbJGjigI1fYSA9PiAoYXNzaWduID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJlbnRyaWVzXCIsIFskaOKAjV9hID0+IChlbnRyaWVzID0gJGjigI1fYSldXSxbXCJwcm9taXNlVGhlblwiLCBbJGjigI1fYSA9PiAocHJvbWlzZVRoZW4gPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBTZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9nbG9iYWwtb2JqZWN0LmpzXCIsIFtbXCJzZXRHbG9iYWxPYmplY3RTeW1ib2xVbnNjb3BhYmxlc1wiLCBbJGjigI1fYSA9PiAoc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMgPSAkaOKAjV9hKV1dLFtcInNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcInNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi93aGl0ZWxpc3QuanNcIiwgW1tcInNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXNcIiwgWyRo4oCNX2EgPT4gKHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tb2R1bGUtbG9hZC5qc1wiLCBbW1wibG9hZFwiLCBbJGjigI1fYSA9PiAobG9hZCA9ICRo4oCNX2EpXV1dXSxbXCIuL21vZHVsZS1saW5rLmpzXCIsIFtbXCJsaW5rXCIsIFskaOKAjV9hID0+IChsaW5rID0gJGjigI1fYSldXV1dLFtcIi4vbW9kdWxlLXByb3h5LmpzXCIsIFtbXCJnZXREZWZlcnJlZEV4cG9ydHNcIiwgWyRo4oCNX2EgPT4gKGdldERlZmVycmVkRXhwb3J0cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1ldmFsdWF0ZS5qc1wiLCBbW1wiY29tcGFydG1lbnRFdmFsdWF0ZVwiLCBbJGjigI1fYSA9PiAoY29tcGFydG1lbnRFdmFsdWF0ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2Utc2FmZS1ldmFsdWF0b3IuanNcIiwgW1tcIm1ha2VTYWZlRXZhbHVhdG9yXCIsIFskaOKAjV9hID0+IChtYWtlU2FmZUV2YWx1YXRvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuLy8gbW9kdWxlQWxpYXNlcyBhc3NvY2lhdGVzIGV2ZXJ5IHB1YmxpYyBtb2R1bGUgZXhwb3J0cyBuYW1lc3BhY2Ugd2l0aCBpdHNcbi8vIGNvcnJlc3BvbmRpbmcgY29tcGFydG1lbnQgYW5kIHNwZWNpZmllciBzbyB0aGV5IGNhbiBiZSB1c2VkIHRvIGxpbmsgbW9kdWxlc1xuLy8gYWNyb3NzIGNvbXBhcnRtZW50cy5cbi8vIFRoZSBtZWNoYW5pc20gdG8gdGhyZWFkIGFuIGFsaWFzIGlzIHRvIHVzZSB0aGUgY29tcGFydG1lbnQubW9kdWxlIGZ1bmN0aW9uXG4vLyB0byBvYnRhaW4gdGhlIGV4cG9ydHMgbmFtZXNwYWNlIG9mIGEgZm9yZWlnbiBtb2R1bGUgYW5kIHBhc3MgaXQgaW50byBhbm90aGVyXG4vLyBjb21wYXJ0bWVudCdzIG1vZHVsZU1hcCBjb25zdHJ1Y3RvciBvcHRpb24uXG5jb25zdCBtb2R1bGVBbGlhc2VzPSAgbmV3IFdlYWtNYXAoKTtcblxuLy8gcHJpdmF0ZUZpZWxkcyBjYXB0dXJlcyB0aGUgcHJpdmF0ZSBzdGF0ZSBmb3IgZWFjaCBjb21wYXJ0bWVudC5cbmNvbnN0IHByaXZhdGVGaWVsZHM9ICBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoc291cmNlOiBzdHJpbmcpID0+IHN0cmluZ30gVHJhbnNmb3JtXG4gKi9cblxuLy8gQ29tcGFydG1lbnRzIGRvIG5vdCBuZWVkIGFuIGltcG9ydEhvb2sgb3IgcmVzb2x2ZUhvb2sgdG8gYmUgdXNlZnVsXG4vLyBhcyBhIHZlc3NlbCBmb3IgZXZhbHVhdGluZyBwcm9ncmFtcy5cbi8vIEhvd2V2ZXIsIGFueSBtZXRob2QgdGhhdCBvcGVyYXRlcyB0aGUgbW9kdWxlIHN5c3RlbSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvblxuLy8gaWYgdGhlc2UgaG9va3MgYXJlIG5vdCBhdmFpbGFibGUuXG5jb25zdCBhc3NlcnRNb2R1bGVIb29rcz0gIChjb21wYXJ0bWVudCk9PntcbiAgY29uc3QgeyBpbXBvcnRIb29rLCByZXNvbHZlSG9va309ICAgd2Vha21hcEdldChwcml2YXRlRmllbGRzLCBjb21wYXJ0bWVudCk7XG4gIGlmKCB0eXBlb2YgaW1wb3J0SG9vayE9PSAgJ2Z1bmN0aW9uJ3x8ICB0eXBlb2YgcmVzb2x2ZUhvb2shPT0gICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ0NvbXBhcnRtZW50IG11c3QgYmUgY29uc3RydWN0ZWQgd2l0aCBhbiBpbXBvcnRIb29rIGFuZCBhIHJlc29sdmVIb29rIGZvciBpdCB0byBiZSBhYmxlIHRvIGxvYWQgbW9kdWxlcycpO1xuXG4gICB9XG4gfTtcblxuY29uc3QgICAgICAgIEluZXJ0Q29tcGFydG1lbnQ9ICBmdW5jdGlvbiBDb21wYXJ0bWVudChcbiAgX2VuZG93bWVudHM9ICB7fSxcbiAgX21vZHVsZXM9ICB7fSxcbiAgX29wdGlvbnM9ICB7fSlcbiAge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdDb21wYXJ0bWVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgaXMgbm90IGEgdmFsaWQgY29uc3RydWN0b3IuJyk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnR9IGNvbXBhcnRtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyXG4gKi8kaOKAjV9vbmNlLkluZXJ0Q29tcGFydG1lbnQoSW5lcnRDb21wYXJ0bWVudCk7XG5jb25zdCBjb21wYXJ0bWVudEltcG9ydE5vdz0gIChjb21wYXJ0bWVudCwgc3BlY2lmaWVyKT0+ICB7XG4gIGNvbnN0IHsgZXhlY3V0ZSwgZXhwb3J0c1Byb3h5fT0gICBsaW5rKFxuICAgIHByaXZhdGVGaWVsZHMsXG4gICAgbW9kdWxlQWxpYXNlcyxcbiAgICBjb21wYXJ0bWVudCxcbiAgICBzcGVjaWZpZXIpO1xuXG4gIGV4ZWN1dGUoKTtcbiAgcmV0dXJuIGV4cG9ydHNQcm94eTtcbiB9O1xuXG5jb25zdCAgICAgICAgQ29tcGFydG1lbnRQcm90b3R5cGU9ICB7XG4gIGNvbnN0cnVjdG9yOiBJbmVydENvbXBhcnRtZW50LFxuXG4gIGdldCBnbG9iYWxUaGlzKCkge1xuICAgIHJldHVybiB3ZWFrbWFwR2V0KHByaXZhdGVGaWVsZHMsIHRoaXMpLmdsb2JhbE9iamVjdDtcbiAgIH0sXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHdlYWttYXBHZXQocHJpdmF0ZUZpZWxkcywgdGhpcykubmFtZTtcbiAgIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgaXMgYSBKYXZhU2NyaXB0IHByb2dyYW0gZ3JhbW1hciBjb25zdHJ1Y3Rpb24uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtBcnJheTxUcmFuc2Zvcm0+fSBbb3B0aW9ucy50cmFuc2Zvcm1zXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNsb3BweUdsb2JhbHNNb2RlXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuX19tb2R1bGVTaGltTGV4aWNhbHNfX11cbiAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5fX2V2YWRlSHRtbENvbW1lbnRUZXN0X19dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuX19ldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0X19dXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuX19yZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zX19dXG4gICAqL1xuICBldmFsdWF0ZShzb3VyY2UsIG9wdGlvbnM9ICB7fSkge1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RmllbGRzPSAgd2Vha21hcEdldChwcml2YXRlRmllbGRzLCB0aGlzKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRFdmFsdWF0ZShjb21wYXJ0bWVudEZpZWxkcywgc291cmNlLCBvcHRpb25zKTtcbiAgIH0sXG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0IENvbXBhcnRtZW50XSc7XG4gICB9LFxuXG4gIG1vZHVsZShzcGVjaWZpZXIpIHtcbiAgICBpZiggdHlwZW9mIHNwZWNpZmllciE9PSAgJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IG9mIG1vZHVsZSgpIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgfVxuXG4gICAgYXNzZXJ0TW9kdWxlSG9va3ModGhpcyk7XG5cbiAgICBjb25zdCB7IGV4cG9ydHNQcm94eX09ICAgZ2V0RGVmZXJyZWRFeHBvcnRzKFxuICAgICAgdGhpcyxcbiAgICAgIHdlYWttYXBHZXQocHJpdmF0ZUZpZWxkcywgdGhpcyksXG4gICAgICBtb2R1bGVBbGlhc2VzLFxuICAgICAgc3BlY2lmaWVyKTtcblxuXG4gICAgcmV0dXJuIGV4cG9ydHNQcm94eTtcbiAgIH0sXG5cbiAgICAgICAgYXN5bmMgaW1wb3J0KHNwZWNpZmllcil7XG4gICAgaWYoIHR5cGVvZiBzcGVjaWZpZXIhPT0gICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBvZiBpbXBvcnQoKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgIH1cblxuICAgIGFzc2VydE1vZHVsZUhvb2tzKHRoaXMpO1xuXG4gICAgcmV0dXJuIHByb21pc2VUaGVuKFxuICAgICAgbG9hZChwcml2YXRlRmllbGRzLCBtb2R1bGVBbGlhc2VzLCB0aGlzLCBzcGVjaWZpZXIpLFxuICAgICAgKCk9PiAge1xuICAgICAgICAvLyBUaGUgbmFtZXNwYWNlIGJveCBpcyBhIGNvbnRlbnRpb3VzIGRlc2lnbiBhbmQgbGlrZWx5IHRvIGJlIGEgYnJlYWtpbmdcbiAgICAgICAgLy8gY2hhbmdlIGluIGFuIGFwcHJvcHJpYXRlbHkgbnVtYmVyZWQgZnV0dXJlIHZlcnNpb24uXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZT0gIGNvbXBhcnRtZW50SW1wb3J0Tm93KFxuICAgICAgICAgIC8qKiBAdHlwZSB7Q29tcGFydG1lbnR9ICovICB0aGlzLFxuICAgICAgICAgIHNwZWNpZmllcik7XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZXNwYWNlfTtcbiAgICAgICB9KTtcblxuICAgfSxcblxuICAgICAgICBhc3luYyBsb2FkKHNwZWNpZmllcil7XG4gICAgaWYoIHR5cGVvZiBzcGVjaWZpZXIhPT0gICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaXJzdCBhcmd1bWVudCBvZiBsb2FkKCkgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgICB9XG5cbiAgICBhc3NlcnRNb2R1bGVIb29rcyh0aGlzKTtcblxuICAgIHJldHVybiBsb2FkKHByaXZhdGVGaWVsZHMsIG1vZHVsZUFsaWFzZXMsIHRoaXMsIHNwZWNpZmllcik7XG4gICB9LFxuXG4gIGltcG9ydE5vdyhzcGVjaWZpZXIpIHtcbiAgICBpZiggdHlwZW9mIHNwZWNpZmllciE9PSAgJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpcnN0IGFyZ3VtZW50IG9mIGltcG9ydE5vdygpIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICAgfVxuXG4gICAgYXNzZXJ0TW9kdWxlSG9va3ModGhpcyk7XG5cbiAgICByZXR1cm4gY29tcGFydG1lbnRJbXBvcnROb3coLyoqIEB0eXBlIHtDb21wYXJ0bWVudH0gKi8gIHRoaXMsICBzcGVjaWZpZXIpO1xuICAgfX07JGjigI1fb25jZS5Db21wYXJ0bWVudFByb3RvdHlwZShDb21wYXJ0bWVudFByb3RvdHlwZSk7XG5cblxuZGVmaW5lUHJvcGVydGllcyhJbmVydENvbXBhcnRtZW50LCB7XG4gIHByb3RvdHlwZTogeyB2YWx1ZTogQ29tcGFydG1lbnRQcm90b3R5cGV9fSk7XG5cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3JcbiAqIEBwYXJhbSB7TWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3J9IHRhcmdldE1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGludHJpbnNpY3NcbiAqIEBwYXJhbSB7KG9iamVjdDogT2JqZWN0KSA9PiB2b2lkfSBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvblxuICogQHJldHVybnMge0NvbXBhcnRtZW50Wydjb25zdHJ1Y3RvciddfVxuICovXG5cbi8qKiBAdHlwZSB7TWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3J9ICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3I9ICAoXG4gIHRhcmdldE1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLFxuICBpbnRyaW5zaWNzLFxuICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbik9PlxuICAgICB7XG4gIGZ1bmN0aW9uIENvbXBhcnRtZW50KGVuZG93bWVudHM9ICB7fSwgbW9kdWxlTWFwPSAge30sIG9wdGlvbnM9ICB7fSkge1xuICAgIGlmKCBuZXcudGFyZ2V0PT09ICB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiQ2xhc3MgY29uc3RydWN0b3IgQ29tcGFydG1lbnQgY2Fubm90IGJlIGludm9rZWQgd2l0aG91dCAnbmV3J1wiKTtcblxuICAgICB9XG5cbiAgICAvLyBFeHRyYWN0IG9wdGlvbnMsIGFuZCBzaGFsbG93LWNsb25lIHRyYW5zZm9ybXMuXG4gICAgY29uc3Qge1xuICAgICAgbmFtZT0gICc8dW5rbm93bj4nLFxuICAgICAgdHJhbnNmb3Jtcz0gIFtdLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fPSAgW10sXG4gICAgICByZXNvbHZlSG9vayxcbiAgICAgIGltcG9ydEhvb2ssXG4gICAgICBtb2R1bGVNYXBIb29rLFxuICAgICAgaW1wb3J0TWV0YUhvb2t9PVxuICAgICAgICBvcHRpb25zO1xuICAgIGNvbnN0IGdsb2JhbFRyYW5zZm9ybXM9ICBbLi4udHJhbnNmb3JtcywgLi4uX19zaGltVHJhbnNmb3Jtc19fXTtcblxuICAgIC8vIE1hcDxGdWxsU3BlY2lmaWVyLCBNb2R1bGVDb21wYXJ0bWVudFJlY29yZD5cbiAgICBjb25zdCBtb2R1bGVSZWNvcmRzPSAgbmV3IE1hcCgpO1xuICAgIC8vIE1hcDxGdWxsU3BlY2lmaWVyLCBNb2R1bGVJbnN0YW5jZT5cbiAgICBjb25zdCBpbnN0YW5jZXM9ICBuZXcgTWFwKCk7XG4gICAgLy8gTWFwPEZ1bGxTcGVjaWZpZXIsIHtFeHBvcnRzUHJveHksIFByb3hpZWRFeHBvcnRzLCBhY3RpdmF0ZSgpfT5cbiAgICBjb25zdCBkZWZlcnJlZEV4cG9ydHM9ICBuZXcgTWFwKCk7XG5cbiAgICAvLyBWYWxpZGF0ZSBnaXZlbiBtb2R1bGVNYXAuXG4gICAgLy8gVGhlIG1vZHVsZSBtYXAgZ2V0cyB0cmFuc2xhdGVkIG9uLWRlbWFuZCBpbiBtb2R1bGUtbG9hZC5qcyBhbmQgdGhlXG4gICAgLy8gbW9kdWxlTWFwIGNhbiBiZSBpbnZhbGlkIGluIHdheXMgdGhhdCBjYW5ub3QgYmUgZGV0ZWN0ZWQgaW4gdGhlXG4gICAgLy8gY29uc3RydWN0b3IsIGJ1dCB0aGVzZSBjaGVja3MgYWxsb3cgdXMgdG8gdGhyb3cgZWFybHkgZm9yIGEgYmV0dGVyXG4gICAgLy8gZGV2ZWxvcGVyIGV4cGVyaWVuY2UuXG4gICAgZm9yKCBjb25zdCBbc3BlY2lmaWVyLCBhbGlhc05hbWVzcGFjZV1vZiAgZW50cmllcyhtb2R1bGVNYXB8fCAge30pKSB7XG4gICAgICBpZiggdHlwZW9mIGFsaWFzTmFtZXNwYWNlPT09ICAnc3RyaW5nJykge1xuICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBwYXJlbnQgbW9kdWxlIHJlY29yZCByZXRyaWV2YWwuXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgIGBDYW5ub3QgbWFwIG1vZHVsZSAke3Eoc3BlY2lmaWVyKX0gdG8gJHtxKFxuICAgICAgICAgICAgYWxpYXNOYW1lc3BhY2UpXG4gICAgICAgICAgICB9IGluIHBhcmVudCBjb21wYXJ0bWVudGApO1xuXG4gICAgICAgfWVsc2UgaWYoIHdlYWttYXBHZXQobW9kdWxlQWxpYXNlcywgYWxpYXNOYW1lc3BhY2UpPT09ICB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVE9ETyBjcmVhdGUgYW5kIGxpbmsgYSBzeW50aGV0aWMgbW9kdWxlIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuXG4gICAgICAgIC8vIG5hbWVzcGFjZSBvYmplY3QuXG4gICAgICAgIHRocm93IFJlZmVyZW5jZUVycm9yKFxuICAgICAgICAgICBgQ2Fubm90IG1hcCBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgc3BlY2lmaWVyKVxuICAgICAgICAgICAgfSBiZWNhdXNlIGl0IGhhcyBubyBrbm93biBjb21wYXJ0bWVudCBpbiB0aGlzIHJlYWxtYCk7XG5cbiAgICAgICB9XG4gICAgIH1cblxuICAgIGNvbnN0IGdsb2JhbE9iamVjdD0gIHt9O1xuXG4gICAgc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMoZ2xvYmFsT2JqZWN0KTtcblxuICAgIC8vIFdlIG11c3QgaW5pdGlhbGl6ZSBhbGwgY29uc3RhbnQgcHJvcGVydGllcyBmaXJzdCBiZWNhdXNlXG4gICAgLy8gYG1ha2VTYWZlRXZhbHVhdG9yYCBtYXkgdXNlIHRoZW0gdG8gY3JlYXRlIG9wdGltaXplZCBiaW5kaW5nc1xuICAgIC8vIGluIHRoZSBldmFsdWF0b3IuXG4gICAgLy8gVE9ETzogY29uc2lkZXIgbWVyZ2luZyBpbnRvIGEgc2luZ2xlIGluaXRpYWxpemF0aW9uIGlmIGludGVybmFsXG4gICAgLy8gZXZhbHVhdG9yIGlzIG5vIGxvbmdlciBlYWdlcmx5IGNyZWF0ZWRcbiAgICBzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXMoZ2xvYmFsT2JqZWN0KTtcblxuICAgIGNvbnN0IHsgc2FmZUV2YWx1YXRlfT0gICBtYWtlU2FmZUV2YWx1YXRvcih7XG4gICAgICBnbG9iYWxPYmplY3QsXG4gICAgICBnbG9iYWxUcmFuc2Zvcm1zLFxuICAgICAgc2xvcHB5R2xvYmFsc01vZGU6IGZhbHNlfSk7XG5cblxuICAgIHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzKGdsb2JhbE9iamVjdCwge1xuICAgICAgaW50cmluc2ljcyxcbiAgICAgIG5ld0dsb2JhbFByb3BlcnR5TmFtZXM6IHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMsXG4gICAgICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcjogdGFyZ2V0TWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3IsXG4gICAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbn0pO1xuXG5cbiAgICAvLyBUT0RPOiBtYXliZSBhZGQgZXZhbFRhbWluZyB0byB0aGUgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgM3JkIG9wdGlvbnM/XG4gICAgc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycyhcbiAgICAgIGdsb2JhbE9iamVjdCxcbiAgICAgIHNhZmVFdmFsdWF0ZSxcbiAgICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuXG4gICAgYXNzaWduKGdsb2JhbE9iamVjdCwgZW5kb3dtZW50cyk7XG5cbiAgICB3ZWFrbWFwU2V0KHByaXZhdGVGaWVsZHMsIHRoaXMsIHtcbiAgICAgIG5hbWU6ICBgJHtuYW1lfWAsXG4gICAgICBnbG9iYWxUcmFuc2Zvcm1zLFxuICAgICAgZ2xvYmFsT2JqZWN0LFxuICAgICAgc2FmZUV2YWx1YXRlLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgbW9kdWxlTWFwLFxuICAgICAgbW9kdWxlTWFwSG9vayxcbiAgICAgIGltcG9ydE1ldGFIb29rLFxuICAgICAgbW9kdWxlUmVjb3JkcyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICAgIGRlZmVycmVkRXhwb3J0cyxcbiAgICAgIGluc3RhbmNlc30pO1xuXG4gICB9XG5cbiAgQ29tcGFydG1lbnQucHJvdG90eXBlPSAgQ29tcGFydG1lbnRQcm90b3R5cGU7XG5cbiAgcmV0dXJuIENvbXBhcnRtZW50O1xuIH07JGjigI1fb25jZS5tYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcihtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3Rvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzIzXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFR5cGVFcnJvcixXZWFrU2V0LGFycmF5RmlsdGVyLGRlZmluZVByb3BlcnR5LGVudHJpZXMsZnJlZXplLGdldE93blByb3BlcnR5RGVzY3JpcHRvcixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdsb2JhbFRoaXMsaXMsaXNPYmplY3Qsb2JqZWN0SGFzT3duUHJvcGVydHksdmFsdWVzLHdlYWtzZXRIYXMsY29uc3RhbnRQcm9wZXJ0aWVzLHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMsdW5pdmVyc2FsUHJvcGVydHlOYW1lcyx3aGl0ZWxpc3Q7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiV2Vha1NldFwiLCBbJGjigI1fYSA9PiAoV2Vha1NldCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlGaWx0ZXJcIiwgWyRo4oCNX2EgPT4gKGFycmF5RmlsdGVyID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9ICRo4oCNX2EpXV0sW1wiZ2xvYmFsVGhpc1wiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVGhpcyA9ICRo4oCNX2EpXV0sW1wiaXNcIiwgWyRo4oCNX2EgPT4gKGlzID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm9iamVjdEhhc093blByb3BlcnR5XCIsIFskaOKAjV9hID0+IChvYmplY3RIYXNPd25Qcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1widmFsdWVzXCIsIFskaOKAjV9hID0+ICh2YWx1ZXMgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRIYXMgPSAkaOKAjV9hKV1dXV0sW1wiLi93aGl0ZWxpc3QuanNcIiwgW1tcImNvbnN0YW50UHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoY29uc3RhbnRQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXSxbXCJ1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+ICh1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXSxbXCJ3aGl0ZWxpc3RcIiwgWyRo4oCNX2EgPT4gKHdoaXRlbGlzdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzRnVuY3Rpb249ICAob2JqKT0+dHlwZW9mIG9iaj09PSAgJ2Z1bmN0aW9uJztcblxuLy8gTGlrZSBkZWZpbmVQcm9wZXJ0eSwgYnV0IHRocm93cyBpZiBpdCB3b3VsZCBtb2RpZnkgYW4gZXhpc3RpbmcgcHJvcGVydHkuXG4vLyBXZSB1c2UgdGhpcyB0byBlbnN1cmUgdGhhdCB0d28gY29uZmxpY3RpbmcgYXR0ZW1wdHMgdG8gZGVmaW5lIHRoZSBzYW1lXG4vLyBwcm9wZXJ0eSB0aHJvd3MsIGNhdXNpbmcgU0VTIGluaXRpYWxpemF0aW9uIHRvIGZhaWwuIE90aGVyd2lzZSwgYVxuLy8gY29uZmxpY3QgYmV0d2VlbiwgZm9yIGV4YW1wbGUsIHR3byBvZiBTRVMncyBpbnRlcm5hbCB3aGl0ZWxpc3RzIG1pZ2h0XG4vLyBnZXQgbWFza2VkIGFzIG9uZSBvdmVyd3JpdGVzIHRoZSBvdGhlci4gQWNjb3JkaW5nbHksIHRoZSB0aHJvd24gZXJyb3Jcbi8vIGNvbXBsYWlucyBvZiBhIFwiQ29uZmxpY3RpbmcgZGVmaW5pdGlvblwiLlxuZnVuY3Rpb24gaW5pdFByb3BlcnR5KG9iaiwgbmFtZSwgZGVzYykge1xuICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkob2JqLCBuYW1lKSkge1xuICAgIGNvbnN0IHByZURlc2M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBuYW1lKTtcbiAgICBpZihcbiAgICAgICFpcyhwcmVEZXNjLnZhbHVlLCBkZXNjLnZhbHVlKXx8XG4gICAgICBwcmVEZXNjLmdldCE9PSAgZGVzYy5nZXR8fFxuICAgICAgcHJlRGVzYy5zZXQhPT0gIGRlc2Muc2V0fHxcbiAgICAgIHByZURlc2Mud3JpdGFibGUhPT0gIGRlc2Mud3JpdGFibGV8fFxuICAgICAgcHJlRGVzYy5lbnVtZXJhYmxlIT09ICBkZXNjLmVudW1lcmFibGV8fFxuICAgICAgcHJlRGVzYy5jb25maWd1cmFibGUhPT0gIGRlc2MuY29uZmlndXJhYmxlKVxuICAgICAge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYENvbmZsaWN0aW5nIGRlZmluaXRpb25zIG9mICR7bmFtZX1gKTtcbiAgICAgfVxuICAgfVxuICBkZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2MpO1xuIH1cblxuLy8gTGlrZSBkZWZpbmVQcm9wZXJ0aWVzLCBidXQgdGhyb3dzIGlmIGl0IHdvdWxkIG1vZGlmeSBhbiBleGlzdGluZyBwcm9wZXJ0eS5cbi8vIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBpbnRyaW5zaWNzIGFkZGVkIHRvIHRoZSBpbnRyaW5zaWNzIGNvbGxlY3RvciBvYmplY3Rcbi8vIGdyYXBoIGRvIG5vdCBvdmVybGFwLlxuZnVuY3Rpb24gaW5pdFByb3BlcnRpZXMob2JqLCBkZXNjcykge1xuICBmb3IoIGNvbnN0IFtuYW1lLCBkZXNjXW9mICBlbnRyaWVzKGRlc2NzKSkge1xuICAgIGluaXRQcm9wZXJ0eShvYmosIG5hbWUsIGRlc2MpO1xuICAgfVxuIH1cblxuLy8gc2FtcGxlR2xvYmFscyBjcmVhdGVzIGFuIGludHJpbnNpY3Mgb2JqZWN0LCBzdWl0YWJsZSBmb3Jcbi8vIGludGVyaW5zaWNzQ29sbGVjdG9yLmFkZEludHJpbnNpY3MsIGZyb20gdGhlIG5hbWVkIHByb3BlcnRpZXMgb2YgYSBnbG9iYWxcbi8vIG9iamVjdC5cbmZ1bmN0aW9uIHNhbXBsZUdsb2JhbHMoZ2xvYmFsT2JqZWN0LCBuZXdQcm9wZXJ0eU5hbWVzKSB7XG4gIGNvbnN0IG5ld0ludHJpbnNpY3M9ICB7IF9fcHJvdG9fXzogbnVsbH07XG4gIGZvciggY29uc3QgW2dsb2JhbE5hbWUsIGludHJpbnNpY05hbWVdb2YgIGVudHJpZXMobmV3UHJvcGVydHlOYW1lcykpIHtcbiAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoZ2xvYmFsT2JqZWN0LCBnbG9iYWxOYW1lKSkge1xuICAgICAgbmV3SW50cmluc2ljc1tpbnRyaW5zaWNOYW1lXT0gIGdsb2JhbE9iamVjdFtnbG9iYWxOYW1lXTtcbiAgICAgfVxuICAgfVxuICByZXR1cm4gbmV3SW50cmluc2ljcztcbiB9XG5cbmNvbnN0ICAgICAgICBtYWtlSW50cmluc2ljc0NvbGxlY3Rvcj0gICgpPT4gIHtcbiAgY29uc3QgaW50cmluc2ljcz0gIHsgX19wcm90b19fOiBudWxsfTtcbiAgbGV0IHBzZXVkb05hdGl2ZXM7XG5cbiAgY29uc3QgYWRkSW50cmluc2ljcz0gIChuZXdJbnRyaW5zaWNzKT0+e1xuICAgIGluaXRQcm9wZXJ0aWVzKGludHJpbnNpY3MsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobmV3SW50cmluc2ljcykpO1xuICAgfTtcbiAgZnJlZXplKGFkZEludHJpbnNpY3MpO1xuXG4gIC8vIEZvciBlYWNoIGludHJpbnNpYywgaWYgaXQgaGFzIGEgYC5wcm90b3R5cGVgIHByb3BlcnR5LCB1c2UgdGhlXG4gIC8vIHdoaXRlbGlzdCB0byBmaW5kIG91dCB0aGUgaW50cmluc2ljIG5hbWUgZm9yIHRoYXQgcHJvdG90eXBlIGFuZCBhZGQgaXRcbiAgLy8gdG8gdGhlIGludHJpbnNpY3MuXG4gIGNvbnN0IGNvbXBsZXRlUHJvdG90eXBlcz0gICgpPT4gIHtcbiAgICBmb3IoIGNvbnN0IFtuYW1lLCBpbnRyaW5zaWNdb2YgIGVudHJpZXMoaW50cmluc2ljcykpIHtcbiAgICAgIGlmKCAhaXNPYmplY3QoaW50cmluc2ljKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICAgfVxuICAgICAgaWYoICFvYmplY3RIYXNPd25Qcm9wZXJ0eShpbnRyaW5zaWMsICdwcm90b3R5cGUnKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICAgfVxuICAgICAgY29uc3QgcGVybWl0PSAgd2hpdGVsaXN0W25hbWVdO1xuICAgICAgaWYoIHR5cGVvZiBwZXJtaXQhPT0gICdvYmplY3QnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBFeHBlY3RlZCBwZXJtaXQgb2JqZWN0IGF0IHdoaXRlbGlzdC4ke25hbWV9YCk7XG4gICAgICAgfVxuICAgICAgY29uc3QgbmFtZVByb3RvdHlwZT0gIHBlcm1pdC5wcm90b3R5cGU7XG4gICAgICBpZiggIW5hbWVQcm90b3R5cGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYCR7bmFtZX0ucHJvdG90eXBlIHByb3BlcnR5IG5vdCB3aGl0ZWxpc3RlZGApO1xuICAgICAgIH1cbiAgICAgIGlmKFxuICAgICAgICB0eXBlb2YgbmFtZVByb3RvdHlwZSE9PSAgJ3N0cmluZyd8fFxuICAgICAgICAhb2JqZWN0SGFzT3duUHJvcGVydHkod2hpdGVsaXN0LCBuYW1lUHJvdG90eXBlKSlcbiAgICAgICAge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgVW5yZWNvZ25pemVkICR7bmFtZX0ucHJvdG90eXBlIHdoaXRlbGlzdCBlbnRyeWApO1xuICAgICAgIH1cbiAgICAgIGNvbnN0IGludHJpbnNpY1Byb3RvdHlwZT0gIGludHJpbnNpYy5wcm90b3R5cGU7XG4gICAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoaW50cmluc2ljcywgbmFtZVByb3RvdHlwZSkpIHtcbiAgICAgICAgaWYoIGludHJpbnNpY3NbbmFtZVByb3RvdHlwZV0hPT0gIGludHJpbnNpY1Byb3RvdHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBDb25mbGljdGluZyBiaW5kaW5ncyBvZiAke25hbWVQcm90b3R5cGV9YCk7XG4gICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuICAgICAgICBjb250aW51ZTtcbiAgICAgICB9XG4gICAgICBpbnRyaW5zaWNzW25hbWVQcm90b3R5cGVdPSAgaW50cmluc2ljUHJvdG90eXBlO1xuICAgICB9XG4gICB9O1xuICBmcmVlemUoY29tcGxldGVQcm90b3R5cGVzKTtcblxuICBjb25zdCBmaW5hbEludHJpbnNpY3M9ICAoKT0+ICB7XG4gICAgZnJlZXplKGludHJpbnNpY3MpO1xuICAgIHBzZXVkb05hdGl2ZXM9ICBuZXcgV2Vha1NldChhcnJheUZpbHRlcih2YWx1ZXMoaW50cmluc2ljcyksIGlzRnVuY3Rpb24pKTtcbiAgICByZXR1cm4gaW50cmluc2ljcztcbiAgIH07XG4gIGZyZWV6ZShmaW5hbEludHJpbnNpY3MpO1xuXG4gIGNvbnN0IGlzUHNldWRvTmF0aXZlPSAgKG9iaik9PntcbiAgICBpZiggIXBzZXVkb05hdGl2ZXMpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdpc1BzZXVkb05hdGl2ZSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgZmluYWxJbnRyaW5zaWNzJyk7XG5cbiAgICAgfVxuICAgIHJldHVybiB3ZWFrc2V0SGFzKHBzZXVkb05hdGl2ZXMsIG9iaik7XG4gICB9O1xuICBmcmVlemUoaXNQc2V1ZG9OYXRpdmUpO1xuXG4gIGNvbnN0IGludHJpbnNpY3NDb2xsZWN0b3I9ICB7XG4gICAgYWRkSW50cmluc2ljcyxcbiAgICBjb21wbGV0ZVByb3RvdHlwZXMsXG4gICAgZmluYWxJbnRyaW5zaWNzLFxuICAgIGlzUHNldWRvTmF0aXZlfTtcblxuICBmcmVlemUoaW50cmluc2ljc0NvbGxlY3Rvcik7XG5cbiAgYWRkSW50cmluc2ljcyhjb25zdGFudFByb3BlcnRpZXMpO1xuICBhZGRJbnRyaW5zaWNzKHNhbXBsZUdsb2JhbHMoZ2xvYmFsVGhpcywgdW5pdmVyc2FsUHJvcGVydHlOYW1lcykpO1xuXG4gIHJldHVybiBpbnRyaW5zaWNzQ29sbGVjdG9yO1xuIH07XG5cbi8qKlxuICogZ2V0R2xvYmFsSW50cmluc2ljcygpXG4gKiBEb2Vzbid0IHRhbWUsIGRlbGV0ZSwgb3IgbW9kaWZ5IGFueXRoaW5nLiBTYW1wbGVzIGdsb2JhbE9iamVjdCB0byBjcmVhdGUgYW5cbiAqIGludHJpbnNpY3MgcmVjb3JkIGNvbnRhaW5pbmcgb25seSB0aGUgd2hpdGVsaXN0ZWQgZ2xvYmFsIHZhcmlhYmxlcywgbGlzdGVkXG4gKiBieSB0aGUgaW50cmluc2ljIG5hbWVzIGFwcHJvcHJpYXRlIGZvciBuZXcgZ2xvYmFscywgaS5lLiwgdGhlIGdsb2JhbHMgb2ZcbiAqIG5ld2x5IGNvbnN0cnVjdGVkIGNvbXBhcnRtZW50cy5cbiAqXG4gKiBXQVJOSU5HOlxuICogSWYgcnVuIGJlZm9yZSBsb2NrZG93biwgdGhlIHJldHVybmVkIGludHJpbnNpY3MgcmVjb3JkIHdpbGwgY2FycnkgdGhlXG4gKiAqb3JpZ2luYWwqIHVuc2FmZSAoZmVyYWwsIHVudGFtZWQpIGJpbmRpbmdzIG9mIHRoZXNlIGdsb2JhbCB2YXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGdsb2JhbE9iamVjdFxuICovJGjigI1fb25jZS5tYWtlSW50cmluc2ljc0NvbGxlY3RvcihtYWtlSW50cmluc2ljc0NvbGxlY3Rvcik7XG5jb25zdCAgICAgICAgZ2V0R2xvYmFsSW50cmluc2ljcz0gIChnbG9iYWxPYmplY3QpPT57XG4gIGNvbnN0IHsgYWRkSW50cmluc2ljcywgZmluYWxJbnRyaW5zaWNzfT0gICBtYWtlSW50cmluc2ljc0NvbGxlY3RvcigpO1xuXG4gIGFkZEludHJpbnNpY3Moc2FtcGxlR2xvYmFscyhnbG9iYWxPYmplY3QsIHNoYXJlZEdsb2JhbFByb3BlcnR5TmFtZXMpKTtcblxuICByZXR1cm4gZmluYWxJbnRyaW5zaWNzKCk7XG4gfTskaOKAjV9vbmNlLmdldEdsb2JhbEludHJpbnNpY3MoZ2V0R2xvYmFsSW50cmluc2ljcyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzI0XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAZmlsZSBFeHBvcnRzIHtAY29kZSBlbmFibGVtZW50c30sIGEgcmVjdXJzaXZlbHkgZGVmaW5lZFxuICogSlNPTiByZWNvcmQgZGVmaW5pbmcgdGhlIG9wdGltdW0gc2V0IG9mIGludHJpbnNpY3MgcHJvcGVydGllc1xuICogdGhhdCBuZWVkIHRvIGJlIFwicmVwYWlyZWRcIiBiZWZvcmUgaGFyZGVuaW5nIGlzIGFwcGxpZWQgb25cbiAqIGVudmlyb21tZW50cyBzdWJqZWN0IHRvIHRoZSBvdmVycmlkZSBtaXN0YWtlLlxuICpcbiAqIEBhdXRob3IgSkYgUGFyYWRpc1xuICogQGF1dGhvciBNYXJrIFMuIE1pbGxlclxuICovXG5cbi8qKlxuICogPHA+QmVjYXVzZSBcInJlcGFpcmluZ1wiIHJlcGxhY2VzIGRhdGEgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycywgZXZlcnlcbiAqIHRpbWUgYSByZXBhaXJlZCBwcm9wZXJ0eSBpcyBhY2Nlc3NlZCwgdGhlIGFzc29jaWF0ZWQgZ2V0dGVyIGlzIGludm9rZWQsXG4gKiB3aGljaCBkZWdyYWRlcyB0aGUgcnVudGltZSBwZXJmb3JtYW5jZSBvZiBhbGwgY29kZSBleGVjdXRpbmcgaW4gdGhlXG4gKiByZXBhaXJlZCBlbnZpcm9tbWVudCwgY29tcGFyZWQgdG8gdGhlIG5vbi1yZXBhaXJlZCBjYXNlLiBJbiBvcmRlclxuICogdG8gbWFpbnRhaW4gcGVyZm9ybWFuY2UsIHdlIG9ubHkgcmVwYWlyIHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdHNcbiAqIGZvciB3aGljaCBoYXJkZW5pbmcgY2F1c2VzIGEgYnJlYWthZ2Ugb2YgdGhlaXIgbm9ybWFsIGludGVuZGVkIHVzYWdlLlxuICpcbiAqIFRoZXJlIGFyZSB0aHJlZSB1bndhbnRlZCBjYXNlczpcbiAqIDx1bD5cbiAqIDxsaT5PdmVycmlkaW5nIHByb3BlcnRpZXMgb24gb2JqZWN0cyB0eXBpY2FsbHkgdXNlZCBhcyByZWNvcmRzLFxuICogICAgIG5hbWVseSB7QGNvZGUgXCJPYmplY3RcIn0gYW5kIHtAY29kZSBcIkFycmF5XCJ9LiBJbiB0aGUgY2FzZSBvZiBhcnJheXMsXG4gKiAgICAgdGhlIHNpdHVhdGlvbiBpcyB1bmludGVudGlvbmFsLCBhIGdpdmVuIHByb2dyYW0gbWlnaHQgbm90IGJlIGF3YXJlXG4gKiAgICAgdGhhdCBub24tbnVtZXJpY2FsIHByb3BlcnRpZXMgYXJlIHN0b3JlZCBvbiB0aGUgdW5kZXJseWluZyBvYmplY3RcbiAqICAgICBpbnN0YW5jZSwgbm90IG9uIHRoZSBhcnJheS4gV2hlbiBhbiBvYmplY3QgaXMgdHlwaWNhbGx5IHVzZWQgYXMgYVxuICogICAgIG1hcCwgd2UgcmVwYWlyIGFsbCBvZiBpdHMgcHJvdG90eXBlIHByb3BlcnRpZXMuXG4gKiA8bGk+T3ZlcnJpZGluZyBwcm9wZXJ0aWVzIG9uIG9iamVjdHMgdGhhdCBwcm92aWRlIGRlZmF1bHRzIG9uIHRoZWlyXG4gKiAgICAgcHJvdG90eXBlIGFuZCB0aGF0IHByb2dyYW1zIHR5cGljYWxseSBzZXQgdXNpbmcgYW4gYXNzaWdubWVudCwgc3VjaCBhc1xuICogICAgIHtAY29kZSBcIkVycm9yLnByb3RvdHlwZS5tZXNzYWdlXCJ9IGFuZCB7QGNvZGUgXCJGdW5jdGlvbi5wcm90b3R5cGUubmFtZVwifVxuICogICAgIChib3RoIGRlZmF1bHQgdG8gXCJcIikuXG4gKiA8bGk+U2V0dGluZy11cCBhIHByb3RvdHlwZSBjaGFpbiwgd2hlcmUgYSBjb25zdHJ1Y3RvciBpcyBzZXQgdG8gZXh0ZW5kXG4gKiAgICAgYW5vdGhlciBvbmUuIFRoaXMgaXMgdHlwaWNhbGx5IHNldCBieSBhc3NpZ25tZW50LCBmb3IgZXhhbXBsZVxuICogICAgIHtAY29kZSBcIkNoaWxkLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENoaWxkXCJ9LCBpbnN0ZWFkIG9mIGludm9raW5nXG4gKiAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCk7XG4gKlxuICogPHA+RWFjaCBKU09OIHJlY29yZCBlbnVtZXJhdGVzIHRoZSBkaXNwb3NpdGlvbiBvZiB0aGUgcHJvcGVydGllcyBvblxuICogc29tZSBjb3JyZXNwb25kaW5nIGludHJpbnNpYyBvYmplY3QuXG4gKlxuICogPHA+Rm9yIGVhY2ggc3VjaCByZWNvcmQsIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGl0cyBwcm9wZXJ0eVxuICogbmFtZXMgY2FuIGJlOlxuICogPHVsPlxuICogPGxpPnRydWUsIGluIHdoaWNoIGNhc2UgdGhpcyBwcm9wZXJ0eSBpcyBzaW1wbHkgcmVwYWlyZWQuIFRoZVxuICogICAgIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb3BlcnR5IGlzIG5vdCB0cmF2ZXJzZWQuIEZvclxuICogXHQgICBleGFtcGxlLCB7QGNvZGUgXCJGdW5jdGlvbi5wcm90b3R5cGUubmFtZVwifSBsZWFkcyB0byB0cnVlLFxuICogICAgIG1lYW5pbmcgdGhhdCB0aGUge0Bjb2RlIFwibmFtZVwifSBwcm9wZXJ0eSBvZiB7QGNvZGVcbiAqICAgICBcIkZ1bmN0aW9uLnByb3RvdHlwZVwifSBzaG91bGQgYmUgcmVwYWlyZWQgKHdoaWNoIGlzIG5lZWRlZFxuICogICAgIHdoZW4gaW5oZXJpdGluZyBmcm9tIEBjb2Rle0Z1bmN0aW9ufSBhbmQgc2V0dGluZyB0aGUgc3ViY2xhc3Mnc1xuICogICAgIHtAY29kZSBcInByb3RvdHlwZS5uYW1lXCJ9IHByb3BlcnR5KS4gSWYgdGhlIHByb3BlcnR5IGlzXG4gKiAgICAgYWxyZWFkeSBhbiBhY2Nlc3NvciBwcm9wZXJ0eSwgaXQgaXMgbm90IHJlcGFpcmVkIChiZWNhdXNlXG4gKiAgICAgYWNjZXNzb3JzIGFyZSBub3Qgc3ViamVjdCB0byB0aGUgb3ZlcnJpZGUgbWlzdGFrZSkuXG4gKiA8bGk+XCIqXCIsIGluIHdoaWNoIGNhc2UgdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVwYWlyZWQgYnV0IHRoZVxuICogICAgIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHByb3BlcnR5IGFyZSB0cmF2ZXJzZWQgYW5kIHJlcGFpcmVkLlxuICogPGxpPkFub3RoZXIgcmVjb3JkLCBpbiB3aGljaCBjYXNlIHRoaXMgcHJvcGVydHkgaXMgbm90IHJlcGFpcmVkXG4gKiAgICAgYW5kIHRoYXQgbmV4dCByZWNvcmQgcmVwcmVzZW50cyB0aGUgZGlzcG9zaXRpb24gb2YgdGhlIG9iamVjdFxuICogICAgIHdoaWNoIGlzIGl0cyB2YWx1ZS4gRm9yIGV4YW1wbGUse0Bjb2RlIFwiRnVuY3Rpb25Qcm90b3R5cGVcIn1cbiAqICAgICBsZWFkcyB0byBhbm90aGVyIHJlY29yZCBleHBsYWluaW5nIHdoaWNoIHByb3BlcnRpZXMge0Bjb2RlXG4gKiAgICAgRnVuY3Rpb24ucHJvdG90eXBlfSBuZWVkIHRvIGJlIHJlcGFpcmVkLlxuICovXG5cbi8qKlxuICogTWluaW1hbCBlbmFibGVtZW50cyB3aGVuIGFsbCB0aGUgY29kZSBpcyBtb2Rlcm4gYW5kIGtub3duIG5vdCB0b1xuICogc3RlcCBpbnRvIHRoZSBvdmVycmlkZSBtaXN0YWtlLCBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgcGVydmFzaXZlXG4gKiBjYXNlcy5cbiAqL1xuY29uc3QgICAgICAgIG1pbkVuYWJsZW1lbnRzPSAge1xuICAnJU9iamVjdFByb3RvdHlwZSUnOiB7XG4gICAgdG9TdHJpbmc6IHRydWV9LFxuXG5cbiAgJyVGdW5jdGlvblByb3RvdHlwZSUnOiB7XG4gICAgdG9TdHJpbmc6IHRydWUgIC8vIHNldCBieSBcInJvbGx1cFwiXG59LFxuXG4gICclRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG5hbWU6IHRydWUgIC8vIHNldCBieSBcInByZWNvbmRcIiwgXCJhdmFcIiwgXCJub2RlLWZldGNoXCJcbn19O1xuXG5cbi8qKlxuICogTW9kZXJhdGUgZW5hYmxlbWVudHMgYXJlIHVzdWFsbHkgZ29vZCBlbm91Z2ggZm9yIGxlZ2FjeSBjb21wYXQuXG4gKi8kaOKAjV9vbmNlLm1pbkVuYWJsZW1lbnRzKG1pbkVuYWJsZW1lbnRzKTtcbmNvbnN0ICAgICAgICBtb2RlcmF0ZUVuYWJsZW1lbnRzPSAge1xuICAnJU9iamVjdFByb3RvdHlwZSUnOiB7XG4gICAgdG9TdHJpbmc6IHRydWUsXG4gICAgdmFsdWVPZjogdHJ1ZX0sXG5cblxuICAnJUFycmF5UHJvdG90eXBlJSc6IHtcbiAgICB0b1N0cmluZzogdHJ1ZSxcbiAgICBwdXNoOiB0cnVlICAvLyBzZXQgYnkgXCJHb29nbGUgQW5hbHl0aWNzXCJcbn0sXG5cbiAgLy8gRnVuY3Rpb24ucHJvdG90eXBlIGhhcyBubyAncHJvdG90eXBlJyBwcm9wZXJ0eSB0byBlbmFibGUuXG4gIC8vIEZ1bmN0aW9uIGluc3RhbmNlcyBoYXZlIHRoZWlyIG93biAnbmFtZScgYW5kICdsZW5ndGgnIHByb3BlcnRpZXNcbiAgLy8gd2hpY2ggYXJlIGNvbmZpZ3VyYWJsZSBhbmQgbm9uLXdyaXRhYmxlLiBUaHVzLCB0aGV5IGFyZSBhbHJlYWR5XG4gIC8vIG5vbi1hc3NpZ25hYmxlIGFueXdheS5cbiAgJyVGdW5jdGlvblByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6IHRydWUsIC8vIHNldCBieSBcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIlxuICAgIGJpbmQ6IHRydWUsIC8vIHNldCBieSBcInVuZGVyc2NvcmVcIiwgXCJleHByZXNzXCJcbiAgICB0b1N0cmluZzogdHJ1ZSAgLy8gc2V0IGJ5IFwicm9sbHVwXCJcbn0sXG5cbiAgJyVFcnJvclByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6IHRydWUsIC8vIHNldCBieSBcImZhc3QtanNvbi1wYXRjaFwiLCBcIm5vZGUtZmV0Y2hcIlxuICAgIG1lc3NhZ2U6IHRydWUsXG4gICAgbmFtZTogdHJ1ZSwgLy8gc2V0IGJ5IFwicHJlY29uZFwiLCBcImF2YVwiLCBcIm5vZGUtZmV0Y2hcIiwgXCJub2RlIDE0XCJcbiAgICB0b1N0cmluZzogdHJ1ZSAgLy8gc2V0IGJ5IFwiYmx1ZWJpcmRcIlxufSxcblxuICAnJVR5cGVFcnJvclByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6IHRydWUsIC8vIHNldCBieSBcInJlYWRhYmxlLXN0cmVhbVwiXG4gICAgbWVzc2FnZTogdHJ1ZSwgLy8gc2V0IGJ5IFwidGFwZVwiXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwicmVhZGFibGUtc3RyZWFtXCIsIFwibm9kZSAxNFwiXG59LFxuXG4gICclU3ludGF4RXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHRvIG1hdGNoIFR5cGVFcnJvclByb3RvdHlwZS5tZXNzYWdlXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwibm9kZSAxNFwiXG59LFxuXG4gICclUmFuZ2VFcnJvclByb3RvdHlwZSUnOiB7XG4gICAgbWVzc2FnZTogdHJ1ZSwgLy8gdG8gbWF0Y2ggVHlwZUVycm9yUHJvdG90eXBlLm1lc3NhZ2VcbiAgICBuYW1lOiB0cnVlICAvLyBzZXQgYnkgXCJub2RlIDE0XCJcbn0sXG5cbiAgJyVVUklFcnJvclByb3RvdHlwZSUnOiB7XG4gICAgbWVzc2FnZTogdHJ1ZSwgLy8gdG8gbWF0Y2ggVHlwZUVycm9yUHJvdG90eXBlLm1lc3NhZ2VcbiAgICBuYW1lOiB0cnVlICAvLyBzZXQgYnkgXCJub2RlIDE0XCJcbn0sXG5cbiAgJyVFdmFsRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHRvIG1hdGNoIFR5cGVFcnJvclByb3RvdHlwZS5tZXNzYWdlXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwibm9kZSAxNFwiXG59LFxuXG4gICclUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlJzoge1xuICAgIG1lc3NhZ2U6IHRydWUsIC8vIHRvIG1hdGNoIFR5cGVFcnJvclByb3RvdHlwZS5tZXNzYWdlXG4gICAgbmFtZTogdHJ1ZSAgLy8gc2V0IGJ5IFwibm9kZSAxNFwiXG59LFxuXG4gICclUHJvbWlzZVByb3RvdHlwZSUnOiB7XG4gICAgY29uc3RydWN0b3I6IHRydWUgIC8vIHNldCBieSBcImNvcmUtanNcIlxufSxcblxuICAnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogJyonLCAvLyBzZXQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJcblxuICAnJUdlbmVyYXRvciUnOiB7XG4gICAgY29uc3RydWN0b3I6IHRydWUsXG4gICAgbmFtZTogdHJ1ZSxcbiAgICB0b1N0cmluZzogdHJ1ZX0sXG5cblxuICAnJUl0ZXJhdG9yUHJvdG90eXBlJSc6IHtcbiAgICB0b1N0cmluZzogdHJ1ZX19O1xuXG5cblxuLyoqXG4gKiBUaGUgJ3NldmVyZScgZW5hYmxlbWVudCBhcmUgbmVlZGVkIGJlY2F1c2Ugb2YgaXNzdWVzIHRyYWNrZWQgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvNTc2XG4gKlxuICogVGhleSBhcmUgbGlrZSB0aGUgYG1vZGVyYXRlYCBlbmFibGVtZW50cyBleGNlcHQgZm9yIHRoZSBlbnRyaWVzIGJlbG93LlxuICovJGjigI1fb25jZS5tb2RlcmF0ZUVuYWJsZW1lbnRzKG1vZGVyYXRlRW5hYmxlbWVudHMpO1xuY29uc3QgICAgICAgIHNldmVyZUVuYWJsZW1lbnRzPSAge1xuICAuLi5tb2RlcmF0ZUVuYWJsZW1lbnRzLFxuXG4gIC8qKlxuICAgKiBSb2xsdXAgKGFzIHVzZWQgYXQgbGVhc3QgYnkgdmVnYSkgYW5kIHdlYnBhY2tcbiAgICogKGFzIHVzZWQgYXQgbGVhc3QgYnkgcmVnZW5lcmF0b3IpIGJvdGggdHVybiBleHBvcnRzIGludG8gYXNzaWdubWVudHNcbiAgICogdG8gYSBiaWcgYGV4cG9ydHNgIG9iamVjdCB0aGF0IGluaGVyaXRzIGRpcmVjdGx5IGZyb21cbiAgICogYE9iamVjdC5wcm90b3R5cGVgLiBTb21lIG9mIHRoZSBleHBvcnRlZCBuYW1lcyB3ZSd2ZSBzZWVuIGluY2x1ZGVcbiAgICogYGhhc093blByb3BlcnR5YCwgYGNvbnN0cnVjdG9yYCwgYW5kIGB0b1N0cmluZ2AuIEJ1dCB0aGUgc3RyYXRlZ3kgdXNlZFxuICAgKiBieSByb2xsdXAgYW5kIHdlYnBhY2sgcG90ZW50aW9uYWxseSB0dXJucyBhbnkgZXhwb3J0ZWQgbmFtZVxuICAgKiBpbnRvIGFuIGFzc2lnbm1lbnQgcmVqZWN0ZWQgYnkgdGhlIG92ZXJyaWRlIG1pc3Rha2UuIFRoYXQncyB3aHlcbiAgICogdGhlIGBzZXZlcmVgIGVuYWJsZW1lbnRzIHRha2VzIHRoZSBleHRyZW1lIHN0ZXAgb2YgZW5hYmxpbmdcbiAgICogZXZlcnl0aGluZyBvbiBgT2JqZWN0LnByb3RvdHlwZWAuXG4gICAqXG4gICAqIEluIGFkZGl0aW9uLCBjb2RlIGRvaW5nIGluaGVyaXRhbmNlIG1hbnVhbGx5IHdpbGwgb2Z0ZW4gb3ZlcnJpZGVcbiAgICogdGhlIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gdGhlIG5ldyBwcm90b3R5cGUgYnkgYXNzaWdubWVudC4gV2UndmVcbiAgICogc2VlbiB0aGlzIHNldmVyYWwgdGltZXMuXG4gICAqXG4gICAqIFRoZSBjb3N0IG9mIGVuYWJsaW5nIGFsbCB0aGVzZSBpcyB0aGF0IHRoZXkgY3JlYXRlIGEgbWlzZXJhYmxlIGRlYnVnZ2luZ1xuICAgKiBleHBlcmllbmNlIHNwZWNpZmljYWxseSBvbiBOb2RlLlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzIzMjRcbiAgICogZXhwbGFpbnMgaG93IGl0IGNvbmZ1c2VkIHRoZSBOb2RlIGNvbnNvbGUuXG4gICAqXG4gICAqIChUT0RPIFJlZXhhbWluZSB0aGUgdnNjb2RlIHNpdHVhdGlvbi4gSSB0aGluayBpdCBtYXkgaGF2ZSBpbXByb3ZlZFxuICAgKiBzaW5jZSB0aGUgZm9sbG93aW5nIHBhcmFncmFwaCB3YXMgd3JpdHRlbi4pXG4gICAqXG4gICAqIFRoZSB2c2NvZGUgZGVidWdnZXIncyBvYmplY3QgaW5zcGVjdG9yIHNob3dzIHRoZSBvd24gZGF0YSBwcm9wZXJ0aWVzIG9mXG4gICAqIGFuIG9iamVjdCwgd2hpY2ggaXMgdHlwaWNhbGx5IHdoYXQgeW91IHdhbnQsIGJ1dCBhbHNvIHNob3dzIGJvdGggZ2V0dGVyXG4gICAqIGFuZCBzZXR0ZXIgZm9yIGV2ZXJ5IGFjY2Vzc29yIHByb3BlcnR5IHdoZXRoZXIgaW5oZXJpdGVkIG9yIG93bi5cbiAgICogV2l0aCB0aGUgYCcqJ2Agc2V0dGluZyBoZXJlLCBhbGwgdGhlIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb21cbiAgICogYE9iamVjdC5wcm90b3R5cGVgIGFyZSBhY2Nlc3NvcnMsIGNyZWF0aW5nIGFuIHVudXNhYmxlIGRpc3BsYXkgYXMgc2VlblxuICAgKiBhdCBBcyBleHBsYWluZWQgYXRcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9sb2NrZG93bi1vcHRpb25zLm1kI292ZXJyaWRldGFtaW5nLW9wdGlvbnNcbiAgICogT3BlbiB0aGUgdHJpYW5nbGVzIGF0IHRoZSBib3R0b20gb2YgdGhhdCBzZWN0aW9uLlxuICAgKi9cbiAgJyVPYmplY3RQcm90b3R5cGUlJzogJyonLFxuXG4gIC8qKlxuICAgKiBUaGUgd2lkZWx5IHVzZWQgQnVmZmVyIGRlZmluZWQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXJcbiAgICogb24gaW5pdGlhbGl6YXRpb24sIG1hbnVhbGx5IGNyZWF0ZXMgdGhlIGVxdWl2YWxlbnQgb2YgYSBzdWJjbGFzcyBvZlxuICAgKiBgVHlwZWRBcnJheWAsIHdoaWNoIGl0IHRoZW4gaW5pdGlhbGl6ZXMgYnkgYXNzaWdubWVudC4gVGhlc2UgYXNzaWdubWVudHNcbiAgICogaW5jbHVkZSBlbm91Z2ggb2YgdGhlIGBUeXBlQXJyYXlgIG1ldGhvZHMgdGhhdCBoZXJlLCB0aGUgYHNldmVyZWBcbiAgICogZW5hYmxlbWVudHMganVzdCBlbmFibGUgdGhlbSBhbGwuXG4gICAqL1xuICAnJVR5cGVkQXJyYXlQcm90b3R5cGUlJzogJyonfTskaOKAjV9vbmNlLnNldmVyZUVuYWJsZW1lbnRzKHNldmVyZUVuYWJsZW1lbnRzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMjVdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgU2V0LFN0cmluZyxUeXBlRXJyb3IsYXJyYXlGb3JFYWNoLGRlZmluZVByb3BlcnR5LGdldE93blByb3BlcnR5RGVzY3JpcHRvcixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdldE93blByb3BlcnR5TmFtZXMsaXNPYmplY3Qsb2JqZWN0SGFzT3duUHJvcGVydHksb3duS2V5cyxzZXRIYXMsbWluRW5hYmxlbWVudHMsbW9kZXJhdGVFbmFibGVtZW50cyxzZXZlcmVFbmFibGVtZW50czskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIlNldFwiLCBbJGjigI1fYSA9PiAoU2V0ID0gJGjigI1fYSldXSxbXCJTdHJpbmdcIiwgWyRo4oCNX2EgPT4gKFN0cmluZyA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFycmF5Rm9yRWFjaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlGb3JFYWNoID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm9iamVjdEhhc093blByb3BlcnR5XCIsIFskaOKAjV9hID0+IChvYmplY3RIYXNPd25Qcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wib3duS2V5c1wiLCBbJGjigI1fYSA9PiAob3duS2V5cyA9ICRo4oCNX2EpXV0sW1wic2V0SGFzXCIsIFskaOKAjV9hID0+IChzZXRIYXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmFibGVtZW50cy5qc1wiLCBbW1wibWluRW5hYmxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1pbkVuYWJsZW1lbnRzID0gJGjigI1fYSldXSxbXCJtb2RlcmF0ZUVuYWJsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtb2RlcmF0ZUVuYWJsZW1lbnRzID0gJGjigI1fYSldXSxbXCJzZXZlcmVFbmFibGVtZW50c1wiLCBbJGjigI1fYSA9PiAoc2V2ZXJlRW5hYmxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBGb3IgYSBzcGVjaWFsIHNldCBvZiBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIGBlbmFibGVtZW50YCB3aGl0ZWxpc3QsXG4gKiBgZW5hYmxlUHJvcGVydHlPdmVycmlkZXNgIGVuc3VyZXMgdGhhdCB0aGUgZWZmZWN0IG9mIGZyZWV6aW5nIGRvZXMgbm90XG4gKiBzdXBwcmVzcyB0aGUgYWJpbGl0eSB0byBvdmVycmlkZSB0aGVzZSBwcm9wZXJ0aWVzIG9uIGRlcml2ZWQgb2JqZWN0cyBieVxuICogc2ltcGxlIGFzc2lnbm1lbnQuXG4gKlxuICogQmVjYXVzZSBvZiBsYWNrIG9mIHN1ZmZpY2llbnQgZm9yZXNpZ2h0IGF0IHRoZSB0aW1lLCBFUzUgdW5mb3J0dW5hdGVseVxuICogc3BlY2lmaWVkIHRoYXQgYSBzaW1wbGUgYXNzaWdubWVudCB0byBhIG5vbi1leGlzdGVudCBwcm9wZXJ0eSBtdXN0IGZhaWwgaWZcbiAqIGl0IHdvdWxkIG92ZXJyaWRlIGFuIG5vbi13cml0YWJsZSBkYXRhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlXG4gKiBzaGFkb3cgb2YgdGhlIHByb3RvdHlwZSBjaGFpbi4gSW4gcmV0cm9zcGVjdCwgdGhpcyB3YXMgYSBtaXN0YWtlLCB0aGVcbiAqIHNvLWNhbGxlZCBcIm92ZXJyaWRlIG1pc3Rha2VcIi4gQnV0IGl0IGlzIG5vdyB0b28gbGF0ZSBhbmQgd2UgbXVzdCBsaXZlIHdpdGhcbiAqIHRoZSBjb25zZXF1ZW5jZXMuXG4gKlxuICogQXMgYSByZXN1bHQsIHNpbXBseSBmcmVlemluZyBhbiBvYmplY3QgdG8gbWFrZSBpdCB0YW1wZXIgcHJvb2YgaGFzIHRoZVxuICogdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgYnJlYWtpbmcgcHJldmlvdXNseSBjb3JyZWN0IGNvZGUgdGhhdCBpc1xuICogY29uc2lkZXJlZCB0byBoYXZlIGZvbGxvd2VkIEpTIGJlc3QgcHJhY3RpY2VzLCBpZiB0aGlzIHByZXZpb3VzIGNvZGUgdXNlZFxuICogYXNzaWdubWVudCB0byBvdmVycmlkZS5cbiAqXG4gKiBGb3IgdGhlIGVuYWJsZWQgcHJvcGVydGllcywgYGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzYCBlZmZlY3RpdmVseSBzaGltcyB3aGF0XG4gKiB0aGUgYXNzaWdubWVudCBiZWhhdmlvciB3b3VsZCBoYXZlIGJlZW4gaW4gdGhlIGFic2VuY2Ugb2YgdGhlIG92ZXJyaWRlXG4gKiBtaXN0YWtlLiBIb3dldmVyLCB0aGUgc2hpbSBwcm9kdWNlcyBhbiBpbXBlcmZlY3QgZW11bGF0aW9uLiBJdCBzaGltcyB0aGVcbiAqIGJlaGF2aW9yIGJ5IHR1cm5pbmcgdGhlc2UgZGF0YSBwcm9wZXJ0aWVzIGludG8gYWNjZXNzb3IgcHJvcGVydGllcywgd2hlcmVcbiAqIHRoZSBhY2Nlc3NvcidzIGdldHRlciBhbmQgc2V0dGVyIHByb3ZpZGUgdGhlIGRlc2lyZWQgYmVoYXZpb3IuIEZvclxuICogbm9uLXJlZmxlY3RpdmUgb3BlcmF0aW9ucywgdGhlIGlsbHVzaW9uIGlzIHBlcmZlY3QuIEhvd2V2ZXIsIHJlZmxlY3RpdmVcbiAqIG9wZXJhdGlvbnMgbGlrZSBgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yYCBzZWUgdGhlIGRlc2NyaXB0b3Igb2YgYW4gYWNjZXNzb3JcbiAqIHByb3BlcnR5IHJhdGhlciB0aGFuIHRoZSBkZXNjcmlwdG9yIG9mIGEgZGF0YSBwcm9wZXJ0eS4gQXQgdGhlIHRpbWUgb2YgdGhpc1xuICogd3JpdGluZywgdGhpcyBpcyB0aGUgYmVzdCB3ZSBrbm93IGhvdyB0byBkby5cbiAqXG4gKiBUbyB0aGUgZ2V0dGVyIG9mIHRoZSBhY2Nlc3NvciB3ZSBhZGQgYSBwcm9wZXJ0eSBuYW1lZFxuICogYCdvcmlnaW5hbFZhbHVlJ2Agd2hvc2UgdmFsdWUgaXMsIGFzIGl0IHNheXMsIHRoZSB2YWx1ZSB0aGF0IHRoZVxuICogZGF0YSBwcm9wZXJ0eSBoYWQgYmVmb3JlIGJlaW5nIGNvbnZlcnRlZCB0byBhbiBhY2Nlc3NvciBwcm9wZXJ0eS4gV2UgYWRkXG4gKiB0aGlzIGV4dHJhIHByb3BlcnR5IHRvIHRoZSBnZXR0ZXIgZm9yIHR3byByZWFzb246XG4gKlxuICogVGhlIGhhcmRlbiBhbGdvcml0aG0gd2Fsa3MgdGhlIG93biBwcm9wZXJ0aWVzIHJlZmxlY3RpdmVseSwgaS5lLiwgd2l0aFxuICogYGdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgc2VtYW50aWNzLCByYXRoZXIgdGhhbiBgW1tHZXRdXWAgc2VtYW50aWNzLiBXaGVuXG4gKiBpdCBzZWVzIGFuIGFjY2Vzc29yIHByb3BlcnR5LCBpdCBkb2VzIG5vdCBpbnZva2UgdGhlIGdldHRlci4gUmF0aGVyLCBpdFxuICogcHJvY2VlZHMgdG8gd2FsayBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhcyBwYXJ0IG9mIGl0cyB0cmFuc2l0aXZlXG4gKiB0cmF2ZXJzYWwuIFdpdGhvdXQgdGhpcyBleHRyYSBwcm9wZXJ0eSwgYGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzYCB3b3VsZCBoYXZlXG4gKiBoaWRkZW4gdGhlIG9yaWdpbmFsIGRhdGEgcHJvcGVydHkgdmFsdWUgZnJvbSBgaGFyZGVuYCwgd2hpY2ggd291bGQgYmUgYmFkLlxuICogSW5zdGVhZCwgYnkgZXhwb3NpbmcgdGhhdCB2YWx1ZSBpbiBhbiBvd24gZGF0YSBwcm9wZXJ0eSBvbiB0aGUgZ2V0dGVyLFxuICogYGhhcmRlbmAgZmluZHMgYW5kIHdhbGtzIGl0IGFueXdheS5cbiAqXG4gKiBXZSBlbmFibGUgYSBmb3JtIG9mIGNvb3BlcmF0aXZlIGVtdWxhdGlvbiwgZ2l2aW5nIHJlZmxlY3RpdmUgY29kZSBhblxuICogb3Bwb3J0dW5pdHkgdG8gY29vcGVyYXRlIGluIHVwaG9sZGluZyB0aGUgaWxsdXNpb24uIFdoZW4gc3VjaCBjb29wZXJhdGl2ZVxuICogcmVmbGVjdGl2ZSBjb2RlIHNlZXMgYW4gYWNjZXNzb3IgcHJvcGVydHksIHdoZXJlIHRoZSBhY2Nlc3NvcidzIGdldHRlclxuICogaGFzIGFuIGBvcmlnaW5hbFZhbHVlYCBwcm9wZXJ0eSwgaXQga25vd3MgdGhhdCB0aGUgZ2V0dGVyIGlzXG4gKiBhbGxlZ2luZyB0aGF0IGl0IGlzIHRoZSByZXN1bHQgb2YgdGhlIGBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlc2AgY29udmVyc2lvblxuICogcGF0dGVybiwgc28gaXQgY2FuIGRlY2lkZSB0byBjb29wZXJhdGl2ZWx5IFwicHJldGVuZFwiIHRoYXQgaXQgc2VlcyBhIGRhdGFcbiAqIHByb3BlcnR5IHdpdGggdGhhdCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGludHJpbnNpY3NcbiAqIEBwYXJhbSB7J21pbicgfCAnbW9kZXJhdGUnIHwgJ3NldmVyZSd9IG92ZXJyaWRlVGFtaW5nXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPHN0cmluZyB8IHN5bWJvbD59IFtvdmVycmlkZURlYnVnXVxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlcyhcbiAgaW50cmluc2ljcyxcbiAgb3ZlcnJpZGVUYW1pbmcsXG4gIG92ZXJyaWRlRGVidWc9ICBbXSlcbiAge1xuICBjb25zdCBkZWJ1Z1Byb3BlcnRpZXM9ICBuZXcgU2V0KG92ZXJyaWRlRGVidWcpO1xuICBmdW5jdGlvbiBlbmFibGUocGF0aCwgb2JqLCBwcm9wLCBkZXNjKSB7XG4gICAgaWYoICd2YWx1ZSdpbiAgZGVzYyYmICBkZXNjLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgY29uc3QgeyB2YWx1ZX09ICAgZGVzYztcblxuICAgICAgZnVuY3Rpb24gZ2V0dGVyKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgfVxuICAgICAgZGVmaW5lUHJvcGVydHkoZ2V0dGVyLCAnb3JpZ2luYWxWYWx1ZScsIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcblxuXG4gICAgICBjb25zdCBpc0RlYnVnPSAgc2V0SGFzKGRlYnVnUHJvcGVydGllcywgcHJvcCk7XG5cbiAgICAgIGZ1bmN0aW9uIHNldHRlcihuZXdWYWx1ZSkge1xuICAgICAgICBpZiggb2JqPT09ICB0aGlzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICBgQ2Fubm90IGFzc2lnbiB0byByZWFkIG9ubHkgcHJvcGVydHkgJyR7U3RyaW5nKFxuICAgICAgICAgICAgICBwcm9wKVxuICAgICAgICAgICAgICB9JyBvZiAnJHtwYXRofSdgKTtcblxuICAgICAgICAgfVxuICAgICAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkodGhpcywgcHJvcCkpIHtcbiAgICAgICAgICB0aGlzW3Byb3BdPSAgbmV3VmFsdWU7XG4gICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgaWYoIGlzRGVidWcpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBUeXBlRXJyb3IoIGBPdmVycmlkZSBwcm9wZXJ0eSAke3Byb3B9YCkpO1xuICAgICAgICAgICB9XG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcCwge1xuICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSk7XG5cbiAgICAgICAgIH1cbiAgICAgICB9XG5cbiAgICAgIGRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwge1xuICAgICAgICBnZXQ6IGdldHRlcixcbiAgICAgICAgc2V0OiBzZXR0ZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGRlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBkZXNjLmNvbmZpZ3VyYWJsZX0pO1xuXG4gICAgIH1cbiAgIH1cblxuICBmdW5jdGlvbiBlbmFibGVQcm9wZXJ0eShwYXRoLCBvYmosIHByb3ApIHtcbiAgICBjb25zdCBkZXNjPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XG4gICAgaWYoICFkZXNjKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cbiAgICBlbmFibGUocGF0aCwgb2JqLCBwcm9wLCBkZXNjKTtcbiAgIH1cblxuICBmdW5jdGlvbiBlbmFibGVBbGxQcm9wZXJ0aWVzKHBhdGgsIG9iaikge1xuICAgIGNvbnN0IGRlc2NzPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICAgIGlmKCAhZGVzY3MpIHtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuICAgIC8vIFR5cGVTY3JpcHQgZG9lcyBub3QgYWxsb3cgc3ltYm9scyB0byBiZSB1c2VkIGFzIGluZGV4ZXMgYmVjYXVzZSBpdFxuICAgIC8vIGNhbm5vdCByZWNva29uIHR5cGVzIG9mIHN5bWJvbGl6ZWQgcHJvcGVydGllcy5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgYXJyYXlGb3JFYWNoKG93bktleXMoZGVzY3MpLCAocHJvcCk9PmVuYWJsZShwYXRoLCBvYmosIHByb3AsIGRlc2NzW3Byb3BdKSk7XG4gICB9XG5cbiAgZnVuY3Rpb24gZW5hYmxlUHJvcGVydGllcyhwYXRoLCBvYmosIHBsYW4pIHtcbiAgICBmb3IoIGNvbnN0IHByb3Agb2YgZ2V0T3duUHJvcGVydHlOYW1lcyhwbGFuKSkge1xuICAgICAgY29uc3QgZGVzYz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgICAgaWYoICFkZXNjfHwgIGRlc2MuZ2V0fHwgIGRlc2Muc2V0KSB7XG4gICAgICAgIC8vIE5vIG5vdCBhIHZhbHVlIHByb3BlcnR5LCBub3RoaW5nIHRvIGRvLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgY29udGludWU7XG4gICAgICAgfVxuXG4gICAgICAvLyBQbGFuIGhhcyBubyBzeW1ib2wga2V5cyBhbmQgd2UgdXNlIGdldE93blByb3BlcnR5TmFtZXMoKVxuICAgICAgLy8gc28gYHByb3BgIGNhbm5vdCBvbmx5IGJlIGEgc3RyaW5nLCBub3QgYSBzeW1ib2wuIFdlIGNvZXJjZSBpdCBpbiBwbGFjZVxuICAgICAgLy8gd2l0aCBgU3RyaW5nKC4uKWAgYW55d2F5IGp1c3QgYXMgZ29vZCBoeWdpZW5lLCBzaW5jZSB0aGVzZSBwYXRocyBhcmUganVzdFxuICAgICAgLy8gZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuXG4gICAgICBjb25zdCBzdWJQYXRoPSAgIGAke3BhdGh9LiR7U3RyaW5nKHByb3ApfWA7XG4gICAgICBjb25zdCBzdWJQbGFuPSAgcGxhbltwcm9wXTtcblxuICAgICAgaWYoIHN1YlBsYW49PT0gIHRydWUpIHtcbiAgICAgICAgZW5hYmxlUHJvcGVydHkoc3ViUGF0aCwgb2JqLCBwcm9wKTtcbiAgICAgICB9ZWxzZSBpZiggc3ViUGxhbj09PSAgJyonKSB7XG4gICAgICAgIGVuYWJsZUFsbFByb3BlcnRpZXMoc3ViUGF0aCwgZGVzYy52YWx1ZSk7XG4gICAgICAgfWVsc2UgaWYoIGlzT2JqZWN0KHN1YlBsYW4pKSB7XG4gICAgICAgIGVuYWJsZVByb3BlcnRpZXMoc3ViUGF0aCwgZGVzYy52YWx1ZSwgc3ViUGxhbik7XG4gICAgICAgfWVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgVW5leHBlY3RlZCBvdmVycmlkZSBlbmFibGVtZW50IHBsYW4gJHtzdWJQYXRofWApO1xuICAgICAgIH1cbiAgICAgfVxuICAgfVxuXG4gIGxldCBwbGFuO1xuICBzd2l0Y2goIG92ZXJyaWRlVGFtaW5nKXtcbiAgICBjYXNlICdtaW4nOiB7XG4gICAgICBwbGFuPSAgbWluRW5hYmxlbWVudHM7XG4gICAgICBicmVhaztcbiAgICAgfVxuICAgIGNhc2UgJ21vZGVyYXRlJzoge1xuICAgICAgcGxhbj0gIG1vZGVyYXRlRW5hYmxlbWVudHM7XG4gICAgICBicmVhaztcbiAgICAgfVxuICAgIGNhc2UgJ3NldmVyZSc6IHtcbiAgICAgIHBsYW49ICBzZXZlcmVFbmFibGVtZW50cztcbiAgICAgIGJyZWFrO1xuICAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYHVucmVjb2duaXplZCBvdmVycmlkZVRhbWluZyAke292ZXJyaWRlVGFtaW5nfWApO1xuICAgICB9fVxuXG5cbiAgLy8gRG8gdGhlIHJlcGFpci5cbiAgZW5hYmxlUHJvcGVydGllcygncm9vdCcsIGludHJpbnNpY3MsIHBsYW4pO1xuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICBlbmFibGVQcm9wZXJ0eU92ZXJyaWRlcyk7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzI2XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFycmF5UHVzaCxmcmVlemUsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBGYWlsLCBxdW90ZTogcX09ICAgYXNzZXJ0O1xuXG4vKipcbiAqIEphdmFTY3JpcHQgbW9kdWxlIHNlbWFudGljcyByZXNpc3RzIGF0dGVtcHRzIHRvIHBhcmFtZXRlcml6ZSBhIG1vZHVsZSdzXG4gKiBpbml0aWFsaXphdGlvbiBiZWhhdmlvci4gQSBtb2R1bGUgaW5pdGlhbGl6ZXMgaW4gb3JkZXIgYWNjb3JkaW5nIHRvXG4gKiB0aGUgcGF0aCBieSB3aGljaCBpdCBpcyBmaXJzdCBpbXBvcnRlZCwgYW5kIHRoZW4gdGhlIGluaXRpYWxpemVkIG1vZHVsZVxuICogaXMgcmV1c2VkIGJ5IGFsbCB0aGUgb3RoZXIgdGltZXMgaXQgaXMgaW1wb3J0ZWQuIENvbXBhcnRtZW50cyBnaXZlIHVzXG4gKiB0aGUgb3Bwb3J0dW5pdHkgdG8gYmluZCB0aGUgc2FtZSBpbXBvcnQgbmFtZSB0byBkaWZmZXJlbnQgaW1wb3J0ZWRcbiAqIG1vZHVsZXMsIGRlcGVuZGluZyBvbiB0aGUgcGFja2FnZS9jb21wYXJ0bWVudCBkb2luZyB0aGUgaW1wb3J0LiBDb21wYXJ0bWVudHNcbiAqIGFsc28gYWRkcmVzcyB0aGUgZGlmZmljdWx0eSBvZiBwYXJhbWV0ZXJpemluZyBhIG1vZHVsZSdzIGluaXRpYWxpemF0aW9uXG4gKiBsb2dpYywgYnV0IG5vdCBpbiBhIHBsZWFzYW50IG1hbm5lci5cbiAqXG4gKiBBIHBsZWFzYW50IHBhcmFtZXRlcml6YXRpb24gd291bGQgYmUgZm9yIGEgc3RhdGljIG1vZHVsZSB0byBiZSBmdW5jdGlvbi1saWtlXG4gKiB3aXRoIGV4cGxpY2l0IHBhcmFtZXRlcnMsIGFuZCBmb3IgdGhlIHBhcmFtZXRlcml6YXRpb24gdG8gYmUgbGlrZVxuICogY2FsbGluZyB0aGUgc3RhdGljIG1vZHVsZSB3aXRoIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gZGVyaXZlIGZyb20gaXQgYVxuICogbW9kdWxlIGluc3RhbmNlLiBDb21wYXJ0bWVudHMgaW5zdGVhZCBsZXRzIHVzIHBhcmFtZXRlcml6ZSB0aGUgbWVhbmluZ1xuICogb2YgYSBtb2R1bGUgaW5zdGFuY2UgZGVyaXZlZCBmcm9tIGEgc3RhdGljIG1vZHVsZSBhY2NvcmRpbmcgdG8gdGhlXG4gKiB0aHJlZSBuYW1lc3BhY2VzIHByb3ZpZGVkIGJ5IHRoZSBKYXZhU2NyaXB0IHNlbWFudGljcywgYWZmZWN0aW5nIHRoZVxuICogbWVhbmluZyBvZiBhIG1vZHVsZSBpbnN0YW5jZS5cbiAqICAgICogVGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lc3BhY2VzLlxuICogICAgICAgKiBUaGUgZ2xvYmFsIHNjb3BlLCBhbGlhc2VkIHRvIHByb3BlcnRpZXMgb2YgdGhlIGdsb2JhbCBvYmplY3QuXG4gKiAgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJpbHkgY29tcGFydG1lbnQtd2lkZSwgYW5kIHRoZXJlZm9yZSBpbiBvdXJcbiAqICAgICAgICAgcmVjb21tZW5lZCB1c2FnZSBwYXR0ZXJuLCBwYWNrYWdlLXdpZGUuXG4gKiAgICAgICAqIFRoZSBnbG9iYWwgbGV4aWNhbCBzY29wZS4gVGhlIFNFUy1zaGltIGNvbXBhcnRtZW50cyBzdXBwb3J0XG4gKiAgICAgICAgIHRoZXNlIGJvdGggY29tcGFydG1lbnQtd2lkZSBhcyB3ZWxsIGFzIHBlci1tb2R1bGUuIEJ1dCBpdCBpc1xuICogICAgICAgICBub3QgeWV0IGNsZWFyIHdoYXQgd2Ugd2lsbCBwcm9wb3NlIGluIHRoZSBDb21wYXJ0bWVudCBwcm9wb3NhbC5cbiAqICAgICogVGhlIGltcG9ydCBuYW1lc3BhY2UuXG4gKiAgICAqIFRoZSBob3N0IGhvb2tzLlxuICpcbiAqIFRoaXMgYGVudmlyb25tZW50LW9wdGlvbnMuanNgIG1vZHVsZSBsb29rcyBmb3IgYSBzZXR0aW5nIG9mIGFuXG4gKiBgb3B0aW9uTmFtZWAgcGFyYW1ldGVyIHJvb3RlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLiBJZiBmb2xsb3dzIHRoZSBOb2RlXG4gKiBwcmVjZWRlbnQgZm9yIGZpbmRpbmcgVW5peCBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR0aW5ncywgbG9va2luZyBmb3IgYVxuICogZ2xvYmFsIGBwcm9jZXNzYCBvYmplY3QgaG9sZGluZyBhbiBgZW52YCBvYmplY3QsXG4gKiBvcHRpb25hbGx5IGhvbGRpbmcgYSBwcm9wZXJ0eSBuYW1lZCBmb3IgdGhlIGBvcHRpb25OYW1lYCB3aG9zZSB2YWx1ZSBpcyB0aGVcbiAqIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBvZiB0aGF0IG9wdGlvbi4gRm9yIGV4YW1wbGUsIGZvciB0aGUgb3B0aW9uTmFtZVxuICogYEZPT19CQVJgIGl0IHdvdWxkIGxvb2sgaW5cbiAqIGBnbG9iYWxUaGlzLnByb2Nlc3MuZW52LkZPT19CQVJgLlxuICpcbiAqIElmIHNldHRpbmcgaXMgZWl0aGVyIGFic2VudCBvciBgdW5kZWZpbmVkYCwgdGhhdCBpbmRpY2F0ZXMgdGhhdFxuICogdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBzaG91bGQgaGF2ZSBpdHMgZGVmYXVsdCBiZWhhdmlvciwgd2hhdGV2ZXIgdGhhdCBpcy5cbiAqIE90aGVyd2lzZSwgcmVmbGVjdGluZyBVbml4IGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhlIHNldHRpbmcgbXVzdCBiZSBhXG4gKiBzdHJpbmcuIFRoaXMgYWxzbyBoZWxwcyBlbnN1cmUgdGhhdCB0aGlzIGNoYW5uZWwgaXMgdXNlZCBvbmx5IHRvIHBhc3MgZGF0YSxcbiAqIG5vdCBhdXRob3JpdHkgYmV5b25kIHRoZSBhYmlsaXR5IHRvIHJlYWQgdGhpcyBnbG9iYWwgc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBtYWtlRW52aXJvbm1lbnRDYXB0b3IgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYUdsb2JhbFxuICovXG5jb25zdCAgICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yPSAgKGFHbG9iYWwpPT57XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0gIFtdO1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGVudmlyb25tZW50IG9wdGlvbiBieSBuYW1lIGFuZCByZXR1cm5zIHRoZSBvcHRpb24gdmFsdWUgb3IgdGhlXG4gICAqIGdpdmVuIGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249ICAob3B0aW9uTmFtZSwgZGVmYXVsdFNldHRpbmcpPT4gIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBvcHRpb25OYW1lLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBYIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgWCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nKVxuICAgICAgICB9IG11c3QgYmUgYSBzdHJpbmcuYCk7XG5cblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuICAgIGxldCBzZXR0aW5nPSAgZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2Vzcz0gIGFHbG9iYWwucHJvY2VzcztcbiAgICBpZiggZ2xvYmFsUHJvY2VzcyYmICB0eXBlb2YgZ2xvYmFsUHJvY2Vzcz09PSAgJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGdsb2JhbEVudj0gIGdsb2JhbFByb2Nlc3MuZW52O1xuICAgICAgaWYoIGdsb2JhbEVudiYmICB0eXBlb2YgZ2xvYmFsRW52PT09ICAnb2JqZWN0Jykge1xuICAgICAgICBpZiggb3B0aW9uTmFtZSBpbiBnbG9iYWxFbnYpIHtcbiAgICAgICAgICBhcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLCBvcHRpb25OYW1lKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25WYWx1ZT0gIGdsb2JhbEVudltvcHRpb25OYW1lXTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgIGFzc2VydC50eXBlb2YoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICAgICdzdHJpbmcnLFxuICAgICAgICAgICAgWCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbiAgICAgICAgICAgICAgb3B0aW9uTmFtZSlcbiAgICAgICAgICAgICAgfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICAgIG9wdGlvblZhbHVlKVxuICAgICAgICAgICAgICB9YCk7XG5cbiAgICAgICAgICBzZXR0aW5nPSAgb3B0aW9uVmFsdWU7XG4gICAgICAgICB9XG4gICAgICAgfVxuICAgICB9XG4gICAgc2V0dGluZz09PSAgdW5kZWZpbmVkfHxcbiAgICAgIHR5cGVvZiBzZXR0aW5nPT09ICAnc3RyaW5nJ3x8XG4gICAgICBGYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nKVxuICAgICAgICB9LCBpZiBwcmVzZW50LCBtdXN0IGJlIGEgc3RyaW5nLmA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0gICgpPT4gIHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgIH07XG4gIGZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG4gIHJldHVybiBmcmVlemUoeyBnZXRFbnZpcm9ubWVudE9wdGlvbiwgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzI3XSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFdlYWtTZXQsYXJyYXlGaWx0ZXIsYXJyYXlNYXAsYXJyYXlQdXNoLGRlZmluZVByb3BlcnR5LGZyZWV6ZSxmcm9tRW50cmllcyxpc0Vycm9yLHN0cmluZ0VuZHNXaXRoLHdlYWtzZXRBZGQsd2Vha3NldEhhczskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb21tb25zLmpzXCIsIFtbXCJXZWFrU2V0XCIsIFskaOKAjV9hID0+IChXZWFrU2V0ID0gJGjigI1fYSldXSxbXCJhcnJheUZpbHRlclwiLCBbJGjigI1fYSA9PiAoYXJyYXlGaWx0ZXIgPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlQdXNoXCIsIFskaOKAjV9hID0+IChhcnJheVB1c2ggPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnR5XCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiZnJlZXplXCIsIFskaOKAjV9hID0+IChmcmVlemUgPSAkaOKAjV9hKV1dLFtcImZyb21FbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvclwiLCBbJGjigI1fYSA9PiAoaXNFcnJvciA9ICRo4oCNX2EpXV0sW1wic3RyaW5nRW5kc1dpdGhcIiwgWyRo4oCNX2EgPT4gKHN0cmluZ0VuZHNXaXRoID0gJGjigI1fYSldXSxbXCJ3ZWFrc2V0QWRkXCIsIFskaOKAjV9hID0+ICh3ZWFrc2V0QWRkID0gJGjigI1fYSldXSxbXCJ3ZWFrc2V0SGFzXCIsIFskaOKAjV9hID0+ICh3ZWFrc2V0SGFzID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vIEZvciBvdXIgaW50ZXJuYWwgZGVidWdnaW5nIHB1cnBvc2VzLCB1bmNvbW1lbnRcbi8vIGNvbnN0IGludGVybmFsRGVidWdDb25zb2xlID0gY29uc29sZTtcblxuLy8gVGhlIHdoaXRlbGlzdHMgb2YgY29uc29sZSBtZXRob2RzLCBmcm9tOlxuLy8gV2hhdHdnIFwibGl2aW5nIHN0YW5kYXJkXCIgaHR0cHM6Ly9jb25zb2xlLnNwZWMud2hhdHdnLm9yZy9cbi8vIE5vZGUgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0LXYxNC54L2RvY3MvYXBpL2NvbnNvbGUuaHRtbFxuLy8gTUROIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Db25zb2xlX0FQSVxuLy8gVHlwZVNjcmlwdCBodHRwczovL29wZW5zdGFwcHMuZ2l0bGFiLmlvL3Byb2plY3RtYW5hZ2VtZW50L2ludGVyZmFjZXMvX25vZGVfbW9kdWxlc19fdHlwZXNfbm9kZV9nbG9iYWxzX2RfLmNvbnNvbGUuaHRtbFxuLy8gQ2hyb21lIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3dlYi90b29scy9jaHJvbWUtZGV2dG9vbHMvY29uc29sZS9hcGlcblxuLy8gQWxsIGNvbnNvbGUgbGV2ZWwgbWV0aG9kcyBoYXZlIHBhcmFtZXRlcnMgKGZtdD8sIC4uLmFyZ3MpXG4vLyB3aGVyZSB0aGUgYXJndW1lbnQgc2VxdWVuY2UgYGZtdD8sIC4uLmFyZ3NgIGZvcm1hdHMgYXJncyBhY2NvcmRpbmcgdG9cbi8vIGZtdCBpZiBmbXQgaXMgYSBmb3JtYXQgc3RyaW5nLiBPdGhlcndpc2UsIGl0IGp1c3QgcmVuZGVycyB0aGVtIGFsbCBhcyB2YWx1ZXNcbi8vIHNlcGFyYXRlZCBieSBzcGFjZXMuXG4vLyBodHRwczovL2NvbnNvbGUuc3BlYy53aGF0d2cub3JnLyNmb3JtYXR0ZXJcbi8vIGh0dHBzOi8vbm9kZWpzLm9yZy9kb2NzL2xhdGVzdC9hcGkvdXRpbC5odG1sI3V0aWxfdXRpbF9mb3JtYXRfZm9ybWF0X2FyZ3NcblxuLy8gRm9yIHRoZSBjYXVzYWwgY29uc29sZSwgYWxsIG9jY3VycmVuY2VzIG9mIGBmbXQsIC4uLmFyZ3NgIG9yIGAuLi5hcmdzYCBieVxuLy8gaXRzZWxmIG11c3QgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhbiBlcnJvciB0byBhc2sgdGhlXG4vLyBgbG9nZ2VkRXJyb3JIYW5kbGVyYCB0byBoYW5kbGUuXG4vLyBJbiB0aGVvcnkgd2Ugc2hvdWxkIGRvIGEgZGVlcCBpbnNwZWN0aW9uIHRvIGRldGVjdCBmb3IgZXhhbXBsZSBhbiBhcnJheVxuLy8gY29udGFpbmluZyBhbiBlcnJvci4gV2UgY3VycmVudGx5IGRvIG5vdCBkZXRlY3QgdGhlc2UgYW5kIG1heSBuZXZlci5cblxuLyoqIEB0eXBlZGVmIHtrZXlvZiBWaXJ0dWFsQ29uc29sZSB8ICdwcm9maWxlJyB8ICdwcm9maWxlRW5kJ30gQ29uc29sZVByb3BzICovXG5cbi8qKiBAdHlwZSB7cmVhZG9ubHkgW0NvbnNvbGVQcm9wcywgTG9nU2V2ZXJpdHkgfCB1bmRlZmluZWRdW119ICovXG5jb25zdCBjb25zb2xlTGV2ZWxNZXRob2RzPSAgZnJlZXplKFtcbiAgWydkZWJ1ZycsICdkZWJ1ZyddLCAvLyAoZm10PywgLi4uYXJncykgdmVyYm9zZSBsZXZlbCBvbiBDaHJvbWVcbiAgWydsb2cnLCAnbG9nJ10sIC8vIChmbXQ/LCAuLi5hcmdzKSBpbmZvIGxldmVsIG9uIENocm9tZVxuICBbJ2luZm8nLCAnaW5mbyddLCAvLyAoZm10PywgLi4uYXJncylcbiAgWyd3YXJuJywgJ3dhcm4nXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG4gIFsnZXJyb3InLCAnZXJyb3InXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG5cbiAgWyd0cmFjZScsICdsb2cnXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG4gIFsnZGlyeG1sJywgJ2xvZyddLCAvLyAoZm10PywgLi4uYXJncylcbiAgWydncm91cCcsICdsb2cnXSwgLy8gKGZtdD8sIC4uLmFyZ3MpXG4gIFsnZ3JvdXBDb2xsYXBzZWQnLCAnbG9nJ10gIC8vIChmbXQ/LCAuLi5hcmdzKVxuXSk7XG5cbi8qKiBAdHlwZSB7cmVhZG9ubHkgW0NvbnNvbGVQcm9wcywgTG9nU2V2ZXJpdHkgfCB1bmRlZmluZWRdW119ICovXG5jb25zdCBjb25zb2xlT3RoZXJNZXRob2RzPSAgZnJlZXplKFtcbiAgWydhc3NlcnQnLCAnZXJyb3InXSwgLy8gKHZhbHVlLCBmbXQ/LCAuLi5hcmdzKVxuICBbJ3RpbWVMb2cnLCAnbG9nJ10sIC8vIChsYWJlbD8sIC4uLmFyZ3MpIG5vIGZtdCBzdHJpbmdcblxuICAvLyBJbnNlbnNpdGl2ZSB0byB3aGV0aGVyIGFueSBhcmd1bWVudCBpcyBhbiBlcnJvci4gQWxsIGFyZ3VtZW50cyBjYW4gcGFzc1xuICAvLyB0aHJ1IHRvIGJhc2VDb25zb2xlIGFzIGlzLlxuICBbJ2NsZWFyJywgdW5kZWZpbmVkXSwgLy8gKClcbiAgWydjb3VudCcsICdpbmZvJ10sIC8vIChsYWJlbD8pXG4gIFsnY291bnRSZXNldCcsIHVuZGVmaW5lZF0sIC8vIChsYWJlbD8pXG4gIFsnZGlyJywgJ2xvZyddLCAvLyAoaXRlbSwgb3B0aW9ucz8pXG4gIFsnZ3JvdXBFbmQnLCAnbG9nJ10sIC8vICgpXG4gIC8vIEluIHRoZW9yeSB0YWJ1bGFyIGRhdGEgbWF5IGJlIG9yIGNvbnRhaW4gYW4gZXJyb3IuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICAvLyBkbyBub3QgZGV0ZWN0IHRoZXNlIGFuZCBtYXkgbmV2ZXIuXG4gIFsndGFibGUnLCAnbG9nJ10sIC8vICh0YWJ1bGFyRGF0YSwgcHJvcGVydGllcz8pXG4gIFsndGltZScsICdpbmZvJ10sIC8vIChsYWJlbD8pXG4gIFsndGltZUVuZCcsICdpbmZvJ10sIC8vIChsYWJlbD8pXG5cbiAgLy8gTm9kZSBJbnNwZWN0b3Igb25seSwgTUROLCBhbmQgVHlwZVNjcmlwdCwgYnV0IG5vdCB3aGF0d2dcbiAgWydwcm9maWxlJywgdW5kZWZpbmVkXSwgLy8gKGxhYmVsPylcbiAgWydwcm9maWxlRW5kJywgdW5kZWZpbmVkXSwgLy8gKGxhYmVsPylcbiAgWyd0aW1lU3RhbXAnLCB1bmRlZmluZWRdICAvLyAobGFiZWw/KVxuXSk7XG5cbi8qKiBAdHlwZSB7cmVhZG9ubHkgW0NvbnNvbGVQcm9wcywgTG9nU2V2ZXJpdHkgfCB1bmRlZmluZWRdW119ICovXG5jb25zdCAgICAgICAgY29uc29sZVdoaXRlbGlzdD0gIGZyZWV6ZShbXG4gIC4uLmNvbnNvbGVMZXZlbE1ldGhvZHMsXG4gIC4uLmNvbnNvbGVPdGhlck1ldGhvZHNdKTtcblxuXG4vKipcbiAqIGNvbnNvbGVPbWl0dGVkUHJvcGVydGllcyBpcyBjdXJyZW50bHkgdW51c2VkLiBJIHJlY29yZCBhbmQgbWFpbnRhaW4gaXQgaGVyZVxuICogd2l0aCB0aGUgaW50ZW50aW9uIHRoYXQgaXQgYmUgdHJlYXRlZCBsaWtlIHRoZSBgZmFsc2VgIGVudHJpZXMgaW4gdGhlIG1haW5cbiAqIFNFUyB3aGl0ZWxpc3Q6IHRoYXQgc2VlaW5nIHRoZXNlIG9uIHRoZSBvcmlnaW5hbCBjb25zb2xlIGlzIGV4cGVjdGVkLCBidXRcbiAqIHNlZWluZyBhbnl0aGluZyBlbHNlIHRoYXQncyBvdXRzaWRlIHRoZSB3aGl0ZWxpc3QgaXMgc3VycHJpc2luZyBhbmQgc2hvdWxkXG4gKiBwcm92aWRlIGEgZGlhZ25vc3RpYy5cbiAqXG4gKiBjb25zdCBjb25zb2xlT21pdHRlZFByb3BlcnRpZXMgPSBmcmVlemUoW1xuICogICAnbWVtb3J5JywgLy8gQ2hyb21lXG4gKiAgICdleGNlcHRpb24nLCAvLyBGRiwgTUROXG4gKiAgICdfaWdub3JlRXJyb3JzJywgLy8gTm9kZVxuICogICAnX3N0ZGVycicsIC8vIE5vZGVcbiAqICAgJ19zdGRlcnJFcnJvckhhbmRsZXInLCAvLyBOb2RlXG4gKiAgICdfc3Rkb3V0JywgLy8gTm9kZVxuICogICAnX3N0ZG91dEVycm9ySGFuZGxlcicsIC8vIE5vZGVcbiAqICAgJ190aW1lcycsIC8vIE5vZGVcbiAqICAgJ2NvbnRleHQnLCAvLyBDaHJvbWUsIE5vZGVcbiAqICAgJ3JlY29yZCcsIC8vIFNhZmFyaVxuICogICAncmVjb3JkRW5kJywgLy8gU2FmYXJpXG4gKlxuICogICAnc2NyZWVuc2hvdCcsIC8vIFNhZmFyaVxuICogICAvLyBTeW1ib2xzXG4gKiAgICdAQHRvU3RyaW5nVGFnJywgLy8gQ2hyb21lOiBcIk9iamVjdFwiLCBTYWZhcmk6IFwiQ29uc29sZVwiXG4gKiAgIC8vIEEgdmFyaWV0eSBvZiBvdGhlciBzeW1ib2xzIGFsc28gc2VlbiBvbiBOb2RlXG4gKiBdKTtcbiAqL1xuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKiogQHR5cGUge01ha2VMb2dnaW5nQ29uc29sZUtpdH0gKi8kaOKAjV9vbmNlLmNvbnNvbGVXaGl0ZWxpc3QoY29uc29sZVdoaXRlbGlzdCk7XG5jb25zdCBtYWtlTG9nZ2luZ0NvbnNvbGVLaXQ9ICAoXG4gIGxvZ2dlZEVycm9ySGFuZGxlcixcbiAgeyBzaG91bGRSZXNldEZvckRlYnVnZ2luZz0gIGZhbHNlfT0gICB7fSk9PlxuICAgICB7XG4gIGlmKCBzaG91bGRSZXNldEZvckRlYnVnZ2luZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgbG9nZ2VkRXJyb3JIYW5kbGVyLnJlc2V0RXJyb3JUYWdOdW0oKTtcbiAgIH1cblxuICAvLyBOb3QgZnJvemVuIVxuICBsZXQgbG9nQXJyYXk9ICBbXTtcblxuICBjb25zdCBsb2dnaW5nQ29uc29sZT0gIGZyb21FbnRyaWVzKFxuICAgIGFycmF5TWFwKGNvbnNvbGVXaGl0ZWxpc3QsIChbbmFtZSwgX10pPT4gIHtcbiAgICAgIC8vIFVzZSBhbiBhcnJvdyBmdW5jdGlvbiBzbyB0aGF0IGl0IGRvZXNuJ3QgY29tZSB3aXRoIGl0cyBvd24gbmFtZSBpblxuICAgICAgLy8gaXRzIHByaW50ZWQgZm9ybS4gSW5zdGVhZCwgd2UncmUgaG9waW5nIHRoYXQgdG9vbGluZyB1c2VzIG9ubHlcbiAgICAgIC8vIHRoZSBgLm5hbWVgIHByb3BlcnR5IHNldCBiZWxvdy5cbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICAgICAqL1xuICAgICAgY29uc3QgbWV0aG9kPSAgKC4uLmFyZ3MpPT4gIHtcbiAgICAgICAgYXJyYXlQdXNoKGxvZ0FycmF5LCBbbmFtZSwgLi4uYXJnc10pO1xuICAgICAgIH07XG4gICAgICBkZWZpbmVQcm9wZXJ0eShtZXRob2QsICduYW1lJywgeyB2YWx1ZTogbmFtZX0pO1xuICAgICAgcmV0dXJuIFtuYW1lLCBmcmVlemUobWV0aG9kKV07XG4gICAgIH0pKTtcblxuICBmcmVlemUobG9nZ2luZ0NvbnNvbGUpO1xuXG4gIGNvbnN0IHRha2VMb2c9ICAoKT0+ICB7XG4gICAgY29uc3QgcmVzdWx0PSAgZnJlZXplKGxvZ0FycmF5KTtcbiAgICBsb2dBcnJheT0gIFtdO1xuICAgIHJldHVybiByZXN1bHQ7XG4gICB9O1xuICBmcmVlemUodGFrZUxvZyk7XG5cbiAgY29uc3QgdHlwZWRMb2dnaW5nQ29uc29sZT0gIC8qKiBAdHlwZSB7VmlydHVhbENvbnNvbGV9ICovICBsb2dnaW5nQ29uc29sZTtcblxuICByZXR1cm4gZnJlZXplKHsgbG9nZ2luZ0NvbnNvbGU6IHR5cGVkTG9nZ2luZ0NvbnNvbGUsIHRha2VMb2d9KTtcbiB9OyRo4oCNX29uY2UubWFrZUxvZ2dpbmdDb25zb2xlS2l0KG1ha2VMb2dnaW5nQ29uc29sZUtpdCk7XG5mcmVlemUobWFrZUxvZ2dpbmdDb25zb2xlS2l0KTtcblxuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKiogQHR5cGUge0Vycm9ySW5mb30gKi9cbmNvbnN0IEVycm9ySW5mbz0gIHtcbiAgTk9URTogJ0VSUk9SX05PVEU6JyxcbiAgTUVTU0FHRTogJ0VSUk9SX01FU1NBR0U6J307XG5cbmZyZWV6ZShFcnJvckluZm8pO1xuXG4vKiogQHR5cGUge01ha2VDYXVzYWxDb25zb2xlfSAqL1xuY29uc3QgbWFrZUNhdXNhbENvbnNvbGU9ICAoYmFzZUNvbnNvbGUsIGxvZ2dlZEVycm9ySGFuZGxlcik9PiAge1xuICBjb25zdCB7XG4gICAgZ2V0U3RhY2tTdHJpbmcsXG4gICAgdGFnRXJyb3IsXG4gICAgdGFrZU1lc3NhZ2VMb2dBcmdzLFxuICAgIHRha2VOb3RlTG9nQXJnc0FycmF5fT1cbiAgICAgIGxvZ2dlZEVycm9ySGFuZGxlcjtcblxuICAvKipcbiAgICogQHBhcmFtIHtSZWFkb25seUFycmF5PGFueT59IGxvZ0FyZ3NcbiAgICogQHBhcmFtIHtBcnJheTxhbnk+fSBzdWJFcnJvcnNTaW5rXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBjb25zdCBleHRyYWN0RXJyb3JBcmdzPSAgKGxvZ0FyZ3MsIHN1YkVycm9yc1NpbmspPT4gIHtcbiAgICBjb25zdCBhcmdUYWdzPSAgYXJyYXlNYXAobG9nQXJncywgKGFyZyk9PntcbiAgICAgIGlmKCBpc0Vycm9yKGFyZykpIHtcbiAgICAgICAgYXJyYXlQdXNoKHN1YkVycm9yc1NpbmssIGFyZyk7XG4gICAgICAgIHJldHVybiAgYCgke3RhZ0Vycm9yKGFyZyl9KWA7XG4gICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICAgfSk7XG4gICAgcmV0dXJuIGFyZ1RhZ3M7XG4gICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0xvZ1NldmVyaXR5fSBzZXZlcml0eVxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKiBAcGFyYW0ge0Vycm9ySW5mb0tpbmR9IGtpbmRcbiAgICogQHBhcmFtIHtyZWFkb25seSBhbnlbXX0gbG9nQXJnc1xuICAgKiBAcGFyYW0ge0FycmF5PEVycm9yPn0gc3ViRXJyb3JzU2lua1xuICAgKi9cbiAgY29uc3QgbG9nRXJyb3JJbmZvPSAgKHNldmVyaXR5LCBlcnJvciwga2luZCwgbG9nQXJncywgc3ViRXJyb3JzU2luayk9PiAge1xuICAgIGNvbnN0IGVycm9yVGFnPSAgdGFnRXJyb3IoZXJyb3IpO1xuICAgIGNvbnN0IGVycm9yTmFtZT1cbiAgICAgIGtpbmQ9PT0gIEVycm9ySW5mby5NRVNTQUdFPyAgIGAke2Vycm9yVGFnfTpgOiAgYCR7ZXJyb3JUYWd9ICR7a2luZH1gO1xuICAgIGNvbnN0IGFyZ1RhZ3M9ICBleHRyYWN0RXJyb3JBcmdzKGxvZ0FyZ3MsIHN1YkVycm9yc1NpbmspO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgYmFzZUNvbnNvbGVbc2V2ZXJpdHldKGVycm9yTmFtZSwgLi4uYXJnVGFncyk7XG4gICB9O1xuXG4gIC8qKlxuICAgKiBMb2dzIHRoZSBgc3ViRXJyb3JzYCB3aXRoaW4gYSBncm91cCBuYW1lIG1lbnRpb25pbmcgYG9wdFRhZ2AuXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nU2V2ZXJpdHl9IHNldmVyaXR5XG4gICAqIEBwYXJhbSB7RXJyb3JbXX0gc3ViRXJyb3JzXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBvcHRUYWdcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjb25zdCBsb2dTdWJFcnJvcnM9ICAoc2V2ZXJpdHksIHN1YkVycm9ycywgb3B0VGFnPSAgdW5kZWZpbmVkKT0+ICB7XG4gICAgaWYoIHN1YkVycm9ycy5sZW5ndGg9PT0gIDApIHtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuICAgIGlmKCBzdWJFcnJvcnMubGVuZ3RoPT09ICAxJiYgIG9wdFRhZz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIGxvZ0Vycm9yKHNldmVyaXR5LCBzdWJFcnJvcnNbMF0pO1xuICAgICAgcmV0dXJuO1xuICAgICB9XG4gICAgbGV0IGxhYmVsO1xuICAgIGlmKCBzdWJFcnJvcnMubGVuZ3RoPT09ICAxKSB7XG4gICAgICBsYWJlbD0gICBgTmVzdGVkIGVycm9yYDtcbiAgICAgfWVsc2Uge1xuICAgICAgbGFiZWw9ICAgYE5lc3RlZCAke3N1YkVycm9ycy5sZW5ndGh9IGVycm9yc2A7XG4gICAgIH1cbiAgICBpZiggb3B0VGFnIT09ICB1bmRlZmluZWQpIHtcbiAgICAgIGxhYmVsPSAgIGAke2xhYmVsfSB1bmRlciAke29wdFRhZ31gO1xuICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBiYXNlQ29uc29sZS5ncm91cChsYWJlbCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciggY29uc3Qgc3ViRXJyb3Igb2Ygc3ViRXJyb3JzKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgICAgICBsb2dFcnJvcihzZXZlcml0eSwgc3ViRXJyb3IpO1xuICAgICAgIH1cbiAgICAgfWZpbmFsbHkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGJhc2VDb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgIH1cbiAgIH07XG5cbiAgY29uc3QgZXJyb3JzTG9nZ2VkPSAgbmV3IFdlYWtTZXQoKTtcblxuICAvKiogQHR5cGUgeyhzZXZlcml0eTogTG9nU2V2ZXJpdHkpID0+IE5vdGVDYWxsYmFja30gKi9cbiAgY29uc3QgbWFrZU5vdGVDYWxsYmFjaz0gIChzZXZlcml0eSk9PihlcnJvciwgbm90ZUxvZ0FyZ3MpPT4gIHtcbiAgICBjb25zdCBzdWJFcnJvcnM9ICBbXTtcbiAgICAvLyBBbm5vdGF0aW9uIGFycml2ZWQgYWZ0ZXIgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLFxuICAgIC8vIHNvIGp1c3QgbG9nIHRoZSBhbm5vdGF0aW9uIGltbWVkaWF0ZWx5LCByYXRoZXIgdGhhbiByZW1lbWJlcmluZyBpdC5cbiAgICBsb2dFcnJvckluZm8oc2V2ZXJpdHksIGVycm9yLCBFcnJvckluZm8uTk9URSwgbm90ZUxvZ0FyZ3MsIHN1YkVycm9ycyk7XG4gICAgbG9nU3ViRXJyb3JzKHNldmVyaXR5LCBzdWJFcnJvcnMsIHRhZ0Vycm9yKGVycm9yKSk7XG4gICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0xvZ1NldmVyaXR5fSBzZXZlcml0eVxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICAgKi9cbiAgY29uc3QgbG9nRXJyb3I9ICAoc2V2ZXJpdHksIGVycm9yKT0+ICB7XG4gICAgaWYoIHdlYWtzZXRIYXMoZXJyb3JzTG9nZ2VkLCBlcnJvcikpIHtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuICAgIGNvbnN0IGVycm9yVGFnPSAgdGFnRXJyb3IoZXJyb3IpO1xuICAgIHdlYWtzZXRBZGQoZXJyb3JzTG9nZ2VkLCBlcnJvcik7XG4gICAgY29uc3Qgc3ViRXJyb3JzPSAgW107XG4gICAgY29uc3QgbWVzc2FnZUxvZ0FyZ3M9ICB0YWtlTWVzc2FnZUxvZ0FyZ3MoZXJyb3IpO1xuICAgIGNvbnN0IG5vdGVMb2dBcmdzQXJyYXk9ICB0YWtlTm90ZUxvZ0FyZ3NBcnJheShcbiAgICAgIGVycm9yLFxuICAgICAgbWFrZU5vdGVDYWxsYmFjayhzZXZlcml0eSkpO1xuXG4gICAgLy8gU2hvdyB0aGUgZXJyb3IncyBtb3N0IGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VcbiAgICBpZiggbWVzc2FnZUxvZ0FyZ3M9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWVzc2FnZSBsb2cgYXJncywgdGhlbiBqdXN0IHNob3cgdGhlIG1lc3NhZ2UgdGhhdFxuICAgICAgLy8gdGhlIGVycm9yIGl0c2VsZiBjYXJyaWVzLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGJhc2VDb25zb2xlW3NldmVyaXR5XSggYCR7ZXJyb3JUYWd9OmAsZXJyb3IubWVzc2FnZSk7XG4gICAgIH1lbHNlIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSwgd2UgdGFrZSBpdCB0byBiZSBzdHJpY3RseSBtb3JlIGluZm9ybWF0aXZlIHRoYW4gdGhlXG4gICAgICAvLyBtZXNzYWdlIHN0cmluZyBjYXJyaWVkIGJ5IHRoZSBlcnJvciwgc28gc2hvdyBpdCAqaW5zdGVhZCouXG4gICAgICBsb2dFcnJvckluZm8oXG4gICAgICAgIHNldmVyaXR5LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgRXJyb3JJbmZvLk1FU1NBR0UsXG4gICAgICAgIG1lc3NhZ2VMb2dBcmdzLFxuICAgICAgICBzdWJFcnJvcnMpO1xuXG4gICAgIH1cbiAgICAvLyBBZnRlciB0aGUgbWVzc2FnZSBidXQgYmVmb3JlIGFueSBvdGhlciBhbm5vdGF0aW9ucywgc2hvdyB0aGUgc3RhY2suXG4gICAgbGV0IHN0YWNrU3RyaW5nPSAgZ2V0U3RhY2tTdHJpbmcoZXJyb3IpO1xuICAgIGlmKFxuICAgICAgdHlwZW9mIHN0YWNrU3RyaW5nPT09ICAnc3RyaW5nJyYmXG4gICAgICBzdGFja1N0cmluZy5sZW5ndGg+PSAgMSYmXG4gICAgICAhc3RyaW5nRW5kc1dpdGgoc3RhY2tTdHJpbmcsICdcXG4nKSlcbiAgICAgIHtcbiAgICAgIHN0YWNrU3RyaW5nKz0gICdcXG4nO1xuICAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBiYXNlQ29uc29sZVtzZXZlcml0eV0oc3RhY2tTdHJpbmcpO1xuICAgIC8vIFNob3cgdGhlIG90aGVyIGFubm90YXRpb25zIG9uIGVycm9yXG4gICAgZm9yKCBjb25zdCBub3RlTG9nQXJncyBvZiBub3RlTG9nQXJnc0FycmF5KSB7XG4gICAgICBsb2dFcnJvckluZm8oc2V2ZXJpdHksIGVycm9yLCBFcnJvckluZm8uTk9URSwgbm90ZUxvZ0FyZ3MsIHN1YkVycm9ycyk7XG4gICAgIH1cbiAgICAvLyBleHBsYWluIGFsbCB0aGUgZXJyb3JzIHNlZW4gaW4gdGhlIG1lc3NhZ2VzIGFscmVhZHkgZW1pdHRlZC5cbiAgICBsb2dTdWJFcnJvcnMoc2V2ZXJpdHksIHN1YkVycm9ycywgZXJyb3JUYWcpO1xuICAgfTtcblxuICBjb25zdCBsZXZlbE1ldGhvZHM9ICBhcnJheU1hcChjb25zb2xlTGV2ZWxNZXRob2RzLCAoW2xldmVsLCBfXSk9PiAge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7Li4uYW55fSBsb2dBcmdzXG4gICAgICovXG4gICAgY29uc3QgbGV2ZWxNZXRob2Q9ICAoLi4ubG9nQXJncyk9PiAge1xuICAgICAgY29uc3Qgc3ViRXJyb3JzPSAgW107XG4gICAgICBjb25zdCBhcmdUYWdzPSAgZXh0cmFjdEVycm9yQXJncyhsb2dBcmdzLCBzdWJFcnJvcnMpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGJhc2VDb25zb2xlW2xldmVsXSguLi5hcmdUYWdzKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgQ29uc29sZVByb3AgdnMgTG9nU2V2ZXJpdHkgbWlzbWF0Y2hcbiAgICAgIGxvZ1N1YkVycm9ycyhsZXZlbCwgc3ViRXJyb3JzKTtcbiAgICAgfTtcbiAgICBkZWZpbmVQcm9wZXJ0eShsZXZlbE1ldGhvZCwgJ25hbWUnLCB7IHZhbHVlOiBsZXZlbH0pO1xuICAgIHJldHVybiBbbGV2ZWwsIGZyZWV6ZShsZXZlbE1ldGhvZCldO1xuICAgfSk7XG4gIGNvbnN0IG90aGVyTWV0aG9kTmFtZXM9ICBhcnJheUZpbHRlcihcbiAgICBjb25zb2xlT3RoZXJNZXRob2RzLFxuICAgIChbbmFtZSwgX10pPT4gIG5hbWUgaW4gYmFzZUNvbnNvbGUpO1xuXG4gIGNvbnN0IG90aGVyTWV0aG9kcz0gIGFycmF5TWFwKG90aGVyTWV0aG9kTmFtZXMsIChbbmFtZSwgX10pPT4gIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgICAqL1xuICAgIGNvbnN0IG90aGVyTWV0aG9kPSAgKC4uLmFyZ3MpPT4gIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICBiYXNlQ29uc29sZVtuYW1lXSguLi5hcmdzKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgIH07XG4gICAgZGVmaW5lUHJvcGVydHkob3RoZXJNZXRob2QsICduYW1lJywgeyB2YWx1ZTogbmFtZX0pO1xuICAgIHJldHVybiBbbmFtZSwgZnJlZXplKG90aGVyTWV0aG9kKV07XG4gICB9KTtcblxuICBjb25zdCBjYXVzYWxDb25zb2xlPSAgZnJvbUVudHJpZXMoWy4uLmxldmVsTWV0aG9kcywgLi4ub3RoZXJNZXRob2RzXSk7XG4gIHJldHVybiAoLyoqIEB0eXBlIHtWaXJ0dWFsQ29uc29sZX0gKi8gZnJlZXplKGNhdXNhbENvbnNvbGUpKTtcbiB9OyRo4oCNX29uY2UubWFrZUNhdXNhbENvbnNvbGUobWFrZUNhdXNhbENvbnNvbGUpO1xuZnJlZXplKG1ha2VDYXVzYWxDb25zb2xlKTtcblxuXG4vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vKiogQHR5cGUge0ZpbHRlckNvbnNvbGV9ICovXG5jb25zdCBmaWx0ZXJDb25zb2xlPSAgKGJhc2VDb25zb2xlLCBmaWx0ZXIsIF90b3BpYz0gIHVuZGVmaW5lZCk9PiAge1xuICAvLyBUT0RPIGRvIHNvbWV0aGluZyB3aXRoIG9wdGlvbmFsIHRvcGljIHN0cmluZ1xuICBjb25zdCB3aGl0ZWxpc3Q9ICBhcnJheUZpbHRlcihcbiAgICBjb25zb2xlV2hpdGVsaXN0LFxuICAgIChbbmFtZSwgX10pPT4gIG5hbWUgaW4gYmFzZUNvbnNvbGUpO1xuXG4gIGNvbnN0IG1ldGhvZHM9ICBhcnJheU1hcCh3aGl0ZWxpc3QsIChbbmFtZSwgc2V2ZXJpdHldKT0+ICB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICAgKi9cbiAgICBjb25zdCBtZXRob2Q9ICAoLi4uYXJncyk9PiAge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGlmKCBzZXZlcml0eT09PSAgdW5kZWZpbmVkfHwgIGZpbHRlci5jYW5Mb2coc2V2ZXJpdHkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgICAgYmFzZUNvbnNvbGVbbmFtZV0oLi4uYXJncyk7XG4gICAgICAgfVxuICAgICB9O1xuICAgIHJldHVybiBbbmFtZSwgZnJlZXplKG1ldGhvZCldO1xuICAgfSk7XG4gIGNvbnN0IGZpbHRlcmluZ0NvbnNvbGU9ICBmcm9tRW50cmllcyhtZXRob2RzKTtcbiAgcmV0dXJuICgvKiogQHR5cGUge1ZpcnR1YWxDb25zb2xlfSAqLyBmcmVlemUoZmlsdGVyaW5nQ29uc29sZSkpO1xuIH07JGjigI1fb25jZS5maWx0ZXJDb25zb2xlKGZpbHRlckNvbnNvbGUpO1xuZnJlZXplKGZpbHRlckNvbnNvbGUpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syOF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGaW5hbGl6YXRpb25SZWdpc3RyeSxNYXAsbWFwR2V0LG1hcERlbGV0ZSxXZWFrTWFwLG1hcFNldCxmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyLHdlYWttYXBTZXQsd2Vha21hcEdldCxtYXBFbnRyaWVzLG1hcEhhczskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb21tb25zLmpzXCIsIFtbXCJGaW5hbGl6YXRpb25SZWdpc3RyeVwiLCBbJGjigI1fYSA9PiAoRmluYWxpemF0aW9uUmVnaXN0cnkgPSAkaOKAjV9hKV1dLFtcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJtYXBHZXRcIiwgWyRo4oCNX2EgPT4gKG1hcEdldCA9ICRo4oCNX2EpXV0sW1wibWFwRGVsZXRlXCIsIFskaOKAjV9hID0+IChtYXBEZWxldGUgPSAkaOKAjV9hKV1dLFtcIldlYWtNYXBcIiwgWyRo4oCNX2EgPT4gKFdlYWtNYXAgPSAkaOKAjV9hKV1dLFtcIm1hcFNldFwiLCBbJGjigI1fYSA9PiAobWFwU2V0ID0gJGjigI1fYSldXSxbXCJmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyXCIsIFskaOKAjV9hID0+IChmaW5hbGl6YXRpb25SZWdpc3RyeVJlZ2lzdGVyID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwU2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwU2V0ID0gJGjigI1fYSldXSxbXCJ3ZWFrbWFwR2V0XCIsIFskaOKAjV9hID0+ICh3ZWFrbWFwR2V0ID0gJGjigI1fYSldXSxbXCJtYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYXBFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYXBIYXNcIiwgWyRo4oCNX2EgPT4gKG1hcEhhcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQ3JlYXRlIHJlamVjdGlvbi10cmFja2luZyBtYWNoaW5lcnkgY29tcGF0aWJsZSB3aXRoIE5vZGUuanMgYW5kIGJyb3dzZXJzLlxuICpcbiAqIE5vdGUgdGhhdCBtb2Rlcm4gYnJvd3NlcnMgKnByZXZlbnQqIGFjY2VzcyB0byB0aGUgJ3VuaGFuZGxlZHJlamVjdGlvbicgYW5kXG4gKiAncmVqZWN0aW9uaGFuZGxlZCcgZXZlbnRzIG5lZWRlZDpcbiAqIC0gaW4gY3Jvc3Mtb3JpZ2luIG1vZGUsIGxpa2Ugd2hlbiBzZXJ2ZWQgZnJvbSBmaWxlOi8vXG4gKiAtIGluIHRoZSBicm93c2VyIGNvbnNvbGUgKGludGVyYWN0aXZlbHkgdHlwZWQtaW4gY29kZSlcbiAqIC0gaW4gdGhlIGRlYnVnZ2VyXG4gKlxuICogVGhlbiwgdGhleSBqdXN0IGxvb2sgbGlrZTogYFVuY2F1Z2h0IChpbiBwcm9taXNlKSBFcnJvcjogLi4uYCBhbmQgZG9uJ3RcbiAqIGltcGxlbWVudCB0aGUgbWFjaGluZXJ5LlxuICpcbiAqIFRoZSBzb2x1dGlvbiBpcyB0byBzZXJ2ZSB5b3VyIHdlYiBwYWdlIGZyb20gYW4gaHR0cDovLyBvciBodHRwczovLyB3ZWIgc2VydmVyXG4gKiBhbmQgZXhlY3V0ZSBhY3R1YWwgY29kZS5cbiAqXG4gKiBAcGFyYW0geyhyZWFzb246IHVua25vd24pID0+IHZvaWR9IHJlcG9ydFJlYXNvbiByZXBvcnQgdGhlIHJlYXNvbiBmb3IgYW5cbiAqIHVuaGFuZGxlZCByZWplY3Rpb24uXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVqZWN0aW9uSGFuZGxlcnM9ICAocmVwb3J0UmVhc29uKT0+e1xuICBpZiggRmluYWxpemF0aW9uUmVnaXN0cnk9PT0gIHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICB9XG5cbiAgLyoqIEB0eXBlZGVmIHtudW1iZXJ9IFJlYXNvbklkICovXG4gIGxldCBsYXN0UmVhc29uSWQ9ICAwO1xuXG4gIC8qKiBAdHlwZSB7TWFwPFJlYXNvbklkLCB1bmtub3duPn0gKi9cbiAgY29uc3QgaWRUb1JlYXNvbj0gIG5ldyBNYXAoKTtcblxuICAvKiogQHR5cGUgeygoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IGNhbmNlbENoZWNraW5nO1xuXG4gIGNvbnN0IHJlbW92ZVJlYXNvbklkPSAgKHJlYXNvbklkKT0+e1xuICAgIG1hcERlbGV0ZShpZFRvUmVhc29uLCByZWFzb25JZCk7XG4gICAgaWYoIGNhbmNlbENoZWNraW5nJiYgIGlkVG9SZWFzb24uc2l6ZT09PSAgMCkge1xuICAgICAgLy8gTm8gbW9yZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0byBjaGVjaywganVzdCBjYW5jZWwgdGhlIGNoZWNrLlxuICAgICAgY2FuY2VsQ2hlY2tpbmcoKTtcbiAgICAgIGNhbmNlbENoZWNraW5nPSAgdW5kZWZpbmVkO1xuICAgICB9XG4gICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcDxQcm9taXNlLCBSZWFzb25JZD59ICovXG4gIGNvbnN0IHByb21pc2VUb1JlYXNvbklkPSAgbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAgICogQ2xlYW4gdXAgYW5kIHJlcG9ydCB0aGUgcmVhc29uIGZvciBhIEdDZWQgdW5oYW5kbGVkIHJlamVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFzb25JZH0gaGVsZFJlYXNvbklkXG4gICAqL1xuICBjb25zdCBmaW5hbGl6ZURyb3BwZWRQcm9taXNlPSAgKGhlbGRSZWFzb25JZCk9PntcbiAgICBpZiggbWFwSGFzKGlkVG9SZWFzb24sIGhlbGRSZWFzb25JZCkpIHtcbiAgICAgIGNvbnN0IHJlYXNvbj0gIG1hcEdldChpZFRvUmVhc29uLCBoZWxkUmVhc29uSWQpO1xuICAgICAgcmVtb3ZlUmVhc29uSWQoaGVsZFJlYXNvbklkKTtcbiAgICAgIHJlcG9ydFJlYXNvbihyZWFzb24pO1xuICAgICB9XG4gICB9O1xuXG4gIC8qKiBAdHlwZSB7RmluYWxpemF0aW9uUmVnaXN0cnk8UmVhc29uSWQ+fSAqL1xuICBjb25zdCBwcm9taXNlVG9SZWFzb249ICBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoZmluYWxpemVEcm9wcGVkUHJvbWlzZSk7XG5cbiAgLyoqXG4gICAqIFRyYWNrIGEgcmVqZWN0ZWQgcHJvbWlzZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgcmVhc29uIGlmIHRoZXJlIGlzIG5vXG4gICAqIHJlamVjdGlvbiBoYW5kbGVyIHN5bmNocm9ub3VzbHkgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uXG4gICAqIEBwYXJhbSB7UHJvbWlzZX0gcHJcbiAgICovXG4gIGNvbnN0IHVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXI9ICAocmVhc29uLCBwcik9PiAge1xuICAgIGxhc3RSZWFzb25JZCs9ICAxO1xuICAgIGNvbnN0IHJlYXNvbklkPSAgbGFzdFJlYXNvbklkO1xuXG4gICAgLy8gVXBkYXRlIGJvb2trZWVwaW5nLlxuICAgIG1hcFNldChpZFRvUmVhc29uLCByZWFzb25JZCwgcmVhc29uKTtcbiAgICB3ZWFrbWFwU2V0KHByb21pc2VUb1JlYXNvbklkLCBwciwgcmVhc29uSWQpO1xuICAgIGZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXIocHJvbWlzZVRvUmVhc29uLCBwciwgcmVhc29uSWQsIHByKTtcbiAgIH07XG5cbiAgLyoqXG4gICAqIERlYWwgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBoYW5kbGVyIHRvIGEgcHJldmlvdXNseSByZWplY3RlZCBwcm9taXNlLlxuICAgKlxuICAgKiBKdXN0IHJlbW92ZSBpdCBmcm9tIG91ciBsaXN0LiAgTGV0IHRoZSBGaW5hbGl6YXRpb25SZWdpc3RyeSBvclxuICAgKiBwcm9jZXNzVGVybWluYXRpb24gcmVwb3J0IGFueSBHQ2VkIHVuaGFuZGxlZCByZWplY3RlZCBwcm9taXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHtQcm9taXNlfSBwclxuICAgKi9cbiAgY29uc3QgcmVqZWN0aW9uSGFuZGxlZEhhbmRsZXI9ICAocHIpPT57XG4gICAgY29uc3QgcmVhc29uSWQ9ICB3ZWFrbWFwR2V0KHByb21pc2VUb1JlYXNvbklkLCBwcik7XG4gICAgcmVtb3ZlUmVhc29uSWQocmVhc29uSWQpO1xuICAgfTtcblxuICAvKipcbiAgICogUmVwb3J0IGFsbCB0aGUgdW5oYW5kbGVkIHJlamVjdGlvbnMsIG5vdyB0aGF0IHdlIGFyZSBhYnJ1cHRseSB0ZXJtaW5hdGluZ1xuICAgKiB0aGUgYWdlbnQgY2x1c3Rlci5cbiAgICovXG4gIGNvbnN0IHByb2Nlc3NUZXJtaW5hdGlvbkhhbmRsZXI9ICAoKT0+ICB7XG4gICAgZm9yKCBjb25zdCBbcmVhc29uSWQsIHJlYXNvbl1vZiAgbWFwRW50cmllcyhpZFRvUmVhc29uKSkge1xuICAgICAgcmVtb3ZlUmVhc29uSWQocmVhc29uSWQpO1xuICAgICAgcmVwb3J0UmVhc29uKHJlYXNvbik7XG4gICAgIH1cbiAgIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZWplY3Rpb25IYW5kbGVkSGFuZGxlcixcbiAgICB1bmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyLFxuICAgIHByb2Nlc3NUZXJtaW5hdGlvbkhhbmRsZXJ9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VSZWplY3Rpb25IYW5kbGVycyhtYWtlUmVqZWN0aW9uSGFuZGxlcnMpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1syOV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBUeXBlRXJyb3IsZ2xvYmFsVGhpcyxkZWZhdWx0SGFuZGxlcixtYWtlQ2F1c2FsQ29uc29sZSxtYWtlUmVqZWN0aW9uSGFuZGxlcnM7JGjigI1faW1wb3J0cyhbW1wiLi4vY29tbW9ucy5qc1wiLCBbW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImdsb2JhbFRoaXNcIiwgWyRo4oCNX2EgPT4gKGdsb2JhbFRoaXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3NlcnQuanNcIiwgW1tcImxvZ2dlZEVycm9ySGFuZGxlclwiLCBbJGjigI1fYSA9PiAoZGVmYXVsdEhhbmRsZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb25zb2xlLmpzXCIsIFtbXCJtYWtlQ2F1c2FsQ29uc29sZVwiLCBbJGjigI1fYSA9PiAobWFrZUNhdXNhbENvbnNvbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi91bmhhbmRsZWQtcmVqZWN0aW9uLmpzXCIsIFtbXCJtYWtlUmVqZWN0aW9uSGFuZGxlcnNcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWplY3Rpb25IYW5kbGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbmNvbnN0IG9yaWdpbmFsQ29uc29sZT0gIGNvbnNvbGU7XG5cbi8qKlxuICogV3JhcCBjb25zb2xlIHVubGVzcyBzdXBwcmVzc2VkLlxuICogQXQgdGhlIG1vbWVudCwgdGhlIGNvbnNvbGUgaXMgY29uc2lkZXJlZCBhIGhvc3QgcG93ZXIgaW4gdGhlIHN0YXJ0XG4gKiBjb21wYXJ0bWVudCwgYW5kIG5vdCBhIHByaW1vcmRpYWwuIEhlbmNlIGl0IGlzIGFic2VudCBmcm9tIHRoZSB3aGlsZWxpc3RcbiAqIGFuZCBieXBhc3NlcyB0aGUgaW50cmluc2ljc0NvbGxlY3Rvci5cbiAqXG4gKiBAcGFyYW0ge1wic2FmZVwiIHwgXCJ1bnNhZmVcIn0gY29uc29sZVRhbWluZ1xuICogQHBhcmFtIHtcInBsYXRmb3JtXCIgfCBcImV4aXRcIiB8IFwiYWJvcnRcIiB8IFwicmVwb3J0XCIgfCBcIm5vbmVcIn0gW2Vycm9yVHJhcHBpbmddXG4gKiBAcGFyYW0ge1wicmVwb3J0XCIgfCBcIm5vbmVcIn0gW3VuaGFuZGxlZFJlamVjdGlvblRyYXBwaW5nXVxuICogQHBhcmFtIHtHZXRTdGFja1N0cmluZz19IG9wdEdldFN0YWNrU3RyaW5nXG4gKi9cbmNvbnN0ICAgICAgICB0YW1lQ29uc29sZT0gIChcbiAgY29uc29sZVRhbWluZz0gICdzYWZlJyxcbiAgZXJyb3JUcmFwcGluZz0gICdwbGF0Zm9ybScsXG4gIHVuaGFuZGxlZFJlamVjdGlvblRyYXBwaW5nPSAgJ3JlcG9ydCcsXG4gIG9wdEdldFN0YWNrU3RyaW5nPSAgdW5kZWZpbmVkKT0+XG4gICAgIHtcbiAgaWYoIGNvbnNvbGVUYW1pbmchPT0gICdzYWZlJyYmICBjb25zb2xlVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgY29uc29sZVRhbWluZyAke2NvbnNvbGVUYW1pbmd9YCk7XG4gICB9XG5cbiAgbGV0IGxvZ2dlZEVycm9ySGFuZGxlcjtcbiAgaWYoIG9wdEdldFN0YWNrU3RyaW5nPT09ICB1bmRlZmluZWQpIHtcbiAgICBsb2dnZWRFcnJvckhhbmRsZXI9ICBkZWZhdWx0SGFuZGxlcjtcbiAgIH1lbHNlIHtcbiAgICBsb2dnZWRFcnJvckhhbmRsZXI9ICB7XG4gICAgICAuLi5kZWZhdWx0SGFuZGxlcixcbiAgICAgIGdldFN0YWNrU3RyaW5nOiBvcHRHZXRTdGFja1N0cmluZ307XG5cbiAgIH1cbiAgY29uc3Qgb3VyQ29uc29sZT1cbiAgICBjb25zb2xlVGFtaW5nPT09ICAndW5zYWZlJz9cbiAgICAgICAgb3JpZ2luYWxDb25zb2xlOlxuICAgICAgICBtYWtlQ2F1c2FsQ29uc29sZShvcmlnaW5hbENvbnNvbGUsIGxvZ2dlZEVycm9ySGFuZGxlcik7XG5cbiAgLy8gQXR0YWNoIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yIHRyYXBzIHN1Y2ggdGhhdCBhbnkgZXJyb3IgdGhhdCBnZXRzIHRocm93blxuICAvLyBhdCB0b3Atb2YtdHVybiAodGhlIGJvdHRvbSBvZiBzdGFjaykgd2lsbCBnZXQgbG9nZ2VkIGJ5IG91ciBjYXVzYWxcbiAgLy8gY29uc29sZSwgcmV2ZWFsaW5nIHRoZSBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IsXG4gIC8vIGluY2x1ZGluZyB0aGUgc3RhY2sgZnJvbSB3aGVuIHRoZSBlcnJvciB3YXMgY3JlYXRlZC5cblxuICAvLyBJbiB0aGUgZm9sbG93aW5nIE5vZGUuanMgYW5kIHdlYiBicm93c2VyIGNhc2VzLCBgcHJvY2Vzc2AgYW5kIGB3aW5kb3dgIGFyZVxuICAvLyBzcGVsbGVkIGFzIGBnbG9iYWxUaGlzYCBwcm9wZXJ0aWVzIHRvIGF2b2lkIHRoZSBvdmVyd2VhbmluZyBnYXplIG9mXG4gIC8vIFBhcmNlbCwgd2hpY2ggZHV0aWZ1bGx5IGluc3RhbGxzIGFuIHVubmVjZXNzYXJ5IGBwcm9jZXNzYCBzaGltIGlmIHdlIGV2ZXJcbiAgLy8gdXR0ZXIgdGhhdC4gVGhhdCB1bm5lY2Vzc2FyeSBzaGltIGZvcmNlcyB0aGUgd2hvbGUgYnVuZGxlIGludG8gc2xvcHB5IG1vZGUsXG4gIC8vIHdoaWNoIGluIHR1cm4gYnJlYWtzIFNFUydzIHN0cmljdCBtb2RlIGludmFyaWFudC5cblxuICAvLyBEaXNhYmxlIHRoZSBwb2x5bW9ycGhpYyBjaGVjayBmb3IgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlLiAgSXQncyB0b28gbm9pc3lcbiAgLy8gd2hlbiBkZWFsaW5nIHdpdGggcGxhdGZvcm0gQVBJcy5cbiAgLyogZXNsaW50LWRpc2FibGUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCAqL1xuXG4gIC8vIE5vZGUuanNcbiAgaWYoIGVycm9yVHJhcHBpbmchPT0gICdub25lJyYmICBnbG9iYWxUaGlzLnByb2Nlc3MhPT0gIHVuZGVmaW5lZCkge1xuICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyb3IpPT57XG4gICAgICAvLyBjYXVzYWxDb25zb2xlIGlzIGJvcm4gZnJvemVuIHNvIG5vdCB2dWxuZXJhYmxlIHRvIG1ldGhvZCB0YW1wZXJpbmcuXG4gICAgICBvdXJDb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIGlmKCBlcnJvclRyYXBwaW5nPT09ICAncGxhdGZvcm0nfHwgIGVycm9yVHJhcHBpbmc9PT0gICdleGl0Jykge1xuICAgICAgICBnbG9iYWxUaGlzLnByb2Nlc3MuZXhpdChnbG9iYWxUaGlzLnByb2Nlc3MuZXhpdENvZGV8fCAgLTEpO1xuICAgICAgIH1lbHNlIGlmKCBlcnJvclRyYXBwaW5nPT09ICAnYWJvcnQnKSB7XG4gICAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5hYm9ydCgpO1xuICAgICAgIH1cbiAgICAgfSk7XG4gICB9XG5cbiAgaWYoXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9uVHJhcHBpbmchPT0gICdub25lJyYmXG4gICAgZ2xvYmFsVGhpcy5wcm9jZXNzIT09ICB1bmRlZmluZWQpXG4gICAge1xuICAgIGNvbnN0IGhhbmRsZVJlamVjdGlvbj0gIChyZWFzb24pPT57XG4gICAgICAvLyAncGxhdGZvcm0nIGFuZCAncmVwb3J0JyBqdXN0IGxvZyB0aGUgcmVhc29uLlxuICAgICAgb3VyQ29uc29sZS5lcnJvcignU0VTX1VOSEFORExFRF9SRUpFQ1RJT046JywgcmVhc29uKTtcbiAgICAgfTtcbiAgICAvLyBNYXliZSB0cmFjayB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zLlxuICAgIGNvbnN0IGg9ICBtYWtlUmVqZWN0aW9uSGFuZGxlcnMoaGFuZGxlUmVqZWN0aW9uKTtcbiAgICBpZiggaCkge1xuICAgICAgLy8gUmVqZWN0aW9uIGhhbmRsZXJzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIGgudW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcik7XG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3Mub24oJ3JlamVjdGlvbkhhbmRsZWQnLCBoLnJlamVjdGlvbkhhbmRsZWRIYW5kbGVyKTtcbiAgICAgIGdsb2JhbFRoaXMucHJvY2Vzcy5vbignZXhpdCcsIGgucHJvY2Vzc1Rlcm1pbmF0aW9uSGFuZGxlcik7XG4gICAgIH1cbiAgIH1cblxuICAvLyBCcm93c2VyXG4gIGlmKFxuICAgIGVycm9yVHJhcHBpbmchPT0gICdub25lJyYmXG4gICAgZ2xvYmFsVGhpcy53aW5kb3chPT0gIHVuZGVmaW5lZCYmXG4gICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciE9PSAgdW5kZWZpbmVkKVxuICAgIHtcbiAgICBnbG9iYWxUaGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCk9PntcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvLyAncGxhdGZvcm0nIGFuZCAncmVwb3J0JyBqdXN0IGxvZyB0aGUgcmVhc29uLlxuICAgICAgb3VyQ29uc29sZS5lcnJvcihldmVudC5lcnJvcik7XG4gICAgICBpZiggZXJyb3JUcmFwcGluZz09PSAgJ2V4aXQnfHwgIGVycm9yVHJhcHBpbmc9PT0gICdhYm9ydCcpIHtcbiAgICAgICAgZ2xvYmFsVGhpcy53aW5kb3cubG9jYXRpb24uaHJlZj0gICBgYWJvdXQ6YmxhbmtgO1xuICAgICAgIH1cbiAgICAgfSk7XG4gICB9XG5cbiAgaWYoXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9uVHJhcHBpbmchPT0gICdub25lJyYmXG4gICAgZ2xvYmFsVGhpcy53aW5kb3chPT0gIHVuZGVmaW5lZCYmXG4gICAgZ2xvYmFsVGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciE9PSAgdW5kZWZpbmVkKVxuICAgIHtcbiAgICBjb25zdCBoYW5kbGVSZWplY3Rpb249ICAocmVhc29uKT0+e1xuICAgICAgb3VyQ29uc29sZS5lcnJvcignU0VTX1VOSEFORExFRF9SRUpFQ1RJT046JywgcmVhc29uKTtcbiAgICAgfTtcblxuICAgIGNvbnN0IGg9ICBtYWtlUmVqZWN0aW9uSGFuZGxlcnMoaGFuZGxlUmVqZWN0aW9uKTtcbiAgICBpZiggaCkge1xuICAgICAgLy8gUmVqZWN0aW9uIGhhbmRsZXJzIGFyZSBzdXBwb3J0ZWQuXG4gICAgICBnbG9iYWxUaGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCAoZXZlbnQpPT57XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGgudW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcihldmVudC5yZWFzb24sIGV2ZW50LnByb21pc2UpO1xuICAgICAgIH0pO1xuXG4gICAgICBnbG9iYWxUaGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZWplY3Rpb25oYW5kbGVkJywgKGV2ZW50KT0+e1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBoLnJlamVjdGlvbkhhbmRsZWRIYW5kbGVyKGV2ZW50LnByb21pc2UpO1xuICAgICAgIH0pO1xuXG4gICAgICBnbG9iYWxUaGlzLndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoX2V2ZW50KT0+e1xuICAgICAgICBoLnByb2Nlc3NUZXJtaW5hdGlvbkhhbmRsZXIoKTtcbiAgICAgICB9KTtcbiAgICAgfVxuICAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwgKi9cblxuICByZXR1cm4geyBjb25zb2xlOiBvdXJDb25zb2xlfTtcbiB9OyRo4oCNX29uY2UudGFtZUNvbnNvbGUodGFtZUNvbnNvbGUpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szMF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBXZWFrTWFwLFdlYWtTZXQsYXBwbHksYXJyYXlGaWx0ZXIsYXJyYXlKb2luLGFycmF5TWFwLGFycmF5U2xpY2UsY3JlYXRlLGRlZmluZVByb3BlcnRpZXMsZnJvbUVudHJpZXMscmVmbGVjdFNldCxyZWdleHBFeGVjLHJlZ2V4cFRlc3Qsd2Vha21hcEdldCx3ZWFrbWFwU2V0LHdlYWtzZXRBZGQsd2Vha3NldEhhczskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb21tb25zLmpzXCIsIFtbXCJXZWFrTWFwXCIsIFskaOKAjV9hID0+IChXZWFrTWFwID0gJGjigI1fYSldXSxbXCJXZWFrU2V0XCIsIFskaOKAjV9hID0+IChXZWFrU2V0ID0gJGjigI1fYSldXSxbXCJhcHBseVwiLCBbJGjigI1fYSA9PiAoYXBwbHkgPSAkaOKAjV9hKV1dLFtcImFycmF5RmlsdGVyXCIsIFskaOKAjV9hID0+IChhcnJheUZpbHRlciA9ICRo4oCNX2EpXV0sW1wiYXJyYXlKb2luXCIsIFskaOKAjV9hID0+IChhcnJheUpvaW4gPSAkaOKAjV9hKV1dLFtcImFycmF5TWFwXCIsIFskaOKAjV9hID0+IChhcnJheU1hcCA9ICRo4oCNX2EpXV0sW1wiYXJyYXlTbGljZVwiLCBbJGjigI1fYSA9PiAoYXJyYXlTbGljZSA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcImZyb21FbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tRW50cmllcyA9ICRo4oCNX2EpXV0sW1wicmVmbGVjdFNldFwiLCBbJGjigI1fYSA9PiAocmVmbGVjdFNldCA9ICRo4oCNX2EpXV0sW1wicmVnZXhwRXhlY1wiLCBbJGjigI1fYSA9PiAocmVnZXhwRXhlYyA9ICRo4oCNX2EpXV0sW1wicmVnZXhwVGVzdFwiLCBbJGjigI1fYSA9PiAocmVnZXhwVGVzdCA9ICRo4oCNX2EpXV0sW1wid2Vha21hcEdldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcEdldCA9ICRo4oCNX2EpXV0sW1wid2Vha21hcFNldFwiLCBbJGjigI1fYSA9PiAod2Vha21hcFNldCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEFkZFwiLCBbJGjigI1fYSA9PiAod2Vha3NldEFkZCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEhhc1wiLCBbJGjigI1fYSA9PiAod2Vha3NldEhhcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vLyBXaGl0ZWxpc3QgbmFtZXMgZnJvbSBodHRwczovL3Y4LmRldi9kb2NzL3N0YWNrLXRyYWNlLWFwaVxuLy8gV2hpdGVsaXN0aW5nIG9ubHkgdGhlIG5hbWVzIHVzZWQgYnkgZXJyb3Itc3RhY2stc2hpbS9zcmMvdjhTdGFja0ZyYW1lc1xuLy8gY2FsbFNpdGVUb0ZyYW1lIHRvIHNoaW0gdGhlIGVycm9yIHN0YWNrIHByb3Bvc2FsLlxuY29uc3Qgc2FmZVY4Q2FsbFNpdGVNZXRob2ROYW1lcz0gIFtcbiAgLy8gc3VwcHJlc3MgJ2dldFRoaXMnIGRlZmluaXRlbHlcbiAgJ2dldFR5cGVOYW1lJyxcbiAgLy8gc3VwcHJlc3MgJ2dldEZ1bmN0aW9uJyBkZWZpbml0ZWx5XG4gICdnZXRGdW5jdGlvbk5hbWUnLFxuICAnZ2V0TWV0aG9kTmFtZScsXG4gICdnZXRGaWxlTmFtZScsXG4gICdnZXRMaW5lTnVtYmVyJyxcbiAgJ2dldENvbHVtbk51bWJlcicsXG4gICdnZXRFdmFsT3JpZ2luJyxcbiAgJ2lzVG9wbGV2ZWwnLFxuICAnaXNFdmFsJyxcbiAgJ2lzTmF0aXZlJyxcbiAgJ2lzQ29uc3RydWN0b3InLFxuICAnaXNBc3luYycsXG4gIC8vIHN1cHByZXNzICdpc1Byb21pc2VBbGwnIGZvciBub3dcbiAgLy8gc3VwcHJlc3MgJ2dldFByb21pc2VJbmRleCcgZm9yIG5vd1xuXG4gIC8vIEFkZGl0aW9uYWwgbmFtZXMgZm91bmQgYnkgZXhwZXJpbWVudCwgYWJzZW50IGZyb21cbiAgLy8gaHR0cHM6Ly92OC5kZXYvZG9jcy9zdGFjay10cmFjZS1hcGlcbiAgJ2dldFBvc2l0aW9uJyxcbiAgJ2dldFNjcmlwdE5hbWVPclNvdXJjZVVSTCcsXG5cbiAgJ3RvU3RyaW5nJyAgLy8gVE9ETyByZXBsYWNlIHRvIHVzZSBvbmx5IHdoaXRlbGlzdGVkIGluZm9cbl07XG5cbi8vIFRPRE8gdGhpcyBpcyBhIHJpZGljdWxvdXNseSBleHBlbnNpdmUgd2F5IHRvIGF0dGVudWF0ZSBjYWxsc2l0ZXMuXG4vLyBCZWZvcmUgdGhhdCBtYXR0ZXJzLCB3ZSBzaG91bGQgc3dpdGNoIHRvIGEgcmVhc29uYWJsZSByZXByZXNlbnRhdGlvbi5cbmNvbnN0IHNhZmVWOENhbGxTaXRlRmFjZXQ9ICAoY2FsbFNpdGUpPT57XG4gIGNvbnN0IG1ldGhvZEVudHJ5PSAgKG5hbWUpPT57XG4gICAgY29uc3QgbWV0aG9kPSAgY2FsbFNpdGVbbmFtZV07XG4gICAgcmV0dXJuIFtuYW1lLCAoKT0+ICBhcHBseShtZXRob2QsIGNhbGxTaXRlLCBbXSldO1xuICAgfTtcbiAgY29uc3Qgbz0gIGZyb21FbnRyaWVzKGFycmF5TWFwKHNhZmVWOENhbGxTaXRlTWV0aG9kTmFtZXMsIG1ldGhvZEVudHJ5KSk7XG4gIHJldHVybiBjcmVhdGUobywge30pO1xuIH07XG5cbmNvbnN0IHNhZmVWOFNTVD0gIChzc3QpPT5hcnJheU1hcChzc3QsIHNhZmVWOENhbGxTaXRlRmFjZXQpO1xuXG4vLyBJZiBpdCBoYXMgYC9ub2RlX21vZHVsZXMvYCBhbnl3aGVyZSBpbiBpdCwgb24gTm9kZSBpdCBpcyBsaWtlbHlcbi8vIHRvIGJlIGEgZGVwZW5kZW50IHBhY2thZ2Ugb2YgdGhlIGN1cnJlbnQgcGFja2FnZSwgYW5kIHNvIHRvXG4vLyBiZSBhbiBpbmZyYXN0cnVjdHVyZSBmcmFtZSB0byBiZSBkcm9wcGVkIGZyb20gY29uY2lzZSBzdGFjayB0cmFjZXMuXG5jb25zdCBGSUxFTkFNRV9OT0RFX0RFUEVOREVOVFNfQ0VOU09SPSAgL1xcL25vZGVfbW9kdWxlc1xcLy87XG5cbi8vIElmIGl0IGJlZ2lucyB3aXRoIGBpbnRlcm5hbC9gIG9yIGBub2RlOmludGVybmFsYCB0aGVuIGl0IGlzIGxpa2VseVxuLy8gcGFydCBvZiB0aGUgbm9kZSBpbmZydXN0cnVjdHJlIGl0c2VsZiwgdG8gYmUgZHJvcHBlZCBmcm9tIGNvbmNpc2Vcbi8vIHN0YWNrIHRyYWNlcy5cbmNvbnN0IEZJTEVOQU1FX05PREVfSU5URVJOQUxTX0NFTlNPUj0gIC9eKD86bm9kZTopP2ludGVybmFsXFwvLztcblxuLy8gRnJhbWVzIHdpdGhpbiB0aGUgYGFzc2VydC5qc2AgcGFja2FnZSBzaG91bGQgYmUgZHJvcHBlZCBmcm9tXG4vLyBjb25jaXNlIHN0YWNrIHRyYWNlcywgYXMgdGhlc2UgYXJlIGp1c3Qgc3RlcHMgdG93YXJkcyBjcmVhdGluZyB0aGVcbi8vIGVycm9yIG9iamVjdCBpbiBxdWVzdGlvbi5cbmNvbnN0IEZJTEVOQU1FX0FTU0VSVF9DRU5TT1I9ICAvXFwvcGFja2FnZXNcXC9zZXNcXC9zcmNcXC9lcnJvclxcL2Fzc2VydC5qcyQvO1xuXG4vLyBGcmFtZXMgd2l0aGluIHRoZSBgZXZlbnR1YWwtc2VuZGAgc2hpbSBzaG91bGQgYmUgZHJvcHBlZCBzbyB0aGF0IGNvbmNpc2Vcbi8vIGRlZXAgc3RhY2tzIG9taXQgdGhlIGludGVybmFscyBvZiB0aGUgZXZlbnR1YWwtc2VuZGluZyBtZWNoYW5pc20gY2F1c2luZ1xuLy8gYXN5bmNocm9ub3VzIG1lc3NhZ2VzIHRvIGJlIHNlbnQuXG4vLyBOb3RlIHRoYXQgdGhlIGV2ZW50dWFsLXNlbmQgcGFja2FnZSB3aWxsIG1vdmUgZnJvbSBhZ29yaWMtc2RrIHRvXG4vLyBFbmRvLCBzbyB0aGlzIHJ1bGUgd2lsbCBiZSBvZiBnZW5lcmFsIGludGVyZXN0LlxuY29uc3QgRklMRU5BTUVfRVZFTlRVQUxfU0VORF9DRU5TT1I9ICAvXFwvcGFja2FnZXNcXC9ldmVudHVhbC1zZW5kXFwvc3JjXFwvLztcblxuLy8gQW55IHN0YWNrIGZyYW1lIHdob3NlIGBmaWxlTmFtZWAgbWF0Y2hlcyBhbnkgb2YgdGhlc2UgY2Vuc29yIHBhdHRlcm5zXG4vLyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBjb25jaXNlIHN0YWNrcy5cbi8vIFRPRE8gRW5hYmxlIHVzZXJzIHRvIGNvbmZpZ3VyZSBGSUxFTkFNRV9DRU5TT1JTIHZpYSBgbG9ja2Rvd25gIG9wdGlvbnMuXG5jb25zdCBGSUxFTkFNRV9DRU5TT1JTPSAgW1xuICBGSUxFTkFNRV9OT0RFX0RFUEVOREVOVFNfQ0VOU09SLFxuICBGSUxFTkFNRV9OT0RFX0lOVEVSTkFMU19DRU5TT1IsXG4gIEZJTEVOQU1FX0FTU0VSVF9DRU5TT1IsXG4gIEZJTEVOQU1FX0VWRU5UVUFMX1NFTkRfQ0VOU09SXTtcblxuXG4vLyBTaG91bGQgYSBzdGFjayBmcmFtZSB3aXRoIHRoaXMgYXMgaXRzIGZpbGVOYW1lIGJlIGluY2x1ZGVkIGluIGEgY29uY2lzZVxuLy8gc3RhY2sgdHJhY2U/XG4vLyBFeHBvcnRlZCBvbmx5IHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZC5cbi8vIFRPRE8gTW92ZSBzbyB0aGF0IGl0IGFwcGxpZXMgbm90IGp1c3QgdG8gdjguXG5jb25zdCAgICAgICAgZmlsdGVyRmlsZU5hbWU9ICAoZmlsZU5hbWUpPT57XG4gIGlmKCAhZmlsZU5hbWUpIHtcbiAgICAvLyBTdGFjayBmcmFtZXMgd2l0aCBubyBmaWxlTmFtZSBzaG91bGQgYXBwZWFyIGluIGNvbmNpc2Ugc3RhY2sgdHJhY2VzLlxuICAgIHJldHVybiB0cnVlO1xuICAgfVxuICBmb3IoIGNvbnN0IGZpbHRlciBvZiBGSUxFTkFNRV9DRU5TT1JTKSB7XG4gICAgaWYoIHJlZ2V4cFRlc3QoZmlsdGVyLCBmaWxlTmFtZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgfVxuICAgfVxuICByZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vLyBUaGUgYWQtaG9jIHJ1bGUgb2YgdGhlIGN1cnJlbnQgcGF0dGVybiBpcyB0aGF0IGFueSBsaWtlbHktZmlsZS1wYXRoIG9yXG4vLyBsaWtlbHkgdXJsLXBhdGggcHJlZml4LCBlbmRpbmcgaW4gYSBgLy4uLi9gIHNob3VsZCBnZXQgZHJvcHBlZC5cbi8vIEFueXRoaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBsaWtlbHkgcGF0aCB0ZXh0IGlzIGtlcHQuXG4vLyBFdmVyeXRoaW5nIHRvIHRoZSByaWdodCBvZiBgLy4uLi9gIGlzIGtlcHQuIFRodXNcbi8vIGAnT2JqZWN0LmJhciAoL3ZhdC12MS8uLi4vZXZlbnR1YWwtc2VuZC90ZXN0L3Rlc3QtZGVlcC1zZW5kLmpzOjEzOjIxKSdgXG4vLyBzaW1wbGlmaWVzIHRvXG4vLyBgJ09iamVjdC5iYXIgKGV2ZW50dWFsLXNlbmQvdGVzdC90ZXN0LWRlZXAtc2VuZC5qczoxMzoyMSknYC5cbi8vXG4vLyBTZWUgdGhyZWFkIHN0YXJ0aW5nIGF0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzIzMjYjaXNzdWVjb21tZW50LTc3MzAyMDM4OVxuJGjigI1fb25jZS5maWx0ZXJGaWxlTmFtZShmaWx0ZXJGaWxlTmFtZSk7Y29uc3QgQ0FMTFNJVEVfRUxMSVBTRVNfUEFUVEVSTj0vXigoPzouKlsoIF0pPylbOi9cXHdfLV0qXFwvXFwuXFwuXFwuXFwvKC4rKSQvO1xuXG4vLyBUaGUgYWQtaG9jIHJ1bGUgb2YgdGhlIGN1cnJlbnQgcGF0dGVybiBpcyB0aGF0IGFueSBsaWtlbHktZmlsZS1wYXRoIG9yXG4vLyBsaWtlbHkgdXJsLXBhdGggcHJlZml4LCBlbmRpbmcgaW4gYSBgL2AgYW5kIHByaW9yIHRvIGBwYWNrYWdlL2Agc2hvdWxkIGdldFxuLy8gZHJvcHBlZC5cbi8vIEFueXRoaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBsaWtlbHkgcGF0aCBwcmVmaXggdGV4dCBpcyBrZXB0LiBgcGFja2FnZS9gIGFuZFxuLy8gZXZlcnl0aGluZyB0byBpdHMgcmlnaHQgaXMga2VwdC4gVGh1c1xuLy8gYCdPYmplY3QuYmFyICgvVXNlcnMvbWFya21pbGxlci9zcmMvb25naXRodWIvYWdvcmljL2Fnb3JpYy1zZGsvcGFja2FnZXMvZXZlbnR1YWwtc2VuZC90ZXN0L3Rlc3QtZGVlcC1zZW5kLmpzOjEzOjIxKSdgXG4vLyBzaW1wbGlmaWVzIHRvXG4vLyBgJ09iamVjdC5iYXIgKHBhY2thZ2VzL2V2ZW50dWFsLXNlbmQvdGVzdC90ZXN0LWRlZXAtc2VuZC5qczoxMzoyMSknYC5cbi8vIE5vdGUgdGhhdCBgL3BhY2thZ2VzL2AgaXMgYSBjb252ZW50aW9uIGZvciBtb25vcmVwb3MgZW5jb3VyYWdlZCBieVxuLy8gbGVybmEuXG5jb25zdCBDQUxMU0lURV9QQUNLQUdFU19QQVRURVJOPSAgL14oKD86LipbKCBdKT8pWzovXFx3Xy1dKlxcLyhwYWNrYWdlc1xcLy4rKSQvO1xuXG4vLyBUaGUgdXNlIG9mIHRoZXNlIGNhbGxTaXRlIHBhdHRlcm5zIGJlbG93IGFzc3VtZXMgdGhhdCBhbnkgbWF0Y2ggd2lsbCBiaW5kXG4vLyBjYXB0dXJlIGdyb3VwcyBjb250YWluaW5nIHRoZSBwYXJ0cyBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nIHdlIHdhbnRcbi8vIHRvIGtlZXAuIFRoZSBwYXJ0cyBvdXRzaWRlIHRob3NlIGNhcHR1cmUgZ3JvdXBzIHdpbGwgYmUgZHJvcHBlZCBmcm9tIGNvbmNpc2Vcbi8vIHN0YWNrcy5cbi8vIFRPRE8gRW5hYmxlIHVzZXJzIHRvIGNvbmZpZ3VyZSBDQUxMU0lURV9QQVRURVJOUyB2aWEgYGxvY2tkb3duYCBvcHRpb25zLlxuY29uc3QgQ0FMTFNJVEVfUEFUVEVSTlM9ICBbXG4gIENBTExTSVRFX0VMTElQU0VTX1BBVFRFUk4sXG4gIENBTExTSVRFX1BBQ0tBR0VTX1BBVFRFUk5dO1xuXG5cbi8vIEZvciBhIHN0YWNrIGZyYW1lIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgY29uY2lzZSBzdGFjayB0cmFjZSwgaWZcbi8vIGBjYWxsU2l0ZVN0cmluZ2AgaXMgdGhlIG9yaWdpbmFsIHN0cmluZ2lmaWVkIHN0YWNrIGZyYW1lLCByZXR1cm4gdGhlXG4vLyBwb3NzaWJseS1zaG9ydGVyIHN0cmluZ2lmaWVkIHN0YWNrIGZyYW1lIHRoYXQgc2hvdWxkIGJlIHNob3duIGluc3RlYWQuXG4vLyBFeHBvcnRlZCBvbmx5IHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZC5cbi8vIFRPRE8gTW92ZSBzbyB0aGF0IGl0IGFwcGxpZXMgbm90IGp1c3QgdG8gdjguXG5jb25zdCAgICAgICAgc2hvcnRlbkNhbGxTaXRlU3RyaW5nPSAgKGNhbGxTaXRlU3RyaW5nKT0+e1xuICBmb3IoIGNvbnN0IGZpbHRlciBvZiBDQUxMU0lURV9QQVRURVJOUykge1xuICAgIGNvbnN0IG1hdGNoPSAgcmVnZXhwRXhlYyhmaWx0ZXIsIGNhbGxTaXRlU3RyaW5nKTtcbiAgICBpZiggbWF0Y2gpIHtcbiAgICAgIHJldHVybiBhcnJheUpvaW4oYXJyYXlTbGljZShtYXRjaCwgMSksICcnKTtcbiAgICAgfVxuICAgfVxuICByZXR1cm4gY2FsbFNpdGVTdHJpbmc7XG4gfTskaOKAjV9vbmNlLnNob3J0ZW5DYWxsU2l0ZVN0cmluZyhzaG9ydGVuQ2FsbFNpdGVTdHJpbmcpO1xuXG5jb25zdCAgICAgICAgdGFtZVY4RXJyb3JDb25zdHJ1Y3Rvcj0gIChcbiAgT3JpZ2luYWxFcnJvcixcbiAgSW5pdGlhbEVycm9yLFxuICBlcnJvclRhbWluZyxcbiAgc3RhY2tGaWx0ZXJpbmcpPT5cbiAgICAge1xuICAvLyBUT0RPOiBQcm9wZXIgQ2FsbFNpdGUgdHlwZXNcbiAgLyoqIEB0eXBlZGVmIHt7fX0gQ2FsbFNpdGUgKi9cblxuICBjb25zdCBvcmlnaW5hbENhcHR1cmVTdGFja1RyYWNlPSAgT3JpZ2luYWxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtcblxuICAvLyBjb25zdCBjYWxsU2l0ZUZpbHRlciA9IF9jYWxsU2l0ZSA9PiB0cnVlO1xuICBjb25zdCBjYWxsU2l0ZUZpbHRlcj0gIChjYWxsU2l0ZSk9PntcbiAgICBpZiggc3RhY2tGaWx0ZXJpbmc9PT0gICd2ZXJib3NlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIHJldHVybiBmaWx0ZXJGaWxlTmFtZShjYWxsU2l0ZS5nZXRGaWxlTmFtZSgpKTtcbiAgIH07XG5cbiAgY29uc3QgY2FsbFNpdGVTdHJpbmdpZmllcj0gIChjYWxsU2l0ZSk9PntcbiAgICBsZXQgY2FsbFNpdGVTdHJpbmc9ICAgYCR7Y2FsbFNpdGV9YDtcbiAgICBpZiggc3RhY2tGaWx0ZXJpbmc9PT0gICdjb25jaXNlJykge1xuICAgICAgY2FsbFNpdGVTdHJpbmc9ICBzaG9ydGVuQ2FsbFNpdGVTdHJpbmcoY2FsbFNpdGVTdHJpbmcpO1xuICAgICB9XG4gICAgcmV0dXJuICBgXFxuICBhdCAke2NhbGxTaXRlU3RyaW5nfWA7XG4gICB9O1xuXG4gIGNvbnN0IHN0YWNrU3RyaW5nRnJvbVNTVD0gIChfZXJyb3IsIHNzdCk9PlxuICAgIGFycmF5Sm9pbihcbiAgICAgIGFycmF5TWFwKGFycmF5RmlsdGVyKHNzdCwgY2FsbFNpdGVGaWx0ZXIpLCBjYWxsU2l0ZVN0cmluZ2lmaWVyKSxcbiAgICAgICcnKTtcblxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJ1Y3R1cmVkU3RhY2tJbmZvXG4gICAqIEBwcm9wZXJ0eSB7Q2FsbFNpdGVbXX0gY2FsbFNpdGVzXG4gICAqIEBwcm9wZXJ0eSB7dW5kZWZpbmVkfSBbc3RhY2tTdHJpbmddXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJzZWRTdGFja0luZm9cbiAgICogQHByb3BlcnR5IHt1bmRlZmluZWR9IFtjYWxsU2l0ZXNdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGFja1N0cmluZ1xuICAgKi9cblxuICAvLyBNYXBwaW5nIGZyb20gZXJyb3IgaW5zdGFuY2UgdG8gdGhlIHN0YWNrIGZvciB0aGF0IGluc3RhbmNlLlxuICAvLyBUaGUgc3RhY2sgaW5mbyBpcyBlaXRoZXIgdGhlIHN0cnVjdHVyZWQgc3RhY2sgdHJhY2VcbiAgLy8gb3IgdGhlIGdlbmVyYXRlZCB0YW1lZCBzdGFjayBzdHJpbmdcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEVycm9yLCBQYXJzZWRTdGFja0luZm8gfCBTdHJ1Y3R1cmVkU3RhY2tJbmZvfSAqL1xuICBjb25zdCBzdGFja0luZm9zPSAgbmV3IFdlYWtNYXAoKTtcblxuICAvLyBVc2UgY29uY2lzZSBtZXRob2RzIHRvIG9idGFpbiBuYW1lZCBmdW5jdGlvbnMgd2l0aG91dCBjb25zdHJ1Y3RvcnMuXG4gIGNvbnN0IHRhbWVkTWV0aG9kcz0gIHtcbiAgICAvLyBUaGUgb3B0aW9uYWwgYG9wdEZuYCBhcmd1bWVudCBpcyBmb3IgY3V0dGluZyBvZmYgdGhlIGJvdHRvbSBvZlxuICAgIC8vIHRoZSBzdGFjayAtLS0gZm9yIGNhcHR1cmluZyB0aGUgc3RhY2sgb25seSBhYm92ZSB0aGUgdG9wbW9zdFxuICAgIC8vIGNhbGwgdG8gdGhhdCBmdW5jdGlvbi4gU2luY2UgdGhpcyBpc24ndCB0aGUgXCJyZWFsXCIgY2FwdHVyZVN0YWNrVHJhY2VcbiAgICAvLyBidXQgaW5zdGVhZCBjYWxscyB0aGUgcmVhbCBvbmUsIGlmIG5vIG90aGVyIGN1dG9mZiBpcyBwcm92aWRlZCxcbiAgICAvLyB3ZSBjdXQgdGhpcyBvbmUgb2ZmLlxuICAgIGNhcHR1cmVTdGFja1RyYWNlKGVycm9yLCBvcHRGbj0gIHRhbWVkTWV0aG9kcy5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgaWYoIHR5cGVvZiBvcmlnaW5hbENhcHR1cmVTdGFja1RyYWNlPT09ICAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIE9yaWdpbmFsRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgaXMgb25seSBvbiB2OFxuICAgICAgICBhcHBseShvcmlnaW5hbENhcHR1cmVTdGFja1RyYWNlLCBPcmlnaW5hbEVycm9yLCBbZXJyb3IsIG9wdEZuXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICByZWZsZWN0U2V0KGVycm9yLCAnc3RhY2snLCAnJyk7XG4gICAgIH0sXG4gICAgLy8gU2hpbSBvZiBwcm9wb3NlZCBzcGVjaWFsIHBvd2VyLCB0byByZXNpZGUgYnkgZGVmYXVsdCBvbmx5XG4gICAgLy8gaW4gdGhlIHN0YXJ0IGNvbXBhcnRtZW50LCBmb3IgZ2V0dGluZyB0aGUgc3RhY2sgdHJhY2ViYWNrXG4gICAgLy8gc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhbiBlcnJvci5cbiAgICAvLyBTZWUgaHR0cHM6Ly90YzM5LmVzL3Byb3Bvc2FsLWVycm9yLXN0YWNrcy9cbiAgICBnZXRTdGFja1N0cmluZyhlcnJvcikge1xuICAgICAgbGV0IHN0YWNrSW5mbz0gIHdlYWttYXBHZXQoc3RhY2tJbmZvcywgZXJyb3IpO1xuXG4gICAgICBpZiggc3RhY2tJbmZvPT09ICB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB3aWxsIGNhbGwgYHByZXBhcmVTdGFja1RyYWNlKClgIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gd2hpY2ggd2lsbCBwb3B1bGF0ZSBzdGFja0luZm9zXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXG4gICAgICAgIHZvaWQgZXJyb3Iuc3RhY2s7XG4gICAgICAgIHN0YWNrSW5mbz0gIHdlYWttYXBHZXQoc3RhY2tJbmZvcywgZXJyb3IpO1xuICAgICAgICBpZiggIXN0YWNrSW5mbykge1xuICAgICAgICAgIHN0YWNrSW5mbz0gIHsgc3RhY2tTdHJpbmc6ICcnfTtcbiAgICAgICAgICB3ZWFrbWFwU2V0KHN0YWNrSW5mb3MsIGVycm9yLCBzdGFja0luZm8pO1xuICAgICAgICAgfVxuICAgICAgIH1cblxuICAgICAgLy8gcHJlcGFyZVN0YWNrVHJhY2UoKSBtYXkgZ2VuZXJhdGUgdGhlIHN0YWNrU3RyaW5nXG4gICAgICAvLyBpZiBlcnJvclRhbWluZyA9PT0gJ3Vuc2FmZSdcblxuICAgICAgaWYoIHN0YWNrSW5mby5zdGFja1N0cmluZyE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdGFja0luZm8uc3RhY2tTdHJpbmc7XG4gICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFja1N0cmluZz0gIHN0YWNrU3RyaW5nRnJvbVNTVChlcnJvciwgc3RhY2tJbmZvLmNhbGxTaXRlcyk7XG4gICAgICB3ZWFrbWFwU2V0KHN0YWNrSW5mb3MsIGVycm9yLCB7IHN0YWNrU3RyaW5nfSk7XG5cbiAgICAgIHJldHVybiBzdGFja1N0cmluZztcbiAgICAgfSxcbiAgICBwcmVwYXJlU3RhY2tUcmFjZShlcnJvciwgc3N0KSB7XG4gICAgICBpZiggZXJyb3JUYW1pbmc9PT0gICd1bnNhZmUnKSB7XG4gICAgICAgIGNvbnN0IHN0YWNrU3RyaW5nPSAgc3RhY2tTdHJpbmdGcm9tU1NUKGVycm9yLCBzc3QpO1xuICAgICAgICB3ZWFrbWFwU2V0KHN0YWNrSW5mb3MsIGVycm9yLCB7IHN0YWNrU3RyaW5nfSk7XG4gICAgICAgIHJldHVybiAgYCR7ZXJyb3J9JHtzdGFja1N0cmluZ31gO1xuICAgICAgIH1lbHNlIHtcbiAgICAgICAgd2Vha21hcFNldChzdGFja0luZm9zLCBlcnJvciwgeyBjYWxsU2l0ZXM6IHNzdH0pO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgfVxuICAgICB9fTtcblxuXG4gIC8vIEEgcHJlcGFyZUZuIGlzIGEgcHJlcGFyZVN0YWNrVHJhY2UgZnVuY3Rpb24uXG4gIC8vIEFuIHNzdCBpcyBhIGBzdHJ1Y3R1cmVkU3RhY2tUcmFjZWAsIHdoaWNoIGlzIGFuIGFycmF5IG9mXG4gIC8vIGNhbGxzaXRlcy5cbiAgLy8gQSB1c2VyIHByZXBhcmVGbiBpcyBhIHByZXBhcmVGbiBkZWZpbmVkIGJ5IGEgY2xpZW50IG9mIHRoaXMgQVBJLFxuICAvLyBhbmQgcHJvdmlkZWQgYnkgYXNzaWduaW5nIHRvIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAuXG4gIC8vIEEgdXNlciBwcmVwYXJlRm4gc2hvdWxkIG9ubHkgcmVjZWl2ZSBhbiBhdHRlbnVhdGVkIHNzdCwgd2hpY2hcbiAgLy8gaXMgYW4gYXJyYXkgb2YgYXR0ZW51YXRlZCBjYWxsc2l0ZXMuXG4gIC8vIEEgc3lzdGVtIHByZXBhcmVGbiBpcyB0aGUgcHJlcGFyZUZuIGNyZWF0ZWQgYnkgdGhpcyBtb2R1bGUgdG9cbiAgLy8gYmUgaW5zdGFsbGVkIG9uIHRoZSByZWFsIGBFcnJvcmAgY29uc3RydWN0b3IsIHRvIHJlY2VpdmVcbiAgLy8gYW4gb3JpZ2luYWwgc3N0LCBpLmUuLCBhbiBhcnJheSBvZiB1bmF0dGVudWF0ZWQgY2FsbHNpdGVzLlxuICAvLyBBbiBpbnB1dCBwcmVwYXJlRm4gaXMgYSBmdW5jdGlvbiB0aGUgdXNlciBhc3NpZ25zIHRvXG4gIC8vIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWAsIHdoaWNoIG1pZ2h0IGJlIGEgdXNlciBwcmVwYXJlRm4gb3JcbiAgLy8gYSBzeXN0ZW0gcHJlcGFyZUZuIHByZXZpb3VzbHkgb2J0YWluZWQgYnkgcmVhZGluZ1xuICAvLyBgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2VgLlxuXG4gIGNvbnN0IGRlZmF1bHRQcmVwYXJlRm49ICB0YW1lZE1ldGhvZHMucHJlcGFyZVN0YWNrVHJhY2U7XG5cbiAgT3JpZ2luYWxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT0gIGRlZmF1bHRQcmVwYXJlRm47XG5cbiAgLy8gQSB3ZWFrc2V0IGJyYW5kaW5nIHNvbWUgZnVuY3Rpb25zIGFzIHN5c3RlbSBwcmVwYXJlRm5zLCBhbGwgb2Ygd2hpY2hcbiAgLy8gbXVzdCBiZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlLCBzaW5jZSB0aGV5IGNhbiByZWNlaXZlIGFuXG4gIC8vIHVuYXR0ZW51YXRlZCBzc3QuXG4gIGNvbnN0IHN5c3RlbVByZXBhcmVGblNldD0gIG5ldyBXZWFrU2V0KFtkZWZhdWx0UHJlcGFyZUZuXSk7XG5cbiAgY29uc3Qgc3lzdGVtUHJlcGFyZUZuRm9yPSAgKGlucHV0UHJlcGFyZUZuKT0+e1xuICAgIGlmKCB3ZWFrc2V0SGFzKHN5c3RlbVByZXBhcmVGblNldCwgaW5wdXRQcmVwYXJlRm4pKSB7XG4gICAgICByZXR1cm4gaW5wdXRQcmVwYXJlRm47XG4gICAgIH1cbiAgICAvLyBVc2UgY29uY2lzZSBtZXRob2RzIHRvIG9idGFpbiBuYW1lZCBmdW5jdGlvbnMgd2l0aG91dCBjb25zdHJ1Y3RvcnMuXG4gICAgY29uc3Qgc3lzdGVtTWV0aG9kcz0gIHtcbiAgICAgIHByZXBhcmVTdGFja1RyYWNlKGVycm9yLCBzc3QpIHtcbiAgICAgICAgd2Vha21hcFNldChzdGFja0luZm9zLCBlcnJvciwgeyBjYWxsU2l0ZXM6IHNzdH0pO1xuICAgICAgICByZXR1cm4gaW5wdXRQcmVwYXJlRm4oZXJyb3IsIHNhZmVWOFNTVChzc3QpKTtcbiAgICAgICB9fTtcblxuICAgIHdlYWtzZXRBZGQoc3lzdGVtUHJlcGFyZUZuU2V0LCBzeXN0ZW1NZXRob2RzLnByZXBhcmVTdGFja1RyYWNlKTtcbiAgICByZXR1cm4gc3lzdGVtTWV0aG9kcy5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgIH07XG5cbiAgLy8gTm90ZSBgc3RhY2tUcmFjZUxpbWl0YCBhY2Nlc3NvciBhbHJlYWR5IGRlZmluZWQgYnlcbiAgLy8gdGFtZS1lcnJvci1jb25zdHJ1Y3Rvci5qc1xuICBkZWZpbmVQcm9wZXJ0aWVzKEluaXRpYWxFcnJvciwge1xuICAgIGNhcHR1cmVTdGFja1RyYWNlOiB7XG4gICAgICB2YWx1ZTogdGFtZWRNZXRob2RzLmNhcHR1cmVTdGFja1RyYWNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX0sXG5cbiAgICBwcmVwYXJlU3RhY2tUcmFjZToge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gT3JpZ2luYWxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTtcbiAgICAgICB9LFxuICAgICAgc2V0KGlucHV0UHJlcGFyZVN0YWNrVHJhY2VGbikge1xuICAgICAgICBpZiggdHlwZW9mIGlucHV0UHJlcGFyZVN0YWNrVHJhY2VGbj09PSAgJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnN0IHN5c3RlbVByZXBhcmVGbj0gIHN5c3RlbVByZXBhcmVGbkZvcihpbnB1dFByZXBhcmVTdGFja1RyYWNlRm4pO1xuICAgICAgICAgIE9yaWdpbmFsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9ICBzeXN0ZW1QcmVwYXJlRm47XG4gICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgT3JpZ2luYWxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT0gIGRlZmF1bHRQcmVwYXJlRm47XG4gICAgICAgICB9XG4gICAgICAgfSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cblxuICByZXR1cm4gdGFtZWRNZXRob2RzLmdldFN0YWNrU3RyaW5nO1xuIH07JGjigI1fb25jZS50YW1lVjhFcnJvckNvbnN0cnVjdG9yKHRhbWVWOEVycm9yQ29uc3RydWN0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szMV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9FUlJPUixUeXBlRXJyb3IsYXBwbHksY29uc3RydWN0LGRlZmluZVByb3BlcnRpZXMsc2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGRlZmluZVByb3BlcnR5LE5hdGl2ZUVycm9ycyx0YW1lVjhFcnJvckNvbnN0cnVjdG9yOyRo4oCNX2ltcG9ydHMoW1tcIi4uL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX0VSUk9SXCIsIFskaOKAjV9hID0+IChGRVJBTF9FUlJPUiA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFwcGx5XCIsIFskaOKAjV9hID0+IChhcHBseSA9ICRo4oCNX2EpXV0sW1wiY29uc3RydWN0XCIsIFskaOKAjV9hID0+IChjb25zdHJ1Y3QgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcInNldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChzZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnR5XCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXSxbXCIuLi93aGl0ZWxpc3QuanNcIiwgW1tcIk5hdGl2ZUVycm9yc1wiLCBbJGjigI1fYSA9PiAoTmF0aXZlRXJyb3JzID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS12OC1lcnJvci1jb25zdHJ1Y3Rvci5qc1wiLCBbW1widGFtZVY4RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAodGFtZVY4RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy8gUHJlc2VudCBvbiBhdCBsZWFzdCBGRiBhbmQgWFMuIFByb3Bvc2VkIGJ5IEVycm9yLXByb3Bvc2FsLiBUaGUgb3JpZ2luYWxcbi8vIGlzIGRhbmdlcm91cywgc28gdGFtZUVycm9yQ29uc3RydWN0b3IgcmVwbGFjZXMgaXQgd2l0aCBhIHNhZmUgb25lLlxuLy8gV2UgZ3JhYiB0aGUgb3JpZ2luYWwgaGVyZSBiZWZvcmUgaXQgZ2V0cyByZXBsYWNlZC5cbmNvbnN0IHN0YWNrRGVzYz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihGRVJBTF9FUlJPUi5wcm90b3R5cGUsICdzdGFjaycpO1xuY29uc3Qgc3RhY2tHZXR0ZXI9ICBzdGFja0Rlc2MmJiAgc3RhY2tEZXNjLmdldDtcblxuLy8gVXNlIGNvbmNpc2UgbWV0aG9kcyB0byBvYnRhaW4gbmFtZWQgZnVuY3Rpb25zIHdpdGhvdXQgY29uc3RydWN0b3JzLlxuY29uc3QgdGFtZWRNZXRob2RzPSAge1xuICBnZXRTdGFja1N0cmluZyhlcnJvcikge1xuICAgIGlmKCB0eXBlb2Ygc3RhY2tHZXR0ZXI9PT0gICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhcHBseShzdGFja0dldHRlciwgZXJyb3IsIFtdKTtcbiAgICAgfWVsc2UgaWYoICdzdGFjaydpbiAgZXJyb3IpIHtcbiAgICAgIC8vIFRoZSBmYWxsYmFjayBpcyB0byBqdXN0IHVzZSB0aGUgZGUgZmFjdG8gYGVycm9yLnN0YWNrYCBpZiBwcmVzZW50XG4gICAgICByZXR1cm4gIGAke2Vycm9yLnN0YWNrfWA7XG4gICAgIH1cbiAgICByZXR1cm4gJyc7XG4gICB9fTtcblxuXG5mdW5jdGlvbiAgICAgICAgICAgICAgICB0YW1lRXJyb3JDb25zdHJ1Y3RvcihcbiAgZXJyb3JUYW1pbmc9ICAnc2FmZScsXG4gIHN0YWNrRmlsdGVyaW5nPSAgJ2NvbmNpc2UnKVxuICB7XG4gIGlmKCBlcnJvclRhbWluZyE9PSAgJ3NhZmUnJiYgIGVycm9yVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgZXJyb3JUYW1pbmcgJHtlcnJvclRhbWluZ31gKTtcbiAgIH1cbiAgaWYoIHN0YWNrRmlsdGVyaW5nIT09ICAnY29uY2lzZScmJiAgc3RhY2tGaWx0ZXJpbmchPT0gICd2ZXJib3NlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgc3RhY2tGaWx0ZXJpbmcgJHtzdGFja0ZpbHRlcmluZ31gKTtcbiAgIH1cbiAgY29uc3QgRXJyb3JQcm90b3R5cGU9ICBGRVJBTF9FUlJPUi5wcm90b3R5cGU7XG5cbiAgY29uc3QgcGxhdGZvcm09XG4gICAgdHlwZW9mIEZFUkFMX0VSUk9SLmNhcHR1cmVTdGFja1RyYWNlPT09ICAnZnVuY3Rpb24nPyAgJ3Y4JzogICd1bmtub3duJztcbiAgY29uc3QgeyBjYXB0dXJlU3RhY2tUcmFjZTogb3JpZ2luYWxDYXB0dXJlU3RhY2tUcmFjZX09ICAgRkVSQUxfRVJST1I7XG5cbiAgY29uc3QgbWFrZUVycm9yQ29uc3RydWN0b3I9ICAoXz0gIHt9KT0+ICB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGNvbnN0IFJlc3VsdEVycm9yPSAgZnVuY3Rpb24gRXJyb3IoLi4ucmVzdCkge1xuICAgICAgbGV0IGVycm9yO1xuICAgICAgaWYoIG5ldy50YXJnZXQ9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICBlcnJvcj0gIGFwcGx5KEZFUkFMX0VSUk9SLCB0aGlzLCByZXN0KTtcbiAgICAgICB9ZWxzZSB7XG4gICAgICAgIGVycm9yPSAgY29uc3RydWN0KEZFUkFMX0VSUk9SLCByZXN0LCBuZXcudGFyZ2V0KTtcbiAgICAgICB9XG4gICAgICBpZiggcGxhdGZvcm09PT0gICd2OCcpIHtcbiAgICAgICAgLy8gVE9ETyBMaWtlbHkgZXhwZW5zaXZlIVxuICAgICAgICBhcHBseShvcmlnaW5hbENhcHR1cmVTdGFja1RyYWNlLCBGRVJBTF9FUlJPUiwgW2Vycm9yLCBSZXN1bHRFcnJvcl0pO1xuICAgICAgIH1cbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgfTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFJlc3VsdEVycm9yLCB7XG4gICAgICBsZW5ndGg6IHsgdmFsdWU6IDF9LFxuICAgICAgcHJvdG90eXBlOiB7XG4gICAgICAgIHZhbHVlOiBFcnJvclByb3RvdHlwZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX19KTtcblxuXG4gICAgcmV0dXJuIFJlc3VsdEVycm9yO1xuICAgfTtcbiAgY29uc3QgSW5pdGlhbEVycm9yPSAgbWFrZUVycm9yQ29uc3RydWN0b3IoeyBwb3dlcnM6ICdvcmlnaW5hbCd9KTtcbiAgY29uc3QgU2hhcmVkRXJyb3I9ICBtYWtlRXJyb3JDb25zdHJ1Y3Rvcih7IHBvd2VyczogJ25vbmUnfSk7XG4gIGRlZmluZVByb3BlcnRpZXMoRXJyb3JQcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogU2hhcmVkRXJyb3J9fSk7XG5cblxuICBmb3IoIGNvbnN0IE5hdGl2ZUVycm9yIG9mIE5hdGl2ZUVycm9ycykge1xuICAgIHNldFByb3RvdHlwZU9mKE5hdGl2ZUVycm9yLCBTaGFyZWRFcnJvcik7XG4gICB9XG5cbiAgLy8gaHR0cHM6Ly92OC5kZXYvZG9jcy9zdGFjay10cmFjZS1hcGkjY29tcGF0aWJpbGl0eSBhZHZpc2VzIHRoYXRcbiAgLy8gcHJvZ3JhbW1lcnMgY2FuIFwiYWx3YXlzXCIgc2V0IGBFcnJvci5zdGFja1RyYWNlTGltaXRgXG4gIC8vIGV2ZW4gb24gbm9uLXY4IHBsYXRmb3Jtcy4gT24gbm9uLXY4XG4gIC8vIGl0IHdpbGwgaGF2ZSBubyBlZmZlY3QsIGJ1dCB0aGlzIGFkdmljZSBvbmx5IG1ha2VzIHNlbnNlXG4gIC8vIGlmIHRoZSBhc3NpZ25tZW50IGl0c2VsZiBkb2VzIG5vdCBmYWlsLCB3aGljaCBpdCB3b3VsZFxuICAvLyBpZiBgRXJyb3JgIHdlcmUgbmFpdmVseSBmcm96ZW4uIEhlbmNlLCB3ZSBhZGQgc2V0dGVycyB0aGF0XG4gIC8vIGFjY2VwdCBidXQgaWdub3JlIHRoZSBhc3NpZ25tZW50IG9uIG5vbi12OCBwbGF0Zm9ybXMuXG4gIGRlZmluZVByb3BlcnRpZXMoSW5pdGlhbEVycm9yLCB7XG4gICAgc3RhY2tUcmFjZUxpbWl0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIGlmKCB0eXBlb2YgRkVSQUxfRVJST1Iuc3RhY2tUcmFjZUxpbWl0PT09ICAnbnVtYmVyJykge1xuICAgICAgICAgIC8vIEZFUkFMX0VSUk9SLnN0YWNrVHJhY2VMaW1pdCBpcyBvbmx5IG9uIHY4XG4gICAgICAgICAgcmV0dXJuIEZFUkFMX0VSUk9SLnN0YWNrVHJhY2VMaW1pdDtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICB9LFxuICAgICAgc2V0KG5ld0xpbWl0KSB7XG4gICAgICAgIGlmKCB0eXBlb2YgbmV3TGltaXQhPT0gICdudW1iZXInKSB7XG4gICAgICAgICAgLy8gc2lsZW50bHkgZG8gbm90aGluZy4gVGhpcyBiZWhhdmlvciBkb2Vzbid0IHByZWNpc2VseVxuICAgICAgICAgIC8vIGVtdWxhdGUgdjggZWRnZS1jYXNlIGJlaGF2aW9yLiBCdXQgZ2l2ZW4gdGhlIHB1cnBvc2VcbiAgICAgICAgICAvLyBvZiB0aGlzIGVtdWxhdGlvbiwgaGF2aW5nIGVkZ2UgY2FzZXMgZXJyIHRvd2FyZHNcbiAgICAgICAgICAvLyBoYXJtbGVzcyBzZWVtcyB0aGUgc2FmZXIgb3B0aW9uLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHR5cGVvZiBGRVJBTF9FUlJPUi5zdGFja1RyYWNlTGltaXQ9PT0gICdudW1iZXInKSB7XG4gICAgICAgICAgLy8gRkVSQUxfRVJST1Iuc3RhY2tUcmFjZUxpbWl0IGlzIG9ubHkgb24gdjhcbiAgICAgICAgICBGRVJBTF9FUlJPUi5zdGFja1RyYWNlTGltaXQ9ICBuZXdMaW1pdDtcbiAgICAgICAgICAvLyBXZSBwbGFjZSB0aGUgdXNlbGVzcyByZXR1cm4gb24gdGhlIG5leHQgbGluZSB0byBlbnN1cmVcbiAgICAgICAgICAvLyB0aGF0IGFueXRoaW5nIHdlIHBsYWNlIGFmdGVyIHRoZSBpZiBpbiB0aGUgZnV0dXJlIG9ubHlcbiAgICAgICAgICAvLyBoYXBwZW5zIGlmIHRoZSB0aGVuLWNhc2UgZG9lcyBub3QuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtcmV0dXJuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuICAgICAgIH0sXG4gICAgICAvLyBXVEYgb24gdjggc3RhY2tUcmFjZUxpbWl0IGlzIGVudW1lcmFibGVcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cblxuICAvLyBUaGUgZGVmYXVsdCBTaGFyZWRFcnJvciBtdWNoIGJlIGNvbXBsZXRlbHkgcG93ZXJsZXNzIGV2ZW4gb24gdjgsXG4gIC8vIHNvIHRoZSBsZW5pZW50IGBzdGFja1RyYWNlTGltaXRgIGFjY2Vzc29yIGRvZXMgbm90aGluZyBvbiBhbGxcbiAgLy8gcGxhdGZvcm1zLlxuICBkZWZpbmVQcm9wZXJ0aWVzKFNoYXJlZEVycm9yLCB7XG4gICAgc3RhY2tUcmFjZUxpbWl0OiB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgfSxcbiAgICAgIHNldChfbmV3TGltaXQpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgIH0sXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG5cbiAgaWYoIHBsYXRmb3JtPT09ICAndjgnKSB7XG4gICAgLy8gYFNoYXJlZEVycm9yLnByZXBhcmVTdGFja1RyYWNlYCwgaWYgaXQgZXhpc3RzLCBtdXN0IGFsc28gYmVcbiAgICAvLyBwb3dlcmxlc3MuIEhvd2V2ZXIsIGZyb20gd2hhdCB3ZSd2ZSBoZWFyZCwgZGVwZCBleHBlY3RzIHRvIGJlIGFibGUgdG9cbiAgICAvLyBhc3NpZ24gdG8gaXQgd2l0aG91dCB0aGUgYXNzaWdubWVudCB0aHJvd2luZy4gSXQgaXMgbm9ybWFsbHkgYSBmdW5jdGlvblxuICAgIC8vIHRoYXQgcmV0dXJucyBhIHN0YWNrIHN0cmluZyB0byBiZSBtYWdpY2FsbHkgYWRkZWQgdG8gZXJyb3Igb2JqZWN0cy5cbiAgICAvLyBIb3dldmVyLCBhcyBsb25nIGFzIHdlJ3JlIGFkZGluZyBhIGxlbmllbnQgc3RhbmRpbiwgd2UgbWF5IGFzIHdlbGxcbiAgICAvLyBhY2NvbW1vZGF0ZSBhbnkgd2hvIGV4cGVjdCB0byBnZXQgYSBmdW5jdGlvbiB0aGV5IGNhbiBjYWxsIGFuZCBnZXRcbiAgICAvLyBhIHN0cmluZyBiYWNrLiBUaGlzIHByZXBhcmVTdGFja1RyYWNlIGlzIGEgZG8tbm90aGluZyBmdW5jdGlvbiB0aGF0XG4gICAgLy8gYWx3YXlzIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFNoYXJlZEVycm9yLCB7XG4gICAgICBwcmVwYXJlU3RhY2tUcmFjZToge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuICgpPT4gICcnO1xuICAgICAgICAgfSxcbiAgICAgICAgc2V0KF9wcmVwYXJlRm4pIHtcbiAgICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSxcblxuICAgICAgY2FwdHVyZVN0YWNrVHJhY2U6IHtcbiAgICAgICAgdmFsdWU6IChlcnJvcmlzaCwgX2NvbnN0cnVjdG9yT3B0KT0+ICB7XG4gICAgICAgICAgZGVmaW5lUHJvcGVydHkoZXJyb3Jpc2gsICdzdGFjaycsIHtcbiAgICAgICAgICAgIHZhbHVlOiAnJ30pO1xuXG4gICAgICAgICB9LFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuICAgfVxuXG4gIGxldCBpbml0aWFsR2V0U3RhY2tTdHJpbmc9ICB0YW1lZE1ldGhvZHMuZ2V0U3RhY2tTdHJpbmc7XG4gIGlmKCBwbGF0Zm9ybT09PSAgJ3Y4Jykge1xuICAgIGluaXRpYWxHZXRTdGFja1N0cmluZz0gIHRhbWVWOEVycm9yQ29uc3RydWN0b3IoXG4gICAgICBGRVJBTF9FUlJPUixcbiAgICAgIEluaXRpYWxFcnJvcixcbiAgICAgIGVycm9yVGFtaW5nLFxuICAgICAgc3RhY2tGaWx0ZXJpbmcpO1xuXG4gICB9ZWxzZSBpZiggZXJyb3JUYW1pbmc9PT0gICd1bnNhZmUnKSB7XG4gICAgLy8gdjggaGFzIHRvbyBtdWNoIG1hZ2ljIGFyb3VuZCB0aGVpciAnc3RhY2snIG93biBwcm9wZXJ0eSBmb3IgaXQgdG9cbiAgICAvLyBjb2V4aXN0IGNsZWFubHkgd2l0aCB0aGlzIGFjY2Vzc29yLiBTbyBvbmx5IGluc3RhbGwgaXQgb24gbm9uLXY4XG5cbiAgICAvLyBFcnJvci5wcm90b3R5cGUuc3RhY2sgcHJvcGVydHkgYXMgcHJvcG9zZWQgYXRcbiAgICAvLyBodHRwczovL3RjMzkuZXMvcHJvcG9zYWwtZXJyb3Itc3RhY2tzL1xuICAgIC8vIHdpdGggdGhlIGZpeCBwcm9wb3NlZCBhdFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWVycm9yLXN0YWNrcy9pc3N1ZXMvNDZcbiAgICAvLyBPbiBvdGhlcnMsIHRoaXMgc3RpbGwgcHJvdGVjdHMgZnJvbSB0aGUgb3ZlcnJpZGUgbWlzdGFrZSxcbiAgICAvLyBlc3NlbnRpYWxseSBsaWtlIGVuYWJsZS1wcm9wZXJ0eS1vdmVycmlkZXMuanMgd291bGRcbiAgICAvLyBvbmNlIHRoaXMgYWNjZXNzb3IgcHJvcGVydHkgaXRzZWxmIGlzIGZyb3plbiwgYXMgd2lsbCBoYXBwZW5cbiAgICAvLyBsYXRlciBkdXJpbmcgbG9ja2Rvd24uXG4gICAgLy9cbiAgICAvLyBIb3dldmVyLCB0aGVyZSBpcyBoZXJlIGEgY2hhbmdlIGZyb20gdGhlIGludGVudCBpbiB0aGUgY3VycmVudFxuICAgIC8vIHN0YXRlIG9mIHRoZSBwcm9wb3NhbC4gSWYgZXhwZXJpZW5jZSB0ZWxscyB1cyB3aGV0aGVyIHRoaXMgY2hhbmdlXG4gICAgLy8gaXMgYSBnb29kIGlkZWEsIHdlIHNob3VsZCBtb2RpZnkgdGhlIHByb3Bvc2FsIGFjY29yZGluZ2x5LiBUaGVyZSBpc1xuICAgIC8vIG11Y2ggY29kZSBpbiB0aGUgd29ybGQgdGhhdCBhc3N1bWVzIGBlcnJvci5zdGFja2AgaXMgYSBzdHJpbmcuIFNvXG4gICAgLy8gd2hlcmUgdGhlIHByb3Bvc2FsIGFjY29tbW9kYXRlcyBzZWN1cmUgb3BlcmF0aW9uIGJ5IG1ha2luZyB0aGVcbiAgICAvLyBwcm9wZXJ0eSBvcHRpb25hbCwgd2UgaW5zdGVhZCBhY2NvbW1vZGF0ZSBzZWN1cmUgb3BlcmF0aW9uIGJ5XG4gICAgLy8gaGF2aW5nIHRoZSBzZWN1cmUgZm9ybSBhbHdheXMgcmV0dXJuIG9ubHkgdGhlIHN0YWJsZSBwYXJ0LCB0aGVcbiAgICAvLyBzdHJpbmdpZmllZCBlcnJvciBpbnN0YW5jZSwgYW5kIG9taXR0aW5nIGFsbCB0aGUgZnJhbWUgaW5mb3JtYXRpb25cbiAgICAvLyByYXRoZXIgdGhhbiBvbWl0dGluZyB0aGUgcHJvcGVydHkuXG4gICAgZGVmaW5lUHJvcGVydGllcyhFcnJvclByb3RvdHlwZSwge1xuICAgICAgc3RhY2s6IHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsR2V0U3RhY2tTdHJpbmcodGhpcyk7XG4gICAgICAgICB9LFxuICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG4gICAgICAgICB9fX0pO1xuXG5cbiAgIH1lbHNlIHtcbiAgICAvLyB2OCBoYXMgdG9vIG11Y2ggbWFnaWMgYXJvdW5kIHRoZWlyICdzdGFjaycgb3duIHByb3BlcnR5IGZvciBpdCB0b1xuICAgIC8vIGNvZXhpc3QgY2xlYW5seSB3aXRoIHRoaXMgYWNjZXNzb3IuIFNvIG9ubHkgaW5zdGFsbCBpdCBvbiBub24tdjhcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEVycm9yUHJvdG90eXBlLCB7XG4gICAgICBzdGFjazoge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtZXJyb3Itc3RhY2tzL2lzc3Vlcy80NlxuICAgICAgICAgIC8vIGFsbG93cyB0aGlzIHRvIG5vdCBhZGQgYW4gdW5wbGVhc2FudCBuZXdsaW5lLiBPdGhlcndpc2VcbiAgICAgICAgICAvLyB3ZSBzaG91bGQgZml4IHRoaXMuXG4gICAgICAgICAgcmV0dXJuICBgJHt0aGlzfWA7XG4gICAgICAgICB9LFxuICAgICAgICBzZXQobmV3VmFsdWUpIHtcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHRoaXMsIHtcbiAgICAgICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG4gICAgICAgICB9fX0pO1xuXG5cbiAgIH1cblxuICByZXR1cm4ge1xuICAgICclSW5pdGlhbEdldFN0YWNrU3RyaW5nJSc6IGluaXRpYWxHZXRTdGFja1N0cmluZyxcbiAgICAnJUluaXRpYWxFcnJvciUnOiBJbml0aWFsRXJyb3IsXG4gICAgJyVTaGFyZWRFcnJvciUnOiBTaGFyZWRFcnJvcn07XG5cbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgdGFtZUVycm9yQ29uc3RydWN0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szMl0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9GVU5DVElPTixGbG9hdDMyQXJyYXksTWFwLFNldCxTdHJpbmcsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGdldFByb3RvdHlwZU9mLGl0ZXJhdGVBcnJheSxpdGVyYXRlTWFwLGl0ZXJhdGVTZXQsaXRlcmF0ZVN0cmluZyxtYXRjaEFsbFJlZ0V4cCxtYXRjaEFsbFN5bWJvbCxyZWdleHBQcm90b3R5cGUsSW5lcnRDb21wYXJ0bWVudDskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX0ZVTkNUSU9OXCIsIFskaOKAjV9hID0+IChGRVJBTF9GVU5DVElPTiA9ICRo4oCNX2EpXV0sW1wiRmxvYXQzMkFycmF5XCIsIFskaOKAjV9hID0+IChGbG9hdDMyQXJyYXkgPSAkaOKAjV9hKV1dLFtcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJTZXRcIiwgWyRo4oCNX2EgPT4gKFNldCA9ICRo4oCNX2EpXV0sW1wiU3RyaW5nXCIsIFskaOKAjV9hID0+IChTdHJpbmcgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJnZXRQcm90b3R5cGVPZlwiLCBbJGjigI1fYSA9PiAoZ2V0UHJvdG90eXBlT2YgPSAkaOKAjV9hKV1dLFtcIml0ZXJhdGVBcnJheVwiLCBbJGjigI1fYSA9PiAoaXRlcmF0ZUFycmF5ID0gJGjigI1fYSldXSxbXCJpdGVyYXRlTWFwXCIsIFskaOKAjV9hID0+IChpdGVyYXRlTWFwID0gJGjigI1fYSldXSxbXCJpdGVyYXRlU2V0XCIsIFskaOKAjV9hID0+IChpdGVyYXRlU2V0ID0gJGjigI1fYSldXSxbXCJpdGVyYXRlU3RyaW5nXCIsIFskaOKAjV9hID0+IChpdGVyYXRlU3RyaW5nID0gJGjigI1fYSldXSxbXCJtYXRjaEFsbFJlZ0V4cFwiLCBbJGjigI1fYSA9PiAobWF0Y2hBbGxSZWdFeHAgPSAkaOKAjV9hKV1dLFtcIm1hdGNoQWxsU3ltYm9sXCIsIFskaOKAjV9hID0+IChtYXRjaEFsbFN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicmVnZXhwUHJvdG90eXBlXCIsIFskaOKAjV9hID0+IChyZWdleHBQcm90b3R5cGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1zaGltLmpzXCIsIFtbXCJJbmVydENvbXBhcnRtZW50XCIsIFskaOKAjV9hID0+IChJbmVydENvbXBhcnRtZW50ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBPYmplY3QuZ2V0Q29uc3RydWN0b3JPZigpXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gaW1wcm92ZSByZWFkYWJpbGl0eSwgc2ltaWxhciB0byBPYmplY3QuZ2V0UHJvdG90eXBlT2YoKS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cbmZ1bmN0aW9uIGdldENvbnN0cnVjdG9yT2Yob2JqKSB7XG4gIHJldHVybiBnZXRQcm90b3R5cGVPZihvYmopLmNvbnN0cnVjdG9yO1xuIH1cblxuLy8gZ2V0QW5vbnltb3VzSW50cmluc2ljcyB1c2VzIGEgdXRpbGl0eSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gYXJndW1lbnRzXG4vLyBvYmplY3QsIHNpbmNlIGl0IGNhbm5vdCBoYXZlIG9uZSBvZiBpdHMgb3duIGFuZCBhbHNvIGJlIGEgY29uc3QgZXhwb3J0LlxuZnVuY3Rpb24gbWFrZUFyZ3VtZW50cygpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICByZXR1cm4gYXJndW1lbnRzO1xuIH1cblxuLyoqXG4gKiBnZXRBbm9ueW1vdXNJbnRyaW5zaWNzKClcbiAqIEdldCB0aGUgaW50cmluc2ljcyBub3Qgb3RoZXJ3aXNlIHJlYWNoYWJsZSBieSBuYW1lZCBvd24gcHJvcGVydHlcbiAqIHRyYXZlcnNhbCBmcm9tIHRoZSBnbG9iYWwgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRBbm9ueW1vdXNJbnRyaW5zaWNzPSAgKCk9PiAge1xuICBjb25zdCBJbmVydEZ1bmN0aW9uPSAgRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlLmNvbnN0cnVjdG9yO1xuXG4gIC8vIDkuMi40LjEgJVRocm93VHlwZUVycm9yJVxuXG4gIGNvbnN0IFRocm93VHlwZUVycm9yPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1ha2VBcmd1bWVudHMoKSwgJ2NhbGxlZScpLlxuICAgICBnZXQ7XG5cbiAgLy8gMjEuMS41LjIgVGhlICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy13cmFwcGVyc1xuICBjb25zdCBTdHJpbmdJdGVyYXRvck9iamVjdD0gIGl0ZXJhdGVTdHJpbmcobmV3IFN0cmluZygpKTtcbiAgY29uc3QgU3RyaW5nSXRlcmF0b3JQcm90b3R5cGU9ICBnZXRQcm90b3R5cGVPZihTdHJpbmdJdGVyYXRvck9iamVjdCk7XG5cbiAgLy8gMjEuMi43LjEgVGhlICVSZWdFeHBTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG4gIGNvbnN0IFJlZ0V4cFN0cmluZ0l0ZXJhdG9yPVxuICAgIHJlZ2V4cFByb3RvdHlwZVttYXRjaEFsbFN5bWJvbF0mJiAgbWF0Y2hBbGxSZWdFeHAoLy4vKTtcbiAgY29uc3QgUmVnRXhwU3RyaW5nSXRlcmF0b3JQcm90b3R5cGU9XG4gICAgUmVnRXhwU3RyaW5nSXRlcmF0b3ImJiAgZ2V0UHJvdG90eXBlT2YoUmVnRXhwU3RyaW5nSXRlcmF0b3IpO1xuXG4gIC8vIDIyLjEuNS4yIFRoZSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUgT2JqZWN0XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFycmF5LWNvbnN0cnVjdG9yXG4gIGNvbnN0IEFycmF5SXRlcmF0b3JPYmplY3Q9ICBpdGVyYXRlQXJyYXkoW10pO1xuICBjb25zdCBBcnJheUl0ZXJhdG9yUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoQXJyYXlJdGVyYXRvck9iamVjdCk7XG5cbiAgLy8gMjIuMi4xIFRoZSAlVHlwZWRBcnJheSUgSW50cmluc2ljIE9iamVjdFxuXG4gIGNvbnN0IFR5cGVkQXJyYXk9ICBnZXRQcm90b3R5cGVPZihGbG9hdDMyQXJyYXkpO1xuXG4gIC8vIDIzLjEuNS4yIFRoZSAlTWFwSXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuXG4gIGNvbnN0IE1hcEl0ZXJhdG9yT2JqZWN0PSAgaXRlcmF0ZU1hcChuZXcgTWFwKCkpO1xuICBjb25zdCBNYXBJdGVyYXRvclByb3RvdHlwZT0gIGdldFByb3RvdHlwZU9mKE1hcEl0ZXJhdG9yT2JqZWN0KTtcblxuICAvLyAyMy4yLjUuMiBUaGUgJVNldEl0ZXJhdG9yUHJvdG90eXBlJSBPYmplY3RcblxuICBjb25zdCBTZXRJdGVyYXRvck9iamVjdD0gIGl0ZXJhdGVTZXQobmV3IFNldCgpKTtcbiAgY29uc3QgU2V0SXRlcmF0b3JQcm90b3R5cGU9ICBnZXRQcm90b3R5cGVPZihTZXRJdGVyYXRvck9iamVjdCk7XG5cbiAgLy8gMjUuMS4yIFRoZSAlSXRlcmF0b3JQcm90b3R5cGUlIE9iamVjdFxuXG4gIGNvbnN0IEl0ZXJhdG9yUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoQXJyYXlJdGVyYXRvclByb3RvdHlwZSk7XG5cbiAgLy8gMjUuMi4xIFRoZSBHZW5lcmF0b3JGdW5jdGlvbiBDb25zdHJ1Y3RvclxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eS1mdW5jdGlvblxuICBmdW5jdGlvbiogR2VuZXJhdG9yRnVuY3Rpb25JbnN0YW5jZSgpIHsgfVxuICBjb25zdCBHZW5lcmF0b3JGdW5jdGlvbj0gIGdldENvbnN0cnVjdG9yT2YoR2VuZXJhdG9yRnVuY3Rpb25JbnN0YW5jZSk7XG5cbiAgLy8gMjUuMi4zIFByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYXRvckZ1bmN0aW9uIFByb3RvdHlwZSBPYmplY3RcblxuICBjb25zdCBHZW5lcmF0b3I9ICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGU7XG5cbiAgLy8gMjUuMy4xIFRoZSBBc3luY0dlbmVyYXRvckZ1bmN0aW9uIENvbnN0cnVjdG9yXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5LWZ1bmN0aW9uXG4gIGFzeW5jIGZ1bmN0aW9uKiBBc3luY0dlbmVyYXRvckZ1bmN0aW9uSW5zdGFuY2UoKSB7IH1cbiAgY29uc3QgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbj0gIGdldENvbnN0cnVjdG9yT2YoXG4gICAgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbkluc3RhbmNlKTtcblxuXG4gIC8vIDI1LjMuMi4yIEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlXG4gIGNvbnN0IEFzeW5jR2VuZXJhdG9yPSAgQXN5bmNHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGU7XG4gIC8vIDI1LjUuMSBQcm9wZXJ0aWVzIG9mIHRoZSBBc3luY0dlbmVyYXRvciBQcm90b3R5cGUgT2JqZWN0XG4gIGNvbnN0IEFzeW5jR2VuZXJhdG9yUHJvdG90eXBlPSAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlO1xuICBjb25zdCBBc3luY0l0ZXJhdG9yUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUpO1xuXG4gIC8vIDI1LjcuMSBUaGUgQXN5bmNGdW5jdGlvbiBDb25zdHJ1Y3RvclxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eS1mdW5jdGlvblxuICBhc3luYyBmdW5jdGlvbiBBc3luY0Z1bmN0aW9uSW5zdGFuY2UoKSB7IH1cbiAgY29uc3QgQXN5bmNGdW5jdGlvbj0gIGdldENvbnN0cnVjdG9yT2YoQXN5bmNGdW5jdGlvbkluc3RhbmNlKTtcblxuICBjb25zdCBpbnRyaW5zaWNzPSAge1xuICAgICclSW5lcnRGdW5jdGlvbiUnOiBJbmVydEZ1bmN0aW9uLFxuICAgICclQXJyYXlJdGVyYXRvclByb3RvdHlwZSUnOiBBcnJheUl0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclSW5lcnRBc3luY0Z1bmN0aW9uJSc6IEFzeW5jRnVuY3Rpb24sXG4gICAgJyVBc3luY0dlbmVyYXRvciUnOiBBc3luY0dlbmVyYXRvcixcbiAgICAnJUluZXJ0QXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUnOiBBc3luY0dlbmVyYXRvckZ1bmN0aW9uLFxuICAgICclQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlJzogQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUsXG4gICAgJyVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSc6IEFzeW5jSXRlcmF0b3JQcm90b3R5cGUsXG4gICAgJyVHZW5lcmF0b3IlJzogR2VuZXJhdG9yLFxuICAgICclSW5lcnRHZW5lcmF0b3JGdW5jdGlvbiUnOiBHZW5lcmF0b3JGdW5jdGlvbixcbiAgICAnJUl0ZXJhdG9yUHJvdG90eXBlJSc6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclTWFwSXRlcmF0b3JQcm90b3R5cGUlJzogTWFwSXRlcmF0b3JQcm90b3R5cGUsXG4gICAgJyVSZWdFeHBTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUnOiBSZWdFeHBTdHJpbmdJdGVyYXRvclByb3RvdHlwZSxcbiAgICAnJVNldEl0ZXJhdG9yUHJvdG90eXBlJSc6IFNldEl0ZXJhdG9yUHJvdG90eXBlLFxuICAgICclU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlJzogU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUsXG4gICAgJyVUaHJvd1R5cGVFcnJvciUnOiBUaHJvd1R5cGVFcnJvcixcbiAgICAnJVR5cGVkQXJyYXklJzogVHlwZWRBcnJheSxcbiAgICAnJUluZXJ0Q29tcGFydG1lbnQlJzogSW5lcnRDb21wYXJ0bWVudH07XG5cblxuICByZXR1cm4gaW50cmluc2ljcztcbiB9OyRo4oCNX29uY2UuZ2V0QW5vbnltb3VzSW50cmluc2ljcyhnZXRBbm9ueW1vdXNJbnRyaW5zaWNzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzNdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgU2V0LFN0cmluZyxUeXBlRXJyb3IsV2Vha01hcCxXZWFrU2V0LGFwcGx5LGFycmF5Rm9yRWFjaCxkZWZpbmVQcm9wZXJ0eSxmcmVlemUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsZ2V0UHJvdG90eXBlT2YsaXNJbnRlZ2VyLGlzT2JqZWN0LG9iamVjdEhhc093blByb3BlcnR5LG93bktleXMscHJldmVudEV4dGVuc2lvbnMsc2V0QWRkLHNldEZvckVhY2gsc2V0SGFzLHRvU3RyaW5nVGFnU3ltYm9sLHR5cGVkQXJyYXlQcm90b3R5cGUsd2Vha21hcEdldCx3ZWFrbWFwU2V0LHdlYWtzZXRBZGQsd2Vha3NldEhhcyxhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJTZXRcIiwgWyRo4oCNX2EgPT4gKFNldCA9ICRo4oCNX2EpXV0sW1wiU3RyaW5nXCIsIFskaOKAjV9hID0+IChTdHJpbmcgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJXZWFrTWFwXCIsIFskaOKAjV9hID0+IChXZWFrTWFwID0gJGjigI1fYSldXSxbXCJXZWFrU2V0XCIsIFskaOKAjV9hID0+IChXZWFrU2V0ID0gJGjigI1fYSldXSxbXCJhcHBseVwiLCBbJGjigI1fYSA9PiAoYXBwbHkgPSAkaOKAjV9hKV1dLFtcImFycmF5Rm9yRWFjaFwiLCBbJGjigI1fYSA9PiAoYXJyYXlGb3JFYWNoID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc1wiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA9ICRo4oCNX2EpXV0sW1wiZ2V0UHJvdG90eXBlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldFByb3RvdHlwZU9mID0gJGjigI1fYSldXSxbXCJpc0ludGVnZXJcIiwgWyRo4oCNX2EgPT4gKGlzSW50ZWdlciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcIm93bktleXNcIiwgWyRo4oCNX2EgPT4gKG93bktleXMgPSAkaOKAjV9hKV1dLFtcInByZXZlbnRFeHRlbnNpb25zXCIsIFskaOKAjV9hID0+IChwcmV2ZW50RXh0ZW5zaW9ucyA9ICRo4oCNX2EpXV0sW1wic2V0QWRkXCIsIFskaOKAjV9hID0+IChzZXRBZGQgPSAkaOKAjV9hKV1dLFtcInNldEZvckVhY2hcIiwgWyRo4oCNX2EgPT4gKHNldEZvckVhY2ggPSAkaOKAjV9hKV1dLFtcInNldEhhc1wiLCBbJGjigI1fYSA9PiAoc2V0SGFzID0gJGjigI1fYSldXSxbXCJ0b1N0cmluZ1RhZ1N5bWJvbFwiLCBbJGjigI1fYSA9PiAodG9TdHJpbmdUYWdTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInR5cGVkQXJyYXlQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKHR5cGVkQXJyYXlQcm90b3R5cGUgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBHZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBHZXQgPSAkaOKAjV9hKV1dLFtcIndlYWttYXBTZXRcIiwgWyRo4oCNX2EgPT4gKHdlYWttYXBTZXQgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRBZGRcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRBZGQgPSAkaOKAjV9hKV1dLFtcIndlYWtzZXRIYXNcIiwgWyRo4oCNX2EgPT4gKHdlYWtzZXRIYXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydCgnLi4vaW5kZXguanMnKS5IYXJkZW59IEhhcmRlblxuICovXG5cbi8vIE9idGFpbiB0aGUgc3RyaW5nIHRhZyBhY2Nlc3NvciBvZiBvZiBUeXBlZEFycmF5IHNvIHdlIGNhbiBpbmRpcmVjdGx5IHVzZSB0aGVcbi8vIFR5cGVkQXJyYXkgYnJhbmQgY2hlY2sgaXQgZW1wbG95cy5cbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgdHlwZWRBcnJheVByb3RvdHlwZSxcbiAgdG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz0gIHR5cGVkQXJyYXlUb1N0cmluZ1RhZy5nZXQ7XG5hc3NlcnQoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnKTtcblxuLy8gRXhwb3J0ZWQgZm9yIHRlc3RzLlxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL21hcnNoYWwvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9ICAob2JqZWN0KT0+e1xuICAvLyBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgY29uc3QgdGFnPSAgYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyE9PSAgdW5kZWZpbmVkO1xuIH07XG5cbi8qKlxuICogVGVzdHMgaWYgYSBwcm9wZXJ0eSBrZXkgaXMgYW4gaW50ZWdlci12YWx1ZWQgY2Fub25pY2FsIG51bWVyaWMgaW5kZXguXG4gKiBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWNhbm9uaWNhbG51bWVyaWNpbmRleHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wZXJ0eUtleVxuICovJGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmNvbnN0IGlzQ2Fub25pY2FsSW50ZWdlckluZGV4U3RyaW5nPSAgKHByb3BlcnR5S2V5KT0+e1xuICBjb25zdCBuPSAgK1N0cmluZyhwcm9wZXJ0eUtleSk7XG4gIHJldHVybiBpc0ludGVnZXIobikmJiAgU3RyaW5nKG4pPT09ICBwcm9wZXJ0eUtleTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyYXlcbiAqL1xuY29uc3QgZnJlZXplVHlwZWRBcnJheT0gIChhcnJheSk9PntcbiAgcHJldmVudEV4dGVuc2lvbnMoYXJyYXkpO1xuXG4gIC8vIERvd25ncmFkZSB3cml0YWJsZSBleHBhbmRvcyB0byByZWFkb25seSwgZXZlbiBpZiBub24tY29uZmlndXJhYmxlLlxuICAvLyBXZSBnZXQgZWFjaCBkZXNjcmlwdG9yIGluZGl2aWR1YWxseSByYXRoZXIgdGhhbiB1c2luZ1xuICAvLyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIGluIG9yZGVyIHRvIGZhaWwgc2FmZSB3aGVuIGVuY291bnRlcmluZ1xuICAvLyBhbiBvYnNjdXJlIEdyYWFsSlMgaXNzdWUgd2hlcmUgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIHJldHVybnNcbiAgLy8gdW5kZWZpbmVkIGZvciBhIHByb3BlcnR5IHRoYXQgZG9lcyBleGlzdC5cbiAgYXJyYXlGb3JFYWNoKG93bktleXMoYXJyYXkpLCAoLyoqIEB0eXBlIHtzdHJpbmcgfCBzeW1ib2x9ICovIG5hbWUpPT4gIHtcbiAgICBjb25zdCBkZXNjPSAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFycmF5LCBuYW1lKTtcbiAgICBhc3NlcnQoZGVzYyk7XG4gICAgLy8gVHlwZWRBcnJheXMgYXJlIGludGVnZXItaW5kZXhlZCBleG90aWMgb2JqZWN0cywgd2hpY2ggZGVmaW5lIHNwZWNpYWxcbiAgICAvLyB0cmVhdG1lbnQgZm9yIHByb3BlcnR5IG5hbWVzIGluIGNhbm9uaWNhbCBudW1lcmljIGZvcm06XG4gICAgLy8gaW50ZWdlcnMgaW4gcmFuZ2UgYXJlIHBlcm1hbmVudGx5IHdyaXRhYmxlIGFuZCBub24tY29uZmlndXJhYmxlLlxuICAgIC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaW50ZWdlci1pbmRleGVkLWV4b3RpYy1vYmplY3RzXG4gICAgLy9cbiAgICAvLyBUaGlzIGlzIGFuYWxvZ291cyB0byB0aGUgZGF0YSBvZiBhIGhhcmRlbmVkIE1hcCBvciBTZXQsXG4gICAgLy8gc28gd2UgY2FydmUgb3V0IHRoaXMgZXhjZXB0aW9uYWwgYmVoYXZpb3IgYnV0IG1ha2UgYWxsIG90aGVyXG4gICAgLy8gcHJvcGVydGllcyBub24tY29uZmlndXJhYmxlLlxuICAgIGlmKCAhaXNDYW5vbmljYWxJbnRlZ2VySW5kZXhTdHJpbmcobmFtZSkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5KGFycmF5LCBuYW1lLCB7XG4gICAgICAgIC4uLmRlc2MsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZX0pO1xuXG4gICAgIH1cbiAgIH0pO1xuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgYGhhcmRlbmAgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0hhcmRlbn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIYXJkZW5lcj0gICgpPT4gIHtcbiAgY29uc3QgaGFyZGVuZWQ9ICBuZXcgV2Vha1NldCgpO1xuXG4gIGNvbnN0IHsgaGFyZGVufT0gICB7XG4gICAgLyoqXG4gICAgICogQHRlbXBsYXRlIFRcbiAgICAgKiBAcGFyYW0ge1R9IHJvb3RcbiAgICAgKiBAcmV0dXJucyB7VH1cbiAgICAgKi9cbiAgICBoYXJkZW4ocm9vdCkge1xuICAgICAgY29uc3QgdG9GcmVlemU9ICBuZXcgU2V0KCk7XG4gICAgICBjb25zdCBwYXRocz0gIG5ldyBXZWFrTWFwKCk7XG5cbiAgICAgIC8vIElmIHZhbCBpcyBzb21ldGhpbmcgd2Ugc2hvdWxkIGJlIGZyZWV6aW5nIGJ1dCBhcmVuJ3QgeWV0LFxuICAgICAgLy8gYWRkIGl0IHRvIHRvRnJlZXplLlxuICAgICAgLyoqXG4gICAgICAgKiBAcGFyYW0ge2FueX0gdmFsXG4gICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAgICAgKi9cbiAgICAgIGZ1bmN0aW9uIGVucXVldWUodmFsLCBwYXRoPSAgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmKCAhaXNPYmplY3QodmFsKSkge1xuICAgICAgICAgIC8vIGlnbm9yZSBwcmltaXRpdmVzXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlPSAgdHlwZW9mIHZhbDtcbiAgICAgICAgaWYoIHR5cGUhPT0gICdvYmplY3QnJiYgIHR5cGUhPT0gICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBmdXR1cmUgcHJvb2Y6IGJyZWFrIHVudGlsIHNvbWVvbmUgZmlndXJlcyBvdXQgd2hhdCBpdCBzaG91bGQgZG9cbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgVW5leHBlY3RlZCB0eXBlb2Y6ICR7dHlwZX1gKTtcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHdlYWtzZXRIYXMoaGFyZGVuZWQsIHZhbCl8fCAgc2V0SGFzKHRvRnJlZXplLCB2YWwpKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGlmIHRoaXMgaXMgYW4gZXhpdCwgb3Igd2UndmUgYWxyZWFkeSB2aXNpdGVkIGl0XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLndhcm4oYGFkZGluZyAke3ZhbH0gdG8gdG9GcmVlemVgLCB2YWwpO1xuICAgICAgICBzZXRBZGQodG9GcmVlemUsIHZhbCk7XG4gICAgICAgIHdlYWttYXBTZXQocGF0aHMsIHZhbCwgcGF0aCk7XG4gICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEBwYXJhbSB7YW55fSBvYmpcbiAgICAgICAqL1xuICAgICAgZnVuY3Rpb24gZnJlZXplQW5kVHJhdmVyc2Uob2JqKSB7XG4gICAgICAgIC8vIE5vdyBmcmVlemUgdGhlIG9iamVjdCB0byBlbnN1cmUgcmVhY3RpdmVcbiAgICAgICAgLy8gb2JqZWN0cyBzdWNoIGFzIHByb3hpZXMgd29uJ3QgYWRkIHByb3BlcnRpZXNcbiAgICAgICAgLy8gZHVyaW5nIHRyYXZlcnNhbCwgYmVmb3JlIHRoZXkgZ2V0IGZyb3plbi5cblxuICAgICAgICAvLyBPYmplY3QgYXJlIHZlcmlmaWVkIGJlZm9yZSBiZWluZyBlbnF1ZXVlZCxcbiAgICAgICAgLy8gdGhlcmVmb3JlIHRoaXMgaXMgYSB2YWxpZCBjYW5kaWRhdGUuXG4gICAgICAgIC8vIFRocm93cyBpZiB0aGlzIGZhaWxzIChzdHJpY3QgbW9kZSkuXG4gICAgICAgIC8vIEFsc28gdGhyb3dzIGlmIHRoZSBvYmplY3QgaXMgYW4gQXJyYXlCdWZmZXIgb3IgYW55IFR5cGVkQXJyYXkuXG4gICAgICAgIGlmKCBpc1R5cGVkQXJyYXkob2JqKSkge1xuICAgICAgICAgIGZyZWV6ZVR5cGVkQXJyYXkob2JqKTtcbiAgICAgICAgIH1lbHNlIHtcbiAgICAgICAgICBmcmVlemUob2JqKTtcbiAgICAgICAgIH1cblxuICAgICAgICAvLyB3ZSByZWx5IHVwb24gY2VydGFpbiBjb21taXRtZW50cyBvZiBPYmplY3QuZnJlZXplIGFuZCBwcm94aWVzIGhlcmVcblxuICAgICAgICAvLyBnZXQgc3RhYmxlL2ltbXV0YWJsZSBvdXRib3VuZCBsaW5rcyBiZWZvcmUgYSBQcm94eSBoYXMgYSBjaGFuY2UgdG8gZG9cbiAgICAgICAgLy8gc29tZXRoaW5nIHNuZWFreS5cbiAgICAgICAgY29uc3QgcGF0aD0gIHdlYWttYXBHZXQocGF0aHMsIG9iail8fCAgJ3Vua25vd24nO1xuICAgICAgICBjb25zdCBkZXNjcz0gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgICAgICAgY29uc3QgcHJvdG89ICBnZXRQcm90b3R5cGVPZihvYmopO1xuICAgICAgICBlbnF1ZXVlKHByb3RvLCAgYCR7cGF0aH0uX19wcm90b19fYCk7XG5cbiAgICAgICAgYXJyYXlGb3JFYWNoKG93bktleXMoZGVzY3MpLCAoLyoqIEB0eXBlIHtzdHJpbmcgfCBzeW1ib2x9ICovIG5hbWUpPT4gIHtcbiAgICAgICAgICBjb25zdCBwYXRobmFtZT0gICBgJHtwYXRofS4ke1N0cmluZyhuYW1lKX1gO1xuICAgICAgICAgIC8vIFRoZSAnbmFtZScgbWF5IGJlIGEgc3ltYm9sLCBhbmQgVHlwZVNjcmlwdCBkb2Vzbid0IGxpa2UgdXMgdG9cbiAgICAgICAgICAvLyBpbmRleCBhcmJpdHJhcnkgc3ltYm9scyBvbiBvYmplY3RzLCBzbyB3ZSBwcmV0ZW5kIHRoZXkncmUganVzdFxuICAgICAgICAgIC8vIHN0cmluZ3MuXG4gICAgICAgICAgY29uc3QgZGVzYz0gIGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAgbmFtZV07XG4gICAgICAgICAgLy8gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyBpcyBndWFyYW50ZWVkIHRvIHJldHVybiB3ZWxsLWZvcm1lZFxuICAgICAgICAgIC8vIGRlc2NyaXB0b3JzLCBidXQgdGhleSBzdGlsbCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZS4gSWZcbiAgICAgICAgICAvLyBzb21lb25lIGhhcyBwb2lzb25lZCBPYmplY3QucHJvdG90eXBlIHRvIGFkZCAndmFsdWUnIG9yICdnZXQnXG4gICAgICAgICAgLy8gcHJvcGVydGllcywgdGhlbiBhIHNpbXBsZSAnaWYgKFwidmFsdWVcIiBpbiBkZXNjKScgb3IgJ2Rlc2MudmFsdWUnXG4gICAgICAgICAgLy8gdGVzdCBjb3VsZCBiZSBjb25mdXNlZC4gV2UgdXNlIGhhc093blByb3BlcnR5IHRvIGJlIHN1cmUgYWJvdXRcbiAgICAgICAgICAvLyB3aGV0aGVyICd2YWx1ZScgaXMgcHJlc2VudCBvciBub3QsIHdoaWNoIHRlbGxzIHVzIGZvciBzdXJlIHRoYXRcbiAgICAgICAgICAvLyB0aGlzIGlzIGEgZGF0YSBwcm9wZXJ0eS5cbiAgICAgICAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoZGVzYywgJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGVucXVldWUoZGVzYy52YWx1ZSwgIGAke3BhdGhuYW1lfWApO1xuICAgICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICBlbnF1ZXVlKGRlc2MuZ2V0LCAgYCR7cGF0aG5hbWV9KGdldClgKTtcbiAgICAgICAgICAgIGVucXVldWUoZGVzYy5zZXQsICBgJHtwYXRobmFtZX0oc2V0KWApO1xuICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlcXVldWUoKSB7XG4gICAgICAgIC8vIE5ldyB2YWx1ZXMgYWRkZWQgYmVmb3JlIGZvckVhY2goKSBoYXMgZmluaXNoZWQgd2lsbCBiZSB2aXNpdGVkLlxuICAgICAgICBzZXRGb3JFYWNoKHRvRnJlZXplLCBmcmVlemVBbmRUcmF2ZXJzZSk7XG4gICAgICAgfVxuXG4gICAgICAvKiogQHBhcmFtIHthbnl9IHZhbHVlICovXG4gICAgICBmdW5jdGlvbiBtYXJrSGFyZGVuZWQodmFsdWUpIHtcbiAgICAgICAgd2Vha3NldEFkZChoYXJkZW5lZCwgdmFsdWUpO1xuICAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY29tbWl0KCkge1xuICAgICAgICBzZXRGb3JFYWNoKHRvRnJlZXplLCBtYXJrSGFyZGVuZWQpO1xuICAgICAgIH1cblxuICAgICAgZW5xdWV1ZShyb290KTtcbiAgICAgIGRlcXVldWUoKTtcbiAgICAgIC8vIGNvbnNvbGUud2FybihcInRvRnJlZXplIHNldDpcIiwgdG9GcmVlemUpO1xuICAgICAgY29tbWl0KCk7XG5cbiAgICAgIHJldHVybiByb290O1xuICAgICB9fTtcblxuXG4gIHJldHVybiBoYXJkZW47XG4gfTskaOKAjV9vbmNlLm1ha2VIYXJkZW5lcihtYWtlSGFyZGVuZXIpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szNF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBEYXRlLFR5cGVFcnJvcixhcHBseSxjb25zdHJ1Y3QsZGVmaW5lUHJvcGVydGllczskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkRhdGVcIiwgWyRo4oCNX2EgPT4gKERhdGUgPSAkaOKAjV9hKV1dLFtcIlR5cGVFcnJvclwiLCBbJGjigI1fYSA9PiAoVHlwZUVycm9yID0gJGjigI1fYSldXSxbXCJhcHBseVwiLCBbJGjigI1fYSA9PiAoYXBwbHkgPSAkaOKAjV9hKV1dLFtcImNvbnN0cnVjdFwiLCBbJGjigI1fYSA9PiAoY29uc3RydWN0ID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0aWVzXCIsIFskaOKAjV9hID0+IChkZWZpbmVQcm9wZXJ0aWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiAgICAgICAgICAgICAgICB0YW1lRGF0ZUNvbnN0cnVjdG9yKGRhdGVUYW1pbmc9ICAnc2FmZScpIHtcbiAgaWYoIGRhdGVUYW1pbmchPT0gICdzYWZlJyYmICBkYXRlVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgZGF0ZVRhbWluZyAke2RhdGVUYW1pbmd9YCk7XG4gICB9XG4gIGNvbnN0IE9yaWdpbmFsRGF0ZT0gIERhdGU7XG4gIGNvbnN0IERhdGVQcm90b3R5cGU9ICBPcmlnaW5hbERhdGUucHJvdG90eXBlO1xuXG4gIC8vIFVzZSBjb25jaXNlIG1ldGhvZHMgdG8gb2J0YWluIG5hbWVkIGZ1bmN0aW9ucyB3aXRob3V0IGNvbnN0cnVjdG9ycy5cbiAgY29uc3QgdGFtZWRNZXRob2RzPSAge1xuICAgIG5vdygpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgIH19O1xuXG5cbiAgLy8gVGFtZSB0aGUgRGF0ZSBjb25zdHJ1Y3Rvci5cbiAgLy8gQ29tbW9uIGJlaGF2aW9yXG4gIC8vICAgKiBuZXcgRGF0ZSh4KSBjb2VyY2VzIHggaW50byBhIG51bWJlciBhbmQgdGhlbiByZXR1cm5zIGEgRGF0ZVxuICAvLyAgICAgZm9yIHRoYXQgbnVtYmVyIG9mIG1pbGxpcyBzaW5jZSB0aGUgZXBvY2hcbiAgLy8gICAqIG5ldyBEYXRlKE5hTikgcmV0dXJucyBhIERhdGUgb2JqZWN0IHdoaWNoIHN0cmluZ2lmaWVzIHRvXG4gIC8vICAgICAnSW52YWxpZCBEYXRlJ1xuICAvLyAgICogbmV3IERhdGUodW5kZWZpbmVkKSByZXR1cm5zIGEgRGF0ZSBvYmplY3Qgd2hpY2ggc3RyaW5naWZpZXMgdG9cbiAgLy8gICAgICdJbnZhbGlkIERhdGUnXG4gIC8vIE9yaWdpbmFsRGF0ZSAobm9ybWFsIHN0YW5kYXJkKSBiZWhhdmlvclxuICAvLyAgICogRGF0ZShhbnl0aGluZykgZ2l2ZXMgYSBzdHJpbmcgd2l0aCB0aGUgY3VycmVudCB0aW1lXG4gIC8vICAgKiBuZXcgRGF0ZSgpIHJldHVybnMgdGhlIGN1cnJlbnQgdGltZSwgYXMgYSBEYXRlIG9iamVjdFxuICAvLyBTaGFyZWREYXRlIGJlaGF2aW9yXG4gIC8vICAgKiBEYXRlKGFueXRoaW5nKSByZXR1cm5lZCAnSW52YWxpZCBEYXRlJ1xuICAvLyAgICogbmV3IERhdGUoKSByZXR1cm5zIGEgRGF0ZSBvYmplY3Qgd2hpY2ggc3RyaW5naWZpZXMgdG9cbiAgLy8gICAgICdJbnZhbGlkIERhdGUnXG4gIGNvbnN0IG1ha2VEYXRlQ29uc3RydWN0b3I9ICAoeyBwb3dlcnM9ICAnbm9uZSd9PSAgIHt9KT0+ICB7XG4gICAgbGV0IFJlc3VsdERhdGU7XG4gICAgaWYoIHBvd2Vycz09PSAgJ29yaWdpbmFsJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgICAgUmVzdWx0RGF0ZT0gIGZ1bmN0aW9uIERhdGUoLi4ucmVzdCkge1xuICAgICAgICBpZiggbmV3LnRhcmdldD09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KE9yaWdpbmFsRGF0ZSwgdW5kZWZpbmVkLCByZXN0KTtcbiAgICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdChPcmlnaW5hbERhdGUsIHJlc3QsIG5ldy50YXJnZXQpO1xuICAgICAgIH07XG4gICAgIH1lbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICAgIFJlc3VsdERhdGU9ICBmdW5jdGlvbiBEYXRlKC4uLnJlc3QpIHtcbiAgICAgICAgaWYoIG5ldy50YXJnZXQ9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiAnSW52YWxpZCBEYXRlJztcbiAgICAgICAgIH1cbiAgICAgICAgaWYoIHJlc3QubGVuZ3RoPT09ICAwKSB7XG4gICAgICAgICAgcmVzdD0gIFtOYU5dO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29uc3RydWN0KE9yaWdpbmFsRGF0ZSwgcmVzdCwgbmV3LnRhcmdldCk7XG4gICAgICAgfTtcbiAgICAgfVxuXG4gICAgZGVmaW5lUHJvcGVydGllcyhSZXN1bHREYXRlLCB7XG4gICAgICBsZW5ndGg6IHsgdmFsdWU6IDd9LFxuICAgICAgcHJvdG90eXBlOiB7XG4gICAgICAgIHZhbHVlOiBEYXRlUHJvdG90eXBlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSxcblxuICAgICAgcGFyc2U6IHtcbiAgICAgICAgdmFsdWU6IERhdGUucGFyc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlfSxcblxuICAgICAgVVRDOiB7XG4gICAgICAgIHZhbHVlOiBEYXRlLlVUQyxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuICAgIHJldHVybiBSZXN1bHREYXRlO1xuICAgfTtcbiAgY29uc3QgSW5pdGlhbERhdGU9ICBtYWtlRGF0ZUNvbnN0cnVjdG9yKHsgcG93ZXJzOiAnb3JpZ2luYWwnfSk7XG4gIGNvbnN0IFNoYXJlZERhdGU9ICBtYWtlRGF0ZUNvbnN0cnVjdG9yKHsgcG93ZXJzOiAnbm9uZSd9KTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKEluaXRpYWxEYXRlLCB7XG4gICAgbm93OiB7XG4gICAgICB2YWx1ZTogRGF0ZS5ub3csXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlfX0pO1xuXG5cbiAgZGVmaW5lUHJvcGVydGllcyhTaGFyZWREYXRlLCB7XG4gICAgbm93OiB7XG4gICAgICB2YWx1ZTogdGFtZWRNZXRob2RzLm5vdyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWV9fSk7XG5cblxuXG4gIGRlZmluZVByb3BlcnRpZXMoRGF0ZVByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBTaGFyZWREYXRlfX0pO1xuXG5cbiAgcmV0dXJuIHtcbiAgICAnJUluaXRpYWxEYXRlJSc6IEluaXRpYWxEYXRlLFxuICAgICclU2hhcmVkRGF0ZSUnOiBTaGFyZWREYXRlfTtcblxuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICB0YW1lRGF0ZUNvbnN0cnVjdG9yKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzVdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgVHlwZUVycm9yLGdsb2JhbFRoaXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGRlZmluZVByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImdsb2JhbFRoaXNcIiwgWyRo4oCNX2EgPT4gKGdsb2JhbFRoaXMgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGFtZURvbWFpbnMsICduYW1lJywge3ZhbHVlOiBcInRhbWVEb21haW5zXCJ9KTskaOKAjV9vbmNlLnRhbWVEb21haW5zKHRhbWVEb21haW5zKTsgICBcblxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiAgICAgICAgdGFtZURvbWFpbnMoZG9tYWluVGFtaW5nPSAgJ3NhZmUnKSB7XG4gIGlmKCBkb21haW5UYW1pbmchPT0gICdzYWZlJyYmICBkb21haW5UYW1pbmchPT0gICd1bnNhZmUnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYHVucmVjb2duaXplZCBkb21haW5UYW1pbmcgJHtkb21haW5UYW1pbmd9YCk7XG4gICB9XG5cbiAgaWYoIGRvbWFpblRhbWluZz09PSAgJ3Vuc2FmZScpIHtcbiAgICByZXR1cm47XG4gICB9XG5cbiAgLy8gUHJvdGVjdCBhZ2FpbnN0IHRoZSBoYXphcmQgcHJlc2VudGVkIGJ5IE5vZGUuanMgZG9tYWlucy5cbiAgaWYoIHR5cGVvZiBnbG9iYWxUaGlzLnByb2Nlc3M9PT0gICdvYmplY3QnJiYgIGdsb2JhbFRoaXMucHJvY2VzcyE9PSAgbnVsbCkge1xuICAgIC8vIENoZWNrIHdoZXRoZXIgZG9tYWlucyB3ZXJlIGluaXRpYWxpemVkLlxuICAgIGNvbnN0IGRvbWFpbkRlc2NyaXB0b3I9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICBnbG9iYWxUaGlzLnByb2Nlc3MsXG4gICAgICAnZG9tYWluJyk7XG5cbiAgICBpZiggZG9tYWluRGVzY3JpcHRvciE9PSAgdW5kZWZpbmVkJiYgIGRvbWFpbkRlc2NyaXB0b3IuZ2V0IT09ICB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoZSBkb21haW4gZGVzY3JpcHRvciBvbiBOb2RlLmpzIGluaXRpYWxseSBoYXMgdmFsdWU6IG51bGwsIHdoaWNoXG4gICAgICAvLyBiZWNvbWVzIGEgZ2V0LCBzZXQgcGFpciBhZnRlciBkb21haW5zIGluaXRpYWxpemUuXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgYFNFUyBmYWlsZWQgdG8gbG9ja2Rvd24sIE5vZGUuanMgZG9tYWlucyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKFNFU19OT19ET01BSU5TKWApO1xuXG4gICAgIH1cbiAgICAvLyBQcmV2ZW50IGRvbWFpbnMgZnJvbSBpbml0aWFsaXppbmcuXG4gICAgLy8gVGhpcyBpcyBjbHVua3kgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIHRocm93biBmcm9tIHRoZSBkb21haW5zIHBhY2thZ2UgZG9lc1xuICAgIC8vIG5vdCBkaXJlY3QgdGhlIHVzZXIncyBnYXplIHRvd2FyZCBhIGtub3dsZWRnZSBiYXNlIGFib3V0IHRoZSBwcm9ibGVtLlxuICAgIC8vIFRoZSBkb21haW4gbW9kdWxlIG1lcmVseSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gaXQgYXR0ZW1wdHMgdG8gZGVmaW5lXG4gICAgLy8gdGhlIGRvbWFpbiBwcm9wZXJ0eSBvZiB0aGUgcHJvY2VzcyBnbG9iYWwgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbi5cbiAgICAvLyBXZSBoYXZlIG5vIGJldHRlciByZWNvdXJzZSBiZWNhdXNlIE5vZGUuanMgdXNlcyBkZWZpbmVQcm9wZXJ0eSB0b28uXG4gICAgZGVmaW5lUHJvcGVydHkoZ2xvYmFsVGhpcy5wcm9jZXNzLCAnZG9tYWluJywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2V9KTtcblxuICAgfVxuIH1cbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzZdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfRlVOQ1RJT04sU3ludGF4RXJyb3IsVHlwZUVycm9yLGRlZmluZVByb3BlcnRpZXMsZ2V0UHJvdG90eXBlT2Ysc2V0UHJvdG90eXBlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9GVU5DVElPTlwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRlVOQ1RJT04gPSAkaOKAjV9hKV1dLFtcIlN5bnRheEVycm9yXCIsIFskaOKAjV9hID0+IChTeW50YXhFcnJvciA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcImdldFByb3RvdHlwZU9mXCIsIFskaOKAjV9hID0+IChnZXRQcm90b3R5cGVPZiA9ICRo4oCNX2EpXV0sW1wic2V0UHJvdG90eXBlT2ZcIiwgWyRo4oCNX2EgPT4gKHNldFByb3RvdHlwZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLy8gVGhpcyBtb2R1bGUgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIGBGdW5jdGlvbmAgY29uc3RydWN0b3IsIGFuZCB0aGUgb3JpZ2luYWxcbi8vIGAlR2VuZXJhdG9yRnVuY3Rpb24lYCwgYCVBc3luY0Z1bmN0aW9uJWAgYW5kIGAlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiVgLFxuLy8gd2l0aCBzYWZlIHJlcGxhY2VtZW50cyB0aGF0IHRocm93IGlmIGludm9rZWQuXG4vL1xuLy8gVGhlc2UgYXJlIGFsbCByZWFjaGFibGUgdmlhIHN5bnRheCwgc28gaXQgaXNuJ3Qgc3VmZmljaWVudCB0byBqdXN0XG4vLyByZXBsYWNlIGdsb2JhbCBwcm9wZXJ0aWVzIHdpdGggc2FmZSB2ZXJzaW9ucy4gT3VyIG1haW4gZ29hbCBpcyB0byBwcmV2ZW50XG4vLyBhY2Nlc3MgdG8gdGhlIGBGdW5jdGlvbmAgY29uc3RydWN0b3IgdGhyb3VnaCB0aGVzZSBzdGFydGluZyBwb2ludHMuXG4vL1xuLy8gQWZ0ZXIgbW9kdWxlcyBibG9jayBpcyBkb25lLCB0aGUgb3JpZ2luYWxzIG11c3Qgbm8gbG9uZ2VyIGJlIHJlYWNoYWJsZSxcbi8vIHVubGVzcyBhIGNvcHkgaGFzIGJlZW4gbWFkZSwgYW5kIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBjcmVhdGVkIGJ5IHN5bnRheFxuLy8gKHVzaW5nIGV2YWwpIG9yIGJ5IGludm9raW5nIGEgcHJldmlvdXNseSBzYXZlZCByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFscy5cbi8vXG4vLyBUeXBpY2FsbHksIHRoaXMgbW9kdWxlIHdpbGwgbm90IGJlIHVzZWQgZGlyZWN0bHksIGJ1dCB2aWEgdGhlXG4vLyBbbG9ja2Rvd24gLSBzaGltXSB3aGljaCBoYW5kbGVzIGFsbCBuZWNlc3NhcnkgcmVwYWlycyBhbmQgdGFtaW5nIGluIFNFUy5cbi8vXG4vLyBSZWxhdGlvbiB0byBFQ01BIHNwZWNpZmljYXRpb25zXG4vL1xuLy8gVGhlIHRhbWluZyBvZiBjb25zdHJ1Y3RvcnMgcmVhbGx5IHdhbnRzIHRvIGJlIHBhcnQgb2YgdGhlIHN0YW5kYXJkLCBiZWNhdXNlXG4vLyBuZXcgY29uc3RydWN0b3JzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLCByZWFjaGFibGUgZnJvbSBzeW50YXgsIGFuZCB0aGlzXG4vLyBsaXN0IG11c3QgYmUgdXBkYXRlZCB0byBtYXRjaC5cbi8vXG4vLyBJbiBhZGRpdGlvbiwgdGhlIHN0YW5kYXJkIG5lZWRzIHRvIGRlZmluZSBmb3VyIG5ldyBpbnRyaW5zaWNzIGZvciB0aGUgc2FmZVxuLy8gcmVwbGFjZW1lbnQgZnVuY3Rpb25zLiBTZWUgWy4vd2hpdGVsaXN0IGludHJpbnNpY3NdLlxuLy9cbi8vIEFkYXB0ZWQgZnJvbSBTRVMvQ2FqYVxuLy8gQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2NhamEvYmxvYi9tYXN0ZXIvc3JjL2NvbS9nb29nbGUvY2FqYS9zZXMvc3RhcnRTRVMuanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2FqYS9ibG9iL21hc3Rlci9zcmMvY29tL2dvb2dsZS9jYWphL3Nlcy9yZXBhaXJFUzUuanNcblxuLyoqXG4gKiB0YW1lRnVuY3Rpb25Db25zdHJ1Y3RvcnMoKVxuICogVGhpcyBibG9jayByZXBsYWNlcyB0aGUgb3JpZ2luYWwgRnVuY3Rpb24gY29uc3RydWN0b3IsIGFuZCB0aGUgb3JpZ2luYWxcbiAqICVHZW5lcmF0b3JGdW5jdGlvbiUgJUFzeW5jRnVuY3Rpb24lIGFuZCAlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUsIHdpdGhcbiAqIHNhZmUgcmVwbGFjZW1lbnRzIHRoYXQgdGhyb3cgaWYgaW52b2tlZC5cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgdGFtZUZ1bmN0aW9uQ29uc3RydWN0b3JzKCkge1xuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBtZXRob2QgaXMgbm90IGNhbGxhYmxlLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlLmNvbnN0cnVjdG9yKCdyZXR1cm4gMScpO1xuICAgfWNhdGNoKCBpZ25vcmUpIHtcbiAgICAvLyBUaHJvd3MsIG5vIG5lZWQgdG8gcGF0Y2guXG4gICAgcmV0dXJuIGhhcmRlbih7fSk7XG4gICB9XG5cbiAgY29uc3QgbmV3SW50cmluc2ljcz0gIHt9O1xuXG4gIC8qXG4gICAqIFRoZSBwcm9jZXNzIHRvIHJlcGFpciBjb25zdHJ1Y3RvcnM6XG4gICAqIDEuIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZnVuY3Rpb24gYnkgZXZhbHVhdGluZyBzeW50YXhcbiAgICogMi4gT2J0YWluIHRoZSBwcm90b3R5cGUgZnJvbSB0aGUgaW5zdGFuY2VcbiAgICogMy4gQ3JlYXRlIGEgc3Vic3RpdHV0ZSB0YW1lZCBjb25zdHJ1Y3RvclxuICAgKiA0LiBSZXBsYWNlIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciB3aXRoIHRoZSB0YW1lZCBjb25zdHJ1Y3RvclxuICAgKiA1LiBSZXBsYWNlIHRhbWVkIGNvbnN0cnVjdG9yIHByb3RvdHlwZSBwcm9wZXJ0eSB3aXRoIHRoZSBvcmlnaW5hbCBvbmVcbiAgICogNi4gUmVwbGFjZSBpdHMgW1tQcm90b3R5cGVdXSBzbG90IHdpdGggdGhlIHRhbWVkIGNvbnN0cnVjdG9yIG9mIEZ1bmN0aW9uXG4gICAqL1xuICBmdW5jdGlvbiByZXBhaXJGdW5jdGlvbihuYW1lLCBpbnRyaW5zaWNOYW1lLCBkZWNsYXJhdGlvbikge1xuICAgIGxldCBGdW5jdGlvbkluc3RhbmNlO1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXZhbCwgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgICBGdW5jdGlvbkluc3RhbmNlPSAgKDAsIGV2YWwpKGRlY2xhcmF0aW9uKTtcbiAgICAgfWNhdGNoKCBlKSB7XG4gICAgICBpZiggZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICAgIC8vIFByZXZlbnQgZmFpbHVyZSBvbiBwbGF0Zm9ybXMgd2hlcmUgYXN5bmMgYW5kL29yIGdlbmVyYXRvcnNcbiAgICAgICAgLy8gYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICAvLyBSZS10aHJvd1xuICAgICAgdGhyb3cgZTtcbiAgICAgfVxuICAgIGNvbnN0IEZ1bmN0aW9uUHJvdG90eXBlPSAgZ2V0UHJvdG90eXBlT2YoRnVuY3Rpb25JbnN0YW5jZSk7XG5cbiAgICAvLyBQcmV2ZW50cyB0aGUgZXZhbHVhdGlvbiBvZiBzb3VyY2Ugd2hlbiBjYWxsaW5nIGNvbnN0cnVjdG9yIG9uIHRoZVxuICAgIC8vIHByb3RvdHlwZSBvZiBmdW5jdGlvbnMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICBjb25zdCBJbmVydENvbnN0cnVjdG9yPSAgZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRnVuY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yIGlzIG5vdCBhIHZhbGlkIGNvbnN0cnVjdG9yLicpO1xuXG4gICAgIH07XG4gICAgZGVmaW5lUHJvcGVydGllcyhJbmVydENvbnN0cnVjdG9yLCB7XG4gICAgICBwcm90b3R5cGU6IHsgdmFsdWU6IEZ1bmN0aW9uUHJvdG90eXBlfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZX19KTtcblxuXG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEZ1bmN0aW9uUHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogSW5lcnRDb25zdHJ1Y3Rvcn19KTtcblxuXG4gICAgLy8gUmVjb25zdHJ1Y3RzIHRoZSBpbmhlcml0YW5jZSBhbW9uZyB0aGUgbmV3IHRhbWVkIGNvbnN0cnVjdG9yc1xuICAgIC8vIHRvIG1pcnJvciB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIGluIG5vcm1hbCBKUy5cbiAgICBpZiggSW5lcnRDb25zdHJ1Y3RvciE9PSAgRkVSQUxfRlVOQ1RJT04ucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRQcm90b3R5cGVPZihJbmVydENvbnN0cnVjdG9yLCBGRVJBTF9GVU5DVElPTi5wcm90b3R5cGUuY29uc3RydWN0b3IpO1xuICAgICB9XG5cbiAgICBuZXdJbnRyaW5zaWNzW2ludHJpbnNpY05hbWVdPSAgSW5lcnRDb25zdHJ1Y3RvcjtcbiAgIH1cblxuICAvLyBIZXJlLCB0aGUgb3JkZXIgb2Ygb3BlcmF0aW9uIGlzIGltcG9ydGFudDogRnVuY3Rpb24gbmVlZHMgdG8gYmUgcmVwYWlyZWRcbiAgLy8gZmlyc3Qgc2luY2UgdGhlIG90aGVyIHJlcGFpcmVkIGNvbnN0cnVjdG9ycyBuZWVkIHRvIGluaGVyaXQgZnJvbSB0aGVcbiAgLy8gdGFtZWQgRnVuY3Rpb24gZnVuY3Rpb24gY29uc3RydWN0b3IuXG5cbiAgcmVwYWlyRnVuY3Rpb24oJ0Z1bmN0aW9uJywgJyVJbmVydEZ1bmN0aW9uJScsICcoZnVuY3Rpb24oKXt9KScpO1xuICByZXBhaXJGdW5jdGlvbihcbiAgICAnR2VuZXJhdG9yRnVuY3Rpb24nLFxuICAgICclSW5lcnRHZW5lcmF0b3JGdW5jdGlvbiUnLFxuICAgICcoZnVuY3Rpb24qKCl7fSknKTtcblxuICByZXBhaXJGdW5jdGlvbihcbiAgICAnQXN5bmNGdW5jdGlvbicsXG4gICAgJyVJbmVydEFzeW5jRnVuY3Rpb24lJyxcbiAgICAnKGFzeW5jIGZ1bmN0aW9uKCl7fSknKTtcblxuICByZXBhaXJGdW5jdGlvbihcbiAgICAnQXN5bmNHZW5lcmF0b3JGdW5jdGlvbicsXG4gICAgJyVJbmVydEFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lJyxcbiAgICAnKGFzeW5jIGZ1bmN0aW9uKigpe30pJyk7XG5cblxuICByZXR1cm4gbmV3SW50cmluc2ljcztcbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgdGFtZUZ1bmN0aW9uQ29uc3RydWN0b3JzKTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbMzddID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgV2Vha1NldCxkZWZpbmVQcm9wZXJ0eSxmcmVlemUsZnVuY3Rpb25Qcm90b3R5cGUsZnVuY3Rpb25Ub1N0cmluZyxzdHJpbmdFbmRzV2l0aCx3ZWFrc2V0QWRkLHdlYWtzZXRIYXM7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJXZWFrU2V0XCIsIFskaOKAjV9hID0+IChXZWFrU2V0ID0gJGjigI1fYSldXSxbXCJkZWZpbmVQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImZyZWV6ZVwiLCBbJGjigI1fYSA9PiAoZnJlZXplID0gJGjigI1fYSldXSxbXCJmdW5jdGlvblByb3RvdHlwZVwiLCBbJGjigI1fYSA9PiAoZnVuY3Rpb25Qcm90b3R5cGUgPSAkaOKAjV9hKV1dLFtcImZ1bmN0aW9uVG9TdHJpbmdcIiwgWyRo4oCNX2EgPT4gKGZ1bmN0aW9uVG9TdHJpbmcgPSAkaOKAjV9hKV1dLFtcInN0cmluZ0VuZHNXaXRoXCIsIFskaOKAjV9hID0+IChzdHJpbmdFbmRzV2l0aCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEFkZFwiLCBbJGjigI1fYSA9PiAod2Vha3NldEFkZCA9ICRo4oCNX2EpXV0sW1wid2Vha3NldEhhc1wiLCBbJGjigI1fYSA9PiAod2Vha3NldEhhcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBuYXRpdmVTdWZmaXg9ICAnKSB7IFtuYXRpdmUgY29kZV0gfSc7XG5cbi8vIE5vdGU6IFRvcCBsZXZlbCBtdXRhYmxlIHN0YXRlLiBEb2VzIG5vdCBtYWtlIGFueXRoaW5nIHdvcnNlLCBzaW5jZSB0aGVcbi8vIHBhdGNoaW5nIG9mIGBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmdgIGlzIGFsc28gZ2xvYmFsbHkgc3RhdGVmdWwuIFdlXG4vLyB1c2UgdGhpcyB0b3AgbGV2ZWwgc3RhdGUgc28gdGhhdCBtdWx0aXBsZSBjYWxscyB0byBgdGFtZUZ1bmN0aW9uVG9TdHJpbmdgIGFyZVxuLy8gaWRlbXBvdGVudCwgcmF0aGVyIHRoYW4gY3JlYXRpbmcgcmVkdW5kYW50IGluZGlyZWN0aW9ucy5cbmxldCBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbjtcblxuLyoqXG4gKiBSZXBsYWNlIGBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmdgIHdpdGggb25lIHRoYXQgcmVjb2duaXplc1xuICogc2hpbW1lZCBmdW5jdGlvbnMgYXMgaG9ub3JhcnkgbmF0aXZlIGZ1bmN0aW9ucy5cbiAqL1xuY29uc3QgICAgICAgIHRhbWVGdW5jdGlvblRvU3RyaW5nPSAgKCk9PiAge1xuICBpZiggbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb249PT0gIHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb25zPSAgbmV3IFdlYWtTZXQoKTtcblxuICAgIGNvbnN0IHRhbWluZ01ldGhvZHM9ICB7XG4gICAgICB0b1N0cmluZygpIHtcbiAgICAgICAgY29uc3Qgc3RyPSAgZnVuY3Rpb25Ub1N0cmluZyh0aGlzLCBbXSk7XG4gICAgICAgIGlmKFxuICAgICAgICAgIHN0cmluZ0VuZHNXaXRoKHN0ciwgbmF0aXZlU3VmZml4KXx8XG4gICAgICAgICAgIXdlYWtzZXRIYXModmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbnMsIHRoaXMpKVxuICAgICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgICAgfVxuICAgICAgICByZXR1cm4gIGBmdW5jdGlvbiAke3RoaXMubmFtZX0oKSB7IFtuYXRpdmUgY29kZV0gfWA7XG4gICAgICAgfX07XG5cblxuICAgIGRlZmluZVByb3BlcnR5KGZ1bmN0aW9uUHJvdG90eXBlLCAndG9TdHJpbmcnLCB7XG4gICAgICB2YWx1ZTogdGFtaW5nTWV0aG9kcy50b1N0cmluZ30pO1xuXG5cbiAgICBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbj0gIGZyZWV6ZSgoZnVuYyk9PlxuICAgICAgd2Vha3NldEFkZCh2aXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9ucywgZnVuYykpO1xuXG4gICB9XG4gIHJldHVybiBtYXJrVmlydHVhbGl6ZWROYXRpdmVGdW5jdGlvbjtcbiB9OyRo4oCNX29uY2UudGFtZUZ1bmN0aW9uVG9TdHJpbmcodGFtZUZ1bmN0aW9uVG9TdHJpbmcpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szOF0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOdW1iZXIsU3RyaW5nLFR5cGVFcnJvcixkZWZpbmVQcm9wZXJ0eSxnZXRPd25Qcm9wZXJ0eU5hbWVzLGlzT2JqZWN0LHJlZ2V4cEV4ZWMsYXNzZXJ0OyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9ucy5qc1wiLCBbW1wiTnVtYmVyXCIsIFskaOKAjV9hID0+IChOdW1iZXIgPSAkaOKAjV9hKV1dLFtcIlN0cmluZ1wiLCBbJGjigI1fYSA9PiAoU3RyaW5nID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChnZXRPd25Qcm9wZXJ0eU5hbWVzID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcInJlZ2V4cEV4ZWNcIiwgWyRo4oCNX2EgPT4gKHJlZ2V4cEV4ZWMgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHF9PSAgIGFzc2VydDtcblxuY29uc3QgbG9jYWxlUGF0dGVybj0gIC9eKFxcdypbYS16XSlMb2NhbGUoW0EtWl1cXHcqKSQvO1xuXG4vLyBVc2UgY29uY2lzZSBtZXRob2RzIHRvIG9idGFpbiBuYW1lZCBmdW5jdGlvbnMgd2l0aG91dCBjb25zdHJ1Y3RvclxuLy8gYmVoYXZpb3Igb3IgYC5wcm90b3R5cGVgIHByb3BlcnR5LlxuY29uc3QgdGFtZWRNZXRob2RzPSAge1xuICAvLyBTZWUgaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLmxvY2FsZWNvbXBhcmVcbiAgbG9jYWxlQ29tcGFyZSh0aGF0KSB7XG4gICAgaWYoIHRoaXM9PT0gIG51bGx8fCAgdGhpcz09PSAgdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnQ2Fubm90IGxvY2FsZUNvbXBhcmUgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCBcInRoaXNcIiB2YWx1ZScpO1xuXG4gICAgIH1cbiAgICBjb25zdCBzPSAgIGAke3RoaXN9YDtcbiAgICB0aGF0PSAgIGAke3RoYXR9YDtcbiAgICBpZiggczwgIHRoYXQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICAgfVxuICAgIGlmKCBzPiAgdGhhdCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgIH1cbiAgICBzPT09ICB0aGF0fHwgIEZhaWwgYGV4cGVjdGVkICR7cShzKX0gYW5kICR7cSh0aGF0KX0gdG8gY29tcGFyZWA7XG4gICAgcmV0dXJuIDA7XG4gICB9LFxuXG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAgYCR7dGhpc31gO1xuICAgfX07XG5cblxuY29uc3Qgbm9uTG9jYWxlQ29tcGFyZT0gIHRhbWVkTWV0aG9kcy5sb2NhbGVDb21wYXJlO1xuY29uc3QgbnVtYmVyVG9TdHJpbmc9ICB0YW1lZE1ldGhvZHMudG9TdHJpbmc7XG5cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIHRhbWVMb2NhbGVNZXRob2RzKGludHJpbnNpY3MsIGxvY2FsZVRhbWluZz0gICdzYWZlJykge1xuICBpZiggbG9jYWxlVGFtaW5nIT09ICAnc2FmZScmJiAgbG9jYWxlVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgbG9jYWxlVGFtaW5nICR7bG9jYWxlVGFtaW5nfWApO1xuICAgfVxuICBpZiggbG9jYWxlVGFtaW5nPT09ICAndW5zYWZlJykge1xuICAgIHJldHVybjtcbiAgIH1cblxuICBkZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAnbG9jYWxlQ29tcGFyZScsIHtcbiAgICB2YWx1ZTogbm9uTG9jYWxlQ29tcGFyZX0pO1xuXG5cbiAgZm9yKCBjb25zdCBpbnRyaW5zaWNOYW1lIG9mIGdldE93blByb3BlcnR5TmFtZXMoaW50cmluc2ljcykpIHtcbiAgICBjb25zdCBpbnRyaW5zaWM9ICBpbnRyaW5zaWNzW2ludHJpbnNpY05hbWVdO1xuICAgIGlmKCBpc09iamVjdChpbnRyaW5zaWMpKSB7XG4gICAgICBmb3IoIGNvbnN0IG1ldGhvZE5hbWUgb2YgZ2V0T3duUHJvcGVydHlOYW1lcyhpbnRyaW5zaWMpKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoPSAgcmVnZXhwRXhlYyhsb2NhbGVQYXR0ZXJuLCBtZXRob2ROYW1lKTtcbiAgICAgICAgaWYoIG1hdGNoKSB7XG4gICAgICAgICAgdHlwZW9mIGludHJpbnNpY1ttZXRob2ROYW1lXT09PSAgJ2Z1bmN0aW9uJ3x8XG4gICAgICAgICAgICBGYWlsIGBleHBlY3RlZCAke3EobWV0aG9kTmFtZSl9IHRvIGJlIGEgZnVuY3Rpb25gO1xuICAgICAgICAgIGNvbnN0IG5vbkxvY2FsZU1ldGhvZE5hbWU9ICAgYCR7bWF0Y2hbMV19JHttYXRjaFsyXX1gO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZD0gIGludHJpbnNpY1tub25Mb2NhbGVNZXRob2ROYW1lXTtcbiAgICAgICAgICB0eXBlb2YgbWV0aG9kPT09ICAnZnVuY3Rpb24nfHxcbiAgICAgICAgICAgIEZhaWwgYGZ1bmN0aW9uICR7cShub25Mb2NhbGVNZXRob2ROYW1lKX0gbm90IGZvdW5kYDtcbiAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShpbnRyaW5zaWMsIG1ldGhvZE5hbWUsIHsgdmFsdWU6IG1ldGhvZH0pO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuICAgfVxuXG4gIC8vIE51bWJlcnMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0b1N0cmluZyBhY2NlcHRzIGEgcmFkaXggaW5zdGVhZCBvZiBpZ25vcmluZ1xuICAvLyBhbGwgb2YgdGhlIGFyZ3VtZW50cyB0aGF0IHdlIHdvdWxkIG90aGVyd2lzZSBmb3J3YXJkLlxuICBkZWZpbmVQcm9wZXJ0eShOdW1iZXIucHJvdG90eXBlLCAndG9Mb2NhbGVTdHJpbmcnLCB7XG4gICAgdmFsdWU6IG51bWJlclRvU3RyaW5nfSk7XG5cbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgdGFtZUxvY2FsZU1ldGhvZHMpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1szOV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNYXRoLFR5cGVFcnJvcixjcmVhdGUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxvYmplY3RQcm90b3R5cGU7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJNYXRoXCIsIFskaOKAjV9hID0+IChNYXRoID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiY3JlYXRlXCIsIFskaOKAjV9hID0+IChjcmVhdGUgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPSAkaOKAjV9hKV1dLFtcIm9iamVjdFByb3RvdHlwZVwiLCBbJGjigI1fYSA9PiAob2JqZWN0UHJvdG90eXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIHRhbWVNYXRoT2JqZWN0KG1hdGhUYW1pbmc9ICAnc2FmZScpIHtcbiAgaWYoIG1hdGhUYW1pbmchPT0gICdzYWZlJyYmICBtYXRoVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgbWF0aFRhbWluZyAke21hdGhUYW1pbmd9YCk7XG4gICB9XG4gIGNvbnN0IG9yaWdpbmFsTWF0aD0gIE1hdGg7XG4gIGNvbnN0IGluaXRpYWxNYXRoPSAgb3JpZ2luYWxNYXRoOyAvLyB0byBmb2xsb3cgdGhlIG5hbWluZyBwYXR0ZXJuXG5cbiAgY29uc3QgeyByYW5kb206IF8sIC4uLm90aGVyRGVzY3JpcHRvcnN9PSAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoXG4gICAgb3JpZ2luYWxNYXRoKTtcblxuXG4gIGNvbnN0IHNoYXJlZE1hdGg9ICBjcmVhdGUob2JqZWN0UHJvdG90eXBlLCBvdGhlckRlc2NyaXB0b3JzKTtcblxuICByZXR1cm4ge1xuICAgICclSW5pdGlhbE1hdGglJzogaW5pdGlhbE1hdGgsXG4gICAgJyVTaGFyZWRNYXRoJSc6IHNoYXJlZE1hdGh9O1xuXG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIHRhbWVNYXRoT2JqZWN0KTtcbn0pXG4sXG4vLyA9PT0gZnVuY3RvcnNbNDBdID09PVxuKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRkVSQUxfUkVHX0VYUCxUeXBlRXJyb3IsY29uc3RydWN0LGRlZmluZVByb3BlcnRpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHNwZWNpZXNTeW1ib2w7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb25zLmpzXCIsIFtbXCJGRVJBTF9SRUdfRVhQXCIsIFskaOKAjV9hID0+IChGRVJBTF9SRUdfRVhQID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiY29uc3RydWN0XCIsIFskaOKAjV9hID0+IChjb25zdHJ1Y3QgPSAkaOKAjV9hKV1dLFtcImRlZmluZVByb3BlcnRpZXNcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcImdldE93blByb3BlcnR5RGVzY3JpcHRvclwiLCBbJGjigI1fYSA9PiAoZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gJGjigI1fYSldXSxbXCJzcGVjaWVzU3ltYm9sXCIsIFskaOKAjV9hID0+IChzcGVjaWVzU3ltYm9sID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuZnVuY3Rpb24gICAgICAgICAgICAgICAgdGFtZVJlZ0V4cENvbnN0cnVjdG9yKHJlZ0V4cFRhbWluZz0gICdzYWZlJykge1xuICBpZiggcmVnRXhwVGFtaW5nIT09ICAnc2FmZScmJiAgcmVnRXhwVGFtaW5nIT09ICAndW5zYWZlJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgcmVnRXhwVGFtaW5nICR7cmVnRXhwVGFtaW5nfWApO1xuICAgfVxuICBjb25zdCBSZWdFeHBQcm90b3R5cGU9ICBGRVJBTF9SRUdfRVhQLnByb3RvdHlwZTtcblxuICBjb25zdCBtYWtlUmVnRXhwQ29uc3RydWN0b3I9ICAoXz0gIHt9KT0+ICB7XG4gICAgLy8gUmVnRXhwIGhhcyBub24td3JpdGFibGUgc3RhdGljIHByb3BlcnRpZXMgd2UgbmVlZCB0byBvbWl0LlxuICAgIGNvbnN0IFJlc3VsdFJlZ0V4cD0gIGZ1bmN0aW9uIFJlZ0V4cCguLi5yZXN0KSB7XG4gICAgICBpZiggbmV3LnRhcmdldD09PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBGRVJBTF9SRUdfRVhQKC4uLnJlc3QpO1xuICAgICAgIH1cbiAgICAgIHJldHVybiBjb25zdHJ1Y3QoRkVSQUxfUkVHX0VYUCwgcmVzdCwgbmV3LnRhcmdldCk7XG4gICAgIH07XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFJlc3VsdFJlZ0V4cCwge1xuICAgICAgbGVuZ3RoOiB7IHZhbHVlOiAyfSxcbiAgICAgIHByb3RvdHlwZToge1xuICAgICAgICB2YWx1ZTogUmVnRXhwUHJvdG90eXBlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlfSxcblxuICAgICAgW3NwZWNpZXNTeW1ib2xdOiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRkVSQUxfUkVHX0VYUCwgc3BlY2llc1N5bWJvbCl9KTtcblxuICAgIHJldHVybiBSZXN1bHRSZWdFeHA7XG4gICB9O1xuXG4gIGNvbnN0IEluaXRpYWxSZWdFeHA9ICBtYWtlUmVnRXhwQ29uc3RydWN0b3IoKTtcbiAgY29uc3QgU2hhcmVkUmVnRXhwPSAgbWFrZVJlZ0V4cENvbnN0cnVjdG9yKCk7XG5cbiAgaWYoIHJlZ0V4cFRhbWluZyE9PSAgJ3Vuc2FmZScpIHtcbiAgICBkZWxldGUgUmVnRXhwUHJvdG90eXBlLmNvbXBpbGU7XG4gICB9XG4gIGRlZmluZVByb3BlcnRpZXMoUmVnRXhwUHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHsgdmFsdWU6IFNoYXJlZFJlZ0V4cH19KTtcblxuXG4gIHJldHVybiB7XG4gICAgJyVJbml0aWFsUmVnRXhwJSc6IEluaXRpYWxSZWdFeHAsXG4gICAgJyVTaGFyZWRSZWdFeHAlJzogU2hhcmVkUmVnRXhwfTtcblxuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICB0YW1lUmVnRXhwQ29uc3RydWN0b3IpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s0MV0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB3aGl0ZWxpc3QsRnVuY3Rpb25JbnN0YW5jZSxpc0FjY2Vzc29yUGVybWl0LE1hcCxTdHJpbmcsVHlwZUVycm9yLGFycmF5RmlsdGVyLGFycmF5SW5jbHVkZXMsYXJyYXlNYXAsZW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsZ2V0UHJvdG90eXBlT2YsaXNPYmplY3QsbWFwR2V0LG9iamVjdEhhc093blByb3BlcnR5LG93bktleXMsc3ltYm9sS2V5Rm9yOyRo4oCNX2ltcG9ydHMoW1tcIi4vd2hpdGVsaXN0LmpzXCIsIFtbXCJ3aGl0ZWxpc3RcIiwgWyRo4oCNX2EgPT4gKHdoaXRlbGlzdCA9ICRo4oCNX2EpXV0sW1wiRnVuY3Rpb25JbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAoRnVuY3Rpb25JbnN0YW5jZSA9ICRo4oCNX2EpXV0sW1wiaXNBY2Nlc3NvclBlcm1pdFwiLCBbJGjigI1fYSA9PiAoaXNBY2Nlc3NvclBlcm1pdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbW1vbnMuanNcIiwgW1tcIk1hcFwiLCBbJGjigI1fYSA9PiAoTWFwID0gJGjigI1fYSldXSxbXCJTdHJpbmdcIiwgWyRo4oCNX2EgPT4gKFN0cmluZyA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFycmF5RmlsdGVyXCIsIFskaOKAjV9hID0+IChhcnJheUZpbHRlciA9ICRo4oCNX2EpXV0sW1wiYXJyYXlJbmNsdWRlc1wiLCBbJGjigI1fYSA9PiAoYXJyYXlJbmNsdWRlcyA9ICRo4oCNX2EpXV0sW1wiYXJyYXlNYXBcIiwgWyRo4oCNX2EgPT4gKGFycmF5TWFwID0gJGjigI1fYSldXSxbXCJlbnRyaWVzXCIsIFskaOKAjV9hID0+IChlbnRyaWVzID0gJGjigI1fYSldXSxbXCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgWyRo4oCNX2EgPT4gKGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9ICRo4oCNX2EpXV0sW1wiZ2V0UHJvdG90eXBlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldFByb3RvdHlwZU9mID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1hcEdldFwiLCBbJGjigI1fYSA9PiAobWFwR2V0ID0gJGjigI1fYSldXSxbXCJvYmplY3RIYXNPd25Qcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAob2JqZWN0SGFzT3duUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcIm93bktleXNcIiwgWyRo4oCNX2EgPT4gKG93bktleXMgPSAkaOKAjV9hKV1dLFtcInN5bWJvbEtleUZvclwiLCBbJGjigI1fYSA9PiAoc3ltYm9sS2V5Rm9yID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiB3aGl0ZWxpc3RJbnRyaW5zaWNzKClcbiAqIFJlbW92ZXMgYWxsIG5vbi1hbGxvd2VkIHByb3BlcnRpZXMgZm91bmQgYnkgcmVjdXJzaXZlbHkgYW5kXG4gKiByZWZsZWN0aXZlbHkgd2Fsa2luZyBvd24gcHJvcGVydHkgY2hhaW5zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnRyaW5zaWNzXG4gKiBAcGFyYW0geyhPYmplY3QpID0+IHZvaWR9IG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIHdoaXRlbGlzdEludHJpbnNpY3MoXG4gIGludHJpbnNpY3MsXG4gIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKVxuICB7XG4gIC8vIFRoZXNlIHByaW1pdGl2ZXMgYXJlIGFsbG93ZWQgYWxsb3dlZCBmb3IgcGVybWl0cy5cbiAgY29uc3QgcHJpbWl0aXZlcz0gIFsndW5kZWZpbmVkJywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZycsICdzeW1ib2wnXTtcblxuICAvLyBUaGVzZSBzeW1ib2xzIGFyZSBhbGxvd2VkIGFzIHdlbGwta25vd24gc3ltYm9sc1xuICBjb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz0gIG5ldyBNYXAoXG4gICAgaW50cmluc2ljcy5TeW1ib2w/XG4gICAgICAgIGFycmF5TWFwKFxuICAgICAgICAgIGFycmF5RmlsdGVyKFxuICAgICAgICAgICAgZW50cmllcyh3aGl0ZWxpc3QuU3ltYm9sKSxcbiAgICAgICAgICAgIChbbmFtZSwgcGVybWl0XSk9PlxuICAgICAgICAgICAgICBwZXJtaXQ9PT0gICdzeW1ib2wnJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGludHJpbnNpY3MuU3ltYm9sW25hbWVdPT09ICAnc3ltYm9sJyksXG5cbiAgICAgICAgICAoW25hbWVdKT0+ICBbaW50cmluc2ljcy5TeW1ib2xbbmFtZV0sICBgQEAke25hbWV9YF0pOlxuXG4gICAgICAgIFtdKTtcblxuXG4gIC8qKlxuICAgKiBhc1N0cmluZ1Byb3BlcnR5TmFtZSgpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wXG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZ1Byb3BlcnR5TmFtZShwYXRoLCBwcm9wKSB7XG4gICAgaWYoIHR5cGVvZiBwcm9wPT09ICAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHByb3A7XG4gICAgIH1cblxuICAgIGNvbnN0IHdlbGxLbm93blN5bWJvbD0gIG1hcEdldCh3ZWxsS25vd25TeW1ib2xOYW1lcywgcHJvcCk7XG5cbiAgICBpZiggdHlwZW9mIHByb3A9PT0gICdzeW1ib2wnKSB7XG4gICAgICBpZiggd2VsbEtub3duU3ltYm9sKSB7XG4gICAgICAgIHJldHVybiB3ZWxsS25vd25TeW1ib2w7XG4gICAgICAgfWVsc2Uge1xuICAgICAgICBjb25zdCByZWdpc3RlcmVkS2V5PSAgc3ltYm9sS2V5Rm9yKHByb3ApO1xuICAgICAgICBpZiggcmVnaXN0ZXJlZEtleSE9PSAgdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuICBgUmVnaXN0ZXJlZFN5bWJvbCgke3JlZ2lzdGVyZWRLZXl9KWA7XG4gICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICBgVW5pcXVlJHtTdHJpbmcocHJvcCl9YDtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cblxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBVbmV4cGVjdGVkIHByb3BlcnR5IG5hbWUgdHlwZSAke3BhdGh9ICR7cHJvcH1gKTtcbiAgIH1cblxuICAvKlxuICAgKiB2aXNpdFByb3RvdHlwZSgpXG4gICAqIFZhbGlkYXRlIHRoZSBvYmplY3QncyBbW3Byb3RvdHlwZV1dIGFnYWluc3QgYSBwZXJtaXQuXG4gICAqL1xuICBmdW5jdGlvbiB2aXNpdFByb3RvdHlwZShwYXRoLCBvYmosIHByb3RvTmFtZSkge1xuICAgIGlmKCAhaXNPYmplY3Qob2JqKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYE9iamVjdCBleHBlY3RlZDogJHtwYXRofSwgJHtvYmp9LCAke3Byb3RvTmFtZX1gKTtcbiAgICAgfVxuICAgIGNvbnN0IHByb3RvPSAgZ2V0UHJvdG90eXBlT2Yob2JqKTtcblxuICAgIC8vIE51bGwgcHJvdG90eXBlLlxuICAgIGlmKCBwcm90bz09PSAgbnVsbCYmICBwcm90b05hbWU9PT0gIG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuXG4gICAgLy8gQXNzZXJ0OiBwcm90b05hbWUsIGlmIHByb3ZpZGVkLCBpcyBhIHN0cmluZy5cbiAgICBpZiggcHJvdG9OYW1lIT09ICB1bmRlZmluZWQmJiAgdHlwZW9mIHByb3RvTmFtZSE9PSAgJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBNYWxmb3JtZWQgd2hpdGVsaXN0IHBlcm1pdCAke3BhdGh9Ll9fcHJvdG9fX2ApO1xuICAgICB9XG5cbiAgICAvLyBJZiBwZXJtaXQgbm90IHNwZWNpZmllZCwgZGVmYXVsdCB0byBPYmplY3QucHJvdG90eXBlLlxuICAgIGlmKCBwcm90bz09PSAgaW50cmluc2ljc1twcm90b05hbWV8fCAgJyVPYmplY3RQcm90b3R5cGUlJ10pIHtcbiAgICAgIHJldHVybjtcbiAgICAgfVxuXG4gICAgLy8gV2UgY2FuJ3QgY2xlYW4gW1twcm90b3R5cGVdXSwgdGhlcmVmb3JlIGFib3J0LlxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgYFVuZXhwZWN0ZWQgaW50cmluc2ljICR7cGF0aH0uX19wcm90b19fIGF0ICR7cHJvdG9OYW1lfWApO1xuXG4gICB9XG5cbiAgLypcbiAgICogaXNBbGxvd2VkUHJvcGVydHlWYWx1ZSgpXG4gICAqIFdoaXRlbGlzdCBhIHNpbmdsZSBwcm9wZXJ0eSB2YWx1ZSBhZ2FpbnN0IGEgcGVybWl0LlxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbGxvd2VkUHJvcGVydHlWYWx1ZShwYXRoLCB2YWx1ZSwgcHJvcCwgcGVybWl0KSB7XG4gICAgaWYoIHR5cGVvZiBwZXJtaXQ9PT0gICdvYmplY3QnKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIHZpc2l0UHJvcGVydGllcyhwYXRoLCB2YWx1ZSwgcGVybWl0KTtcbiAgICAgIC8vIFRoZSBwcm9wZXJ0eSBpcyBhbGxvd2VkLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgIH1cblxuICAgIGlmKCBwZXJtaXQ9PT0gIGZhbHNlKSB7XG4gICAgICAvLyBBIGJvb2xhbiAnZmFsc2UnIHBlcm1pdCBzcGVjaWZpZXMgdGhlIHJlbW92YWwgb2YgYSBwcm9wZXJ0eS5cbiAgICAgIC8vIFdlIHJlcXVpcmUgYSBtb3JlIHNwZWNpZmljIHBlcm1pdCBpbnN0ZWFkIG9mIGFsbG93aW5nICd0cnVlJy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgfVxuXG4gICAgaWYoIHR5cGVvZiBwZXJtaXQ9PT0gICdzdHJpbmcnKSB7XG4gICAgICAvLyBBIHN0cmluZyBwZXJtaXQgY2FuIGhhdmUgb25lIG9mIHR3byBtZWFuaW5nczpcblxuICAgICAgaWYoIHByb3A9PT0gICdwcm90b3R5cGUnfHwgIHByb3A9PT0gICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgLy8gRm9yIHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgdmFsdWUgcHJvcGVydGllcywgdGhlIHBlcm1pdFxuICAgICAgICAvLyBpcyB0aGUgbmFtZSBvZiBhbiBpbnRyaW5zaWMuXG4gICAgICAgIC8vIEFzc3VtcHRpb246IHByb3RvdHlwZSBhbmQgY29uc3RydWN0b3IgY2Fubm90IGJlIHByaW1pdGl2ZXMuXG4gICAgICAgIC8vIEFzc2VydDogdGhlIHBlcm1pdCBpcyB0aGUgbmFtZSBvZiBhbiBpbnRyaW5zaWMuXG4gICAgICAgIC8vIEFzc2VydDogdGhlIHByb3BlcnR5IHZhbHVlIGlzIGVxdWFsIHRvIHRoYXQgaW50cmluc2ljLlxuXG4gICAgICAgIGlmKCBvYmplY3RIYXNPd25Qcm9wZXJ0eShpbnRyaW5zaWNzLCBwZXJtaXQpKSB7XG4gICAgICAgICAgaWYoIHZhbHVlIT09ICBpbnRyaW5zaWNzW3Blcm1pdF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBEb2VzIG5vdCBtYXRjaCB3aGl0ZWxpc3QgJHtwYXRofWApO1xuICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICB9XG4gICAgICAgfWVsc2Uge1xuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIHByb3BlcnRpZXMsIHRoZSBwZXJtaXQgaXMgdGhlIG5hbWUgb2YgYSBwcmltaXRpdmUuXG4gICAgICAgIC8vIEFzc2VydDogdGhlIHBlcm1pdCBpcyB0aGUgbmFtZSBvZiBhIHByaW1pdGl2ZS5cbiAgICAgICAgLy8gQXNzZXJ0OiB0aGUgcHJvcGVydHkgdmFsdWUgdHlwZSBpcyBlcXVhbCB0byB0aGF0IHByaW1pdGl2ZS5cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9uZWx5LWlmXG4gICAgICAgIGlmKCBhcnJheUluY2x1ZGVzKHByaW1pdGl2ZXMsIHBlcm1pdCkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAgICAgaWYoIHR5cGVvZiB2YWx1ZSE9PSAgcGVybWl0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgYEF0ICR7cGF0aH0gZXhwZWN0ZWQgJHtwZXJtaXR9IG5vdCAke3R5cGVvZiB2YWx1ZX1gKTtcblxuICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICB9XG4gICAgICAgfVxuICAgICB9XG5cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCBgVW5leHBlY3RlZCB3aGl0ZWxpc3QgcGVybWl0ICR7cGVybWl0fSBhdCAke3BhdGh9YCk7XG4gICB9XG5cbiAgLypcbiAgICogaXNBbGxvd2VkUHJvcGVydHkoKVxuICAgKiBDaGVjayB3aGV0aGVyIGEgc2luZ2xlIHByb3BlcnR5IGlzIGFsbG93ZWQuXG4gICAqL1xuICBmdW5jdGlvbiBpc0FsbG93ZWRQcm9wZXJ0eShwYXRoLCBvYmosIHByb3AsIHBlcm1pdCkge1xuICAgIGNvbnN0IGRlc2M9ICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcblxuICAgIC8vIElzIHRoaXMgYSB2YWx1ZSBwcm9wZXJ0eT9cbiAgICBpZiggb2JqZWN0SGFzT3duUHJvcGVydHkoZGVzYywgJ3ZhbHVlJykpIHtcbiAgICAgIGlmKCBpc0FjY2Vzc29yUGVybWl0KHBlcm1pdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvciggYEFjY2Vzc29yIGV4cGVjdGVkIGF0ICR7cGF0aH1gKTtcbiAgICAgICB9XG4gICAgICByZXR1cm4gaXNBbGxvd2VkUHJvcGVydHlWYWx1ZShwYXRoLCBkZXNjLnZhbHVlLCBwcm9wLCBwZXJtaXQpO1xuICAgICB9XG4gICAgaWYoICFpc0FjY2Vzc29yUGVybWl0KHBlcm1pdCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIGBBY2Nlc3NvciBub3QgZXhwZWN0ZWQgYXQgJHtwYXRofWApO1xuICAgICB9XG4gICAgcmV0dXJuKFxuICAgICAgaXNBbGxvd2VkUHJvcGVydHlWYWx1ZSggYCR7cGF0aH08Z2V0PmAsZGVzYy5nZXQsIHByb3AsIHBlcm1pdC5nZXQpJiZcbiAgICAgIGlzQWxsb3dlZFByb3BlcnR5VmFsdWUoIGAke3BhdGh9PHNldD5gLGRlc2Muc2V0LCBwcm9wLCBwZXJtaXQuc2V0KSk7XG5cbiAgIH1cblxuICAvKlxuICAgKiBnZXRTdWJQZXJtaXQoKVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3ViUGVybWl0KG9iaiwgcGVybWl0LCBwcm9wKSB7XG4gICAgY29uc3QgcGVybWl0UHJvcD0gIHByb3A9PT0gICdfX3Byb3RvX18nPyAgJy0tcHJvdG8tLSc6ICBwcm9wO1xuICAgIGlmKCBvYmplY3RIYXNPd25Qcm9wZXJ0eShwZXJtaXQsIHBlcm1pdFByb3ApKSB7XG4gICAgICByZXR1cm4gcGVybWl0W3Blcm1pdFByb3BdO1xuICAgICB9XG5cbiAgICBpZiggdHlwZW9mIG9iaj09PSAgJ2Z1bmN0aW9uJykge1xuICAgICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24ob2JqKTtcbiAgICAgIGlmKCBvYmplY3RIYXNPd25Qcm9wZXJ0eShGdW5jdGlvbkluc3RhbmNlLCBwZXJtaXRQcm9wKSkge1xuICAgICAgICByZXR1cm4gRnVuY3Rpb25JbnN0YW5jZVtwZXJtaXRQcm9wXTtcbiAgICAgICB9XG4gICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICB9XG5cbiAgLypcbiAgICogdmlzaXRQcm9wZXJ0aWVzKClcbiAgICogVmlzaXQgYWxsIHByb3BlcnRpZXMgZm9yIGEgcGVybWl0LlxuICAgKi9cbiAgZnVuY3Rpb24gdmlzaXRQcm9wZXJ0aWVzKHBhdGgsIG9iaiwgcGVybWl0KSB7XG4gICAgaWYoIG9iaj09PSAgdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgIH1cblxuICAgIGNvbnN0IHByb3RvTmFtZT0gIHBlcm1pdFsnW1tQcm90b11dJ107XG4gICAgdmlzaXRQcm90b3R5cGUocGF0aCwgb2JqLCBwcm90b05hbWUpO1xuXG4gICAgZm9yKCBjb25zdCBwcm9wIG9mIG93bktleXMob2JqKSkge1xuICAgICAgY29uc3QgcHJvcFN0cmluZz0gIGFzU3RyaW5nUHJvcGVydHlOYW1lKHBhdGgsIHByb3ApO1xuICAgICAgY29uc3Qgc3ViUGF0aD0gICBgJHtwYXRofS4ke3Byb3BTdHJpbmd9YDtcbiAgICAgIGNvbnN0IHN1YlBlcm1pdD0gIGdldFN1YlBlcm1pdChvYmosIHBlcm1pdCwgcHJvcFN0cmluZyk7XG5cbiAgICAgIGlmKCAhc3ViUGVybWl0fHwgICFpc0FsbG93ZWRQcm9wZXJ0eShzdWJQYXRoLCBvYmosIHByb3AsIHN1YlBlcm1pdCkpIHtcbiAgICAgICAgLy8gRWl0aGVyIHRoZSBvYmplY3QgbGFja3MgYSBwZXJtaXQgb3IgdGhlIG9iamVjdCBkb2Vzbid0IG1hdGNoIHRoZVxuICAgICAgICAvLyBwZXJtaXQuXG4gICAgICAgIC8vIElmIHRoZSBwZXJtaXQgaXMgc3BlY2lmaWNhbGx5IGZhbHNlLCBub3QgbWVyZWx5IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gdGhpcyBpcyBhIHByb3BlcnR5IHdlIGV4cGVjdCB0byBzZWUgYmVjYXVzZSB3ZSBrbm93IGl0IGV4aXN0cyBpblxuICAgICAgICAvLyBzb21lIGVudmlyb25tZW50cyBhbmQgd2UgaGF2ZSBleHByZXNzbHkgZGVjaWRlZCB0byBleGNsdWRlIGl0LlxuICAgICAgICAvLyBBbnkgb3RoZXIgZGlzYWxsb3dlZCBwcm9wZXJ0eSBpcyBvbmUgd2UgaGF2ZSBub3QgYXVkaXRlZCBhbmQgd2UgbG9nXG4gICAgICAgIC8vIHRoYXQgd2UgYXJlIHJlbW92aW5nIGl0IHNvIHdlIGtub3cgdG8gbG9vayBpbnRvIGl0LCBhcyBoYXBwZW5zIHdoZW5cbiAgICAgICAgLy8gdGhlIGxhbmd1YWdlIGV2b2x2ZXMgbmV3IGZlYXR1cmVzIHRvIGV4aXN0aW5nIGludHJpbnNpY3MuXG4gICAgICAgIGlmKCBzdWJQZXJtaXQhPT0gIGZhbHNlKSB7XG4gICAgICAgICAgLy8gVGhpcyBjYWxsIHRvIGBjb25zb2xlLndhcm5gIGlzIGludGVudGlvbmFsLiBJdCBpcyBub3QgYSB2ZXN0aWdlIG9mXG4gICAgICAgICAgLy8gYSBkZWJ1Z2dpbmcgYXR0ZW1wdC4gU2VlIHRoZSBjb21tZW50IGF0IHRvcCBvZiBmaWxlIGZvciBhblxuICAgICAgICAgIC8vIGV4cGxhbmF0aW9uLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICAgICAgY29uc29sZS53YXJuKCBgUmVtb3ZpbmcgJHtzdWJQYXRofWApO1xuICAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGRlbGV0ZSBvYmpbcHJvcF07XG4gICAgICAgICB9Y2F0Y2goIGVycikge1xuICAgICAgICAgIGlmKCBwcm9wIGluIG9iaikge1xuICAgICAgICAgICAgaWYoIHR5cGVvZiBvYmo9PT0gICdmdW5jdGlvbicmJiAgcHJvcD09PSAgJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICAgICAgb2JqLnByb3RvdHlwZT0gIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgaWYoIG9iai5wcm90b3R5cGU9PT0gIHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCBgVG9sZXJhdGluZyB1bmRlbGV0YWJsZSAke3N1YlBhdGh9ID09PSB1bmRlZmluZWRgKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgICAgICAgICAgY29uc29sZS5lcnJvciggYGZhaWxlZCB0byBkZWxldGUgJHtzdWJQYXRofWAsZXJyKTtcbiAgICAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIGBkZWxldGluZyAke3N1YlBhdGh9IHRocmV3YCxlcnIpO1xuICAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuICAgfVxuXG4gIC8vIFN0YXJ0IHBhdGggd2l0aCAnaW50cmluc2ljcycgdG8gY2xhcmlmeSB0aGF0IHByb3BlcnRpZXMgYXJlIG5vdFxuICAvLyByZW1vdmVkIGZyb20gdGhlIGdsb2JhbCBvYmplY3QgYnkgdGhlIHdoaXRlbGlzdGluZyBvcGVyYXRpb24uXG4gIHZpc2l0UHJvcGVydGllcygnaW50cmluc2ljcycsIGludHJpbnNpY3MsIHdoaXRlbGlzdCk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIHdoaXRlbGlzdEludHJpbnNpY3MpO1xufSlcbixcbi8vID09PSBmdW5jdG9yc1s0Ml0gPT09XG4oKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGRVJBTF9GVU5DVElPTixGRVJBTF9FVkFMLFR5cGVFcnJvcixhcnJheUZpbHRlcixhcnJheU1hcCxnbG9iYWxUaGlzLGlzLG93bktleXMsc3RyaW5nU3BsaXQsbm9FdmFsRXZhbHVhdGUsZW5Kb2luLG1ha2VIYXJkZW5lcixtYWtlSW50cmluc2ljc0NvbGxlY3Rvcix3aGl0ZWxpc3RJbnRyaW5zaWNzLHRhbWVGdW5jdGlvbkNvbnN0cnVjdG9ycyx0YW1lRGF0ZUNvbnN0cnVjdG9yLHRhbWVNYXRoT2JqZWN0LHRhbWVSZWdFeHBDb25zdHJ1Y3RvcixlbmFibGVQcm9wZXJ0eU92ZXJyaWRlcyx0YW1lTG9jYWxlTWV0aG9kcyxzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXMsc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXMsc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9ycyxtYWtlU2FmZUV2YWx1YXRvcixpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lcyx0YW1lRnVuY3Rpb25Ub1N0cmluZyx0YW1lRG9tYWlucyx0YW1lQ29uc29sZSx0YW1lRXJyb3JDb25zdHJ1Y3Rvcixhc3NlcnQsbWFrZUFzc2VydCxtYWtlRW52aXJvbm1lbnRDYXB0b3IsZ2V0QW5vbnltb3VzSW50cmluc2ljcyxtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcjskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbnMuanNcIiwgW1tcIkZFUkFMX0ZVTkNUSU9OXCIsIFskaOKAjV9hID0+IChGRVJBTF9GVU5DVElPTiA9ICRo4oCNX2EpXV0sW1wiRkVSQUxfRVZBTFwiLCBbJGjigI1fYSA9PiAoRkVSQUxfRVZBTCA9ICRo4oCNX2EpXV0sW1wiVHlwZUVycm9yXCIsIFskaOKAjV9hID0+IChUeXBlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFycmF5RmlsdGVyXCIsIFskaOKAjV9hID0+IChhcnJheUZpbHRlciA9ICRo4oCNX2EpXV0sW1wiYXJyYXlNYXBcIiwgWyRo4oCNX2EgPT4gKGFycmF5TWFwID0gJGjigI1fYSldXSxbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXSxbXCJpc1wiLCBbJGjigI1fYSA9PiAoaXMgPSAkaOKAjV9hKV1dLFtcIm93bktleXNcIiwgWyRo4oCNX2EgPT4gKG93bktleXMgPSAkaOKAjV9hKV1dLFtcInN0cmluZ1NwbGl0XCIsIFskaOKAjV9hID0+IChzdHJpbmdTcGxpdCA9ICRo4oCNX2EpXV0sW1wibm9FdmFsRXZhbHVhdGVcIiwgWyRo4oCNX2EgPT4gKG5vRXZhbEV2YWx1YXRlID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3Ivc3RyaW5naWZ5LXV0aWxzLmpzXCIsIFtbXCJlbkpvaW5cIiwgWyRo4oCNX2EgPT4gKGVuSm9pbiA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2UtaGFyZGVuZXIuanNcIiwgW1tcIm1ha2VIYXJkZW5lclwiLCBbJGjigI1fYSA9PiAobWFrZUhhcmRlbmVyID0gJGjigI1fYSldXV1dLFtcIi4vaW50cmluc2ljcy5qc1wiLCBbW1wibWFrZUludHJpbnNpY3NDb2xsZWN0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vd2hpdGVsaXN0LWludHJpbnNpY3MuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHdoaXRlbGlzdEludHJpbnNpY3MgPSAkaOKAjV9hKV1dXV0sW1wiLi90YW1lLWZ1bmN0aW9uLWNvbnN0cnVjdG9ycy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZUZ1bmN0aW9uQ29uc3RydWN0b3JzID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS1kYXRlLWNvbnN0cnVjdG9yLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+ICh0YW1lRGF0ZUNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vdGFtZS1tYXRoLW9iamVjdC5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZU1hdGhPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi90YW1lLXJlZ2V4cC1jb25zdHJ1Y3Rvci5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAodGFtZVJlZ0V4cENvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZW5hYmxlLXByb3BlcnR5LW92ZXJyaWRlcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAoZW5hYmxlUHJvcGVydHlPdmVycmlkZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi90YW1lLWxvY2FsZS1tZXRob2RzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+ICh0YW1lTG9jYWxlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2dsb2JhbC1vYmplY3QuanNcIiwgW1tcInNldEdsb2JhbE9iamVjdENvbnN0YW50UHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzID0gJGjigI1fYSldXSxbXCJzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllc1wiLCBbJGjigI1fYSA9PiAoc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXMgPSAkaOKAjV9hKV1dLFtcInNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnNcIiwgWyRo4oCNX2EgPT4gKHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlLXNhZmUtZXZhbHVhdG9yLmpzXCIsIFtbXCJtYWtlU2FmZUV2YWx1YXRvclwiLCBbJGjigI1fYSA9PiAobWFrZVNhZmVFdmFsdWF0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi93aGl0ZWxpc3QuanNcIiwgW1tcImluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzXCIsIFskaOKAjV9hID0+IChpbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhbWUtZnVuY3Rpb24tdG9zdHJpbmcuanNcIiwgW1tcInRhbWVGdW5jdGlvblRvU3RyaW5nXCIsIFskaOKAjV9hID0+ICh0YW1lRnVuY3Rpb25Ub1N0cmluZyA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhbWUtZG9tYWlucy5qc1wiLCBbW1widGFtZURvbWFpbnNcIiwgWyRo4oCNX2EgPT4gKHRhbWVEb21haW5zID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IvdGFtZS1jb25zb2xlLmpzXCIsIFtbXCJ0YW1lQ29uc29sZVwiLCBbJGjigI1fYSA9PiAodGFtZUNvbnNvbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci90YW1lLWVycm9yLWNvbnN0cnVjdG9yLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+ICh0YW1lRXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcIm1ha2VBc3NlcnRcIiwgWyRo4oCNX2EgPT4gKG1ha2VBc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbnZpcm9ubWVudC1vcHRpb25zLmpzXCIsIFtbXCJtYWtlRW52aXJvbm1lbnRDYXB0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbnZpcm9ubWVudENhcHRvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2dldC1hbm9ueW1vdXMtaW50cmluc2ljcy5qc1wiLCBbW1wiZ2V0QW5vbnltb3VzSW50cmluc2ljc1wiLCBbJGjigI1fYSA9PiAoZ2V0QW5vbnltb3VzSW50cmluc2ljcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LXNoaW0uanNcIiwgW1tcIm1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtpbXBvcnQoJy4uL2luZGV4LmpzJykuTG9ja2Rvd25PcHRpb25zfSBMb2NrZG93bk9wdGlvbnMgKi9cblxuY29uc3QgeyBGYWlsLCBkZXRhaWxzOiBkLCBxdW90ZTogcX09ICAgYXNzZXJ0O1xuXG4vKiogQHR5cGUge0Vycm9yPX0gKi9cbmxldCBwcmlvckxvY2tkb3duO1xuXG4vLyBCdWlsZCBhIGhhcmRlbigpIHdpdGggYW4gZW1wdHkgZnJpbmdlLlxuLy8gR2F0ZSBpdCBvbiBsb2NrZG93bi5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gcmVmXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgaGFyZGVuPSAgbWFrZUhhcmRlbmVyKCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIFRyYW5zZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb21wYXJ0bWVudENvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge09iamVjdH0gZW5kb3dtZW50c1xuICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZU1hcFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtBcnJheTxUcmFuc2Zvcm0+fSBbb3B0aW9ucy50cmFuc2Zvcm1zXVxuICogQHBhcmFtIHtBcnJheTxUcmFuc2Zvcm0+fSBbb3B0aW9ucy5fX3NoaW1UcmFuc2Zvcm1zX19dXG4gKi9cblxuLy8gVE9ETyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzgxNFxuLy8gTG9ja2Rvd24gY3VycmVudGx5IGFsbG93cyBtdWx0aXBsZSBjYWxscyBwcm92aWRlZCB0aGF0IHRoZSBzcGVjaWZpZWQgb3B0aW9uc1xuLy8gb2YgZXZlcnkgY2FsbCBhZ3JlZS4gIFdpdGggZXhwZXJpZW5jZSwgd2UgaGF2ZSBvYnNlcnZlZCB0aGF0IGxvY2tkb3duIHNob3VsZFxuLy8gb25seSBldmVyIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgYW5kIHRoYXQgc2ltcGxpZnlpbmcgbG9ja2Rvd24gd2lsbCBpbXByb3ZlXG4vLyB0aGUgcXVhbGl0eSBvZiBhdWRpdHMuXG5cbmNvbnN0IGFzc2VydERpcmVjdEV2YWxBdmFpbGFibGU9ICAoKT0+ICB7XG4gIGxldCBhbGxvd2VkPSAgZmFsc2U7XG4gIHRyeSB7XG4gICAgYWxsb3dlZD0gIEZFUkFMX0ZVTkNUSU9OKFxuICAgICAgJ2V2YWwnLFxuICAgICAgJ1NFU19jaGFuZ2VkJyxcbiAgICAgICBgXFxcbiAgICAgICAgZXZhbChcIlNFU19jaGFuZ2VkID0gdHJ1ZVwiKTtcbiAgICAgICAgcmV0dXJuIFNFU19jaGFuZ2VkO1xuICAgICAgYCkoXG4gICAgICBGRVJBTF9FVkFMLCBmYWxzZSk7XG4gICAgLy8gSWYgd2UgZ2V0IGhlcmUgYW5kIFNFU19jaGFuZ2VkIHN0YXllZCBmYWxzZSwgdGhhdCBtZWFucyB0aGUgZXZhbCB3YXMgc2xvcHB5XG4gICAgLy8gYW5kIGluZGlyZWN0LCB3aGljaCBnZW5lcmFsbHkgY3JlYXRlcyBhIG5ldyBnbG9iYWwuXG4gICAgLy8gV2UgYXJlIGdvaW5nIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgZmFpbGluZyB0byBpbml0aWFsaXplIFNFUywgYnV0XG4gICAgLy8gZ29vZCBuZWlnaGJvcnMgY2xlYW4gdXAuXG4gICAgaWYoICFhbGxvd2VkKSB7XG4gICAgICBkZWxldGUgZ2xvYmFsVGhpcy5TRVNfY2hhbmdlZDtcbiAgICAgfVxuICAgfWNhdGNoKCBfZXJyb3IpIHtcbiAgICAvLyBXZSByZWFjaCBoZXJlIGlmIGV2YWwgaXMgb3V0cmlnaHQgZm9yYmlkZGVuIGJ5IGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gICAgLy8gV2UgYWxsb3cgdGhpcyBmb3IgU0VTIHVzYWdlIHRoYXQgZGVsZWdhdGVzIHRoZSByZXNwb25zaWJpbGl0eSB0byBpc29sYXRlXG4gICAgLy8gZ3Vlc3QgY29kZSB0byBwcm9kdWN0aW9uIGNvZGUgZ2VuZXJhdGlvbi5cbiAgICBhbGxvd2VkPSAgdHJ1ZTtcbiAgIH1cbiAgaWYoICFhbGxvd2VkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICBgU0VTIGNhbm5vdCBpbml0aWFsaXplIHVubGVzcyAnZXZhbCcgaXMgdGhlIG9yaWdpbmFsIGludHJpbnNpYyAnZXZhbCcsIHN1aXRhYmxlIGZvciBkaXJlY3QtZXZhbCAoZHluYW1pY2FsbHkgc2NvcGVkIGV2YWwpIChTRVNfRElSRUNUX0VWQUwpYCk7XG5cbiAgIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TG9ja2Rvd25PcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoKSA9PiB2b2lkfSByZXBhaXJJbnRyaW5zaWNzXG4gKi9cbmNvbnN0ICAgICAgICByZXBhaXJJbnRyaW5zaWNzPSAgKG9wdGlvbnM9ICB7fSk9PiAge1xuICAvLyBGaXJzdCB0aW1lLCBhYnNlbnQgb3B0aW9ucyBkZWZhdWx0IHRvICdzYWZlJy5cbiAgLy8gU3Vic2VxdWVudCB0aW1lcywgYWJzZW50IG9wdGlvbnMgZGVmYXVsdCB0byBmaXJzdCBvcHRpb25zLlxuICAvLyBUaHVzLCBhbGwgcHJlc2VudCBvcHRpb25zIG11c3QgYWdyZWUgd2l0aCBmaXJzdCBvcHRpb25zLlxuICAvLyBSZWNvbnN0cnVjdGluZyBgb3B0aW9uYCBoZXJlIGFsc28gZW5zdXJlcyB0aGF0IGl0IGlzIGEgd2VsbFxuICAvLyBiZWhhdmVkIHJlY29yZCwgd2l0aCBvbmx5IG93biBkYXRhIHByb3BlcnRpZXMuXG4gIC8vXG4gIC8vIFRoZSBgb3ZlcnJpZGVUYW1pbmdgIGlzIG5vdCBhIHNhZmV0eSBpc3N1ZS4gUmF0aGVyIGl0IGlzIGEgdHJhZGVvZmZcbiAgLy8gYmV0d2VlbiBjb2RlIGNvbXBhdGliaWxpdHksIHdoaWNoIGlzIGJldHRlciB3aXRoIHRoZSBgJ21vZGVyYXRlJ2BcbiAgLy8gc2V0dGluZywgYW5kIHRvb2wgY29tcGF0aWJpbGl0eSwgd2hpY2ggaXMgYmV0dGVyIHdpdGggdGhlIGAnbWluJ2BcbiAgLy8gc2V0dGluZy4gU2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL1JFQURNRS5tZCNlbmFibGluZy1vdmVycmlkZS1ieS1hc3NpZ25tZW50KVxuICAvLyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2hlbiB0byB1c2Ugd2hpY2guXG4gIC8vXG4gIC8vIFRoZSBgc3RhY2tGaWx0ZXJpbmdgIGlzIG5vdCBhIHNhZmV0eSBpc3N1ZS4gUmF0aGVyIGl0IGlzIGEgdHJhZGVvZmZcbiAgLy8gYmV0d2VlbiByZWxldmFuY2UgYW5kIGNvbXBsZXRlbmVzcyBvZiB0aGUgc3RhY2sgZnJhbWVzIHNob3duIG9uIHRoZVxuICAvLyBjb25zb2xlLiBTZXR0aW5nYHN0YWNrRmlsdGVyaW5nYCB0byBgJ3ZlcmJvc2UnYCBhcHBsaWVzIG5vIGZpbHRlcnMsIHByb3ZpZGluZ1xuICAvLyB0aGUgcmF3IHN0YWNrIGZyYW1lcyB0aGF0IGNhbiBiZSBxdWl0ZSB2ZXJzYm9zZS4gU2V0dGluZ1xuICAvLyBgc3RhY2tGcmFtZUZpbHRlcmluZ2AgdG9gJ2NvbmNpc2UnYCBsaW1pdHMgdGhlIGRpc3BsYXkgdG8gdGhlIHN0YWNrIGZyYW1lXG4gIC8vIGluZm9ybWF0aW9uIG1vc3QgbGlrZWx5IHRvIGJlIHJlbGV2YW50LCBlbGltaW5hdGluZyBkaXN0cmFjdGluZyBmcmFtZXNcbiAgLy8gc3VjaCBhcyB0aG9zZSBmcm9tIHRoZSBpbmZyYXN0cnVjdHVyZS4gSG93ZXZlciwgdGhlIGJ1ZyB5b3UncmUgdHJ5aW5nIHRvXG4gIC8vIHRyYWNrIGRvd24gbWlnaHQgYmUgaW4gdGhlIGluZnJhc3RydXJlLCBpbiB3aGljaCBjYXNlIHRoZSBgJ3ZlcmJvc2UnYCBzZXR0aW5nXG4gIC8vIGlzIHVzZWZ1bC4gU2VlXG4gIC8vIFtgc3RhY2tGaWx0ZXJpbmdgIG9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvU0VTLXNoaW0vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2xvY2tkb3duLW9wdGlvbnMubWQjc3RhY2tmaWx0ZXJpbmctb3B0aW9ucylcbiAgLy8gZm9yIGFuIGV4cGxhbmF0aW9uLlxuXG4gIGNvbnN0IHtcbiAgICBnZXRFbnZpcm9ubWVudE9wdGlvbjogZ2V0ZW52LFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc309XG4gICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyk7XG5cbiAgY29uc3Qge1xuICAgIGVycm9yVGFtaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9FUlJPUl9UQU1JTkcnLCAnc2FmZScpLFxuICAgIGVycm9yVHJhcHBpbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX0VSUk9SX1RSQVBQSU5HJywgJ3BsYXRmb3JtJyksXG4gICAgdW5oYW5kbGVkUmVqZWN0aW9uVHJhcHBpbmc9ICBnZXRlbnYoXG4gICAgICAnTE9DS0RPV05fVU5IQU5ETEVEX1JFSkVDVElPTl9UUkFQUElORycsXG4gICAgICAncmVwb3J0JyksXG5cbiAgICByZWdFeHBUYW1pbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX1JFR0VYUF9UQU1JTkcnLCAnc2FmZScpLFxuICAgIGxvY2FsZVRhbWluZz0gIGdldGVudignTE9DS0RPV05fTE9DQUxFX1RBTUlORycsICdzYWZlJyksXG4gICAgY29uc29sZVRhbWluZz0gIGdldGVudignTE9DS0RPV05fQ09OU09MRV9UQU1JTkcnLCAnc2FmZScpLFxuICAgIG92ZXJyaWRlVGFtaW5nPSAgZ2V0ZW52KCdMT0NLRE9XTl9PVkVSUklERV9UQU1JTkcnLCAnbW9kZXJhdGUnKSxcbiAgICBzdGFja0ZpbHRlcmluZz0gIGdldGVudignTE9DS0RPV05fU1RBQ0tfRklMVEVSSU5HJywgJ2NvbmNpc2UnKSxcbiAgICBkb21haW5UYW1pbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX0RPTUFJTl9UQU1JTkcnLCAnc2FmZScpLFxuICAgIGV2YWxUYW1pbmc9ICBnZXRlbnYoJ0xPQ0tET1dOX0VWQUxfVEFNSU5HJywgJ3NhZmVFdmFsJyksXG4gICAgb3ZlcnJpZGVEZWJ1Zz0gIGFycmF5RmlsdGVyKFxuICAgICAgc3RyaW5nU3BsaXQoZ2V0ZW52KCdMT0NLRE9XTl9PVkVSUklERV9ERUJVRycsICcnKSwgJywnKSxcbiAgICAgIC8qKiBAcGFyYW0ge3N0cmluZ30gZGVidWdOYW1lICovXG4gICAgICAoZGVidWdOYW1lKT0+ZGVidWdOYW1lIT09ICAnJyksXG5cbiAgICBkYXRlVGFtaW5nPSAgJ3NhZmUnLCAvLyBkZXByZWNhdGVkXG4gICAgbWF0aFRhbWluZz0gICdzYWZlJywgLy8gZGVwcmVjYXRlZFxuICAgIC4uLmV4dHJhT3B0aW9uc309XG4gICAgICBvcHRpb25zO1xuXG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0gIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcygpO1xuICBpZiggY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLmxlbmd0aD4gIDApIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGNvbnNvbGUud2FybihcbiAgICAgICBgU0VTIExvY2tkb3duIHVzaW5nIG9wdGlvbnMgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgJHtlbkpvaW4oXG4gICAgICAgIGFycmF5TWFwKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgcSksXG4gICAgICAgICdhbmQnKVxuICAgICAgICB9YCk7XG5cbiAgIH1cblxuICBldmFsVGFtaW5nPT09ICAndW5zYWZlRXZhbCd8fFxuICAgIGV2YWxUYW1pbmc9PT0gICdzYWZlRXZhbCd8fFxuICAgIGV2YWxUYW1pbmc9PT0gICdub0V2YWwnfHxcbiAgICBGYWlsIGBsb2NrZG93bigpOiBub24gc3VwcG9ydGVkIG9wdGlvbiBldmFsVGFtaW5nOiAke3EoZXZhbFRhbWluZyl9YDtcblxuICAvLyBBc3NlcnQgdGhhdCBvbmx5IHN1cHBvcnRlZCBvcHRpb25zIHdlcmUgcGFzc2VkLlxuICAvLyBVc2UgUmVmbGVjdC5vd25LZXlzIHRvIHJlamVjdCBzeW1ib2wtbmFtZWQgcHJvcGVydGllcyBhcyB3ZWxsLlxuICBjb25zdCBleHRyYU9wdGlvbnNOYW1lcz0gIG93bktleXMoZXh0cmFPcHRpb25zKTtcbiAgZXh0cmFPcHRpb25zTmFtZXMubGVuZ3RoPT09ICAwfHxcbiAgICBGYWlsIGBsb2NrZG93bigpOiBub24gc3VwcG9ydGVkIG9wdGlvbiAke3EoZXh0cmFPcHRpb25zTmFtZXMpfWA7XG5cbiAgcHJpb3JMb2NrZG93bj09PSAgdW5kZWZpbmVkfHxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgZCBgQWxyZWFkeSBsb2NrZWQgZG93biBhdCAke3ByaW9yTG9ja2Rvd259IChTRVNfQUxSRUFEWV9MT0NLRURfRE9XTilgLFxuICAgICAgVHlwZUVycm9yKTtcblxuICBwcmlvckxvY2tkb3duPSAgbmV3IFR5cGVFcnJvcignUHJpb3IgbG9ja2Rvd24gKFNFU19BTFJFQURZX0xPQ0tFRF9ET1dOKScpO1xuICAvLyBUZWFzZSBWOCB0byBnZW5lcmF0ZSB0aGUgc3RhY2sgc3RyaW5nIGFuZCByZWxlYXNlIHRoZSBjbG9zdXJlcyB0aGUgc3RhY2tcbiAgLy8gdHJhY2UgcmV0YWluZWQ6XG4gIHByaW9yTG9ja2Rvd24uc3RhY2s7XG5cbiAgYXNzZXJ0RGlyZWN0RXZhbEF2YWlsYWJsZSgpO1xuXG4gIC8qKlxuICAgKiBCZWNhdXNlIG9mIHBhY2thZ2VycyBhbmQgYnVuZGxlcnMsIGV0YywgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgbG9ja2Rvd25cbiAgICogbWlnaHQgaGFwcGVuIGluIHNlcGFyYXRlIGluc3RhbnRpYXRpb25zIG9mIHRoZSBzb3VyY2Ugb2YgdGhpcyBtb2R1bGUuXG4gICAqIEluIHRoYXQgY2FzZSwgZWFjaCBvbmUgc2VlcyBpdHMgb3duIGBmaXJzdE9wdGlvbnNgIHZhcmlhYmxlLCBzbyB0aGUgdGVzdFxuICAgKiBhYm92ZSB3aWxsIG5vdCBkZXRlY3QgdGhhdCBsb2NrZG93biBoYXMgYWxyZWFkeSBoYXBwZW5lZC4gV2VcbiAgICogdW5yZWxpYWJseSB0ZXN0IHNvbWUgdGVsbHRhbGUgc2lnbnMgdGhhdCBsb2NrZG93biBoYXMgcnVuLCB0byBhdm9pZFxuICAgKiB0cnlpbmcgdG8gbG9jayBkb3duIGEgbG9ja2VkIGRvd24gZW52aXJvbm1lbnQuIEFsdGhvdWdoIHRoZSB0ZXN0IGlzXG4gICAqIHVucmVsaWFibGUsIHRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBTRVMgdGhyZWF0IG1vZGVsLiBTRVMgcHJvdmlkZXNcbiAgICogc2VjdXJpdHkgb25seSBpZiBpdCBydW5zIGZpcnN0IGluIGEgZ2l2ZW4gcmVhbG0sIG9yIGlmIGV2ZXJ5dGhpbmcgdGhhdFxuICAgKiBydW5zIGJlZm9yZSBpdCBpcyBTRVMtYXdhcmUgYW5kIGNvb3BlcmF0aXZlLiBOZWl0aGVyIFNFUyBub3IgYW55dGhpbmdcbiAgICogY2FuIHByb3RlY3QgaXRzZWxmIGZyb20gY29ycnVwdGluZyBjb2RlIHRoYXQgcnVucyBmaXJzdC4gRm9yIHRoZXNlXG4gICAqIHB1cnBvc2VzLCBjb2RlIHRoYXQgdHVybnMgYSByZWFsbSBpbnRvIHNvbWV0aGluZyB0aGF0IHBhc3NlcyB0aGVzZVxuICAgKiB0ZXN0cyB3aXRob3V0IGFjdHVhbGx5IGxvY2tpbmcgZG93biBjb3VudHMgYXMgY29ycnVwdGluZyBjb2RlLlxuICAgKlxuICAgKiBUaGUgc3BlY2lmaWNzIG9mIHdoYXQgdGhpcyB0ZXN0cyBmb3IgbWF5IGNoYW5nZSBvdmVyIHRpbWUsIGJ1dCBpdFxuICAgKiBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIGFueSBzZXR0aW5nIG9mIHRoZSBsb2NrZG93biBvcHRpb25zLlxuICAgKi9cbiAgY29uc3Qgc2VlbXNUb0JlTG9ja2VkRG93bj0gICgpPT4gIHtcbiAgICByZXR1cm4oXG4gICAgICBnbG9iYWxUaGlzLkZ1bmN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciE9PSAgZ2xvYmFsVGhpcy5GdW5jdGlvbiYmXG4gICAgICAvLyBAdHMtaWdub3JlIGhhcmRlbiBpcyBhYnNlbnQgb24gZ2xvYmFsVGhpcyB0eXBlIGRlZi5cbiAgICAgIHR5cGVvZiBnbG9iYWxUaGlzLmhhcmRlbj09PSAgJ2Z1bmN0aW9uJyYmXG4gICAgICAvLyBAdHMtaWdub3JlIGxvY2tkb3duIGlzIGFic2VudCBvbiBnbG9iYWxUaGlzIHR5cGUgZGVmLlxuICAgICAgdHlwZW9mIGdsb2JhbFRoaXMubG9ja2Rvd249PT0gICdmdW5jdGlvbicmJlxuICAgICAgZ2xvYmFsVGhpcy5EYXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciE9PSAgZ2xvYmFsVGhpcy5EYXRlJiZcbiAgICAgIHR5cGVvZiBnbG9iYWxUaGlzLkRhdGUubm93PT09ICAnZnVuY3Rpb24nJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgZG9lcyBub3QgcmVjb2duaXplIHRoYXQgRGF0ZSBjb25zdHJ1Y3RvciBpcyBhIHNwZWNpYWxcbiAgICAgIC8vIEZ1bmN0aW9uLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGlzKGdsb2JhbFRoaXMuRGF0ZS5wcm90b3R5cGUuY29uc3RydWN0b3Iubm93KCksIE5hTikpO1xuXG4gICB9O1xuXG4gIGlmKCBzZWVtc1RvQmVMb2NrZWREb3duKCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgIGBBbHJlYWR5IGxvY2tlZCBkb3duIGJ1dCBub3QgYnkgdGhpcyBTRVMgaW5zdGFuY2UgKFNFU19NVUxUSVBMRV9JTlNUQU5DRVMpYCk7XG5cbiAgIH1cblxuICAvKipcbiAgICogMS4gVEFNRSBwb3dlcnMgJiBnYXRoZXIgaW50cmluc2ljcyBmaXJzdC5cbiAgICovXG5cbiAgdGFtZURvbWFpbnMoZG9tYWluVGFtaW5nKTtcblxuICBjb25zdCB7XG4gICAgYWRkSW50cmluc2ljcyxcbiAgICBjb21wbGV0ZVByb3RvdHlwZXMsXG4gICAgZmluYWxJbnRyaW5zaWNzfT1cbiAgICAgIG1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yKCk7XG5cbiAgYWRkSW50cmluc2ljcyh7IGhhcmRlbn0pO1xuXG4gIGFkZEludHJpbnNpY3ModGFtZUZ1bmN0aW9uQ29uc3RydWN0b3JzKCkpO1xuXG4gIGFkZEludHJpbnNpY3ModGFtZURhdGVDb25zdHJ1Y3RvcihkYXRlVGFtaW5nKSk7XG4gIGFkZEludHJpbnNpY3ModGFtZUVycm9yQ29uc3RydWN0b3IoZXJyb3JUYW1pbmcsIHN0YWNrRmlsdGVyaW5nKSk7XG4gIGFkZEludHJpbnNpY3ModGFtZU1hdGhPYmplY3QobWF0aFRhbWluZykpO1xuICBhZGRJbnRyaW5zaWNzKHRhbWVSZWdFeHBDb25zdHJ1Y3RvcihyZWdFeHBUYW1pbmcpKTtcblxuICBhZGRJbnRyaW5zaWNzKGdldEFub255bW91c0ludHJpbnNpY3MoKSk7XG5cbiAgY29tcGxldGVQcm90b3R5cGVzKCk7XG5cbiAgY29uc3QgaW50cmluc2ljcz0gIGZpbmFsSW50cmluc2ljcygpO1xuXG4gIC8qKlxuICAgKiBXcmFwIGNvbnNvbGUgdW5sZXNzIHN1cHByZXNzZWQuXG4gICAqIEF0IHRoZSBtb21lbnQsIHRoZSBjb25zb2xlIGlzIGNvbnNpZGVyZWQgYSBob3N0IHBvd2VyIGluIHRoZSBzdGFydFxuICAgKiBjb21wYXJ0bWVudCwgYW5kIG5vdCBhIHByaW1vcmRpYWwuIEhlbmNlIGl0IGlzIGFic2VudCBmcm9tIHRoZSB3aGlsZWxpc3RcbiAgICogYW5kIGJ5cGFzc2VzIHRoZSBpbnRyaW5zaWNzQ29sbGVjdG9yLlxuICAgKlxuICAgKiBAdHlwZSB7KChlcnJvcjogYW55KSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgbGV0IG9wdEdldFN0YWNrU3RyaW5nO1xuICBpZiggZXJyb3JUYW1pbmchPT0gICd1bnNhZmUnKSB7XG4gICAgb3B0R2V0U3RhY2tTdHJpbmc9ICBpbnRyaW5zaWNzWyclSW5pdGlhbEdldFN0YWNrU3RyaW5nJSddO1xuICAgfVxuICBjb25zdCBjb25zb2xlUmVjb3JkPSAgdGFtZUNvbnNvbGUoXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0YW1lQ29uc29sZSBkb2VzIGl0cyBvd24gaW5wdXQgdmFsaWRhdGlvblxuICAgIGNvbnNvbGVUYW1pbmcsXG4gICAgZXJyb3JUcmFwcGluZyxcbiAgICB1bmhhbmRsZWRSZWplY3Rpb25UcmFwcGluZyxcbiAgICBvcHRHZXRTdGFja1N0cmluZyk7XG5cbiAgZ2xvYmFsVGhpcy5jb25zb2xlPSAgLyoqIEB0eXBlIHtDb25zb2xlfSAqLyAgY29uc29sZVJlY29yZC5jb25zb2xlO1xuXG4gIC8vIEB0cy1pZ25vcmUgYXNzZXJ0IGlzIGFic2VudCBvbiBnbG9iYWxUaGlzIHR5cGUgZGVmLlxuICBpZiggZXJyb3JUYW1pbmc9PT0gICd1bnNhZmUnJiYgIGdsb2JhbFRoaXMuYXNzZXJ0PT09ICBhc3NlcnQpIHtcbiAgICAvLyBJZiBlcnJvclRhbWluZyBpcyAndW5zYWZlJyB3ZSByZXBsYWNlIHRoZSBnbG9iYWwgYXNzZXJ0IHdpdGhcbiAgICAvLyBvbmUgd2hvc2UgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnIGRvZXMgbm90IHJlZGFjdFxuICAgIC8vIHVubWFya2VkIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIElPVywgaXQgYmxhYnMgaW5mb3JtYXRpb24gdGhhdFxuICAgIC8vIHdhcyBzdXBwb3NlZCB0byBiZSBzZWNyZXQgZnJvbSBjYWxsZXJzLCBhcyBhbiBhaWQgdG8gZGVidWdnaW5nXG4gICAgLy8gYXQgYSBmdXJ0aGVyIGNvc3QgaW4gc2FmZXR5LlxuICAgIC8vIEB0cy1pZ25vcmUgYXNzZXJ0IGlzIGFic2VudCBvbiBnbG9iYWxUaGlzIHR5cGUgZGVmLlxuICAgIGdsb2JhbFRoaXMuYXNzZXJ0PSAgbWFrZUFzc2VydCh1bmRlZmluZWQsIHRydWUpO1xuICAgfVxuXG4gIC8vIFJlcGxhY2UgKkxvY2FsZSogbWV0aG9kcyB3aXRoIHRoZWlyIG5vbi1sb2NhbGUgZXF1aXZhbGVudHNcbiAgdGFtZUxvY2FsZU1ldGhvZHMoaW50cmluc2ljcywgbG9jYWxlVGFtaW5nKTtcblxuICAvLyBSZXBsYWNlIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB3aXRoIG9uZSB0aGF0IHJlY29nbml6ZXNcbiAgLy8gc2hpbW1lZCBmdW5jdGlvbnMgYXMgaG9ub3JhcnkgbmF0aXZlIGZ1bmN0aW9ucy5cbiAgY29uc3QgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb249ICB0YW1lRnVuY3Rpb25Ub1N0cmluZygpO1xuXG4gIC8qKlxuICAgKiAyLiBXSElURUxJU1QgdG8gc3RhbmRhcmRpemUgdGhlIGVudmlyb25tZW50LlxuICAgKi9cblxuICAvLyBSZW1vdmUgbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMuXG4gIC8vIEFsbCByZW1haW5pbmcgZnVuY3Rpb24gZW5jb3VudGVyZWQgZHVyaW5nIHdoaXRlbGlzdGluZyBhcmVcbiAgLy8gYnJhbmRlZCBhcyBob25vcmFyeSBuYXRpdmUgZnVuY3Rpb25zLlxuICB3aGl0ZWxpc3RJbnRyaW5zaWNzKGludHJpbnNpY3MsIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9uKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBwb3dlcmZ1bCBpbml0aWFsIGdsb2JhbCwgaS5lLiwgdGhlIGdsb2JhbCBvZiB0aGVcbiAgLy8gc3RhcnQgY29tcGFydG1lbnQsIGZyb20gdGhlIGludHJpbnNpY3MuXG5cbiAgc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzKGdsb2JhbFRoaXMpO1xuXG4gIHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzKGdsb2JhbFRoaXMsIHtcbiAgICBpbnRyaW5zaWNzLFxuICAgIG5ld0dsb2JhbFByb3BlcnR5TmFtZXM6IGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzLFxuICAgIG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLFxuICAgIG1hcmtWaXJ0dWFsaXplZE5hdGl2ZUZ1bmN0aW9ufSk7XG5cblxuICBpZiggZXZhbFRhbWluZz09PSAgJ25vRXZhbCcpIHtcbiAgICBzZXRHbG9iYWxPYmplY3RFdmFsdWF0b3JzKFxuICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgIG5vRXZhbEV2YWx1YXRlLFxuICAgICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24pO1xuXG4gICB9ZWxzZSBpZiggZXZhbFRhbWluZz09PSAgJ3NhZmVFdmFsJykge1xuICAgIGNvbnN0IHsgc2FmZUV2YWx1YXRlfT0gICBtYWtlU2FmZUV2YWx1YXRvcih7IGdsb2JhbE9iamVjdDogZ2xvYmFsVGhpc30pO1xuICAgIHNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMoXG4gICAgICBnbG9iYWxUaGlzLFxuICAgICAgc2FmZUV2YWx1YXRlLFxuICAgICAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24pO1xuXG4gICB9ZWxzZSBpZiggZXZhbFRhbWluZz09PSAgJ3Vuc2FmZUV2YWwnKSB7XG4gICAgLy8gTGVhdmUgZXZhbCBmdW5jdGlvbiBhbmQgRnVuY3Rpb24gY29uc3RydWN0b3Igb2YgdGhlIGluaXRpYWwgY29tcGFydG1lbnQgaW4tdGFjdC5cbiAgICAvLyBPdGhlciBjb21wYXJ0bWVudHMgd2lsbCBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlc2UgZXZhbHVhdG9ycyB1bmxlc3MgYSBndWVzdCBwcm9ncmFtXG4gICAgLy8gZXNjYXBlcyBjb250YWlubWVudC5cbiAgIH1cblxuICAvKipcbiAgICogMy4gSEFSREVOIHRvIHNoYXJlIHRoZSBpbnRyaW5zaWNzLlxuICAgKlxuICAgKiBXZSBkZWZpbmUgaGFyZGVuSW50cmluc2ljcyBoZXJlIHNvIHRoYXQgb3B0aW9ucyBhcmUgaW4gc2NvcGUsIGJ1dCByZXR1cm5cbiAgICogaXQgdG8gdGhlIGNhbGxlciBiZWNhdXNlIHdlIGludGVuZCB0byBldmVudHVhbGx5IGFsbG93IHZldHRlZCBzaGltcyB0byBydW5cbiAgICogYmV0d2VlbiByZXBhaXJzIGFuZCB0aGUgaGFyZGVuaW5nIG9mIGludHJpbnNpY3MgYW5kIHNvIHdlIGNhbiBiZW5jaG1hcmtcbiAgICogcmVwYWlyIHNlcGFyYXRlbHkgZnJvbSBoYXJkZW5pbmcuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGhhcmRlbkludHJpbnNpY3MoKSB7XG4gICAgLy8gQ2lyY3VtdmVudCB0aGUgb3ZlcnJpZGUgbWlzdGFrZS5cbiAgICAvLyBUT0RPIGNvbnNpZGVyIG1vdmluZyB0aGlzIHRvIHRoZSBlbmQgb2YgdGhlIHJlcGFpciBwaGFzZSwgYW5kXG4gICAgLy8gdGhlcmVmb3JlIGJlZm9yZSB2ZXR0ZWQgc2hpbXMgcmF0aGVyIHRoYW4gYWZ0ZXJ3YXJkcy4gSXQgaXMgbm90XG4gICAgLy8gY2xlYXIgeWV0IHdoaWNoIGlzIGJldHRlci5cbiAgICAvLyBAdHMtaWdub3JlIGVuYWJsZVByb3BlcnR5T3ZlcnJpZGVzIGRvZXMgaXRzIG93biBpbnB1dCB2YWxpZGF0aW9uXG4gICAgZW5hYmxlUHJvcGVydHlPdmVycmlkZXMoaW50cmluc2ljcywgb3ZlcnJpZGVUYW1pbmcsIG92ZXJyaWRlRGVidWcpO1xuXG4gICAgLy8gRmluYWxseSByZWdpc3RlciBhbmQgb3B0aW9uYWxseSBmcmVlemUgYWxsIHRoZSBpbnRyaW5zaWNzLiBUaGlzXG4gICAgLy8gbXVzdCBiZSB0aGUgb3BlcmF0aW9uIHRoYXQgbW9kaWZpZXMgdGhlIGludHJpbnNpY3MuXG4gICAgaGFyZGVuKGludHJpbnNpY3MpO1xuXG4gICAgLy8gUmV2ZWFsIGhhcmRlbiBhZnRlciBsb2NrZG93bi5cbiAgICAvLyBIYXJkZW4gaXMgZGFuZ2Vyb3VzIGJlZm9yZSBsb2NrZG93biBiZWNhdXNlIGhhcmRlbmluZyBqdXN0XG4gICAgLy8gYWJvdXQgYW55dGhpbmcgd2lsbCBpbmFkdmVydGVudGx5IHJlbmRlciBpbnRyaW5zaWNzIGlycmVwYXJhYmxlLlxuICAgIC8vIEFsc28sIGZvciBtb2R1bGVzIHRoYXQgbXVzdCB3b3JrIGJvdGggYmVmb3JlIG9yIGFmdGVyIGxvY2tkb3duIChjb2RlXG4gICAgLy8gdGhhdCBpcyBwb3J0YWJsZSBiZXR3ZWVuIEpTIGFuZCBTRVMpLCB0aGUgZXhpc3RlbmNlIG9mIGhhcmRlbiBpbiBnbG9iYWxcbiAgICAvLyBzY29wZSBzaWduYWxzIHdoZXRoZXIgc3VjaCBjb2RlIHNob3VsZCBhdHRlbXB0IHRvIHVzZSBoYXJkZW4gaW4gdGhlXG4gICAgLy8gZGVmZW5zZSBvZiBpdHMgb3duIEFQSS5cbiAgICAvLyBAdHMtaWdub3JlIGhhcmRlbiBub3QgeWV0IHJlY29nbml6ZWQgb24gZ2xvYmFsVGhpcy5cbiAgICBnbG9iYWxUaGlzLmhhcmRlbj0gIGhhcmRlbjtcblxuICAgIC8vIFJldHVybmluZyBgdHJ1ZWAgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIEpTIHRvIFNFUyB0cmFuc2l0aW9uLlxuICAgIHJldHVybiB0cnVlO1xuICAgfVxuXG4gIHJldHVybiBoYXJkZW5JbnRyaW5zaWNzO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtMb2NrZG93bk9wdGlvbnN9IFtvcHRpb25zXVxuICovJGjigI1fb25jZS5yZXBhaXJJbnRyaW5zaWNzKHJlcGFpckludHJpbnNpY3MpO1xuY29uc3QgICAgICAgIGxvY2tkb3duPSAgKG9wdGlvbnM9ICB7fSk9PiAge1xuICBjb25zdCBoYXJkZW5JbnRyaW5zaWNzPSAgcmVwYWlySW50cmluc2ljcyhvcHRpb25zKTtcbiAgaGFyZGVuSW50cmluc2ljcygpO1xuIH07JGjigI1fb25jZS5sb2NrZG93bihsb2NrZG93bik7XG59KVxuLFxuLy8gPT09IGZ1bmN0b3JzWzQzXSA9PT1cbigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdsb2JhbFRoaXMsVHlwZUVycm9yLGFzc2lnbix0YW1lRnVuY3Rpb25Ub1N0cmluZyxnZXRHbG9iYWxJbnRyaW5zaWNzLGxvY2tkb3duLG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9jb21tb25zLmpzXCIsIFtbXCJnbG9iYWxUaGlzXCIsIFskaOKAjV9hID0+IChnbG9iYWxUaGlzID0gJGjigI1fYSldXSxbXCJUeXBlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKFR5cGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiYXNzaWduXCIsIFskaOKAjV9hID0+IChhc3NpZ24gPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvdGFtZS1mdW5jdGlvbi10b3N0cmluZy5qc1wiLCBbW1widGFtZUZ1bmN0aW9uVG9TdHJpbmdcIiwgWyRo4oCNX2EgPT4gKHRhbWVGdW5jdGlvblRvU3RyaW5nID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2ludHJpbnNpY3MuanNcIiwgW1tcImdldEdsb2JhbEludHJpbnNpY3NcIiwgWyRo4oCNX2EgPT4gKGdldEdsb2JhbEludHJpbnNpY3MgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbG9ja2Rvd24tc2hpbS5qc1wiLCBbW1wibG9ja2Rvd25cIiwgWyRo4oCNX2EgPT4gKGxvY2tkb3duID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2NvbXBhcnRtZW50LXNoaW0uanNcIiwgW1tcIm1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9lcnJvci9hc3NlcnQuanNcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogZ2V0VGhpcyByZXR1cm5zIGdsb2JhbFRoaXMgaW4gc2xvcHB5IG1vZGUgb3IgdW5kZWZpbmVkIGluIHN0cmljdCBtb2RlLiAqL1xuZnVuY3Rpb24gZ2V0VGhpcygpIHtcbiAgcmV0dXJuIHRoaXM7XG4gfVxuXG5pZiggZ2V0VGhpcygpKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoIGBTRVMgZmFpbGVkIHRvIGluaXRpYWxpemUsIHNsb3BweSBtb2RlIChTRVNfTk9fU0xPUFBZKWApO1xuIH1cblxuY29uc3QgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb249ICB0YW1lRnVuY3Rpb25Ub1N0cmluZygpO1xuXG5jb25zdCBDb21wYXJ0bWVudD0gIG1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yKFxuICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcixcbiAgZ2V0R2xvYmFsSW50cmluc2ljcyhnbG9iYWxUaGlzKSxcbiAgbWFya1ZpcnR1YWxpemVkTmF0aXZlRnVuY3Rpb24pO1xuXG5cbmFzc2lnbihnbG9iYWxUaGlzLCB7XG4gIGxvY2tkb3duLFxuICBDb21wYXJ0bWVudCxcbiAgYXNzZXJ0fSk7XG59KVxuLFxuXTsgLy8gZnVuY3RvcnMgZW5kXG5cbiAgZnVuY3Rpb24gY2VsbChuYW1lLCB2YWx1ZSA9IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG9ic2VydmVycyA9IFtdO1xuICAgIGZ1bmN0aW9uIHNldChuZXdWYWx1ZSkge1xuICAgICAgdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZSBvZiBvYnNlcnZlcnMpIHtcbiAgICAgICAgb2JzZXJ2ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb2JzZXJ2ZShvYnNlcnZlKSB7XG4gICAgICBvYnNlcnZlcnMucHVzaChvYnNlcnZlKTtcbiAgICAgIG9ic2VydmUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBnZXQsIHNldCwgb2JzZXJ2ZSwgZW51bWVyYWJsZTogdHJ1ZSB9O1xuICB9XG5cbiAgY29uc3QgY2VsbHMgPSBbXG4gICAge1xuICAgICAgZ2xvYmFsVGhpczogY2VsbChcImdsb2JhbFRoaXNcIiksXG4gICAgICBBcnJheTogY2VsbChcIkFycmF5XCIpLFxuICAgICAgRGF0ZTogY2VsbChcIkRhdGVcIiksXG4gICAgICBGaW5hbGl6YXRpb25SZWdpc3RyeTogY2VsbChcIkZpbmFsaXphdGlvblJlZ2lzdHJ5XCIpLFxuICAgICAgRmxvYXQzMkFycmF5OiBjZWxsKFwiRmxvYXQzMkFycmF5XCIpLFxuICAgICAgSlNPTjogY2VsbChcIkpTT05cIiksXG4gICAgICBNYXA6IGNlbGwoXCJNYXBcIiksXG4gICAgICBNYXRoOiBjZWxsKFwiTWF0aFwiKSxcbiAgICAgIE51bWJlcjogY2VsbChcIk51bWJlclwiKSxcbiAgICAgIE9iamVjdDogY2VsbChcIk9iamVjdFwiKSxcbiAgICAgIFByb21pc2U6IGNlbGwoXCJQcm9taXNlXCIpLFxuICAgICAgUHJveHk6IGNlbGwoXCJQcm94eVwiKSxcbiAgICAgIFJlZmxlY3Q6IGNlbGwoXCJSZWZsZWN0XCIpLFxuICAgICAgRkVSQUxfUkVHX0VYUDogY2VsbChcIkZFUkFMX1JFR19FWFBcIiksXG4gICAgICBTZXQ6IGNlbGwoXCJTZXRcIiksXG4gICAgICBTdHJpbmc6IGNlbGwoXCJTdHJpbmdcIiksXG4gICAgICBXZWFrTWFwOiBjZWxsKFwiV2Vha01hcFwiKSxcbiAgICAgIFdlYWtTZXQ6IGNlbGwoXCJXZWFrU2V0XCIpLFxuICAgICAgRkVSQUxfRVJST1I6IGNlbGwoXCJGRVJBTF9FUlJPUlwiKSxcbiAgICAgIFJhbmdlRXJyb3I6IGNlbGwoXCJSYW5nZUVycm9yXCIpLFxuICAgICAgUmVmZXJlbmNlRXJyb3I6IGNlbGwoXCJSZWZlcmVuY2VFcnJvclwiKSxcbiAgICAgIFN5bnRheEVycm9yOiBjZWxsKFwiU3ludGF4RXJyb3JcIiksXG4gICAgICBUeXBlRXJyb3I6IGNlbGwoXCJUeXBlRXJyb3JcIiksXG4gICAgICBhc3NpZ246IGNlbGwoXCJhc3NpZ25cIiksXG4gICAgICBjcmVhdGU6IGNlbGwoXCJjcmVhdGVcIiksXG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzOiBjZWxsKFwiZGVmaW5lUHJvcGVydGllc1wiKSxcbiAgICAgIGVudHJpZXM6IGNlbGwoXCJlbnRyaWVzXCIpLFxuICAgICAgZnJlZXplOiBjZWxsKFwiZnJlZXplXCIpLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBjZWxsKFwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpLFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogY2VsbChcImdldE93blByb3BlcnR5RGVzY3JpcHRvcnNcIiksXG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBjZWxsKFwiZ2V0T3duUHJvcGVydHlOYW1lc1wiKSxcbiAgICAgIGdldFByb3RvdHlwZU9mOiBjZWxsKFwiZ2V0UHJvdG90eXBlT2ZcIiksXG4gICAgICBpczogY2VsbChcImlzXCIpLFxuICAgICAgaXNFeHRlbnNpYmxlOiBjZWxsKFwiaXNFeHRlbnNpYmxlXCIpLFxuICAgICAga2V5czogY2VsbChcImtleXNcIiksXG4gICAgICBvYmplY3RQcm90b3R5cGU6IGNlbGwoXCJvYmplY3RQcm90b3R5cGVcIiksXG4gICAgICBzZWFsOiBjZWxsKFwic2VhbFwiKSxcbiAgICAgIHByZXZlbnRFeHRlbnNpb25zOiBjZWxsKFwicHJldmVudEV4dGVuc2lvbnNcIiksXG4gICAgICBzZXRQcm90b3R5cGVPZjogY2VsbChcInNldFByb3RvdHlwZU9mXCIpLFxuICAgICAgdmFsdWVzOiBjZWxsKFwidmFsdWVzXCIpLFxuICAgICAgZnJvbUVudHJpZXM6IGNlbGwoXCJmcm9tRW50cmllc1wiKSxcbiAgICAgIHNwZWNpZXNTeW1ib2w6IGNlbGwoXCJzcGVjaWVzU3ltYm9sXCIpLFxuICAgICAgdG9TdHJpbmdUYWdTeW1ib2w6IGNlbGwoXCJ0b1N0cmluZ1RhZ1N5bWJvbFwiKSxcbiAgICAgIGl0ZXJhdG9yU3ltYm9sOiBjZWxsKFwiaXRlcmF0b3JTeW1ib2xcIiksXG4gICAgICBtYXRjaEFsbFN5bWJvbDogY2VsbChcIm1hdGNoQWxsU3ltYm9sXCIpLFxuICAgICAgdW5zY29wYWJsZXNTeW1ib2w6IGNlbGwoXCJ1bnNjb3BhYmxlc1N5bWJvbFwiKSxcbiAgICAgIHN5bWJvbEtleUZvcjogY2VsbChcInN5bWJvbEtleUZvclwiKSxcbiAgICAgIHN5bWJvbEZvcjogY2VsbChcInN5bWJvbEZvclwiKSxcbiAgICAgIGlzSW50ZWdlcjogY2VsbChcImlzSW50ZWdlclwiKSxcbiAgICAgIHN0cmluZ2lmeUpzb246IGNlbGwoXCJzdHJpbmdpZnlKc29uXCIpLFxuICAgICAgZGVmaW5lUHJvcGVydHk6IGNlbGwoXCJkZWZpbmVQcm9wZXJ0eVwiKSxcbiAgICAgIGFwcGx5OiBjZWxsKFwiYXBwbHlcIiksXG4gICAgICBjb25zdHJ1Y3Q6IGNlbGwoXCJjb25zdHJ1Y3RcIiksXG4gICAgICByZWZsZWN0R2V0OiBjZWxsKFwicmVmbGVjdEdldFwiKSxcbiAgICAgIHJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGNlbGwoXCJyZWZsZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpLFxuICAgICAgcmVmbGVjdEhhczogY2VsbChcInJlZmxlY3RIYXNcIiksXG4gICAgICByZWZsZWN0SXNFeHRlbnNpYmxlOiBjZWxsKFwicmVmbGVjdElzRXh0ZW5zaWJsZVwiKSxcbiAgICAgIG93bktleXM6IGNlbGwoXCJvd25LZXlzXCIpLFxuICAgICAgcmVmbGVjdFByZXZlbnRFeHRlbnNpb25zOiBjZWxsKFwicmVmbGVjdFByZXZlbnRFeHRlbnNpb25zXCIpLFxuICAgICAgcmVmbGVjdFNldDogY2VsbChcInJlZmxlY3RTZXRcIiksXG4gICAgICBpc0FycmF5OiBjZWxsKFwiaXNBcnJheVwiKSxcbiAgICAgIGFycmF5UHJvdG90eXBlOiBjZWxsKFwiYXJyYXlQcm90b3R5cGVcIiksXG4gICAgICBtYXBQcm90b3R5cGU6IGNlbGwoXCJtYXBQcm90b3R5cGVcIiksXG4gICAgICBwcm94eVJldm9jYWJsZTogY2VsbChcInByb3h5UmV2b2NhYmxlXCIpLFxuICAgICAgcmVnZXhwUHJvdG90eXBlOiBjZWxsKFwicmVnZXhwUHJvdG90eXBlXCIpLFxuICAgICAgc2V0UHJvdG90eXBlOiBjZWxsKFwic2V0UHJvdG90eXBlXCIpLFxuICAgICAgc3RyaW5nUHJvdG90eXBlOiBjZWxsKFwic3RyaW5nUHJvdG90eXBlXCIpLFxuICAgICAgd2Vha21hcFByb3RvdHlwZTogY2VsbChcIndlYWttYXBQcm90b3R5cGVcIiksXG4gICAgICB3ZWFrc2V0UHJvdG90eXBlOiBjZWxsKFwid2Vha3NldFByb3RvdHlwZVwiKSxcbiAgICAgIGZ1bmN0aW9uUHJvdG90eXBlOiBjZWxsKFwiZnVuY3Rpb25Qcm90b3R5cGVcIiksXG4gICAgICBwcm9taXNlUHJvdG90eXBlOiBjZWxsKFwicHJvbWlzZVByb3RvdHlwZVwiKSxcbiAgICAgIHR5cGVkQXJyYXlQcm90b3R5cGU6IGNlbGwoXCJ0eXBlZEFycmF5UHJvdG90eXBlXCIpLFxuICAgICAgdW5jdXJyeVRoaXM6IGNlbGwoXCJ1bmN1cnJ5VGhpc1wiKSxcbiAgICAgIG9iamVjdEhhc093blByb3BlcnR5OiBjZWxsKFwib2JqZWN0SGFzT3duUHJvcGVydHlcIiksXG4gICAgICBhcnJheUZpbHRlcjogY2VsbChcImFycmF5RmlsdGVyXCIpLFxuICAgICAgYXJyYXlGb3JFYWNoOiBjZWxsKFwiYXJyYXlGb3JFYWNoXCIpLFxuICAgICAgYXJyYXlJbmNsdWRlczogY2VsbChcImFycmF5SW5jbHVkZXNcIiksXG4gICAgICBhcnJheUpvaW46IGNlbGwoXCJhcnJheUpvaW5cIiksXG4gICAgICBhcnJheU1hcDogY2VsbChcImFycmF5TWFwXCIpLFxuICAgICAgYXJyYXlQb3A6IGNlbGwoXCJhcnJheVBvcFwiKSxcbiAgICAgIGFycmF5UHVzaDogY2VsbChcImFycmF5UHVzaFwiKSxcbiAgICAgIGFycmF5U2xpY2U6IGNlbGwoXCJhcnJheVNsaWNlXCIpLFxuICAgICAgYXJyYXlTb21lOiBjZWxsKFwiYXJyYXlTb21lXCIpLFxuICAgICAgYXJyYXlTb3J0OiBjZWxsKFwiYXJyYXlTb3J0XCIpLFxuICAgICAgaXRlcmF0ZUFycmF5OiBjZWxsKFwiaXRlcmF0ZUFycmF5XCIpLFxuICAgICAgbWFwU2V0OiBjZWxsKFwibWFwU2V0XCIpLFxuICAgICAgbWFwR2V0OiBjZWxsKFwibWFwR2V0XCIpLFxuICAgICAgbWFwSGFzOiBjZWxsKFwibWFwSGFzXCIpLFxuICAgICAgbWFwRGVsZXRlOiBjZWxsKFwibWFwRGVsZXRlXCIpLFxuICAgICAgbWFwRW50cmllczogY2VsbChcIm1hcEVudHJpZXNcIiksXG4gICAgICBpdGVyYXRlTWFwOiBjZWxsKFwiaXRlcmF0ZU1hcFwiKSxcbiAgICAgIHNldEFkZDogY2VsbChcInNldEFkZFwiKSxcbiAgICAgIHNldERlbGV0ZTogY2VsbChcInNldERlbGV0ZVwiKSxcbiAgICAgIHNldEZvckVhY2g6IGNlbGwoXCJzZXRGb3JFYWNoXCIpLFxuICAgICAgc2V0SGFzOiBjZWxsKFwic2V0SGFzXCIpLFxuICAgICAgaXRlcmF0ZVNldDogY2VsbChcIml0ZXJhdGVTZXRcIiksXG4gICAgICByZWdleHBUZXN0OiBjZWxsKFwicmVnZXhwVGVzdFwiKSxcbiAgICAgIHJlZ2V4cEV4ZWM6IGNlbGwoXCJyZWdleHBFeGVjXCIpLFxuICAgICAgbWF0Y2hBbGxSZWdFeHA6IGNlbGwoXCJtYXRjaEFsbFJlZ0V4cFwiKSxcbiAgICAgIHN0cmluZ0VuZHNXaXRoOiBjZWxsKFwic3RyaW5nRW5kc1dpdGhcIiksXG4gICAgICBzdHJpbmdJbmNsdWRlczogY2VsbChcInN0cmluZ0luY2x1ZGVzXCIpLFxuICAgICAgc3RyaW5nSW5kZXhPZjogY2VsbChcInN0cmluZ0luZGV4T2ZcIiksXG4gICAgICBzdHJpbmdNYXRjaDogY2VsbChcInN0cmluZ01hdGNoXCIpLFxuICAgICAgc3RyaW5nUmVwbGFjZTogY2VsbChcInN0cmluZ1JlcGxhY2VcIiksXG4gICAgICBzdHJpbmdTZWFyY2g6IGNlbGwoXCJzdHJpbmdTZWFyY2hcIiksXG4gICAgICBzdHJpbmdTbGljZTogY2VsbChcInN0cmluZ1NsaWNlXCIpLFxuICAgICAgc3RyaW5nU3BsaXQ6IGNlbGwoXCJzdHJpbmdTcGxpdFwiKSxcbiAgICAgIHN0cmluZ1N0YXJ0c1dpdGg6IGNlbGwoXCJzdHJpbmdTdGFydHNXaXRoXCIpLFxuICAgICAgaXRlcmF0ZVN0cmluZzogY2VsbChcIml0ZXJhdGVTdHJpbmdcIiksXG4gICAgICB3ZWFrbWFwRGVsZXRlOiBjZWxsKFwid2Vha21hcERlbGV0ZVwiKSxcbiAgICAgIHdlYWttYXBHZXQ6IGNlbGwoXCJ3ZWFrbWFwR2V0XCIpLFxuICAgICAgd2Vha21hcEhhczogY2VsbChcIndlYWttYXBIYXNcIiksXG4gICAgICB3ZWFrbWFwU2V0OiBjZWxsKFwid2Vha21hcFNldFwiKSxcbiAgICAgIHdlYWtzZXRBZGQ6IGNlbGwoXCJ3ZWFrc2V0QWRkXCIpLFxuICAgICAgd2Vha3NldEdldDogY2VsbChcIndlYWtzZXRHZXRcIiksXG4gICAgICB3ZWFrc2V0SGFzOiBjZWxsKFwid2Vha3NldEhhc1wiKSxcbiAgICAgIGZ1bmN0aW9uVG9TdHJpbmc6IGNlbGwoXCJmdW5jdGlvblRvU3RyaW5nXCIpLFxuICAgICAgcHJvbWlzZUFsbDogY2VsbChcInByb21pc2VBbGxcIiksXG4gICAgICBwcm9taXNlQ2F0Y2g6IGNlbGwoXCJwcm9taXNlQ2F0Y2hcIiksXG4gICAgICBwcm9taXNlVGhlbjogY2VsbChcInByb21pc2VUaGVuXCIpLFxuICAgICAgZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3RlcjogY2VsbChcImZpbmFsaXphdGlvblJlZ2lzdHJ5UmVnaXN0ZXJcIiksXG4gICAgICBmaW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXI6IGNlbGwoXCJmaW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXJcIiksXG4gICAgICBnZXRDb25zdHJ1Y3Rvck9mOiBjZWxsKFwiZ2V0Q29uc3RydWN0b3JPZlwiKSxcbiAgICAgIGltbXV0YWJsZU9iamVjdDogY2VsbChcImltbXV0YWJsZU9iamVjdFwiKSxcbiAgICAgIGlzT2JqZWN0OiBjZWxsKFwiaXNPYmplY3RcIiksXG4gICAgICBpc0Vycm9yOiBjZWxsKFwiaXNFcnJvclwiKSxcbiAgICAgIEZFUkFMX0VWQUw6IGNlbGwoXCJGRVJBTF9FVkFMXCIpLFxuICAgICAgRkVSQUxfRlVOQ1RJT046IGNlbGwoXCJGRVJBTF9GVU5DVElPTlwiKSxcbiAgICAgIG5vRXZhbEV2YWx1YXRlOiBjZWxsKFwibm9FdmFsRXZhbHVhdGVcIiksXG4gICAgfSxcbiAgICB7XG4gICAgfSxcbiAgICB7XG4gICAgICBhbjogY2VsbChcImFuXCIpLFxuICAgICAgYmVzdEVmZm9ydFN0cmluZ2lmeTogY2VsbChcImJlc3RFZmZvcnRTdHJpbmdpZnlcIiksXG4gICAgICBlbkpvaW46IGNlbGwoXCJlbkpvaW5cIiksXG4gICAgfSxcbiAgICB7XG4gICAgfSxcbiAgICB7XG4gICAgICB1bnJlZGFjdGVkRGV0YWlsczogY2VsbChcInVucmVkYWN0ZWREZXRhaWxzXCIpLFxuICAgICAgbG9nZ2VkRXJyb3JIYW5kbGVyOiBjZWxsKFwibG9nZ2VkRXJyb3JIYW5kbGVyXCIpLFxuICAgICAgbWFrZUFzc2VydDogY2VsbChcIm1ha2VBc3NlcnRcIiksXG4gICAgICBhc3NlcnQ6IGNlbGwoXCJhc3NlcnRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlRXZhbFNjb3BlS2l0OiBjZWxsKFwibWFrZUV2YWxTY29wZUtpdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlzVmFsaWRJZGVudGlmaWVyTmFtZTogY2VsbChcImlzVmFsaWRJZGVudGlmaWVyTmFtZVwiKSxcbiAgICAgIGdldFNjb3BlQ29uc3RhbnRzOiBjZWxsKFwiZ2V0U2NvcGVDb25zdGFudHNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlRXZhbHVhdGU6IGNlbGwoXCJtYWtlRXZhbHVhdGVcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBhbHdheXNUaHJvd0hhbmRsZXI6IGNlbGwoXCJhbHdheXNUaHJvd0hhbmRsZXJcIiksXG4gICAgICBzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyOiBjZWxsKFwic3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlclwiKSxcbiAgICAgIHN0cmljdFNjb3BlVGVybWluYXRvcjogY2VsbChcInN0cmljdFNjb3BlVGVybWluYXRvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3I6IGNlbGwoXCJjcmVhdGVTbG9wcHlHbG9iYWxzU2NvcGVUZXJtaW5hdG9yXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZ2V0U291cmNlVVJMOiBjZWxsKFwiZ2V0U291cmNlVVJMXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgcmVqZWN0SHRtbENvbW1lbnRzOiBjZWxsKFwicmVqZWN0SHRtbENvbW1lbnRzXCIpLFxuICAgICAgZXZhZGVIdG1sQ29tbWVudFRlc3Q6IGNlbGwoXCJldmFkZUh0bWxDb21tZW50VGVzdFwiKSxcbiAgICAgIHJlamVjdEltcG9ydEV4cHJlc3Npb25zOiBjZWxsKFwicmVqZWN0SW1wb3J0RXhwcmVzc2lvbnNcIiksXG4gICAgICBldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0OiBjZWxsKFwiZXZhZGVJbXBvcnRFeHByZXNzaW9uVGVzdFwiKSxcbiAgICAgIHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnM6IGNlbGwoXCJyZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zXCIpLFxuICAgICAgbWFuZGF0b3J5VHJhbnNmb3JtczogY2VsbChcIm1hbmRhdG9yeVRyYW5zZm9ybXNcIiksXG4gICAgICBhcHBseVRyYW5zZm9ybXM6IGNlbGwoXCJhcHBseVRyYW5zZm9ybXNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlU2FmZUV2YWx1YXRvcjogY2VsbChcIm1ha2VTYWZlRXZhbHVhdG9yXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZUNvbXBhcnRtZW50RXZhbHVhdG9yOiBjZWxsKFwicHJvdmlkZUNvbXBhcnRtZW50RXZhbHVhdG9yXCIpLFxuICAgICAgY29tcGFydG1lbnRFdmFsdWF0ZTogY2VsbChcImNvbXBhcnRtZW50RXZhbHVhdGVcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlRXZhbEZ1bmN0aW9uOiBjZWxsKFwibWFrZUV2YWxGdW5jdGlvblwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yOiBjZWxsKFwibWFrZUZ1bmN0aW9uQ29uc3RydWN0b3JcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBjb25zdGFudFByb3BlcnRpZXM6IGNlbGwoXCJjb25zdGFudFByb3BlcnRpZXNcIiksXG4gICAgICB1bml2ZXJzYWxQcm9wZXJ0eU5hbWVzOiBjZWxsKFwidW5pdmVyc2FsUHJvcGVydHlOYW1lc1wiKSxcbiAgICAgIGluaXRpYWxHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsKFwiaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXNcIiksXG4gICAgICBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsKFwic2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lc1wiKSxcbiAgICAgIHVuaXF1ZUdsb2JhbFByb3BlcnR5TmFtZXM6IGNlbGwoXCJ1bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzXCIpLFxuICAgICAgTmF0aXZlRXJyb3JzOiBjZWxsKFwiTmF0aXZlRXJyb3JzXCIpLFxuICAgICAgRnVuY3Rpb25JbnN0YW5jZTogY2VsbChcIkZ1bmN0aW9uSW5zdGFuY2VcIiksXG4gICAgICBpc0FjY2Vzc29yUGVybWl0OiBjZWxsKFwiaXNBY2Nlc3NvclBlcm1pdFwiKSxcbiAgICAgIHdoaXRlbGlzdDogY2VsbChcIndoaXRlbGlzdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzOiBjZWxsKFwic2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXNcIiksXG4gICAgICBzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXM6IGNlbGwoXCJzZXRHbG9iYWxPYmplY3RDb25zdGFudFByb3BlcnRpZXNcIiksXG4gICAgICBzZXRHbG9iYWxPYmplY3RNdXRhYmxlUHJvcGVydGllczogY2VsbChcInNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzXCIpLFxuICAgICAgc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9yczogY2VsbChcInNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBtYWtlQWxpYXM6IGNlbGwoXCJtYWtlQWxpYXNcIiksXG4gICAgICBsb2FkOiBjZWxsKFwibG9hZFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmVyRXhwb3J0czogY2VsbChcImRlZmVyRXhwb3J0c1wiKSxcbiAgICAgIGdldERlZmVycmVkRXhwb3J0czogY2VsbChcImdldERlZmVycmVkRXhwb3J0c1wiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2U6IGNlbGwoXCJtYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlXCIpLFxuICAgICAgbWFrZU1vZHVsZUluc3RhbmNlOiBjZWxsKFwibWFrZU1vZHVsZUluc3RhbmNlXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbGluazogY2VsbChcImxpbmtcIiksXG4gICAgICBpbnN0YW50aWF0ZTogY2VsbChcImluc3RhbnRpYXRlXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgSW5lcnRDb21wYXJ0bWVudDogY2VsbChcIkluZXJ0Q29tcGFydG1lbnRcIiksXG4gICAgICBDb21wYXJ0bWVudFByb3RvdHlwZTogY2VsbChcIkNvbXBhcnRtZW50UHJvdG90eXBlXCIpLFxuICAgICAgbWFrZUNvbXBhcnRtZW50Q29uc3RydWN0b3I6IGNlbGwoXCJtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yOiBjZWxsKFwibWFrZUludHJpbnNpY3NDb2xsZWN0b3JcIiksXG4gICAgICBnZXRHbG9iYWxJbnRyaW5zaWNzOiBjZWxsKFwiZ2V0R2xvYmFsSW50cmluc2ljc1wiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1pbkVuYWJsZW1lbnRzOiBjZWxsKFwibWluRW5hYmxlbWVudHNcIiksXG4gICAgICBtb2RlcmF0ZUVuYWJsZW1lbnRzOiBjZWxsKFwibW9kZXJhdGVFbmFibGVtZW50c1wiKSxcbiAgICAgIHNldmVyZUVuYWJsZW1lbnRzOiBjZWxsKFwic2V2ZXJlRW5hYmxlbWVudHNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcjogY2VsbChcIm1ha2VFbnZpcm9ubWVudENhcHRvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1ha2VMb2dnaW5nQ29uc29sZUtpdDogY2VsbChcIm1ha2VMb2dnaW5nQ29uc29sZUtpdFwiKSxcbiAgICAgIG1ha2VDYXVzYWxDb25zb2xlOiBjZWxsKFwibWFrZUNhdXNhbENvbnNvbGVcIiksXG4gICAgICBmaWx0ZXJDb25zb2xlOiBjZWxsKFwiZmlsdGVyQ29uc29sZVwiKSxcbiAgICAgIGNvbnNvbGVXaGl0ZWxpc3Q6IGNlbGwoXCJjb25zb2xlV2hpdGVsaXN0XCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFrZVJlamVjdGlvbkhhbmRsZXJzOiBjZWxsKFwibWFrZVJlamVjdGlvbkhhbmRsZXJzXCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgdGFtZUNvbnNvbGU6IGNlbGwoXCJ0YW1lQ29uc29sZVwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbHRlckZpbGVOYW1lOiBjZWxsKFwiZmlsdGVyRmlsZU5hbWVcIiksXG4gICAgICBzaG9ydGVuQ2FsbFNpdGVTdHJpbmc6IGNlbGwoXCJzaG9ydGVuQ2FsbFNpdGVTdHJpbmdcIiksXG4gICAgICB0YW1lVjhFcnJvckNvbnN0cnVjdG9yOiBjZWxsKFwidGFtZVY4RXJyb3JDb25zdHJ1Y3RvclwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHQ6IGNlbGwoXCJkZWZhdWx0XCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZ2V0QW5vbnltb3VzSW50cmluc2ljczogY2VsbChcImdldEFub255bW91c0ludHJpbnNpY3NcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBpc1R5cGVkQXJyYXk6IGNlbGwoXCJpc1R5cGVkQXJyYXlcIiksXG4gICAgICBtYWtlSGFyZGVuZXI6IGNlbGwoXCJtYWtlSGFyZGVuZXJcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhbWVEb21haW5zOiBjZWxsKFwidGFtZURvbWFpbnNcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRhbWVGdW5jdGlvblRvU3RyaW5nOiBjZWxsKFwidGFtZUZ1bmN0aW9uVG9TdHJpbmdcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHQ6IGNlbGwoXCJkZWZhdWx0XCIpLFxuICAgIH0sXG4gICAge1xuICAgICAgZGVmYXVsdDogY2VsbChcImRlZmF1bHRcIiksXG4gICAgfSxcbiAgICB7XG4gICAgICBkZWZhdWx0OiBjZWxsKFwiZGVmYXVsdFwiKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHJlcGFpckludHJpbnNpY3M6IGNlbGwoXCJyZXBhaXJJbnRyaW5zaWNzXCIpLFxuICAgICAgbG9ja2Rvd246IGNlbGwoXCJsb2NrZG93blwiKSxcbiAgICB9LFxuICAgIHtcbiAgICB9LFxuICBdO1xuXG5cbiAgY29uc3QgbmFtZXNwYWNlcyA9IGNlbGxzLm1hcChjZWxscyA9PiBPYmplY3QuY3JlYXRlKG51bGwsIGNlbGxzKSk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5hbWVzcGFjZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY2VsbHNbaW5kZXhdWycqJ10gPSBjZWxsKCcqJywgbmFtZXNwYWNlc1tpbmRleF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb2JzZXJ2ZUltcG9ydHMobWFwLCBpbXBvcnROYW1lLCBpbXBvcnRJbmRleCkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIG9ic2VydmVyc10gb2YgbWFwLmdldChpbXBvcnROYW1lKSkge1xuICAgICAgY29uc3QgY2VsbCA9IGNlbGxzW2ltcG9ydEluZGV4XVtuYW1lXTtcbiAgICAgIGlmIChjZWxsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGBDYW5ub3QgaW1wb3J0IG5hbWUgJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiBvYnNlcnZlcnMpIHtcbiAgICAgICAgY2VsbC5vYnNlcnZlKG9ic2VydmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdG9yc1swXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgdW5pdmVyc2FsVGhpczogY2VsbHNbMF0uZ2xvYmFsVGhpcy5zZXQsXG4gICAgICBBcnJheTogY2VsbHNbMF0uQXJyYXkuc2V0LFxuICAgICAgRGF0ZTogY2VsbHNbMF0uRGF0ZS5zZXQsXG4gICAgICBGaW5hbGl6YXRpb25SZWdpc3RyeTogY2VsbHNbMF0uRmluYWxpemF0aW9uUmVnaXN0cnkuc2V0LFxuICAgICAgRmxvYXQzMkFycmF5OiBjZWxsc1swXS5GbG9hdDMyQXJyYXkuc2V0LFxuICAgICAgSlNPTjogY2VsbHNbMF0uSlNPTi5zZXQsXG4gICAgICBNYXA6IGNlbGxzWzBdLk1hcC5zZXQsXG4gICAgICBNYXRoOiBjZWxsc1swXS5NYXRoLnNldCxcbiAgICAgIE51bWJlcjogY2VsbHNbMF0uTnVtYmVyLnNldCxcbiAgICAgIE9iamVjdDogY2VsbHNbMF0uT2JqZWN0LnNldCxcbiAgICAgIFByb21pc2U6IGNlbGxzWzBdLlByb21pc2Uuc2V0LFxuICAgICAgUHJveHk6IGNlbGxzWzBdLlByb3h5LnNldCxcbiAgICAgIFJlZmxlY3Q6IGNlbGxzWzBdLlJlZmxlY3Quc2V0LFxuICAgICAgRkVSQUxfUkVHX0VYUDogY2VsbHNbMF0uRkVSQUxfUkVHX0VYUC5zZXQsXG4gICAgICBTZXQ6IGNlbGxzWzBdLlNldC5zZXQsXG4gICAgICBTdHJpbmc6IGNlbGxzWzBdLlN0cmluZy5zZXQsXG4gICAgICBXZWFrTWFwOiBjZWxsc1swXS5XZWFrTWFwLnNldCxcbiAgICAgIFdlYWtTZXQ6IGNlbGxzWzBdLldlYWtTZXQuc2V0LFxuICAgICAgRkVSQUxfRVJST1I6IGNlbGxzWzBdLkZFUkFMX0VSUk9SLnNldCxcbiAgICAgIFJhbmdlRXJyb3I6IGNlbGxzWzBdLlJhbmdlRXJyb3Iuc2V0LFxuICAgICAgUmVmZXJlbmNlRXJyb3I6IGNlbGxzWzBdLlJlZmVyZW5jZUVycm9yLnNldCxcbiAgICAgIFN5bnRheEVycm9yOiBjZWxsc1swXS5TeW50YXhFcnJvci5zZXQsXG4gICAgICBUeXBlRXJyb3I6IGNlbGxzWzBdLlR5cGVFcnJvci5zZXQsXG4gICAgICBhc3NpZ246IGNlbGxzWzBdLmFzc2lnbi5zZXQsXG4gICAgICBjcmVhdGU6IGNlbGxzWzBdLmNyZWF0ZS5zZXQsXG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzOiBjZWxsc1swXS5kZWZpbmVQcm9wZXJ0aWVzLnNldCxcbiAgICAgIGVudHJpZXM6IGNlbGxzWzBdLmVudHJpZXMuc2V0LFxuICAgICAgZnJlZXplOiBjZWxsc1swXS5mcmVlemUuc2V0LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBjZWxsc1swXS5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2V0LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczogY2VsbHNbMF0uZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycy5zZXQsXG4gICAgICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiBjZWxsc1swXS5nZXRPd25Qcm9wZXJ0eU5hbWVzLnNldCxcbiAgICAgIGdldFByb3RvdHlwZU9mOiBjZWxsc1swXS5nZXRQcm90b3R5cGVPZi5zZXQsXG4gICAgICBpczogY2VsbHNbMF0uaXMuc2V0LFxuICAgICAgaXNFeHRlbnNpYmxlOiBjZWxsc1swXS5pc0V4dGVuc2libGUuc2V0LFxuICAgICAga2V5czogY2VsbHNbMF0ua2V5cy5zZXQsXG4gICAgICBvYmplY3RQcm90b3R5cGU6IGNlbGxzWzBdLm9iamVjdFByb3RvdHlwZS5zZXQsXG4gICAgICBzZWFsOiBjZWxsc1swXS5zZWFsLnNldCxcbiAgICAgIHByZXZlbnRFeHRlbnNpb25zOiBjZWxsc1swXS5wcmV2ZW50RXh0ZW5zaW9ucy5zZXQsXG4gICAgICBzZXRQcm90b3R5cGVPZjogY2VsbHNbMF0uc2V0UHJvdG90eXBlT2Yuc2V0LFxuICAgICAgdmFsdWVzOiBjZWxsc1swXS52YWx1ZXMuc2V0LFxuICAgICAgZnJvbUVudHJpZXM6IGNlbGxzWzBdLmZyb21FbnRyaWVzLnNldCxcbiAgICAgIHNwZWNpZXNTeW1ib2w6IGNlbGxzWzBdLnNwZWNpZXNTeW1ib2wuc2V0LFxuICAgICAgdG9TdHJpbmdUYWdTeW1ib2w6IGNlbGxzWzBdLnRvU3RyaW5nVGFnU3ltYm9sLnNldCxcbiAgICAgIGl0ZXJhdG9yU3ltYm9sOiBjZWxsc1swXS5pdGVyYXRvclN5bWJvbC5zZXQsXG4gICAgICBtYXRjaEFsbFN5bWJvbDogY2VsbHNbMF0ubWF0Y2hBbGxTeW1ib2wuc2V0LFxuICAgICAgdW5zY29wYWJsZXNTeW1ib2w6IGNlbGxzWzBdLnVuc2NvcGFibGVzU3ltYm9sLnNldCxcbiAgICAgIHN5bWJvbEtleUZvcjogY2VsbHNbMF0uc3ltYm9sS2V5Rm9yLnNldCxcbiAgICAgIHN5bWJvbEZvcjogY2VsbHNbMF0uc3ltYm9sRm9yLnNldCxcbiAgICAgIGlzSW50ZWdlcjogY2VsbHNbMF0uaXNJbnRlZ2VyLnNldCxcbiAgICAgIHN0cmluZ2lmeUpzb246IGNlbGxzWzBdLnN0cmluZ2lmeUpzb24uc2V0LFxuICAgICAgZGVmaW5lUHJvcGVydHk6IGNlbGxzWzBdLmRlZmluZVByb3BlcnR5LnNldCxcbiAgICAgIGFwcGx5OiBjZWxsc1swXS5hcHBseS5zZXQsXG4gICAgICBjb25zdHJ1Y3Q6IGNlbGxzWzBdLmNvbnN0cnVjdC5zZXQsXG4gICAgICByZWZsZWN0R2V0OiBjZWxsc1swXS5yZWZsZWN0R2V0LnNldCxcbiAgICAgIHJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGNlbGxzWzBdLnJlZmxlY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2V0LFxuICAgICAgcmVmbGVjdEhhczogY2VsbHNbMF0ucmVmbGVjdEhhcy5zZXQsXG4gICAgICByZWZsZWN0SXNFeHRlbnNpYmxlOiBjZWxsc1swXS5yZWZsZWN0SXNFeHRlbnNpYmxlLnNldCxcbiAgICAgIG93bktleXM6IGNlbGxzWzBdLm93bktleXMuc2V0LFxuICAgICAgcmVmbGVjdFByZXZlbnRFeHRlbnNpb25zOiBjZWxsc1swXS5yZWZsZWN0UHJldmVudEV4dGVuc2lvbnMuc2V0LFxuICAgICAgcmVmbGVjdFNldDogY2VsbHNbMF0ucmVmbGVjdFNldC5zZXQsXG4gICAgICBpc0FycmF5OiBjZWxsc1swXS5pc0FycmF5LnNldCxcbiAgICAgIGFycmF5UHJvdG90eXBlOiBjZWxsc1swXS5hcnJheVByb3RvdHlwZS5zZXQsXG4gICAgICBtYXBQcm90b3R5cGU6IGNlbGxzWzBdLm1hcFByb3RvdHlwZS5zZXQsXG4gICAgICBwcm94eVJldm9jYWJsZTogY2VsbHNbMF0ucHJveHlSZXZvY2FibGUuc2V0LFxuICAgICAgcmVnZXhwUHJvdG90eXBlOiBjZWxsc1swXS5yZWdleHBQcm90b3R5cGUuc2V0LFxuICAgICAgc2V0UHJvdG90eXBlOiBjZWxsc1swXS5zZXRQcm90b3R5cGUuc2V0LFxuICAgICAgc3RyaW5nUHJvdG90eXBlOiBjZWxsc1swXS5zdHJpbmdQcm90b3R5cGUuc2V0LFxuICAgICAgd2Vha21hcFByb3RvdHlwZTogY2VsbHNbMF0ud2Vha21hcFByb3RvdHlwZS5zZXQsXG4gICAgICB3ZWFrc2V0UHJvdG90eXBlOiBjZWxsc1swXS53ZWFrc2V0UHJvdG90eXBlLnNldCxcbiAgICAgIGZ1bmN0aW9uUHJvdG90eXBlOiBjZWxsc1swXS5mdW5jdGlvblByb3RvdHlwZS5zZXQsXG4gICAgICBwcm9taXNlUHJvdG90eXBlOiBjZWxsc1swXS5wcm9taXNlUHJvdG90eXBlLnNldCxcbiAgICAgIHR5cGVkQXJyYXlQcm90b3R5cGU6IGNlbGxzWzBdLnR5cGVkQXJyYXlQcm90b3R5cGUuc2V0LFxuICAgICAgdW5jdXJyeVRoaXM6IGNlbGxzWzBdLnVuY3VycnlUaGlzLnNldCxcbiAgICAgIG9iamVjdEhhc093blByb3BlcnR5OiBjZWxsc1swXS5vYmplY3RIYXNPd25Qcm9wZXJ0eS5zZXQsXG4gICAgICBhcnJheUZpbHRlcjogY2VsbHNbMF0uYXJyYXlGaWx0ZXIuc2V0LFxuICAgICAgYXJyYXlGb3JFYWNoOiBjZWxsc1swXS5hcnJheUZvckVhY2guc2V0LFxuICAgICAgYXJyYXlJbmNsdWRlczogY2VsbHNbMF0uYXJyYXlJbmNsdWRlcy5zZXQsXG4gICAgICBhcnJheUpvaW46IGNlbGxzWzBdLmFycmF5Sm9pbi5zZXQsXG4gICAgICBhcnJheU1hcDogY2VsbHNbMF0uYXJyYXlNYXAuc2V0LFxuICAgICAgYXJyYXlQb3A6IGNlbGxzWzBdLmFycmF5UG9wLnNldCxcbiAgICAgIGFycmF5UHVzaDogY2VsbHNbMF0uYXJyYXlQdXNoLnNldCxcbiAgICAgIGFycmF5U2xpY2U6IGNlbGxzWzBdLmFycmF5U2xpY2Uuc2V0LFxuICAgICAgYXJyYXlTb21lOiBjZWxsc1swXS5hcnJheVNvbWUuc2V0LFxuICAgICAgYXJyYXlTb3J0OiBjZWxsc1swXS5hcnJheVNvcnQuc2V0LFxuICAgICAgaXRlcmF0ZUFycmF5OiBjZWxsc1swXS5pdGVyYXRlQXJyYXkuc2V0LFxuICAgICAgbWFwU2V0OiBjZWxsc1swXS5tYXBTZXQuc2V0LFxuICAgICAgbWFwR2V0OiBjZWxsc1swXS5tYXBHZXQuc2V0LFxuICAgICAgbWFwSGFzOiBjZWxsc1swXS5tYXBIYXMuc2V0LFxuICAgICAgbWFwRGVsZXRlOiBjZWxsc1swXS5tYXBEZWxldGUuc2V0LFxuICAgICAgbWFwRW50cmllczogY2VsbHNbMF0ubWFwRW50cmllcy5zZXQsXG4gICAgICBpdGVyYXRlTWFwOiBjZWxsc1swXS5pdGVyYXRlTWFwLnNldCxcbiAgICAgIHNldEFkZDogY2VsbHNbMF0uc2V0QWRkLnNldCxcbiAgICAgIHNldERlbGV0ZTogY2VsbHNbMF0uc2V0RGVsZXRlLnNldCxcbiAgICAgIHNldEZvckVhY2g6IGNlbGxzWzBdLnNldEZvckVhY2guc2V0LFxuICAgICAgc2V0SGFzOiBjZWxsc1swXS5zZXRIYXMuc2V0LFxuICAgICAgaXRlcmF0ZVNldDogY2VsbHNbMF0uaXRlcmF0ZVNldC5zZXQsXG4gICAgICByZWdleHBUZXN0OiBjZWxsc1swXS5yZWdleHBUZXN0LnNldCxcbiAgICAgIHJlZ2V4cEV4ZWM6IGNlbGxzWzBdLnJlZ2V4cEV4ZWMuc2V0LFxuICAgICAgbWF0Y2hBbGxSZWdFeHA6IGNlbGxzWzBdLm1hdGNoQWxsUmVnRXhwLnNldCxcbiAgICAgIHN0cmluZ0VuZHNXaXRoOiBjZWxsc1swXS5zdHJpbmdFbmRzV2l0aC5zZXQsXG4gICAgICBzdHJpbmdJbmNsdWRlczogY2VsbHNbMF0uc3RyaW5nSW5jbHVkZXMuc2V0LFxuICAgICAgc3RyaW5nSW5kZXhPZjogY2VsbHNbMF0uc3RyaW5nSW5kZXhPZi5zZXQsXG4gICAgICBzdHJpbmdNYXRjaDogY2VsbHNbMF0uc3RyaW5nTWF0Y2guc2V0LFxuICAgICAgc3RyaW5nUmVwbGFjZTogY2VsbHNbMF0uc3RyaW5nUmVwbGFjZS5zZXQsXG4gICAgICBzdHJpbmdTZWFyY2g6IGNlbGxzWzBdLnN0cmluZ1NlYXJjaC5zZXQsXG4gICAgICBzdHJpbmdTbGljZTogY2VsbHNbMF0uc3RyaW5nU2xpY2Uuc2V0LFxuICAgICAgc3RyaW5nU3BsaXQ6IGNlbGxzWzBdLnN0cmluZ1NwbGl0LnNldCxcbiAgICAgIHN0cmluZ1N0YXJ0c1dpdGg6IGNlbGxzWzBdLnN0cmluZ1N0YXJ0c1dpdGguc2V0LFxuICAgICAgaXRlcmF0ZVN0cmluZzogY2VsbHNbMF0uaXRlcmF0ZVN0cmluZy5zZXQsXG4gICAgICB3ZWFrbWFwRGVsZXRlOiBjZWxsc1swXS53ZWFrbWFwRGVsZXRlLnNldCxcbiAgICAgIHdlYWttYXBHZXQ6IGNlbGxzWzBdLndlYWttYXBHZXQuc2V0LFxuICAgICAgd2Vha21hcEhhczogY2VsbHNbMF0ud2Vha21hcEhhcy5zZXQsXG4gICAgICB3ZWFrbWFwU2V0OiBjZWxsc1swXS53ZWFrbWFwU2V0LnNldCxcbiAgICAgIHdlYWtzZXRBZGQ6IGNlbGxzWzBdLndlYWtzZXRBZGQuc2V0LFxuICAgICAgd2Vha3NldEdldDogY2VsbHNbMF0ud2Vha3NldEdldC5zZXQsXG4gICAgICB3ZWFrc2V0SGFzOiBjZWxsc1swXS53ZWFrc2V0SGFzLnNldCxcbiAgICAgIGZ1bmN0aW9uVG9TdHJpbmc6IGNlbGxzWzBdLmZ1bmN0aW9uVG9TdHJpbmcuc2V0LFxuICAgICAgcHJvbWlzZUFsbDogY2VsbHNbMF0ucHJvbWlzZUFsbC5zZXQsXG4gICAgICBwcm9taXNlQ2F0Y2g6IGNlbGxzWzBdLnByb21pc2VDYXRjaC5zZXQsXG4gICAgICBwcm9taXNlVGhlbjogY2VsbHNbMF0ucHJvbWlzZVRoZW4uc2V0LFxuICAgICAgZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3RlcjogY2VsbHNbMF0uZmluYWxpemF0aW9uUmVnaXN0cnlSZWdpc3Rlci5zZXQsXG4gICAgICBmaW5hbGl6YXRpb25SZWdpc3RyeVVucmVnaXN0ZXI6IGNlbGxzWzBdLmZpbmFsaXphdGlvblJlZ2lzdHJ5VW5yZWdpc3Rlci5zZXQsXG4gICAgICBnZXRDb25zdHJ1Y3Rvck9mOiBjZWxsc1swXS5nZXRDb25zdHJ1Y3Rvck9mLnNldCxcbiAgICAgIGltbXV0YWJsZU9iamVjdDogY2VsbHNbMF0uaW1tdXRhYmxlT2JqZWN0LnNldCxcbiAgICAgIGlzT2JqZWN0OiBjZWxsc1swXS5pc09iamVjdC5zZXQsXG4gICAgICBpc0Vycm9yOiBjZWxsc1swXS5pc0Vycm9yLnNldCxcbiAgICAgIEZFUkFMX0VWQUw6IGNlbGxzWzBdLkZFUkFMX0VWQUwuc2V0LFxuICAgICAgRkVSQUxfRlVOQ1RJT046IGNlbGxzWzBdLkZFUkFMX0ZVTkNUSU9OLnNldCxcbiAgICAgIG5vRXZhbEV2YWx1YXRlOiBjZWxsc1swXS5ub0V2YWxFdmFsdWF0ZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzFdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzJdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGFuOiBjZWxsc1syXS5hbi5zZXQsXG4gICAgICBiZXN0RWZmb3J0U3RyaW5naWZ5OiBjZWxsc1syXS5iZXN0RWZmb3J0U3RyaW5naWZ5LnNldCxcbiAgICAgIGVuSm9pbjogY2VsbHNbMl0uZW5Kb2luLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbM10oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbNF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgMSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zdHJpbmdpZnktdXRpbHMuanNcIiwgMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90eXBlcy5qc1wiLCAzKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIHVucmVkYWN0ZWREZXRhaWxzOiBjZWxsc1s0XS51bnJlZGFjdGVkRGV0YWlscy5zZXQsXG4gICAgICBsb2dnZWRFcnJvckhhbmRsZXI6IGNlbGxzWzRdLmxvZ2dlZEVycm9ySGFuZGxlci5zZXQsXG4gICAgICBtYWtlQXNzZXJ0OiBjZWxsc1s0XS5tYWtlQXNzZXJ0LnNldCxcbiAgICAgIGFzc2VydDogY2VsbHNbNF0uYXNzZXJ0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbNV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlRXZhbFNjb3BlS2l0OiBjZWxsc1s1XS5tYWtlRXZhbFNjb3BlS2l0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbNl0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBpc1ZhbGlkSWRlbnRpZmllck5hbWU6IGNlbGxzWzZdLmlzVmFsaWRJZGVudGlmaWVyTmFtZS5zZXQsXG4gICAgICBnZXRTY29wZUNvbnN0YW50czogY2VsbHNbNl0uZ2V0U2NvcGVDb25zdGFudHMuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1s3XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3Njb3BlLWNvbnN0YW50cy5qc1wiLCA2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1ha2VFdmFsdWF0ZTogY2VsbHNbN10ubWFrZUV2YWx1YXRlLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbOF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBhbHdheXNUaHJvd0hhbmRsZXI6IGNlbGxzWzhdLmFsd2F5c1Rocm93SGFuZGxlci5zZXQsXG4gICAgICBzdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyOiBjZWxsc1s4XS5zdHJpY3RTY29wZVRlcm1pbmF0b3JIYW5kbGVyLnNldCxcbiAgICAgIHN0cmljdFNjb3BlVGVybWluYXRvcjogY2VsbHNbOF0uc3RyaWN0U2NvcGVUZXJtaW5hdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbOV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zdHJpY3Qtc2NvcGUtdGVybWluYXRvci5qc1wiLCA4KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3I6IGNlbGxzWzldLmNyZWF0ZVNsb3BweUdsb2JhbHNTY29wZVRlcm1pbmF0b3Iuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxMF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBnZXRTb3VyY2VVUkw6IGNlbGxzWzEwXS5nZXRTb3VyY2VVUkwuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxMV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9nZXQtc291cmNlLXVybC5qc1wiLCAxMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICByZWplY3RIdG1sQ29tbWVudHM6IGNlbGxzWzExXS5yZWplY3RIdG1sQ29tbWVudHMuc2V0LFxuICAgICAgZXZhZGVIdG1sQ29tbWVudFRlc3Q6IGNlbGxzWzExXS5ldmFkZUh0bWxDb21tZW50VGVzdC5zZXQsXG4gICAgICByZWplY3RJbXBvcnRFeHByZXNzaW9uczogY2VsbHNbMTFdLnJlamVjdEltcG9ydEV4cHJlc3Npb25zLnNldCxcbiAgICAgIGV2YWRlSW1wb3J0RXhwcmVzc2lvblRlc3Q6IGNlbGxzWzExXS5ldmFkZUltcG9ydEV4cHJlc3Npb25UZXN0LnNldCxcbiAgICAgIHJlamVjdFNvbWVEaXJlY3RFdmFsRXhwcmVzc2lvbnM6IGNlbGxzWzExXS5yZWplY3RTb21lRGlyZWN0RXZhbEV4cHJlc3Npb25zLnNldCxcbiAgICAgIG1hbmRhdG9yeVRyYW5zZm9ybXM6IGNlbGxzWzExXS5tYW5kYXRvcnlUcmFuc2Zvcm1zLnNldCxcbiAgICAgIGFwcGx5VHJhbnNmb3JtczogY2VsbHNbMTFdLmFwcGx5VHJhbnNmb3Jtcy5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzEyXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2V2YWwtc2NvcGUuanNcIiwgNSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tYWtlLWV2YWx1YXRlLmpzXCIsIDcpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc2xvcHB5LWdsb2JhbHMtc2NvcGUtdGVybWluYXRvci5qc1wiLCA5KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3N0cmljdC1zY29wZS10ZXJtaW5hdG9yLmpzXCIsIDgpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdHJhbnNmb3Jtcy5qc1wiLCAxMSk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlU2FmZUV2YWx1YXRvcjogY2VsbHNbMTJdLm1ha2VTYWZlRXZhbHVhdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTNdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbWFrZS1zYWZlLWV2YWx1YXRvci5qc1wiLCAxMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90cmFuc2Zvcm1zLmpzXCIsIDExKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIHByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvcjogY2VsbHNbMTNdLnByb3ZpZGVDb21wYXJ0bWVudEV2YWx1YXRvci5zZXQsXG4gICAgICBjb21wYXJ0bWVudEV2YWx1YXRlOiBjZWxsc1sxM10uY29tcGFydG1lbnRFdmFsdWF0ZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzE0XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUV2YWxGdW5jdGlvbjogY2VsbHNbMTRdLm1ha2VFdmFsRnVuY3Rpb24uc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxNV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlRnVuY3Rpb25Db25zdHJ1Y3RvcjogY2VsbHNbMTVdLm1ha2VGdW5jdGlvbkNvbnN0cnVjdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTZdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBjb25zdGFudFByb3BlcnRpZXM6IGNlbGxzWzE2XS5jb25zdGFudFByb3BlcnRpZXMuc2V0LFxuICAgICAgdW5pdmVyc2FsUHJvcGVydHlOYW1lczogY2VsbHNbMTZdLnVuaXZlcnNhbFByb3BlcnR5TmFtZXMuc2V0LFxuICAgICAgaW5pdGlhbEdsb2JhbFByb3BlcnR5TmFtZXM6IGNlbGxzWzE2XS5pbml0aWFsR2xvYmFsUHJvcGVydHlOYW1lcy5zZXQsXG4gICAgICBzaGFyZWRHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsc1sxNl0uc2hhcmVkR2xvYmFsUHJvcGVydHlOYW1lcy5zZXQsXG4gICAgICB1bmlxdWVHbG9iYWxQcm9wZXJ0eU5hbWVzOiBjZWxsc1sxNl0udW5pcXVlR2xvYmFsUHJvcGVydHlOYW1lcy5zZXQsXG4gICAgICBOYXRpdmVFcnJvcnM6IGNlbGxzWzE2XS5OYXRpdmVFcnJvcnMuc2V0LFxuICAgICAgRnVuY3Rpb25JbnN0YW5jZTogY2VsbHNbMTZdLkZ1bmN0aW9uSW5zdGFuY2Uuc2V0LFxuICAgICAgaXNBY2Nlc3NvclBlcm1pdDogY2VsbHNbMTZdLmlzQWNjZXNzb3JQZXJtaXQuc2V0LFxuICAgICAgd2hpdGVsaXN0OiBjZWxsc1sxNl0ud2hpdGVsaXN0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMTddKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbWFrZS1ldmFsLWZ1bmN0aW9uLmpzXCIsIDE0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21ha2UtZnVuY3Rpb24tY29uc3RydWN0b3IuanNcIiwgMTUpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIHNldEdsb2JhbE9iamVjdFN5bWJvbFVuc2NvcGFibGVzOiBjZWxsc1sxN10uc2V0R2xvYmFsT2JqZWN0U3ltYm9sVW5zY29wYWJsZXMuc2V0LFxuICAgICAgc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzOiBjZWxsc1sxN10uc2V0R2xvYmFsT2JqZWN0Q29uc3RhbnRQcm9wZXJ0aWVzLnNldCxcbiAgICAgIHNldEdsb2JhbE9iamVjdE11dGFibGVQcm9wZXJ0aWVzOiBjZWxsc1sxN10uc2V0R2xvYmFsT2JqZWN0TXV0YWJsZVByb3BlcnRpZXMuc2V0LFxuICAgICAgc2V0R2xvYmFsT2JqZWN0RXZhbHVhdG9yczogY2VsbHNbMTddLnNldEdsb2JhbE9iamVjdEV2YWx1YXRvcnMuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxOF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlQWxpYXM6IGNlbGxzWzE4XS5tYWtlQWxpYXMuc2V0LFxuICAgICAgbG9hZDogY2VsbHNbMThdLmxvYWQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1sxOV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tb2R1bGUtbG9hZC5qc1wiLCAxOCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZlckV4cG9ydHM6IGNlbGxzWzE5XS5kZWZlckV4cG9ydHMuc2V0LFxuICAgICAgZ2V0RGVmZXJyZWRFeHBvcnRzOiBjZWxsc1sxOV0uZ2V0RGVmZXJyZWRFeHBvcnRzLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjBdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tcGFydG1lbnQtZXZhbHVhdGUuanNcIiwgMTMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vbW9kdWxlLXByb3h5LmpzXCIsIDE5KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1ha2VUaGlyZFBhcnR5TW9kdWxlSW5zdGFuY2U6IGNlbGxzWzIwXS5tYWtlVGhpcmRQYXJ0eU1vZHVsZUluc3RhbmNlLnNldCxcbiAgICAgIG1ha2VNb2R1bGVJbnN0YW5jZTogY2VsbHNbMjBdLm1ha2VNb2R1bGVJbnN0YW5jZS5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzIxXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL2Fzc2VydC5qc1wiLCA0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21vZHVsZS1pbnN0YW5jZS5qc1wiLCAyMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBsaW5rOiBjZWxsc1syMV0ubGluay5zZXQsXG4gICAgICBpbnN0YW50aWF0ZTogY2VsbHNbMjFdLmluc3RhbnRpYXRlLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjJdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tcGFydG1lbnQtZXZhbHVhdGUuanNcIiwgMTMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZ2xvYmFsLW9iamVjdC5qc1wiLCAxNyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tYWtlLXNhZmUtZXZhbHVhdG9yLmpzXCIsIDEyKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21vZHVsZS1saW5rLmpzXCIsIDIxKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21vZHVsZS1sb2FkLmpzXCIsIDE4KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21vZHVsZS1wcm94eS5qc1wiLCAxOSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi93aGl0ZWxpc3QuanNcIiwgMTYpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgSW5lcnRDb21wYXJ0bWVudDogY2VsbHNbMjJdLkluZXJ0Q29tcGFydG1lbnQuc2V0LFxuICAgICAgQ29tcGFydG1lbnRQcm90b3R5cGU6IGNlbGxzWzIyXS5Db21wYXJ0bWVudFByb3RvdHlwZS5zZXQsXG4gICAgICBtYWtlQ29tcGFydG1lbnRDb25zdHJ1Y3RvcjogY2VsbHNbMjJdLm1ha2VDb21wYXJ0bWVudENvbnN0cnVjdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjNdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1ha2VJbnRyaW5zaWNzQ29sbGVjdG9yOiBjZWxsc1syM10ubWFrZUludHJpbnNpY3NDb2xsZWN0b3Iuc2V0LFxuICAgICAgZ2V0R2xvYmFsSW50cmluc2ljczogY2VsbHNbMjNdLmdldEdsb2JhbEludHJpbnNpY3Muc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syNF0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIG1pbkVuYWJsZW1lbnRzOiBjZWxsc1syNF0ubWluRW5hYmxlbWVudHMuc2V0LFxuICAgICAgbW9kZXJhdGVFbmFibGVtZW50czogY2VsbHNbMjRdLm1vZGVyYXRlRW5hYmxlbWVudHMuc2V0LFxuICAgICAgc2V2ZXJlRW5hYmxlbWVudHM6IGNlbGxzWzI0XS5zZXZlcmVFbmFibGVtZW50cy5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzI1XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2VuYWJsZW1lbnRzLmpzXCIsIDI0KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzI1XS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjZdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yOiBjZWxsc1syNl0ubWFrZUVudmlyb25tZW50Q2FwdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMjddKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIDEpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdHlwZXMuanNcIiwgMyk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlTG9nZ2luZ0NvbnNvbGVLaXQ6IGNlbGxzWzI3XS5tYWtlTG9nZ2luZ0NvbnNvbGVLaXQuc2V0LFxuICAgICAgbWFrZUNhdXNhbENvbnNvbGU6IGNlbGxzWzI3XS5tYWtlQ2F1c2FsQ29uc29sZS5zZXQsXG4gICAgICBmaWx0ZXJDb25zb2xlOiBjZWxsc1syN10uZmlsdGVyQ29uc29sZS5zZXQsXG4gICAgICBjb25zb2xlV2hpdGVsaXN0OiBjZWxsc1syN10uY29uc29sZVdoaXRlbGlzdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzI4XSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4uL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBtYWtlUmVqZWN0aW9uSGFuZGxlcnM6IGNlbGxzWzI4XS5tYWtlUmVqZWN0aW9uSGFuZGxlcnMuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1syOV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29uc29sZS5qc1wiLCAyNyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCAxKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3R5cGVzLmpzXCIsIDMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdW5oYW5kbGVkLXJlamVjdGlvbi5qc1wiLCAyOCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICB0YW1lQ29uc29sZTogY2VsbHNbMjldLnRhbWVDb25zb2xlLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzBdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGZpbHRlckZpbGVOYW1lOiBjZWxsc1szMF0uZmlsdGVyRmlsZU5hbWUuc2V0LFxuICAgICAgc2hvcnRlbkNhbGxTaXRlU3RyaW5nOiBjZWxsc1szMF0uc2hvcnRlbkNhbGxTaXRlU3RyaW5nLnNldCxcbiAgICAgIHRhbWVWOEVycm9yQ29uc3RydWN0b3I6IGNlbGxzWzMwXS50YW1lVjhFcnJvckNvbnN0cnVjdG9yLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzFdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuLi93aGl0ZWxpc3QuanNcIiwgMTYpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS12OC1lcnJvci1jb25zdHJ1Y3Rvci5qc1wiLCAzMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZhdWx0OiBjZWxsc1szMV0uZGVmYXVsdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzMyXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbXBhcnRtZW50LXNoaW0uanNcIiwgMjIpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZ2V0QW5vbnltb3VzSW50cmluc2ljczogY2VsbHNbMzJdLmdldEFub255bW91c0ludHJpbnNpY3Muc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1szM10oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lcnJvci9hc3NlcnQuanNcIiwgNCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBpc1R5cGVkQXJyYXk6IGNlbGxzWzMzXS5pc1R5cGVkQXJyYXkuc2V0LFxuICAgICAgbWFrZUhhcmRlbmVyOiBjZWxsc1szM10ubWFrZUhhcmRlbmVyLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzRdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmYXVsdDogY2VsbHNbMzRdLmRlZmF1bHQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1szNV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICB0YW1lRG9tYWluczogY2VsbHNbMzVdLnRhbWVEb21haW5zLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzZdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmYXVsdDogY2VsbHNbMzZdLmRlZmF1bHQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1szN10oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICB0YW1lRnVuY3Rpb25Ub1N0cmluZzogY2VsbHNbMzddLnRhbWVGdW5jdGlvblRvU3RyaW5nLnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbMzhdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgZGVmYXVsdDogY2VsbHNbMzhdLmRlZmF1bHQuc2V0LFxuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuICBmdW5jdG9yc1szOV0oe1xuICAgIGltcG9ydHMoZW50cmllcykge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgfSxcbiAgICBsaXZlVmFyOiB7XG4gICAgfSxcbiAgICBvbmNlVmFyOiB7XG4gICAgICBkZWZhdWx0OiBjZWxsc1szOV0uZGVmYXVsdC5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzQwXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tbW9ucy5qc1wiLCAwKTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzQwXS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbNDFdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vd2hpdGVsaXN0LmpzXCIsIDE2KTtcbiAgICB9LFxuICAgIGxpdmVWYXI6IHtcbiAgICB9LFxuICAgIG9uY2VWYXI6IHtcbiAgICAgIGRlZmF1bHQ6IGNlbGxzWzQxXS5kZWZhdWx0LnNldCxcbiAgICB9LFxuICAgIGltcG9ydE1ldGE6IHt9LFxuICB9KTtcbiAgZnVuY3RvcnNbNDJdKHtcbiAgICBpbXBvcnRzKGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9jb21tb25zLmpzXCIsIDApO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vY29tcGFydG1lbnQtc2hpbS5qc1wiLCAyMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9lbmFibGUtcHJvcGVydHktb3ZlcnJpZGVzLmpzXCIsIDI1KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vudmlyb25tZW50LW9wdGlvbnMuanNcIiwgMjYpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3Ivc3RyaW5naWZ5LXV0aWxzLmpzXCIsIDIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZXJyb3IvdGFtZS1jb25zb2xlLmpzXCIsIDI5KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2Vycm9yL3RhbWUtZXJyb3ItY29uc3RydWN0b3IuanNcIiwgMzEpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vZ2V0LWFub255bW91cy1pbnRyaW5zaWNzLmpzXCIsIDMyKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL2dsb2JhbC1vYmplY3QuanNcIiwgMTcpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vaW50cmluc2ljcy5qc1wiLCAyMyk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9tYWtlLWhhcmRlbmVyLmpzXCIsIDMzKTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL21ha2Utc2FmZS1ldmFsdWF0b3IuanNcIiwgMTIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS1kYXRlLWNvbnN0cnVjdG9yLmpzXCIsIDM0KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RhbWUtZG9tYWlucy5qc1wiLCAzNSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90YW1lLWZ1bmN0aW9uLWNvbnN0cnVjdG9ycy5qc1wiLCAzNik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90YW1lLWZ1bmN0aW9uLXRvc3RyaW5nLmpzXCIsIDM3KTtcbiAgICAgIG9ic2VydmVJbXBvcnRzKG1hcCwgXCIuL3RhbWUtbG9jYWxlLW1ldGhvZHMuanNcIiwgMzgpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vdGFtZS1tYXRoLW9iamVjdC5qc1wiLCAzOSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi90YW1lLXJlZ2V4cC1jb25zdHJ1Y3Rvci5qc1wiLCA0MCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi93aGl0ZWxpc3QtaW50cmluc2ljcy5qc1wiLCA0MSk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi93aGl0ZWxpc3QuanNcIiwgMTYpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgICAgcmVwYWlySW50cmluc2ljczogY2VsbHNbNDJdLnJlcGFpckludHJpbnNpY3Muc2V0LFxuICAgICAgbG9ja2Rvd246IGNlbGxzWzQyXS5sb2NrZG93bi5zZXQsXG4gICAgfSxcbiAgICBpbXBvcnRNZXRhOiB7fSxcbiAgfSk7XG4gIGZ1bmN0b3JzWzQzXSh7XG4gICAgaW1wb3J0cyhlbnRyaWVzKSB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGVudHJpZXMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL2NvbW1vbnMuanNcIiwgMCk7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zcmMvY29tcGFydG1lbnQtc2hpbS5qc1wiLCAyMik7XG4gICAgICBvYnNlcnZlSW1wb3J0cyhtYXAsIFwiLi9zcmMvZXJyb3IvYXNzZXJ0LmpzXCIsIDQpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL2ludHJpbnNpY3MuanNcIiwgMjMpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL2xvY2tkb3duLXNoaW0uanNcIiwgNDIpO1xuICAgICAgb2JzZXJ2ZUltcG9ydHMobWFwLCBcIi4vc3JjL3RhbWUtZnVuY3Rpb24tdG9zdHJpbmcuanNcIiwgMzcpO1xuICAgIH0sXG4gICAgbGl2ZVZhcjoge1xuICAgIH0sXG4gICAgb25jZVZhcjoge1xuICAgIH0sXG4gICAgaW1wb3J0TWV0YToge30sXG4gIH0pO1xuXG4gIHJldHVybiBjZWxsc1tjZWxscy5sZW5ndGggLSAxXVsnKiddLmdldCgpO1xufSkoKTtcblxuLy8gRU5EIG9mIGluamVjdGVkIGNvZGUgZnJvbSBzZXNcbiAgfSkoKVxuICByZXR1cm4gbW9kdWxlLmV4cG9ydHNcbn0pKClcblxuICAgIGNvbnN0IGxvY2tkb3duT3B0aW9ucyA9IHtcbiAgICAgIC8vIGdpdmVzIGEgc2VtaS1oaWdoIHJlc29sdXRpb24gdGltZXJcbiAgICAgIGRhdGVUYW1pbmc6ICd1bnNhZmUnLFxuICAgICAgLy8gdGhpcyBpcyBpbnRyb2R1Y2VzIG5vbi1kZXRlcm1pbmlzbSwgYnV0IGlzIG90aGVyd2lzZSBzYWZlXG4gICAgICBtYXRoVGFtaW5nOiAndW5zYWZlJyxcbiAgICAgIC8vIGxldHMgY29kZSBvYnNlcnZlIGNhbGwgc3RhY2ssIGJ1dCBlYXNpZXIgZGVidWdnYWJpbGl0eVxuICAgICAgZXJyb3JUYW1pbmc6ICd1bnNhZmUnLFxuICAgICAgLy8gc2hvd3MgdGhlIGZ1bGwgY2FsbCBzdGFja1xuICAgICAgc3RhY2tGaWx0ZXJpbmc6ICd2ZXJib3NlJyxcbiAgICAgIC8vIGRlZXAgc3RhY2tzXG4gICAgICBjb25zb2xlVGFtaW5nOiAndW5zYWZlJyxcbiAgICB9XG5cbiAgICBsb2NrZG93bihsb2NrZG93bk9wdGlvbnMpXG5cbiAgICAvLyBpbml0aWFsaXplIHRoZSBrZXJuZWxcbiAgICBjb25zdCBjcmVhdGVLZXJuZWxDb3JlID0gKGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnXG4gIHJldHVybiBjcmVhdGVLZXJuZWxDb3JlXG5cbiAgZnVuY3Rpb24gY3JlYXRlS2VybmVsQ29yZSAoe1xuICAgIC8vIHRoZSBwbGF0Zm9ybSBhcGkgZ2xvYmFsXG4gICAgZ2xvYmFsUmVmLFxuICAgIC8vIHBhY2thZ2UgcG9saWN5IG9iamVjdFxuICAgIGxhdmFtb2F0Q29uZmlnLFxuICAgIC8vIGtlcm5lbCBjb25maWd1cmF0aW9uXG4gICAgbG9hZE1vZHVsZURhdGEsXG4gICAgZ2V0UmVsYXRpdmVNb2R1bGVJZCxcbiAgICBwcmVwYXJlTW9kdWxlSW5pdGlhbGl6ZXJBcmdzLFxuICAgIGdldEV4dGVybmFsQ29tcGFydG1lbnQsXG4gICAgZ2xvYmFsVGhpc1JlZnMsXG4gICAgLy8gc2VjdXJpdHkgb3B0aW9uc1xuICAgIHNjdXR0bGVHbG9iYWxUaGlzLFxuICAgIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9ucyxcbiAgICBkZWJ1Z01vZGUsXG4gICAgcnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlcyxcbiAgICByZXBvcnRTdGF0c0hvb2ssXG4gIH0pIHtcbiAgICAvLyBwcmVwYXJlIHRoZSBMYXZhTW9hdCBrZXJuZWwtY29yZSBmYWN0b3J5XG4gICAgLy8gZmFjdG9yeSBpcyBkZWZpbmVkIHdpdGhpbiBhIENvbXBhcnRtZW50XG4gICAgLy8gdW5sZXNzIFwicnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlc1wiIGlzIGVuYWJsZWRcbiAgICBsZXQgbWFrZUtlcm5lbENvcmVcbiAgICBpZiAocnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlcykge1xuICAgICAgbWFrZUtlcm5lbENvcmUgPSB1bnNhZmVNYWtlS2VybmVsQ29yZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbmRvd21lbnRzOlxuICAgICAgLy8gLSBjb25zb2xlIGlzIGluY2x1ZGVkIGZvciBjb252ZW5pZW5jZVxuICAgICAgLy8gLSBNYXRoIGlzIGZvciB1bnRhbWVkIE1hdGgucmFuZG9tXG4gICAgICAvLyAtIERhdGUgaXMgZm9yIHVudGFtZWQgRGF0ZS5ub3dcbiAgICAgIGNvbnN0IGtlcm5lbENvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHsgY29uc29sZSwgTWF0aCwgRGF0ZSB9KVxuICAgICAgbWFrZUtlcm5lbENvcmUgPSBrZXJuZWxDb21wYXJ0bWVudC5ldmFsdWF0ZShgKCR7dW5zYWZlTWFrZUtlcm5lbENvcmV9KVxcbi8vIyBzb3VyY2VVUkw9TGF2YU1vYXQvY29yZS9rZXJuZWxgKVxuICAgIH1cbiAgICBjb25zdCBsYXZhbW9hdEtlcm5lbCA9IG1ha2VLZXJuZWxDb3JlKHtcbiAgICAgIGdsb2JhbFJlZixcbiAgICAgIGxhdmFtb2F0Q29uZmlnLFxuICAgICAgbG9hZE1vZHVsZURhdGEsXG4gICAgICBnZXRSZWxhdGl2ZU1vZHVsZUlkLFxuICAgICAgcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyQXJncyxcbiAgICAgIGdldEV4dGVybmFsQ29tcGFydG1lbnQsXG4gICAgICBnbG9iYWxUaGlzUmVmcyxcbiAgICAgIHNjdXR0bGVHbG9iYWxUaGlzLFxuICAgICAgc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zLFxuICAgICAgZGVidWdNb2RlLFxuICAgICAgcnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlcyxcbiAgICAgIHJlcG9ydFN0YXRzSG9vayxcbiAgICB9KVxuXG4gICAgcmV0dXJuIGxhdmFtb2F0S2VybmVsXG4gIH1cblxuICAvLyB0aGlzIGlzIHNlcmlhbGl6ZWQgYW5kIHJ1biBpbiBhIFNFUyBDb21wYXJ0bWVudCB3aGVuIFwicnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlc1wiIGlzIGZhbHNlXG4gIC8vIG1vc3RseSBqdXN0IGV4aXN0cyB0byBleHBvc2UgdmFyaWFibGVzIHRvIGludGVybmFsUmVxdWlyZSBhbmQgbG9hZEJ1bmRsZVxuICBmdW5jdGlvbiB1bnNhZmVNYWtlS2VybmVsQ29yZSAoe1xuICAgIGdsb2JhbFJlZixcbiAgICBsYXZhbW9hdENvbmZpZyxcbiAgICBsb2FkTW9kdWxlRGF0YSxcbiAgICBnZXRSZWxhdGl2ZU1vZHVsZUlkLFxuICAgIHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MsXG4gICAgZ2V0RXh0ZXJuYWxDb21wYXJ0bWVudCxcbiAgICBnbG9iYWxUaGlzUmVmcyA9IFsnZ2xvYmFsVGhpcyddLFxuICAgIHNjdXR0bGVHbG9iYWxUaGlzID0gZmFsc2UsXG4gICAgc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zID0gW10sXG4gICAgZGVidWdNb2RlID0gZmFsc2UsXG4gICAgcnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlcyA9IGZhbHNlLFxuICAgIHJlcG9ydFN0YXRzSG9vayA9ICgpID0+IHt9LFxuICB9KSB7XG4gICAgLy8gXCJ0ZW1wbGF0ZVJlcXVpcmVcIiBjYWxscyBhcmUgaW5saW5lZCBpbiBcImdlbmVyYXRlS2VybmVsXCJcbiAgICBjb25zdCBnZW5lcmFsVXRpbHMgPSAvLyBkZWZpbmUgbWFrZUdlbmVyYWxVdGlsc1xuKGZ1bmN0aW9uKCl7XG4gIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFJlZlxuICBjb25zdCBleHBvcnRzID0ge31cbiAgY29uc3QgbW9kdWxlID0geyBleHBvcnRzIH1cbiAgOyhmdW5jdGlvbigpe1xuLy8gU1RBUlQgb2YgaW5qZWN0ZWQgY29kZSBmcm9tIG1ha2VHZW5lcmFsVXRpbHNcbm1vZHVsZS5leHBvcnRzID0gbWFrZUdlbmVyYWxVdGlsc1xuXG5mdW5jdGlvbiBtYWtlR2VuZXJhbFV0aWxzICgpIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVGdW5jdGlvbldyYXBwZXIsXG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVGdW5jdGlvbldyYXBwZXIgKHNvdXJjZVZhbHVlLCB1bndyYXBUZXN0LCB1bndyYXBUbykge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgIGlmIChuZXcudGFyZ2V0KSB7XG4gICAgICAgIC8vIGhhbmRsZSBjb25zdHJ1Y3RvciBjYWxsc1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5jb25zdHJ1Y3Qoc291cmNlVmFsdWUsIGFyZ3MsIG5ldy50YXJnZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBoYW5kbGUgZnVuY3Rpb24gY2FsbHNcbiAgICAgICAgLy8gdW53cmFwIHRvIHRhcmdldCB2YWx1ZSBpZiB0aGlzIHZhbHVlIGlzIHRoZSBzb3VyY2UgcGFja2FnZSBjb21wYXJ0bWVudCdzIGdsb2JhbFRoaXNcbiAgICAgICAgY29uc3QgdGhpc1JlZiA9IHVud3JhcFRlc3QodGhpcykgPyB1bndyYXBUbyA6IHRoaXNcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoc291cmNlVmFsdWUsIHRoaXNSZWYsIGFyZ3MpXG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5ld1ZhbHVlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2VWYWx1ZSkpXG4gICAgcmV0dXJuIG5ld1ZhbHVlXG4gIH1cbn1cblxuLy8gRU5EIG9mIGluamVjdGVkIGNvZGUgZnJvbSBtYWtlR2VuZXJhbFV0aWxzXG4gIH0pKClcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzXG59KSgpKClcbiAgICBjb25zdCB7IGdldEVuZG93bWVudHNGb3JDb25maWcsIG1ha2VNaW5pbWFsVmlld09mUmVmLCBhcHBseUVuZG93bWVudFByb3BEZXNjVHJhbnNmb3JtcyB9ID0gLy8gZGVmaW5lIG1ha2VHZXRFbmRvd21lbnRzRm9yQ29uZmlnXG4oZnVuY3Rpb24oKXtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsUmVmXG4gIGNvbnN0IGV4cG9ydHMgPSB7fVxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHMgfVxuICA7KGZ1bmN0aW9uKCl7XG4vLyBTVEFSVCBvZiBpbmplY3RlZCBjb2RlIGZyb20gbWFrZUdldEVuZG93bWVudHNGb3JDb25maWdcbi8vIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgcHJlbHVkZSB0ZW1wbGF0ZVxuLy8gdGhpcyBtb2R1bGUgaGFzIGJlZW4gd3JpdHRlbiBzbyB0aGF0IGl0IHJlcXVpcmVkIGRpcmVjdGx5IG9yIGNvcGllZCBhbmQgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIHdpdGggYSBzbWFsbCB3cmFwcGVyXG5tb2R1bGUuZXhwb3J0cyA9IG1ha2VHZXRFbmRvd21lbnRzRm9yQ29uZmlnXG5cbi8vIHV0aWxpdGllcyBmb3IgZ2VuZXJhdGluZyB0aGUgZW5kb3dtZW50cyBvYmplY3QgYmFzZWQgb24gYSBnbG9iYWxSZWYgYW5kIGEgY29uZmlnXG5cbi8vIFRoZSBjb25maWcgdXNlcyBhIHBlcmlvZC1kZWxpbWluYXRlZCBwYXRoIG5vdGF0aW9uIHRvIHB1bGwgb3V0IGRlZXAgdmFsdWVzIGZyb20gb2JqZWN0c1xuLy8gVGhlc2UgdXRpbGl0aWVzIGhlbHAgY3JlYXRlIGFuIG9iamVjdCBwb3B1bGF0ZWQgd2l0aCBvbmx5IHRoZSBkZWVwIHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIHRoZSBjb25maWdcblxuZnVuY3Rpb24gbWFrZUdldEVuZG93bWVudHNGb3JDb25maWcgKHsgY3JlYXRlRnVuY3Rpb25XcmFwcGVyIH0pIHtcbiAgcmV0dXJuIHtcbiAgICBnZXRFbmRvd21lbnRzRm9yQ29uZmlnLFxuICAgIG1ha2VNaW5pbWFsVmlld09mUmVmLFxuICAgIGNvcHlWYWx1ZUF0UGF0aCxcbiAgICBhcHBseUdldFNldFByb3BEZXNjVHJhbnNmb3JtcyxcbiAgICBhcHBseUVuZG93bWVudFByb3BEZXNjVHJhbnNmb3JtcyxcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZ2V0RW5kb3dtZW50c0ZvckNvbmZpZ1xuICAgKiBAcGFyYW0ge29iamVjdH0gc291cmNlUmVmIC0gT2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgLSBMYXZhTW9hdCBwYWNrYWdlIGNvbmZpZ1xuICAgKiBAcGFyYW0ge29iamVjdH0gdW53cmFwVG8gLSBGb3IgZ2V0dGVycyBhbmQgc2V0dGVycywgd2hlbiB0aGUgdGhpcy12YWx1ZSBpcyB1bndyYXBGcm9tLCBpcyByZXBsYWNlZCBhcyB1bndyYXBUb1xuICAgKiBAcGFyYW0ge29iamVjdH0gdW53cmFwRnJvbSAtIEZvciBnZXR0ZXJzIGFuZCBzZXR0ZXJzLCB0aGUgdGhpcy12YWx1ZSB0byByZXBsYWNlIChkZWZhdWx0OiB0YXJnZXRSZWYpXG4gICAqIEByZXR1cm4ge29iamVjdH0gLSBUaGUgdGFyZ2V0UmVmXG4gICAqXG4gICAqL1xuICBmdW5jdGlvbiBnZXRFbmRvd21lbnRzRm9yQ29uZmlnIChzb3VyY2VSZWYsIGNvbmZpZywgdW53cmFwVG8sIHVud3JhcEZyb20pIHtcbiAgICBpZiAoIWNvbmZpZy5nbG9iYWxzKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgLy8gdmFsaWRhdGUgcmVhZCBhY2Nlc3MgZnJvbSBjb25maWdcbiAgICBjb25zdCB3aGl0ZWxpc3RlZFJlYWRzID0gW11cbiAgICBjb25zdCBleHBsaWNpdGx5QmFubmVkID0gW11cbiAgICBPYmplY3QuZW50cmllcyhjb25maWcuZ2xvYmFscykuZm9yRWFjaCgoW3BhdGgsIGNvbmZpZ1ZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdCgnLicpXG4gICAgICAvLyBkaXNhbGxvdyBkdW5kZXIgcHJvdG8gaW4gcGF0aFxuICAgICAgY29uc3QgcGF0aENvbnRhaW5zRHVuZGVyUHJvdG8gPSBwYXRoUGFydHMuc29tZShwYXRoUGFydCA9PiBwYXRoUGFydCA9PT0gJ19fcHJvdG9fXycpXG4gICAgICBpZiAocGF0aENvbnRhaW5zRHVuZGVyUHJvdG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhbW9hdCAtIFwiX19wcm90b19fXCIgZGlzYWxsb3dlZCB3aGVuIGNyZWF0aW5nIG1pbmlhbCB2aWV3LiBzYXcgXCIke3BhdGh9XCJgKVxuICAgICAgfVxuICAgICAgLy8gZmFsc2UgbWVhbnMgbm8gYWNjZXNzLiBJdCdzIG5lY2Vzc2FyeSBzbyB0aGF0IG92ZXJyaWRlcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHRpZ2h0ZW4gdGhlIHBvbGljeVxuICAgICAgaWYgKGNvbmZpZ1ZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBleHBsaWNpdGx5QmFubmVkLnB1c2gocGF0aClcbiAgICAgICAgcmV0dXJuIFxuICAgICAgfVxuICAgICAgLy8gd3JpdGUgYWNjZXNzIGhhbmRsZWQgZWxzZXdoZXJlXG4gICAgICBpZiAoY29uZmlnVmFsdWUgPT09ICd3cml0ZScpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnVmFsdWUgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIHVucmVjb2duaXphYmxlIHBvbGljeSB2YWx1ZSAoJHt0eXBlb2YgY29uZmlnVmFsdWV9KSBmb3IgcGF0aCBcIiR7cGF0aH1cImApXG4gICAgICB9XG4gICAgICB3aGl0ZWxpc3RlZFJlYWRzLnB1c2gocGF0aClcbiAgICB9KVxuICAgIHJldHVybiBtYWtlTWluaW1hbFZpZXdPZlJlZihzb3VyY2VSZWYsIHdoaXRlbGlzdGVkUmVhZHMsIHVud3JhcFRvLCB1bndyYXBGcm9tLCBleHBsaWNpdGx5QmFubmVkKVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1pbmltYWxWaWV3T2ZSZWYgKHNvdXJjZVJlZiwgcGF0aHMsIHVud3JhcFRvLCB1bndyYXBGcm9tLCBleHBsaWNpdGx5QmFubmVkID0gW10pIHtcbiAgICBjb25zdCB0YXJnZXRSZWYgPSB7fVxuICAgIHBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG4gICAgICBjb3B5VmFsdWVBdFBhdGgoJycsIHBhdGguc3BsaXQoJy4nKSwgZXhwbGljaXRseUJhbm5lZCwgc291cmNlUmVmLCB0YXJnZXRSZWYsIHVud3JhcFRvLCB1bndyYXBGcm9tKVxuICAgIH0pXG4gICAgcmV0dXJuIHRhcmdldFJlZlxuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kUGF0aCh2aXNpdGVkLCBuZXh0KSB7XG4gICAgaWYgKCF2aXNpdGVkIHx8IHZpc2l0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV4dFxuICAgIH1cbiAgICByZXR1cm4gYCR7dmlzaXRlZH0uJHtuZXh0fWBcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvcHlWYWx1ZUF0UGF0aCAodmlzaXRlZFBhdGgsIHBhdGhQYXJ0cywgZXhwbGljaXRseUJhbm5lZCwgc291cmNlUmVmLCB0YXJnZXRSZWYsIHVud3JhcFRvID0gc291cmNlUmVmLCB1bndyYXBGcm9tID0gdGFyZ2V0UmVmKSB7XG4gICAgaWYgKHBhdGhQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGNvcHksIG11c3QgaGF2ZSBwYXRoUGFydHMsIHdhcyBlbXB0eScpXG4gICAgfVxuICAgIGNvbnN0IFtuZXh0UGFydCwgLi4ucmVtYWluaW5nUGFydHNdID0gcGF0aFBhcnRzXG4gICAgY29uc3QgY3VycmVudFBhdGggPSBleHRlbmRQYXRoKHZpc2l0ZWRQYXRoLCBuZXh0UGFydClcbiAgICAvLyBnZXQgdGhlIHByb3BlcnR5IGZyb20gYW55IGRlcHRoIGluIHRoZSBwcm9wZXJ0eSBjaGFpblxuICAgIGNvbnN0IHsgcHJvcDogc291cmNlUHJvcERlc2MgfSA9IGdldFByb3BlcnR5RGVzY3JpcHRvckRlZXAoc291cmNlUmVmLCBuZXh0UGFydClcblxuICAgIC8vIGlmIHNvdXJjZSBtaXNzaW5nIHRoZSB2YWx1ZSB0byBjb3B5LCBqdXN0IHNraXAgaXRcbiAgICBpZiAoIXNvdXJjZVByb3BEZXNjKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBpZiB0YXJnZXQgYWxyZWFkeSBoYXMgYSB2YWx1ZSwgaXQgbXVzdCBiZSBleHRlbnNpYmxlXG4gICAgY29uc3QgdGFyZ2V0UHJvcERlc2MgPSBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXRSZWYsIG5leHRQYXJ0KVxuICAgIGlmICh0YXJnZXRQcm9wRGVzYykge1xuICAgICAgLy8gZG9udCBhdHRlbXB0IHRvIGV4dGVuZCBhIGdldHRlciBvciB0cmlnZ2VyIGEgc2V0dGVyXG4gICAgICBpZiAoISgndmFsdWUnIGluIHRhcmdldFByb3BEZXNjKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuYWJsZSB0byBjb3B5IG9uIHRvIHRhcmdldFJlZiwgdGFyZ2V0UmVmIGhhcyBhIGdldHRlciBhdCBcIiR7bmV4dFBhcnR9XCJgKVxuICAgICAgfVxuICAgICAgLy8gdmFsdWUgbXVzdCBiZSBleHRlbnNpYmxlIChjYW50IHdyaXRlIHByb3BlcnRpZXMgb250byBpdClcbiAgICAgIGNvbnN0IHRhcmdldFZhbHVlID0gdGFyZ2V0UHJvcERlc2MudmFsdWVcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHR5cGVvZiB0YXJnZXRWYWx1ZVxuICAgICAgaWYgKHZhbHVlVHlwZSAhPT0gJ29iamVjdCcgJiYgdmFsdWVUeXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5hYmxlIHRvIGNvcHkgb24gdG8gdGFyZ2V0UmVmLCB0YXJnZXRSZWYgdmFsdWUgaXMgbm90IGFuIG9iaiBvciBmdW5jIFwiJHtuZXh0UGFydH1cImApXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcGF0aCBpbiB0aGUgYXNzaWdubWVudCwgd2FsayBpbnRvIHRoZSBjb250YWluaW5nIHJlZmVyZW5jZVxuICAgIGlmIChyZW1haW5pbmdQYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IHNvdXJjZVZhbHVlLCBzb3VyY2VXcml0YWJsZSB9ID0gZ2V0U291cmNlVmFsdWUoKVxuICAgICAgY29uc3QgbmV4dFNvdXJjZVJlZiA9IHNvdXJjZVZhbHVlXG4gICAgICBsZXQgbmV4dFRhcmdldFJlZlxuICAgICAgLy8gY2hlY2sgaWYgdmFsdWUgZXhpc3RzIG9uIHRhcmdldCBhbmQgZG9lcyBub3QgbmVlZCBzZWxlY3RpdmUgdHJlYXRtZW50XG4gICAgICBpZiAodGFyZ2V0UHJvcERlc2MgJiYgIWV4cGxpY2l0bHlCYW5uZWQuaW5jbHVkZXMoY3VycmVudFBhdGgpKSB7XG4gICAgICAgIC8vIGEgdmFsdWUgYWxyZWFkeSBleGlzdHMsIHdlIHNob3VsZCB3YWxrIGludG8gaXRcbiAgICAgICAgbmV4dFRhcmdldFJlZiA9IHRhcmdldFByb3BEZXNjLnZhbHVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpdHMgbm90IHBvcHVsYXRlZCBzbyBsZXRzIHdyaXRlIHRvIGl0XG4gICAgICAgIC8vIHB1dCBhbiBvYmplY3QgdG8gc2VydmUgYXMgYSBjb250YWluZXJcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0ge31cbiAgICAgICAgY29uc3QgbmV3UHJvcERlc2MgPSB7XG4gICAgICAgICAgdmFsdWU6IGNvbnRhaW5lclJlZixcbiAgICAgICAgICB3cml0YWJsZTogc291cmNlV3JpdGFibGUsXG4gICAgICAgICAgZW51bWVyYWJsZTogc291cmNlUHJvcERlc2MuZW51bWVyYWJsZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHNvdXJjZVByb3BEZXNjLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgfVxuICAgICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldFJlZiwgbmV4dFBhcnQsIG5ld1Byb3BEZXNjKVxuICAgICAgICAvLyB0aGUgbmV3bHkgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZSB0aGUgbmV4dCB0YXJnZXRcbiAgICAgICAgbmV4dFRhcmdldFJlZiA9IGNvbnRhaW5lclJlZlxuICAgICAgfVxuICAgICAgY29weVZhbHVlQXRQYXRoKGN1cnJlbnRQYXRoLCByZW1haW5pbmdQYXJ0cywgZXhwbGljaXRseUJhbm5lZCwgbmV4dFNvdXJjZVJlZiwgbmV4dFRhcmdldFJlZilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIGNvbmZsaWN0aW5nIHJ1bGVzIGV4aXN0LCBvcHQgZm9yIHRoZSBuZWdhdGl2ZSBvbmUuIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgIGlmIChleHBsaWNpdGx5QmFubmVkLmluY2x1ZGVzKGN1cnJlbnRQYXRoKSkge1xuICAgICAgY29uc29sZS53YXJuKGBMYXZhTW9hdCAtIGNvbmZsaWN0aW5nIHJ1bGVzIGV4aXN0IGZvciBcIiR7Y3VycmVudFBhdGh9XCJgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdGhpcyBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRoLCB0aGUgdmFsdWUgd2UncmUgdHJ5aW5nIHRvIGFjdHVhbGx5IGNvcHlcbiAgICAvLyBpZiBoYXMgZ2V0dGVyL3NldHRlciAtIGFwcGx5IHRoaXMtdmFsdWUgdW53cmFwcGluZ1xuICAgIGlmICghKCd2YWx1ZScgaW4gc291cmNlUHJvcERlc2MpKSB7XG4gICAgICAvLyB3cmFwcGVyIHNldHRlci9nZXR0ZXIgd2l0aCBjb3JyZWN0IHJlY2VpdmVyXG4gICAgICBjb25zdCB3cmFwcGVyUHJvcERlc2MgPSBhcHBseUdldFNldFByb3BEZXNjVHJhbnNmb3Jtcyhzb3VyY2VQcm9wRGVzYywgdW53cmFwRnJvbSwgdW53cmFwVG8pXG4gICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldFJlZiwgbmV4dFBhcnQsIHdyYXBwZXJQcm9wRGVzYylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSB2YWx1ZSB0eXBlIGluIG9yZGVyIHRvIGNvcHkgaXQgd2l0aFxuICAgIC8vIHRoaXMtdmFsdWUgdW53cmFwcGluZyBzdXBwb3J0XG4gICAgY29uc3QgeyBzb3VyY2VWYWx1ZSwgc291cmNlV3JpdGFibGUgfSA9IGdldFNvdXJjZVZhbHVlKClcblxuICAgIC8vIG5vdCBhIGZ1bmN0aW9uIC0gY29weSBhcyBpc1xuICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0UmVmLCBuZXh0UGFydCwgc291cmNlUHJvcERlc2MpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIGFkZCB3b3JrYXJvdW5kIGZvciBmdW5jdGlvbnMgdG8gc3dhcCBiYWNrIHRvIHRoZSBzb3VyY2VhbCBcInRoaXNcIiByZWZlcmVuY2VcbiAgICBjb25zdCB1bndyYXBUZXN0ID0gdGhpc1ZhbHVlID0+IHRoaXNWYWx1ZSA9PT0gdW53cmFwRnJvbVxuICAgIGNvbnN0IG5ld1ZhbHVlID0gY3JlYXRlRnVuY3Rpb25XcmFwcGVyKHNvdXJjZVZhbHVlLCB1bndyYXBUZXN0LCB1bndyYXBUbylcbiAgICBjb25zdCBuZXdQcm9wRGVzYyA9IHtcbiAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgIHdyaXRhYmxlOiBzb3VyY2VXcml0YWJsZSxcbiAgICAgIGVudW1lcmFibGU6IHNvdXJjZVByb3BEZXNjLmVudW1lcmFibGUsXG4gICAgICBjb25maWd1cmFibGU6IHNvdXJjZVByb3BEZXNjLmNvbmZpZ3VyYWJsZSxcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXRSZWYsIG5leHRQYXJ0LCBuZXdQcm9wRGVzYylcblxuICAgIGZ1bmN0aW9uIGdldFNvdXJjZVZhbHVlICgpIHtcbiAgICAgIC8vIGRldGVybWluZSB0aGUgc291cmNlIHZhbHVlLCB0aGlzIGNvZXJjZXMgZ2V0dGVycyB0byB2YWx1ZXNcbiAgICAgIC8vIGltIGRlZXBseSBzb3JyeSwgcmVzcGVjdGluZyBnZXR0ZXJzIHdhcyBjb21wbGljYXRlZCBhbmRcbiAgICAgIC8vIG15IGJyYWluIGlzIG5vdCB2ZXJ5IGdvb2RcbiAgICAgIGxldCBzb3VyY2VWYWx1ZSwgc291cmNlV3JpdGFibGVcbiAgICAgIGlmICgndmFsdWUnIGluIHNvdXJjZVByb3BEZXNjKSB7XG4gICAgICAgIHNvdXJjZVZhbHVlID0gc291cmNlUHJvcERlc2MudmFsdWVcbiAgICAgICAgc291cmNlV3JpdGFibGUgPSBzb3VyY2VQcm9wRGVzYy53cml0YWJsZVxuICAgICAgfSBlbHNlIGlmICgnZ2V0JyBpbiBzb3VyY2VQcm9wRGVzYykge1xuICAgICAgICBzb3VyY2VWYWx1ZSA9IHNvdXJjZVByb3BEZXNjLmdldC5jYWxsKHVud3JhcFRvKVxuICAgICAgICBzb3VyY2VXcml0YWJsZSA9ICdzZXQnIGluIHNvdXJjZVByb3BEZXNjXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldEVuZG93bWVudHNGb3JDb25maWcgLSBwcm9wZXJ0eSBkZXNjcmlwdG9yIG1pc3NpbmcgYSBnZXR0ZXInKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc291cmNlVmFsdWUsIHNvdXJjZVdyaXRhYmxlIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUVuZG93bWVudFByb3BEZXNjVHJhbnNmb3JtcyAocHJvcERlc2MsIHVud3JhcEZyb21Db21wYXJ0bWVudCwgdW53cmFwVG9HbG9iYWxUaGlzKSB7XG4gICAgbGV0IG5ld1Byb3BEZXNjID0gcHJvcERlc2NcbiAgICBuZXdQcm9wRGVzYyA9IGFwcGx5RnVuY3Rpb25Qcm9wRGVzY1RyYW5zZm9ybShuZXdQcm9wRGVzYywgdW53cmFwRnJvbUNvbXBhcnRtZW50LCB1bndyYXBUb0dsb2JhbFRoaXMpXG4gICAgbmV3UHJvcERlc2MgPSBhcHBseUdldFNldFByb3BEZXNjVHJhbnNmb3JtcyhuZXdQcm9wRGVzYywgdW53cmFwRnJvbUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsIHVud3JhcFRvR2xvYmFsVGhpcylcbiAgICByZXR1cm4gbmV3UHJvcERlc2NcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5R2V0U2V0UHJvcERlc2NUcmFuc2Zvcm1zIChzb3VyY2VQcm9wRGVzYywgdW53cmFwRnJvbUdsb2JhbFRoaXMsIHVud3JhcFRvR2xvYmFsVGhpcykge1xuICAgIGNvbnN0IHdyYXBwZWRQcm9wRGVzYyA9IHsgLi4uc291cmNlUHJvcERlc2MgfVxuICAgIGlmIChzb3VyY2VQcm9wRGVzYy5nZXQpIHtcbiAgICAgIHdyYXBwZWRQcm9wRGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpc1xuICAgICAgICAvLyByZXBsYWNlIHRoZSBcInJlY2VpdmVyXCIgdmFsdWUgaWYgaXQgcG9pbnRzIHRvIGZha2UgcGFyZW50XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyUmVmID0gcmVjZWl2ZXIgPT09IHVud3JhcEZyb21HbG9iYWxUaGlzID8gdW53cmFwVG9HbG9iYWxUaGlzIDogcmVjZWl2ZXJcbiAgICAgICAgLy8gc29tZXRpbWVzIGdldHRlcnMgcmVwbGFjZSB0aGVtc2VsdmVzIHdpdGggc3RhdGljIHByb3BlcnRpZXMsIGFzIHNlZW4gd2loIHRoZSBGaXJlRm94IHJ1bnRpbWVcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gUmVmbGVjdC5hcHBseShzb3VyY2VQcm9wRGVzYy5nZXQsIHJlY2VpdmVyUmVmLCBbXSlcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBmdW5jdGlvbnMgbXVzdCBiZSB3cmFwcGVkIHRvIGVuc3VyZSBhIGdvb2QgdGhpcy12YWx1ZS5cbiAgICAgICAgICAvLyBsb2NrZG93biBjYXVzZXMgc29tZSBwcm9wRGVzY3MgdG8gZ28gdG8gdmFsdWUgLT4gZ2V0dGVyLFxuICAgICAgICAgIC8vIGVnIFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcIi4gd2UgbmVlZCB0byB3cmFwIGdldHRlciByZXN1bHRzXG4gICAgICAgICAgLy8gYXMgd2VsbCBpbiBvcmRlciB0byBlbnN1cmUgdGhleSBoYXZlIHRoZWlyIHRoaXMtdmFsdWUgd3JhcHBlZCBjb3JyZWN0bHlcbiAgICAgICAgICAvLyBpZiB0aGlzIGVuZHMgdXAgYmVpbmcgcHJvYmxlbWF0aWMgd2UgY2FuIG1heWJlIHRha2UgYWR2YW50YWdlIG9mIGxvY2tkb3duJ3NcbiAgICAgICAgICAvLyBcImdldHRlci5vcmlnaW5hbFZhbHVlXCIgcHJvcGVydHkgYmVpbmcgYXZhaWxhYmxlXG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uV3JhcHBlcihyZXN1bHQsICh0aGlzVmFsdWUpID0+IHRoaXNWYWx1ZSA9PT0gdW53cmFwRnJvbUdsb2JhbFRoaXMsIHVud3JhcFRvR2xvYmFsVGhpcylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNvdXJjZVByb3BEZXNjLnNldCkge1xuICAgICAgd3JhcHBlZFByb3BEZXNjLnNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvLyByZXBsYWNlIHRoZSBcInJlY2VpdmVyXCIgdmFsdWUgaWYgaXQgcG9pbnRzIHRvIGZha2UgcGFyZW50XG4gICAgICAgIGNvbnN0IHJlY2VpdmVyID0gdGhpc1xuICAgICAgICBjb25zdCByZWNlaXZlclJlZiA9IHJlY2VpdmVyID09PSB1bndyYXBGcm9tR2xvYmFsVGhpcyA/IHVud3JhcFRvR2xvYmFsVGhpcyA6IHJlY2VpdmVyXG4gICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHNvdXJjZVByb3BEZXNjLnNldCwgcmVjZWl2ZXJSZWYsIFt2YWx1ZV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB3cmFwcGVkUHJvcERlc2NcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5RnVuY3Rpb25Qcm9wRGVzY1RyYW5zZm9ybSAocHJvcERlc2MsIHVud3JhcEZyb21Db21wYXJ0bWVudCwgdW53cmFwVG9HbG9iYWxUaGlzKSB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBwcm9wRGVzYyAmJiB0eXBlb2YgcHJvcERlc2MudmFsdWUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICByZXR1cm4gcHJvcERlc2NcbiAgICB9XG4gICAgY29uc3QgdW53cmFwVGVzdCA9ICh0aGlzVmFsdWUpID0+IHtcbiAgICAgIC8vIHVud3JhcCBmdW5jdGlvbiBjYWxscyB0aGlzLXZhbHVlIHRvIHVud3JhcFRvR2xvYmFsVGhpcyB3aGVuOlxuICAgICAgLy8gdGhpcyB2YWx1ZSBpcyBnbG9iYWxUaGlzIGV4LiBnbG9iYWxUaGlzLmFiYygpXG4gICAgICAvLyBzY29wZSBwcm94eSBsZWFrIHdvcmthcm91bmQgZXguIGFiYygpXG4gICAgICByZXR1cm4gdGhpc1ZhbHVlID09PSB1bndyYXBGcm9tQ29tcGFydG1lbnQuZ2xvYmFsVGhpc1xuICAgIH1cbiAgICBjb25zdCBuZXdGbiA9IGNyZWF0ZUZ1bmN0aW9uV3JhcHBlcihwcm9wRGVzYy52YWx1ZSwgdW53cmFwVGVzdCwgdW53cmFwVG9HbG9iYWxUaGlzKVxuICAgIHJldHVybiB7IC4uLnByb3BEZXNjLCB2YWx1ZTogbmV3Rm4gfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvckRlZXAgKHRhcmdldCwga2V5KSB7XG4gIGxldCByZWNlaXZlciA9IHRhcmdldFxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIGFib3J0IGlmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgcHJvdG90eXBlIGNoYWluLlxuICAgIGlmICghcmVjZWl2ZXIpIHtcbiAgICAgIHJldHVybiB7IHByb3A6IG51bGwsIHJlY2VpdmVyOiBudWxsIH1cbiAgICB9XG4gICAgLy8gc3VwcG9ydCBsb29rdXAgb24gb2JqZWN0cyBhbmQgcHJpbWl0aXZlc1xuICAgIGNvbnN0IHR5cGVvZlJlY2VpdmVyID0gdHlwZW9mIHJlY2VpdmVyXG4gICAgaWYgKHR5cGVvZlJlY2VpdmVyID09PSAnb2JqZWN0JyB8fCB0eXBlb2ZSZWNlaXZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgcHJvcCA9IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJlY2VpdmVyLCBrZXkpXG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICByZXR1cm4geyByZWNlaXZlciwgcHJvcCB9XG4gICAgICB9XG4gICAgICAvLyB0cnkgbmV4dCBpbiB0aGUgcHJvdG90eXBlIGNoYWluXG4gICAgICByZWNlaXZlciA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YocmVjZWl2ZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHByb3RvdHlwZSBsb29rdXAgZm9yIHByaW1pdGl2ZXNcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICAgICAgcmVjZWl2ZXIgPSByZWNlaXZlci5fX3Byb3RvX19cbiAgICB9XG4gIH1cbn1cblxuLy8gRU5EIG9mIGluamVjdGVkIGNvZGUgZnJvbSBtYWtlR2V0RW5kb3dtZW50c0ZvckNvbmZpZ1xuICB9KSgpXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0c1xufSkoKShnZW5lcmFsVXRpbHMpXG4gICAgY29uc3QgeyBwcmVwYXJlQ29tcGFydG1lbnRHbG9iYWxGcm9tQ29uZmlnIH0gPSAvLyBkZWZpbmUgbWFrZVByZXBhcmVSZWFsbUdsb2JhbEZyb21Db25maWdcbihmdW5jdGlvbigpe1xuICBjb25zdCBnbG9iYWwgPSBnbG9iYWxSZWZcbiAgY29uc3QgZXhwb3J0cyA9IHt9XG4gIGNvbnN0IG1vZHVsZSA9IHsgZXhwb3J0cyB9XG4gIDsoZnVuY3Rpb24oKXtcbi8vIFNUQVJUIG9mIGluamVjdGVkIGNvZGUgZnJvbSBtYWtlUHJlcGFyZVJlYWxtR2xvYmFsRnJvbUNvbmZpZ1xuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBwcmVsdWRlIHRlbXBsYXRlXG4vLyB0aGlzIG1vZHVsZSBoYXMgYmVlbiB3cml0dGVuIHNvIHRoYXQgaXQgcmVxdWlyZWQgZGlyZWN0bHkgb3IgY29waWVkIGFuZCBhZGRlZCB0byB0aGUgdGVtcGxhdGUgd2l0aCBhIHNtYWxsIHdyYXBwZXJcbm1vZHVsZS5leHBvcnRzID0gbWFrZVByZXBhcmVSZWFsbUdsb2JhbEZyb21Db25maWdcblxuLy8gdXRpbGl0aWVzIGZvciBleHBvc2luZyBjb25maWd1cmluZyB0aGUgZXhwb3NlZCBlbmRvd21lbnRzIG9uIHRoZSBjb250YWluZXIgZ2xvYmFsXG5cbi8vIFRoZSBjb25maWcgdXNlcyBhIHBlcmlvZC1kZWxpbWluYXRlZCBwYXRoIG5vdGF0aW9uIHRvIHB1bGwgb3V0IGRlZXAgdmFsdWVzIGZyb20gb2JqZWN0c1xuLy8gVGhlc2UgdXRpbGl0aWVzIGhlbHAgbW9kaWZ5IHRoZSBjb250YWluZXIgZ2xvYmFsIHRvIGV4cG9zZSB0aGUgYWxsb3dlZCBnbG9iYWxzIGZyb20gdGhlIGdsb2JhbFN0b3JlIE9SIHRoZSBwbGF0Zm9ybSBnbG9iYWxcblxuZnVuY3Rpb24gbWFrZVByZXBhcmVSZWFsbUdsb2JhbEZyb21Db25maWcgKHsgY3JlYXRlRnVuY3Rpb25XcmFwcGVyIH0pIHtcbiAgcmV0dXJuIHtcbiAgICBwcmVwYXJlQ29tcGFydG1lbnRHbG9iYWxGcm9tQ29uZmlnLFxuICAgIGdldFRvcExldmVsUmVhZEFjY2Vzc0Zyb21QYWNrYWdlQ29uZmlnLFxuICAgIGdldFRvcExldmVsV3JpdGVBY2Nlc3NGcm9tUGFja2FnZUNvbmZpZyxcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsUmVhZEFjY2Vzc0Zyb21QYWNrYWdlQ29uZmlnIChnbG9iYWxzQ29uZmlnKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXMoZ2xvYmFsc0NvbmZpZylcbiAgICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdmFsdWUgPT09ICdyZWFkJyB8fCB2YWx1ZSA9PT0gdHJ1ZSB8fCAodmFsdWUgPT09ICd3cml0ZScgJiYga2V5LnNwbGl0KCcuJykubGVuZ3RoID4gMSkpXG4gICAgICAubWFwKChba2V5XSkgPT4ga2V5LnNwbGl0KCcuJylbMF0pXG4gICAgLy8gcmV0dXJuIHVuaXF1ZSBhcnJheVxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQocmVzdWx0KSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFRvcExldmVsV3JpdGVBY2Nlc3NGcm9tUGFja2FnZUNvbmZpZyAoZ2xvYmFsc0NvbmZpZykge1xuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKGdsb2JhbHNDb25maWcpXG4gICAgICAuZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHZhbHVlID09PSAnd3JpdGUnICYmIGtleS5zcGxpdCgnLicpLmxlbmd0aCA9PT0gMSlcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZUNvbXBhcnRtZW50R2xvYmFsRnJvbUNvbmZpZyAocGFja2FnZUNvbXBhcnRtZW50LCBnbG9iYWxzQ29uZmlnLCBlbmRvd21lbnRzLCBnbG9iYWxTdG9yZSwgZ2xvYmFsVGhpc1JlZnMpIHtcbiAgICBjb25zdCBwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWwgPSBwYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpc1xuICAgIC8vIGxvb2t1cCB0b3AgbGV2ZWwgcmVhZCArIHdyaXRlIGFjY2VzcyBrZXlzXG4gICAgY29uc3QgdG9wTGV2ZWxXcml0ZUFjY2Vzc0tleXMgPSBnZXRUb3BMZXZlbFdyaXRlQWNjZXNzRnJvbVBhY2thZ2VDb25maWcoZ2xvYmFsc0NvbmZpZylcbiAgICBjb25zdCB0b3BMZXZlbFJlYWRBY2Nlc3NLZXlzID0gZ2V0VG9wTGV2ZWxSZWFkQWNjZXNzRnJvbVBhY2thZ2VDb25maWcoZ2xvYmFsc0NvbmZpZylcblxuICAgIC8vIGRlZmluZSBhY2Nlc3NvcnNcblxuICAgIC8vIGFsbG93IHJlYWQgYWNjZXNzIHZpYSBnbG9iYWxTdG9yZSBvciBwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWxcbiAgICB0b3BMZXZlbFJlYWRBY2Nlc3NLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWwsIGtleSwge1xuICAgICAgICBnZXQgKCkge1xuICAgICAgICAgIGlmIChnbG9iYWxTdG9yZS5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFN0b3JlLmdldChrZXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldChlbmRvd21lbnRzLCBrZXksIHRoaXMpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZXQgKCkge1xuICAgICAgICAgIC8vIFRPRE86IHRoZXJlIHNob3VsZCBiZSBhIGNvbmZpZyB0byB0aHJvdyB2cyBzaWxlbnRseSBpZ25vcmVcbiAgICAgICAgICBjb25zb2xlLndhcm4oYExhdmFNb2F0OiBpZ25vcmluZyB3cml0ZSBhdHRlbXB0IHRvIHJlYWQtYWNjZXNzIGdsb2JhbCBcIiR7a2V5fVwiYClcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIGFsbG93IHdyaXRlIGFjY2VzcyB0byBnbG9iYWxTdG9yZVxuICAgIC8vIHJlYWQgYWNjZXNzIHZpYSBnbG9iYWxTdG9yZSBvciBwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWxcbiAgICB0b3BMZXZlbFdyaXRlQWNjZXNzS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGFja2FnZUNvbXBhcnRtZW50R2xvYmFsLCBrZXksIHtcbiAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICBpZiAoZ2xvYmFsU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxTdG9yZS5nZXQoa2V5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZW5kb3dtZW50c1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZXQgKHZhbHVlKSB7XG4gICAgICAgICAgZ2xvYmFsU3RvcmUuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIC8vIHNldCBjaXJjdWxhciBnbG9iYWxSZWZzXG4gICAgZ2xvYmFsVGhpc1JlZnMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgLy8gaWYgZ2xvYmFsUmVmIGlzIGFjdHVhbGx5IGFuIGVuZG93bWVudCwgaWdub3JlXG4gICAgICBpZiAodG9wTGV2ZWxSZWFkQWNjZXNzS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKHRvcExldmVsV3JpdGVBY2Nlc3NLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICAvLyBzZXQgY2lyY3VsYXIgcmVmIHRvIGdsb2JhbFxuICAgICAgcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsW2tleV0gPSBwYWNrYWdlQ29tcGFydG1lbnRHbG9iYWxcbiAgICB9KVxuXG4gICAgLy8gYmluZCBGdW5jdGlvbiBjb25zdHJ1Y3RvciB0aGlzIHZhbHVlIHRvIGdsb2JhbFRoaXNcbiAgICAvLyBsZWdhY3kgZ2xvYmFsVGhpcyBzaGltXG4gICAgY29uc3Qgb3JpZ0Z1bmN0aW9uID0gcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsLkZ1bmN0aW9uXG4gICAgY29uc3QgbmV3RnVuY3Rpb24gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3QgZm4gPSBvcmlnRnVuY3Rpb24oLi4uYXJncylcbiAgICAgIGNvbnN0IHVud3JhcFRlc3QgPSB0aGlzVmFsdWUgPT4gdGhpc1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbldyYXBwZXIoZm4sIHVud3JhcFRlc3QsIHBhY2thZ2VDb21wYXJ0bWVudEdsb2JhbClcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobmV3RnVuY3Rpb24sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdGdW5jdGlvbikpXG4gICAgcGFja2FnZUNvbXBhcnRtZW50R2xvYmFsLkZ1bmN0aW9uID0gbmV3RnVuY3Rpb25cbiAgfVxufVxuXG4vLyBFTkQgb2YgaW5qZWN0ZWQgY29kZSBmcm9tIG1ha2VQcmVwYXJlUmVhbG1HbG9iYWxGcm9tQ29uZmlnXG4gIH0pKClcbiAgcmV0dXJuIG1vZHVsZS5leHBvcnRzXG59KSgpKGdlbmVyYWxVdGlscylcbiAgICBjb25zdCB7IHN0cmljdFNjb3BlVGVybWluYXRvciB9ID0gLy8gZGVmaW5lIHN0cmljdC1zY29wZS10ZXJtaW5hdG9yXG4oZnVuY3Rpb24oKXtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsUmVmXG4gIGNvbnN0IGV4cG9ydHMgPSB7fVxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHMgfVxuICA7KGZ1bmN0aW9uKCl7XG4vLyBTVEFSVCBvZiBpbmplY3RlZCBjb2RlIGZyb20gc3RyaWN0LXNjb3BlLXRlcm1pbmF0b3Jcbi8vIGltcG9ydCB7XG4vLyAgIFByb3h5LFxuLy8gICBTdHJpbmcsXG4vLyAgIFR5cGVFcnJvcixcbi8vICAgUmVmZXJlbmNlRXJyb3IsXG4vLyAgIGNyZWF0ZSxcbi8vICAgZnJlZXplLFxuLy8gICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuLy8gICBnbG9iYWxUaGlzLFxuLy8gICBpbW11dGFibGVPYmplY3QsXG4vLyB9IGZyb20gJy4vY29tbW9ucy5qcyc7XG5jb25zdCB7IGZyZWV6ZSwgY3JlYXRlLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5jb25zdCBpbW11dGFibGVPYmplY3QgPSBmcmVlemUoY3JlYXRlKG51bGwpKTtcblxuLy8gaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSAnLi9lcnJvci9hc3NlcnQuanMnO1xuY29uc3QgYXNzZXJ0ID0ge1xuICBmYWlsOiAobXNnKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gIH1cbn1cblxuLy8gY29uc3QgeyBkZXRhaWxzOiBkLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuY29uc3QgZCA9IChzdHJpbmdzLCBhcmdzKSA9PiBzdHJpbmdzLmpvaW4oKSArIGFyZ3Muam9pbigpO1xuY29uc3QgcSA9IChhcmcpID0+IGFyZ1xuXG4vKipcbiAqIGFsd2F5c1Rocm93SGFuZGxlclxuICogVGhpcyBpcyBhbiBvYmplY3QgdGhhdCB0aHJvd3MgaWYgYW55IHByb3BlcnR5IGlzIGNhbGxlZC4gSXQncyB1c2VkIGFzXG4gKiBhIHByb3h5IGhhbmRsZXIgd2hpY2ggdGhyb3dzIG9uIGFueSB0cmFwIGNhbGxlZC5cbiAqIEl0J3MgbWFkZSBmcm9tIGEgcHJveHkgd2l0aCBhIGdldCB0cmFwIHRoYXQgdGhyb3dzLiBJdCdzIHNhZmUgdG9cbiAqIGNyZWF0ZSBvbmUgYW5kIHNoYXJlIGl0IGJldHdlZW4gYWxsIFByb3h5IGhhbmRsZXJzLlxuICovXG5jb25zdCBhbHdheXNUaHJvd0hhbmRsZXIgPSBuZXcgUHJveHkoXG4gIGltbXV0YWJsZU9iamVjdCxcbiAgZnJlZXplKHtcbiAgICBnZXQoX3NoYWRvdywgcHJvcCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBkYFBsZWFzZSByZXBvcnQgdW5leHBlY3RlZCBzY29wZSBoYW5kbGVyIHRyYXA6ICR7cShTdHJpbmcocHJvcCkpfWAsXG4gICAgICApO1xuICAgIH0sXG4gIH0pLFxuKTtcblxuLypcbiAqIHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllc1xuICogc2NvcGVUZXJtaW5hdG9ySGFuZGxlciBtYW5hZ2VzIGEgc3RyaWN0U2NvcGVUZXJtaW5hdG9yIFByb3h5IHdoaWNoIHNlcnZlcyBhc1xuICogdGhlIGZpbmFsIHNjb3BlIGJvdW5kYXJ5IHRoYXQgd2lsbCBhbHdheXMgcmV0dXJuIFwidW5kZWZpbmVkXCIgaW4gb3JkZXJcbiAqIHRvIHByZXZlbnQgYWNjZXNzIHRvIFwic3RhcnQgY29tcGFydG1lbnQgZ2xvYmFsc1wiLlxuICovXG5jb25zdCBzY29wZVByb3h5SGFuZGxlclByb3BlcnRpZXMgPSB7XG4gIGdldChfc2hhZG93LCBfcHJvcCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgc2V0KF9zaGFkb3csIHByb3AsIF92YWx1ZSkge1xuICAgIC8vIFdlIHNob3VsZCBvbmx5IGhpdCB0aGlzIGlmIHRoZSBoYXMoKSBob29rIHJldHVybmVkIHRydWUgbWF0Y2hlcyB0aGUgdjhcbiAgICAvLyBSZWZlcmVuY2VFcnJvciBtZXNzYWdlIFwiVW5jYXVnaHQgUmVmZXJlbmNlRXJyb3I6IHh5eiBpcyBub3QgZGVmaW5lZFwiXG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKGAke1N0cmluZyhwcm9wKX0gaXMgbm90IGRlZmluZWRgKTtcbiAgfSxcblxuICBoYXMoX3NoYWRvdywgcHJvcCkge1xuICAgIC8vIHdlIG11c3QgYXQgbGVhc3QgcmV0dXJuIHRydWUgZm9yIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSByZWFsbSBnbG9iYWxUaGlzXG4gICAgcmV0dXJuIHByb3AgaW4gZ2xvYmFsVGhpcztcbiAgfSxcblxuICAvLyBub3RlOiB0aGlzIGlzIGxpa2VseSBhIGJ1ZyBvZiBzYWZhcmlcbiAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTUzNFxuICBnZXRQcm90b3R5cGVPZigpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvLyBDaGlwIGhhcyBzZWVuIHRoaXMgaGFwcGVuIHNpbmdsZSBzdGVwcGluZyB1bmRlciB0aGUgQ2hyb21lL3Y4IGRlYnVnZ2VyLlxuICAvLyBUT0RPIHJlY29yZCBob3cgdG8gcmVsaWFibHkgcmVwcm9kdWNlLCBhbmQgdG8gdGVzdCBpZiB0aGlzIGZpeCBoZWxwcy5cbiAgLy8gVE9ETyByZXBvcnQgYXMgYnVnIHRvIHY4IG9yIENocm9tZSwgYW5kIHJlY29yZCBpc3N1ZSBsaW5rIGhlcmUuXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdGFyZ2V0LCBwcm9wKSB7XG4gICAgLy8gQ29lcmNlIHdpdGggYFN0cmluZ2AgaW4gY2FzZSBwcm9wIGlzIGEgc3ltYm9sLlxuICAgIGNvbnN0IHF1b3RlZFByb3AgPSBxKFN0cmluZyhwcm9wKSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGxcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIHRyYXAgb24gc2NvcGVUZXJtaW5hdG9ySGFuZGxlciBmb3IgJHtxdW90ZWRQcm9wfWAsXG4gICAgICBuZXcgVHlwZUVycm9yKCkuc3RhY2ssXG4gICAgKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9LFxufTtcblxuLy8gVGhlIHNjb3BlIGhhbmRsZXIncyBwcm90b3R5cGUgaXMgYSBwcm94eSB0aGF0IHRocm93cyBpZiBhbnkgdHJhcCBvdGhlclxuLy8gdGhhbiBnZXQvc2V0L2hhcyBhcmUgcnVuIChsaWtlIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGFwcGx5LFxuLy8gZ2V0UHJvdG90eXBlT2YpLlxuY29uc3Qgc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlciA9IGZyZWV6ZShcbiAgY3JlYXRlKFxuICAgIGFsd2F5c1Rocm93SGFuZGxlcixcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNjb3BlUHJveHlIYW5kbGVyUHJvcGVydGllcyksXG4gICksXG4pO1xuXG5jb25zdCBzdHJpY3RTY29wZVRlcm1pbmF0b3IgPSBuZXcgUHJveHkoXG4gIGltbXV0YWJsZU9iamVjdCxcbiAgc3RyaWN0U2NvcGVUZXJtaW5hdG9ySGFuZGxlcixcbik7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhbHdheXNUaHJvd0hhbmRsZXIsXG4gIHN0cmljdFNjb3BlVGVybWluYXRvckhhbmRsZXIsXG4gIHN0cmljdFNjb3BlVGVybWluYXRvcixcbn1cblxuLy8gRU5EIG9mIGluamVjdGVkIGNvZGUgZnJvbSBzdHJpY3Qtc2NvcGUtdGVybWluYXRvclxuICB9KSgpXG4gIHJldHVybiBtb2R1bGUuZXhwb3J0c1xufSkoKVxuXG4gICAgY29uc3QgbW9kdWxlQ2FjaGUgPSBuZXcgTWFwKClcbiAgICBjb25zdCBwYWNrYWdlQ29tcGFydG1lbnRDYWNoZSA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGdsb2JhbFN0b3JlID0gbmV3IE1hcCgpXG5cbiAgICBjb25zdCByb290UGFja2FnZU5hbWUgPSAnJHJvb3QkJ1xuICAgIGNvbnN0IHJvb3RQYWNrYWdlQ29tcGFydG1lbnQgPSBjcmVhdGVSb290UGFja2FnZUNvbXBhcnRtZW50KGdsb2JhbFJlZilcblxuICAgIC8vIHNjdXR0bGUgZ2xvYmFsVGhpcyByaWdodCBhZnRlciB3ZSB1c2VkIGl0IHRvIGNyZWF0ZSB0aGUgcm9vdCBwYWNrYWdlIGNvbXBhcnRtZW50XG4gICAgaWYgKHNjdXR0bGVHbG9iYWxUaGlzKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCBcIiR7dHlwZW9mIHNjdXR0bGVHbG9iYWxUaGlzRXhjZXB0aW9uc31cImApXG4gICAgICB9XG4gICAgICBwZXJmb3JtU2N1dHRsZUdsb2JhbFRoaXMoZ2xvYmFsUmVmLCBzY3V0dGxlR2xvYmFsVGhpc0V4Y2VwdGlvbnMpXG4gICAgfVxuXG4gICAgY29uc3Qga2VybmVsID0ge1xuICAgICAgaW50ZXJuYWxSZXF1aXJlLFxuICAgIH1cbiAgICBpZiAoZGVidWdNb2RlKSB7XG4gICAgICBrZXJuZWwuX2dldFBvbGljeUZvclBhY2thZ2UgPSBnZXRQb2xpY3lGb3JQYWNrYWdlXG4gICAgICBrZXJuZWwuX2dldENvbXBhcnRtZW50Rm9yUGFja2FnZSA9IGdldENvbXBhcnRtZW50Rm9yUGFja2FnZVxuICAgIH1cbiAgICBPYmplY3QuZnJlZXplKGtlcm5lbClcbiAgICByZXR1cm4ga2VybmVsXG5cbiAgICBmdW5jdGlvbiBwZXJmb3JtU2N1dHRsZUdsb2JhbFRoaXMgKGdsb2JhbFJlZiwgZXh0cmFQcm9wc1RvQXZvaWQgPSBuZXcgQXJyYXkoKSkge1xuICAgICAgY29uc3QgcHJvcHMgPSBuZXcgQXJyYXkoKVxuICAgICAgZ2V0UHJvdG90eXBlQ2hhaW4oZ2xvYmFsUmVmKVxuICAgICAgICAuZm9yRWFjaChwcm90byA9PlxuICAgICAgICAgIHByb3BzLnB1c2goLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKSlcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRyYVByb3BzVG9Bdm9pZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwcm9wID0gZXh0cmFQcm9wc1RvQXZvaWRbaV1cbiAgICAgICAgaWYgKCFwcm9wLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFydHMgPSBwcm9wLnNwbGl0KCcvJylcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhcnRzLnNsaWNlKDEsIC0xKS5qb2luKCcvJylcbiAgICAgICAgY29uc3QgZmxhZ3MgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXVxuICAgICAgICBleHRyYVByb3BzVG9Bdm9pZFtpXSA9IG5ldyBSZWdFeHAocGF0dGVybiwgZmxhZ3MpXG4gICAgICB9XG5cbiAgICAgIC8vIHN1cHBvcnQgTE0sU0VTIGV4cG9ydGVkIEFQSXMgYW5kIHBvbHlmaWxsc1xuICAgICAgY29uc3QgYXZvaWRGb3JMYXZhTW9hdENvbXBhdGliaWxpdHkgPSBbJ0NvbXBhcnRtZW50JywgJ0Vycm9yJywgJ2dsb2JhbFRoaXMnXVxuICAgICAgY29uc3QgcHJvcHNUb0F2b2lkID0gbmV3IFNldChbLi4uYXZvaWRGb3JMYXZhTW9hdENvbXBhdGliaWxpdHksIC4uLmV4dHJhUHJvcHNUb0F2b2lkXSlcblxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgICAgIGlmIChzaG91bGRBdm9pZFByb3AocHJvcHNUb0F2b2lkLCBwcm9wKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZ2xvYmFsUmVmLCBwcm9wKT8uY29uZmlndXJhYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVzYyA9IHtcbiAgICAgICAgICBzZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYExhdmFNb2F0IC0gcHJvcGVydHkgXCIke3Byb3B9XCIgb2YgZ2xvYmFsVGhpcyBjYW5ub3QgYmUgc2V0IHVuZGVyIHNjdXR0bGluZyBtb2RlLiBgICtcbiAgICAgICAgICAgICAgJ1RvIGxlYXJuIG1vcmUgdmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL0xhdmFNb2F0L0xhdmFNb2F0L3B1bGwvMzYwLicsXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYExhdmFNb2F0IC0gcHJvcGVydHkgXCIke3Byb3B9XCIgb2YgZ2xvYmFsVGhpcyBpcyBpbmFjY2Vzc2libGUgdW5kZXIgc2N1dHRsaW5nIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAnVG8gbGVhcm4gbW9yZSB2aXNpdCBodHRwczovL2dpdGh1Yi5jb20vTGF2YU1vYXQvTGF2YU1vYXQvcHVsbC8zNjAuJyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGdsb2JhbFJlZiwgcHJvcCwgZGVzYylcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uIGluc3RhbnRpYXRpZXMgYSBtb2R1bGUgZnJvbSBhIG1vZHVsZUlkLlxuICAgIC8vIDEuIGxvYWRzIHRoZSBtb2R1bGUgbWV0YWRhdGEgYW5kIHBvbGljeVxuICAgIC8vIDIuIHByZXBhcmVzIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnRcbiAgICAvLyAzLiBpbnN0YW50aWF0ZXMgdGhlIG1vZHVsZSwgcmVjdXJzaXZlbHkgaW5zdGFudGlhdGluZyBkZXBlbmRlbmNpZXNcbiAgICAvLyA0LiByZXR1cm5zIHRoZSBtb2R1bGUgZXhwb3J0c1xuICAgIGZ1bmN0aW9uIGludGVybmFsUmVxdWlyZSAobW9kdWxlSWQpIHtcbiAgICAgIC8vIHVzZSBjYWNoZWQgbW9kdWxlLmV4cG9ydHMgaWYgbW9kdWxlIGlzIGFscmVhZHkgaW5zdGFudGlhdGVkXG4gICAgICBpZiAobW9kdWxlQ2FjaGUuaGFzKG1vZHVsZUlkKSkge1xuICAgICAgICBjb25zdCBtb2R1bGVFeHBvcnRzID0gbW9kdWxlQ2FjaGUuZ2V0KG1vZHVsZUlkKS5leHBvcnRzXG4gICAgICAgIHJldHVybiBtb2R1bGVFeHBvcnRzXG4gICAgICB9XG5cbiAgICAgIHJlcG9ydFN0YXRzSG9vaygnc3RhcnQnLCBtb2R1bGVJZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gbG9hZCBhbmQgdmFsaWRhdGUgbW9kdWxlIG1ldGFkYXRhXG4gICAgICAgIC8vIGlmIG1vZHVsZSBtZXRhZGF0YSBpcyBtaXNzaW5nLCB0aHJvdyBhbiBlcnJvclxuICAgICAgICBjb25zdCBtb2R1bGVEYXRhID0gbG9hZE1vZHVsZURhdGEobW9kdWxlSWQpXG4gICAgICAgIGlmICghbW9kdWxlRGF0YSkge1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlIFxcJycgKyBtb2R1bGVJZCArICdcXCcnKVxuICAgICAgICAgIGVyci5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnXG4gICAgICAgICAgdGhyb3cgZXJyXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vZHVsZURhdGEuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTGF2YU1vYXQgLSBtb2R1bGVJZCBpcyBub3QgZGVmaW5lZCBjb3JyZWN0bHkuJylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhcnNlIGFuZCB2YWxpZGF0ZSBtb2R1bGUgZGF0YVxuICAgICAgICBjb25zdCB7IHBhY2thZ2U6IHBhY2thZ2VOYW1lLCBzb3VyY2U6IG1vZHVsZVNvdXJjZSB9ID0gbW9kdWxlRGF0YVxuICAgICAgICBpZiAoIXBhY2thZ2VOYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIG1pc3NpbmcgcGFja2FnZU5hbWUgZm9yIG1vZHVsZSBcIiR7bW9kdWxlSWR9XCJgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhY2thZ2VQb2xpY3kgPSBnZXRQb2xpY3lGb3JQYWNrYWdlKGxhdmFtb2F0Q29uZmlnLCBwYWNrYWdlTmFtZSlcblxuICAgICAgICAvLyBjcmVhdGUgdGhlIG1vZHVsZU9iaiBhbmQgaW5pdGlhbGl6ZXJcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJbml0aWFsaXplciwgbW9kdWxlT2JqIH0gPSBwcmVwYXJlTW9kdWxlSW5pdGlhbGl6ZXIobW9kdWxlRGF0YSwgcGFja2FnZVBvbGljeSlcblxuICAgICAgICAvLyBjYWNoZSBtb2R1bGVPYmogaGVyZVxuICAgICAgICAvLyB0aGlzIGlzIGltcG9ydGFudCB0byBpbmYgbG9vcHMgd2hlbiBoaXR0aW5nIGN5Y2xlcyBpbiB0aGUgZGVwIGdyYXBoXG4gICAgICAgIC8vIG11c3QgY2FjaGUgYmVmb3JlIHJ1bm5pbmcgdGhlIG1vZHVsZUluaXRpYWxpemVyXG4gICAgICAgIG1vZHVsZUNhY2hlLnNldChtb2R1bGVJZCwgbW9kdWxlT2JqKVxuXG4gICAgICAgIC8vIHZhbGlkYXRlIG1vZHVsZUluaXRpYWxpemVyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlSW5pdGlhbGl6ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gbW9kdWxlSW5pdGlhbGl6ZXIgaXMgbm90IGRlZmluZWQgY29ycmVjdGx5LiBnb3QgXCIke3R5cGVvZiBtb2R1bGVJbml0aWFsaXplcn1cIlxcbiR7bW9kdWxlU291cmNlfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBtb2R1bGUgd2l0aCB0aGUgY29ycmVjdCBjb250ZXh0XG4gICAgICAgIGNvbnN0IGluaXRpYWxpemVyQXJncyA9IHByZXBhcmVNb2R1bGVJbml0aWFsaXplckFyZ3MocmVxdWlyZVJlbGF0aXZlV2l0aENvbnRleHQsIG1vZHVsZU9iaiwgbW9kdWxlRGF0YSlcbiAgICAgICAgbW9kdWxlSW5pdGlhbGl6ZXIuYXBwbHkobW9kdWxlT2JqLmV4cG9ydHMsIGluaXRpYWxpemVyQXJncylcbiAgICAgICAgY29uc3QgbW9kdWxlRXhwb3J0cyA9IG1vZHVsZU9iai5leHBvcnRzXG4gICAgICAgIHJldHVybiBtb2R1bGVFeHBvcnRzXG5cbiAgICAgICAgLy8gdGhpcyBpcyBwYXNzZWQgdG8gdGhlIG1vZHVsZSBpbml0aWFsaXplclxuICAgICAgICAvLyBpdCBhZGRzIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJlbnQgbW9kdWxlXG4gICAgICAgIC8vIHRoaXMgY291bGQgYmUgcmVwbGFjZWQgdmlhIFwiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcIiBpZiBpdHMgbW9yZSBwZXJmb3JtYW50XG4gICAgICAgIGZ1bmN0aW9uIHJlcXVpcmVSZWxhdGl2ZVdpdGhDb250ZXh0IChyZXF1ZXN0ZWROYW1lKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50TW9kdWxlRXhwb3J0cyA9IG1vZHVsZU9iai5leHBvcnRzXG4gICAgICAgICAgY29uc3QgcGFyZW50TW9kdWxlRGF0YSA9IG1vZHVsZURhdGFcbiAgICAgICAgICBjb25zdCBwYXJlbnRQYWNrYWdlUG9saWN5ID0gcGFja2FnZVBvbGljeVxuICAgICAgICAgIGNvbnN0IHBhcmVudE1vZHVsZUlkID0gbW9kdWxlSWRcbiAgICAgICAgICByZXR1cm4gcmVxdWlyZVJlbGF0aXZlKHsgcmVxdWVzdGVkTmFtZSwgcGFyZW50TW9kdWxlRXhwb3J0cywgcGFyZW50TW9kdWxlRGF0YSwgcGFyZW50UGFja2FnZVBvbGljeSwgcGFyZW50TW9kdWxlSWQgfSlcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVwb3J0U3RhdHNIb29rKCdlbmQnLCBtb2R1bGVJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzIHJlc29sdmVzIGEgbW9kdWxlIGdpdmVuIGEgcmVxdWVzdGVkTmFtZSAoZWcgcmVsYXRpdmUgcGF0aCB0byBwYXJlbnQpIGFuZCBhIHBhcmVudE1vZHVsZSBjb250ZXh0XG4gICAgLy8gdGhlIGV4cG9ydHMgYXJlIHByb2Nlc3NlZCB2aWEgXCJwcm90ZWN0RXhwb3J0c1JlcXVpcmVUaW1lXCIgcGVyIHRoZSBtb2R1bGUncyBjb25maWd1cmF0aW9uXG4gICAgZnVuY3Rpb24gcmVxdWlyZVJlbGF0aXZlICh7IHJlcXVlc3RlZE5hbWUsIHBhcmVudE1vZHVsZUV4cG9ydHMsIHBhcmVudE1vZHVsZURhdGEsIHBhcmVudFBhY2thZ2VQb2xpY3ksIHBhcmVudE1vZHVsZUlkIH0pIHtcbiAgICAgIGNvbnN0IHBhcmVudE1vZHVsZVBhY2thZ2VOYW1lID0gcGFyZW50TW9kdWxlRGF0YS5wYWNrYWdlXG4gICAgICBjb25zdCBwYXJlbnRQYWNrYWdlc1doaXRlbGlzdCA9IHBhcmVudFBhY2thZ2VQb2xpY3kucGFja2FnZXNcbiAgICAgIGNvbnN0IHBhcmVudEJ1aWx0aW5zV2hpdGVsaXN0ID0gT2JqZWN0LmVudHJpZXMocGFyZW50UGFja2FnZVBvbGljeS5idWlsdGluKVxuICAgICAgICAuZmlsdGVyKChbXywgYWxsb3dlZF0pID0+IGFsbG93ZWQgPT09IHRydWUpXG4gICAgICAgIC5tYXAoKFtwYWNrYWdlUGF0aCwgYWxsb3dlZF0pID0+IHBhY2thZ2VQYXRoLnNwbGl0KCcuJylbMF0pXG5cbiAgICAgIC8vIHJlc29sdmUgdGhlIG1vZHVsZUlkIGZyb20gdGhlIHJlcXVlc3RlZE5hbWVcbiAgICAgIGNvbnN0IG1vZHVsZUlkID0gZ2V0UmVsYXRpdmVNb2R1bGVJZChwYXJlbnRNb2R1bGVJZCwgcmVxdWVzdGVkTmFtZSlcblxuICAgICAgLy8gYnJvd3NlcmlmeSBnb29wOlxuICAgICAgLy8gcmVjdXJzaXZlIHJlcXVpcmVzIGRvbnQgaGl0IGNhY2hlIHNvIGl0IGluZiBsb29wcywgc28gd2Ugc2hvcnRjaXJjdWl0XG4gICAgICAvLyB0aGlzIG9ubHkgc2VlbXMgdG8gaGFwcGVuIHdpdGggYSBmZXcgYnJvd3NlcmlmeSBidWlsdGlucyAobm9kZWpzIGJ1aWx0aW4gbW9kdWxlIHBvbHlmaWxscylcbiAgICAgIC8vIHdlIGNvdWxkIGxpa2VseSBhbGxvdyBhbnkgcmVxdWVzdGVkTmFtZSBzaW5jZSBpdCBjYW4gb25seSByZWZlciB0byBpdHNlbGZcbiAgICAgIGlmIChtb2R1bGVJZCA9PT0gcGFyZW50TW9kdWxlSWQpIHtcbiAgICAgICAgaWYgKFsndGltZXJzJywgJ2J1ZmZlciddLmluY2x1ZGVzKHJlcXVlc3RlZE5hbWUpID09PSBmYWxzZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSByZWN1cnNpdmUgcmVxdWlyZSBkZXRlY3RlZDogXCIke3JlcXVlc3RlZE5hbWV9XCJgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnRNb2R1bGVFeHBvcnRzXG4gICAgICB9XG5cbiAgICAgIC8vIGxvYWQgbW9kdWxlXG4gICAgICBsZXQgbW9kdWxlRXhwb3J0cyA9IGludGVybmFsUmVxdWlyZShtb2R1bGVJZClcblxuICAgICAgLy8gbG9vayB1cCBjb25maWcgZm9yIG1vZHVsZVxuICAgICAgY29uc3QgbW9kdWxlRGF0YSA9IGxvYWRNb2R1bGVEYXRhKG1vZHVsZUlkKVxuICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSBtb2R1bGVEYXRhLnBhY2thZ2VcblxuICAgICAgLy8gZGlzYWxsb3cgcmVxdWlyaW5nIHBhY2thZ2VzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcGFyZW50J3Mgd2hpdGVsaXN0XG4gICAgICBjb25zdCBpc1NhbWVQYWNrYWdlID0gcGFja2FnZU5hbWUgPT09IHBhcmVudE1vZHVsZVBhY2thZ2VOYW1lXG4gICAgICBjb25zdCBwYXJlbnRJc0VudHJ5TW9kdWxlID0gcGFyZW50TW9kdWxlUGFja2FnZU5hbWUgPT09IHJvb3RQYWNrYWdlTmFtZVxuICAgICAgbGV0IGlzSW5QYXJlbnRXaGl0ZWxpc3QgPSBmYWxzZVxuICAgICAgaWYgKG1vZHVsZURhdGEudHlwZSA9PT0gJ2J1aWx0aW4nKSB7XG4gICAgICAgIGlzSW5QYXJlbnRXaGl0ZWxpc3QgPSBwYXJlbnRCdWlsdGluc1doaXRlbGlzdC5pbmNsdWRlcyhwYWNrYWdlTmFtZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSW5QYXJlbnRXaGl0ZWxpc3QgPSAocGFyZW50UGFja2FnZXNXaGl0ZWxpc3RbcGFja2FnZU5hbWVdID09PSB0cnVlKVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZGF0ZSB0aGF0IHRoZSBpbXBvcnQgaXMgYWxsb3dlZFxuICAgICAgaWYgKCFwYXJlbnRJc0VudHJ5TW9kdWxlICYmICFpc1NhbWVQYWNrYWdlICYmICFpc0luUGFyZW50V2hpdGVsaXN0KSB7XG4gICAgICAgIGxldCB0eXBlVGV4dCA9ICcgJ1xuICAgICAgICBpZiAobW9kdWxlRGF0YS50eXBlID09PSAnYnVpbHRpbicpIHtcbiAgICAgICAgICB0eXBlVGV4dCA9ICcgbm9kZSBidWlsdGluICdcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gcmVxdWlyZWQke3R5cGVUZXh0fXBhY2thZ2Ugbm90IGluIGFsbG93bGlzdDogcGFja2FnZSBcIiR7cGFyZW50TW9kdWxlUGFja2FnZU5hbWV9XCIgcmVxdWVzdGVkIFwiJHtwYWNrYWdlTmFtZX1cIiBhcyBcIiR7cmVxdWVzdGVkTmFtZX1cImApXG4gICAgICB9XG5cbiAgICAgIC8vIGNyZWF0ZSBtaW5pbWFsIHNlbGVjdGlvbiBpZiBpdHMgYSBidWlsdGluIGFuZCB0aGUgd2hvbGUgcGF0aCBpcyBub3Qgc2VsZWN0ZWQgZm9yXG4gICAgICBpZiAoIXBhcmVudElzRW50cnlNb2R1bGUgJiYgbW9kdWxlRGF0YS50eXBlID09PSAnYnVpbHRpbicgJiYgIXBhcmVudFBhY2thZ2VQb2xpY3kuYnVpbHRpblttb2R1bGVJZF0pIHtcbiAgICAgICAgY29uc3QgYnVpbHRpblBhdGhzID0gKFxuICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmVudFBhY2thZ2VQb2xpY3kuYnVpbHRpbilcbiAgICAgICAgICAvLyBncmFiIGFsbCBhbGxvd2VkIGJ1aWx0aW4gcGF0aHMgdGhhdCBtYXRjaCB0aGlzIHBhY2thZ2VcbiAgICAgICAgICAgIC5maWx0ZXIoKFtwYWNrYWdlUGF0aCwgYWxsb3dlZF0pID0+IGFsbG93ZWQgPT09IHRydWUgJiYgbW9kdWxlSWQgPT09IHBhY2thZ2VQYXRoLnNwbGl0KCcuJylbMF0pXG4gICAgICAgICAgLy8gb25seSBpbmNsdWRlIHRoZSBwYXRocyBhZnRlciB0aGUgcGFja2FnZU5hbWVcbiAgICAgICAgICAgIC5tYXAoKFtwYWNrYWdlUGF0aCwgYWxsb3dlZF0pID0+IHBhY2thZ2VQYXRoLnNwbGl0KCcuJykuc2xpY2UoMSkuam9pbignLicpKVxuICAgICAgICAgICAgLnNvcnQoKVxuICAgICAgICApXG4gICAgICAgIG1vZHVsZUV4cG9ydHMgPSBtYWtlTWluaW1hbFZpZXdPZlJlZihtb2R1bGVFeHBvcnRzLCBidWlsdGluUGF0aHMpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtb2R1bGVFeHBvcnRzXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyIChtb2R1bGVEYXRhLCBwYWNrYWdlUG9saWN5KSB7XG4gICAgICBjb25zdCB7IG1vZHVsZUluaXRpYWxpemVyLCBwcmVjb21waWxlZEluaXRpYWxpemVyLCBwYWNrYWdlOiBwYWNrYWdlTmFtZSwgaWQ6IG1vZHVsZUlkLCBzb3VyY2U6IG1vZHVsZVNvdXJjZSB9ID0gbW9kdWxlRGF0YVxuXG4gICAgICAvLyBtb2R1bGVJbml0aWFsaXplciBtYXkgYmUgc2V0IGJ5IGxvYWRNb2R1bGVEYXRhIChlLmcuIGJ1aWx0aW4gKyBuYXRpdmUgbW9kdWxlcylcbiAgICAgIGlmIChtb2R1bGVJbml0aWFsaXplcikge1xuICAgICAgICAvLyBpZiBhbiBleHRlcm5hbCBtb2R1bGVJbml0aWFsaXplciBpcyBzZXQsIGVuc3VyZSBpdCBpcyBhbGxvd2VkXG4gICAgICAgIGlmIChtb2R1bGVEYXRhLnR5cGUgPT09ICduYXRpdmUnKSB7XG4gICAgICAgICAgLy8gZW5zdXJlIHBhY2thZ2UgaXMgYWxsb3dlZCB0byBoYXZlIG5hdGl2ZSBtb2R1bGVzXG4gICAgICAgICAgaWYgKHBhY2thZ2VQb2xpY3kubmF0aXZlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gXCJuYXRpdmVcIiBtb2R1bGUgdHlwZSBub3QgcGVybWl0dGVkIGZvciBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cIiwgbW9kdWxlIFwiJHttb2R1bGVJZH1cImApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZURhdGEudHlwZSAhPT0gJ2J1aWx0aW4nKSB7XG4gICAgICAgICAgLy8gYnVpbHRpbiBtb2R1bGUgdHlwZXMgZG9udCBoYXZlIHBvbGljeSBjb25maWd1cmF0aW9uc1xuICAgICAgICAgIC8vIGJ1dCB0aGUgcGFja2FnZXMgdGhhdCBjYW4gaW1wb3J0IHRoZW0gYXJlIGNvbnN0cmFpbmVkIGVsc2V3aGVyZVxuICAgICAgICAgIC8vIGhlcmUgd2UganVzdCBlbnN1cmUgdGhhdCB0aGUgbW9kdWxlIHR5cGUgaXMgdGhlIG9ubHkgb3RoZXIgdHlwZSB3aXRoIGEgZXh0ZXJuYWwgbW9kdWxlSW5pdGlhbGl6ZXJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gaW52YWxpZCBleHRlcm5hbCBtb2R1bGVJbml0aWFsaXplciBmb3IgbW9kdWxlIHR5cGUgXCIke21vZHVsZURhdGEudHlwZX1cIiBpbiBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cIiwgbW9kdWxlIFwiJHttb2R1bGVJZH1cImApXG4gICAgICAgIH1cbiAgICAgICAgLy8gbW9kdWxlT2JqIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBSZWFsbSBhcyB0aGUgbW9kdWxlSW5pdGlhbGl6ZXIgKGVnIGRhcnQyanMgcnVudGltZSByZXF1aXJlbWVudClcbiAgICAgICAgLy8gaGVyZSB3ZSBhcmUgYXNzdW1pbmcgdGhlIHByb3ZpZGVkIG1vZHVsZUluaXRpYWxpemVyIGlzIGZyb20gdGhlIHNhbWUgUmVhbG0gYXMgdGhpcyBrZXJuZWxcbiAgICAgICAgY29uc3QgbW9kdWxlT2JqID0geyBleHBvcnRzOiB7fSB9XG4gICAgICAgIHJldHVybiB7IG1vZHVsZUluaXRpYWxpemVyLCBtb2R1bGVPYmogfVxuICAgICAgfVxuXG4gICAgICAvLyBzZXR1cCBpbml0aWFsaXplciBmcm9tIG1vZHVsZVNvdXJjZSBhbmQgY29tcGFydG1lbnQuXG4gICAgICAvLyBleGVjdXRlIGluIHBhY2thZ2UgY29tcGFydG1lbnQgd2l0aCBnbG9iYWxUaGlzIHBvcHVsYXRlZCBwZXIgcGFja2FnZSBwb2xpY3lcbiAgICAgIGNvbnN0IHBhY2thZ2VDb21wYXJ0bWVudCA9IGdldENvbXBhcnRtZW50Rm9yUGFja2FnZShwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeSlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IG1vZHVsZU9ialxuICAgICAgICBsZXQgbW9kdWxlSW5pdGlhbGl6ZXJcbiAgICAgICAgaWYgKHJ1bldpdGhQcmVjb21waWxlZE1vZHVsZXMpIHtcbiAgICAgICAgICBpZiAoIXByZWNvbXBpbGVkSW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSBwcmVjb21waWxlZEluaXRpYWxpemVyIG1pc3NpbmcgZm9yIFwiJHttb2R1bGVJZH1cIiBmcm9tIHBhY2thZ2UgXCIke3BhY2thZ2VOYW1lfVwiYClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbW9kdWxlT2JqIG11c3QgYmUgZnJvbSB0aGUgc2FtZSBSZWFsbSBhcyB0aGUgbW9kdWxlSW5pdGlhbGl6ZXIgKGVnIGRhcnQyanMgcnVudGltZSByZXF1aXJlbWVudClcbiAgICAgICAgICAvLyBoZXJlIHdlIGFyZSBhc3N1bWluZyB0aGUgcHJvdmlkZWQgbW9kdWxlSW5pdGlhbGl6ZXIgaXMgZnJvbSB0aGUgc2FtZSBSZWFsbSBhcyB0aGlzIGtlcm5lbFxuICAgICAgICAgIG1vZHVsZU9iaiA9IHsgZXhwb3J0czoge30gfVxuICAgICAgICAgIGNvbnN0IGV2YWxLaXQgPSB7XG4gICAgICAgICAgICBnbG9iYWxUaGlzOiBwYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgICAgIHNjb3BlVGVybWluYXRvcjogc3RyaWN0U2NvcGVUZXJtaW5hdG9yLFxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB0aGlzIGludm9rZXMgdGhlIHdpdGgtcHJveHkgd3JhcHBlclxuICAgICAgICAgIGNvbnN0IG1vZHVsZUluaXRpYWxpemVyRmFjdG9yeSA9IHByZWNvbXBpbGVkSW5pdGlhbGl6ZXIuY2FsbChldmFsS2l0KVxuICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyBzdHJpY3QgbW9kZVxuICAgICAgICAgIG1vZHVsZUluaXRpYWxpemVyID0gbW9kdWxlSW5pdGlhbGl6ZXJGYWN0b3J5KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZVNvdXJjZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF2YU1vYXQgLSBtb2R1bGVTb3VyY2Ugbm90IGEgc3RyaW5nIGZvciBcIiR7bW9kdWxlSWR9XCIgZnJvbSBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cImApXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHNvdXJjZVVSTCA9IG1vZHVsZURhdGEuZmlsZSB8fCBgbW9kdWxlcy8ke21vZHVsZUlkfWBcbiAgICAgICAgICBpZiAoc291cmNlVVJMLmluY2x1ZGVzKCdcXG4nKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMYXZhTW9hdCAtIE5ld2xpbmVzIG5vdCBhbGxvd2VkIGluIGZpbGVuYW1lczogJHtKU09OLnN0cmluZ2lmeShzb3VyY2VVUkwpfWApXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIG1vZHVsZU9iaiBtdXN0IGJlIGZyb20gdGhlIHNhbWUgUmVhbG0gYXMgdGhlIG1vZHVsZUluaXRpYWxpemVyIChlZyBkYXJ0MmpzIHJ1bnRpbWUgcmVxdWlyZW1lbnQpXG4gICAgICAgICAgbW9kdWxlT2JqID0gcGFja2FnZUNvbXBhcnRtZW50LmV2YWx1YXRlKCcoeyBleHBvcnRzOiB7fSB9KScpXG4gICAgICAgICAgLy8gVE9ETzogbW92ZSBhbGwgc291cmNlIG11dGF0aW9ucyBlbHNld2hlcmVcbiAgICAgICAgICBtb2R1bGVJbml0aWFsaXplciA9IHBhY2thZ2VDb21wYXJ0bWVudC5ldmFsdWF0ZShgJHttb2R1bGVTb3VyY2V9XFxuLy8jIHNvdXJjZVVSTD0ke3NvdXJjZVVSTH1gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG1vZHVsZUluaXRpYWxpemVyLCBtb2R1bGVPYmogfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTGF2YU1vYXQgLSBFcnJvciBldmFsdWF0aW5nIG1vZHVsZSBcIiR7bW9kdWxlSWR9XCIgZnJvbSBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cIiBcXG4ke2Vyci5zdGFja31gKVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVSb290UGFja2FnZUNvbXBhcnRtZW50IChnbG9iYWxSZWYpIHtcbiAgICAgIGlmIChwYWNrYWdlQ29tcGFydG1lbnRDYWNoZS5oYXMocm9vdFBhY2thZ2VOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhdmFNb2F0IC0gY3JlYXRlUm9vdFBhY2thZ2VDb21wYXJ0bWVudCBjYWxsZWQgbW9yZSB0aGFuIG9uY2UnKVxuICAgICAgfVxuICAgICAgLy8gcHJlcGFyZSB0aGUgcm9vdCBwYWNrYWdlJ3MgU0VTIENvbXBhcnRtZW50XG4gICAgICAvLyBlbmRvd21lbnRzOlxuICAgICAgLy8gLSBNYXRoIGlzIGZvciB1bnRhbWVkIE1hdGgucmFuZG9tXG4gICAgICAvLyAtIERhdGUgaXMgZm9yIHVudGFtZWQgRGF0ZS5ub3dcbiAgICAgIGNvbnN0IHJvb3RQYWNrYWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoeyBNYXRoLCBEYXRlIH0pXG4gICAgICAvLyBmaW5kIHRoZSByZWxldmFudCBlbmRvd21lbnQgc291cmNlc1xuICAgICAgY29uc3QgZ2xvYmFsUHJvdG9DaGFpbiA9IGdldFByb3RvdHlwZUNoYWluKGdsb2JhbFJlZilcbiAgICAgIC8vIHRoZSBpbmRleCBmb3IgdGhlIGNvbW1vbiBwcm90b3R5cGFsIGFuY2VzdG9yLCBPYmplY3QucHJvdG90eXBlXG4gICAgICAvLyB0aGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGxhc3QgaW5kZXgsIGJ1dCB3ZSBjaGVjayBqdXN0IGluIGNhc2VcbiAgICAgIGNvbnN0IGNvbW1vblByb3RvdHlwZUluZGV4ID0gZ2xvYmFsUHJvdG9DaGFpbi5maW5kSW5kZXgoZ2xvYmFsUHJvdG9DaGFpbkVudHJ5ID0+IGdsb2JhbFByb3RvQ2hhaW5FbnRyeSA9PT0gT2JqZWN0LnByb3RvdHlwZSlcbiAgICAgIGlmIChjb21tb25Qcm90b3R5cGVJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdMYXZhbW9hdCAtIHVuYWJsZSB0byBmaW5kIGNvbW1vbiBwcm90b3R5cGUgYmV0d2VlbiBDb21wYXJ0bWVudCBhbmQgZ2xvYmFsUmVmJylcbiAgICAgIH1cbiAgICAgIC8vIHdlIHdpbGwgY29weSBlbmRvd21lbnRzIGZyb20gYWxsIGVudHJpZXMgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgZXhjbHVkaW5nIE9iamVjdC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGVuZG93bWVudFNvdXJjZXMgPSBnbG9iYWxQcm90b0NoYWluLnNsaWNlKDAsIGNvbW1vblByb3RvdHlwZUluZGV4KVxuXG4gICAgICAvLyBjYWxsIGFsbCBnZXR0ZXJzLCBpbiBjYXNlIG9mIGJlaGF2aW9yIGNoYW5nZSAoc3VjaCBhcyB3aXRoIEZpcmVGb3ggbGF6eSBnZXR0ZXJzKVxuICAgICAgLy8gY2FsbCBvbiBjb250ZW50cyBvZiBlbmRvd21lbnRzU291cmNlcyBkaXJlY3RseSBpbnN0ZWFkIG9mIGluIG5ldyBhcnJheSBpbnN0YW5jZXMuIElmIHRoZXJlIGlzIGEgbGF6eSBnZXR0ZXIgaXQgb25seSBjaGFuZ2VzIHRoZSBvcmlnaW5hbCBwcm9wIGRlc2MuXG4gICAgICBlbmRvd21lbnRTb3VyY2VzLmZvckVhY2goc291cmNlID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpXG4gICAgICAgIE9iamVjdC52YWx1ZXMoZGVzY3JpcHRvcnMpLmZvckVhY2goZGVzYyA9PiB7XG4gICAgICAgICAgaWYgKCdnZXQnIGluIGRlc2MpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIFJlZmxlY3QuYXBwbHkoZGVzYy5nZXQsIGdsb2JhbFJlZiwgW10pXG4gICAgICAgICAgICB9Y2F0Y2h7fVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGVuZG93bWVudFNvdXJjZURlc2NyaXB0b3JzID0gZW5kb3dtZW50U291cmNlcy5tYXAoZ2xvYmFsUHJvdG9DaGFpbkVudHJ5ID0+IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGdsb2JhbFByb3RvQ2hhaW5FbnRyeSkpXG4gICAgICAvLyBmbGF0dGVuIHByb3BEZXNjIGNvbGxlY3Rpb25zIHdpdGggcHJlY2VkZW5jZSBmb3IgZ2xvYmFsVGhpcy1lbmQgb2YgdGhlIHByb3RvdHlwZSBjaGFpblxuICAgICAgY29uc3QgZW5kb3dtZW50RGVzY3JpcHRvcnNGbGF0ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG51bGwpLCAuLi5lbmRvd21lbnRTb3VyY2VEZXNjcmlwdG9ycy5yZXZlcnNlKCkpXG4gICAgICAvLyBleHBvc2UgYWxsIG93biBwcm9wZXJ0aWVzIG9mIGdsb2JhbFJlZiwgaW5jbHVkaW5nIG5vbi1lbnVtZXJhYmxlXG4gICAgICBPYmplY3QuZW50cmllcyhlbmRvd21lbnREZXNjcmlwdG9yc0ZsYXQpXG4gICAgICAgIC8vIGlnbm9yZSBwcm9wZXJ0aWVzIGFscmVhZHkgZGVmaW5lZCBvbiBjb21wYXJ0bWVudCBnbG9iYWxcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICEoa2V5IGluIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcykpXG4gICAgICAgIC8vIGlnbm9yZSBjaXJjdWxhciBnbG9iYWxUaGlzIHJlZnNcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICEoZ2xvYmFsVGhpc1JlZnMuaW5jbHVkZXMoa2V5KSkpXG4gICAgICAgIC8vIGRlZmluZSBwcm9wZXJ0eSBvbiBjb21wYXJ0bWVudCBnbG9iYWxcbiAgICAgICAgLmZvckVhY2goKFtrZXksIGRlc2NdKSA9PiB7XG4gICAgICAgICAgLy8gdW53cmFwIGZ1bmN0aW9ucywgc2V0dGVycy9nZXR0ZXJzICYgYXBwbHkgc2NvcGUgcHJveHkgd29ya2Fyb3VuZFxuICAgICAgICAgIGNvbnN0IHdyYXBwZWRQcm9wRGVzYyA9IGFwcGx5RW5kb3dtZW50UHJvcERlc2NUcmFuc2Zvcm1zKGRlc2MsIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQsIGdsb2JhbFJlZilcbiAgICAgICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcywga2V5LCB3cmFwcGVkUHJvcERlc2MpXG4gICAgICAgIH0pXG4gICAgICAvLyBnbG9iYWwgY2lyY3VsYXIgcmVmZXJlbmNlcyBvdGhlcndpc2UgYWRkZWQgYnkgcHJlcGFyZUNvbXBhcnRtZW50R2xvYmFsRnJvbUNvbmZpZ1xuICAgICAgLy8gQWRkIGFsbCBjaXJjdWxhciByZWZzIHRvIHJvb3QgcGFja2FnZSBjb21wYXJ0bWVudCBnbG9iYWxUaGlzXG4gICAgICBmb3IgKGNvbnN0IHJlZiBvZiBnbG9iYWxUaGlzUmVmcykge1xuICAgICAgICBpZiAocmVmIGluIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcykge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgcm9vdFBhY2thZ2VDb21wYXJ0bWVudC5nbG9iYWxUaGlzW3JlZl0gPSByb290UGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXNcbiAgICAgIH1cblxuICAgICAgLy8gc2F2ZSB0aGUgY29tcGFydG1lbnQgZm9yIHVzZSBieSBvdGhlciBtb2R1bGVzIGluIHRoZSBwYWNrYWdlXG4gICAgICBwYWNrYWdlQ29tcGFydG1lbnRDYWNoZS5zZXQocm9vdFBhY2thZ2VOYW1lLCByb290UGFja2FnZUNvbXBhcnRtZW50KVxuXG4gICAgICByZXR1cm4gcm9vdFBhY2thZ2VDb21wYXJ0bWVudFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldENvbXBhcnRtZW50Rm9yUGFja2FnZSAocGFja2FnZU5hbWUsIHBhY2thZ2VQb2xpY3kpIHtcbiAgICAgIC8vIGNvbXBhcnRtZW50IG1heSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkXG4gICAgICBsZXQgcGFja2FnZUNvbXBhcnRtZW50ID0gcGFja2FnZUNvbXBhcnRtZW50Q2FjaGUuZ2V0KHBhY2thZ2VOYW1lKVxuICAgICAgaWYgKHBhY2thZ2VDb21wYXJ0bWVudCkge1xuICAgICAgICByZXR1cm4gcGFja2FnZUNvbXBhcnRtZW50XG4gICAgICB9XG5cbiAgICAgIC8vIHByZXBhcmUgQ29tcGFydG1lbnRcbiAgICAgIGlmIChnZXRFeHRlcm5hbENvbXBhcnRtZW50ICYmIHBhY2thZ2VQb2xpY3kuZW52KSB7XG4gICAgICAgIC8vIGV4dGVybmFsIGNvbXBhcnRtZW50IGNhbiBiZSBwcm92aWRlZCBieSB0aGUgcGxhdGZvcm0gKGVnIGxhdmFtb2F0LW5vZGUpXG4gICAgICAgIHBhY2thZ2VDb21wYXJ0bWVudCA9IGdldEV4dGVybmFsQ29tcGFydG1lbnQocGFja2FnZU5hbWUsIHBhY2thZ2VQb2xpY3kpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwcmVwYXJlIHRoZSBtb2R1bGUncyBTRVMgQ29tcGFydG1lbnRcbiAgICAgICAgLy8gZW5kb3dtZW50czpcbiAgICAgICAgLy8gLSBNYXRoIGlzIGZvciB1bnRhbWVkIE1hdGgucmFuZG9tXG4gICAgICAgIC8vIC0gRGF0ZSBpcyBmb3IgdW50YW1lZCBEYXRlLm5vd1xuICAgICAgICBwYWNrYWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoeyBNYXRoLCBEYXRlIH0pXG4gICAgICB9XG4gICAgICAvLyBwcmVwYXJlIGVuZG93bWVudHNcbiAgICAgIGxldCBlbmRvd21lbnRzXG4gICAgICB0cnkge1xuICAgICAgICBlbmRvd21lbnRzID0gZ2V0RW5kb3dtZW50c0ZvckNvbmZpZyhcbiAgICAgICAgICAvLyBzb3VyY2UgcmVmZXJlbmNlXG4gICAgICAgICAgcm9vdFBhY2thZ2VDb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuICAgICAgICAgIC8vIHBvbGljeVxuICAgICAgICAgIHBhY2thZ2VQb2xpY3ksXG4gICAgICAgICAgLy8gdW53cmFwIHRvXG4gICAgICAgICAgZ2xvYmFsUmVmLFxuICAgICAgICAgIC8vIHVud3JhcCBmcm9tXG4gICAgICAgICAgcGFja2FnZUNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG4gICAgICAgIClcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlcnJNc2cgPSBgTGF2YW1vYXQgLSBmYWlsZWQgdG8gcHJlcGFyZSBlbmRvd21lbnRzIGZvciBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cIjpcXG4ke2Vyci5zdGFja31gXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJNc2cpXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYW5zZm9ybSBmdW5jdGlvbnMsIGdldHRlcnMgJiBzZXR0ZXJzIG9uIHByb3AgZGVzY3MuIFNvbHZlcyBTRVMgc2NvcGUgcHJveHkgYnVnXG4gICAgICBPYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlbmRvd21lbnRzKSlcbiAgICAgICAgLy8gaWdub3JlIG5vbi1jb25maWd1cmFibGUgcHJvcGVydGllcyBiZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgZW5kb3dtZW50cyBpbiBwbGFjZVxuICAgICAgICAuZmlsdGVyKChba2V5LCBwcm9wRGVzY10pID0+IHByb3BEZXNjLmNvbmZpZ3VyYWJsZSlcbiAgICAgICAgLmZvckVhY2goKFtrZXksIHByb3BEZXNjXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRQcm9wRGVzYyA9IGFwcGx5RW5kb3dtZW50UHJvcERlc2NUcmFuc2Zvcm1zKHByb3BEZXNjLCBwYWNrYWdlQ29tcGFydG1lbnQsIHJvb3RQYWNrYWdlQ29tcGFydG1lbnQuZ2xvYmFsVGhpcylcbiAgICAgICAgICBSZWZsZWN0LmRlZmluZVByb3BlcnR5KGVuZG93bWVudHMsIGtleSwgd3JhcHBlZFByb3BEZXNjKVxuICAgICAgICB9KVxuXG4gICAgICAvLyBzZXRzIHVwIHJlYWQvd3JpdGUgYWNjZXNzIGFzIGNvbmZpZ3VyZWRcbiAgICAgIGNvbnN0IGdsb2JhbHNDb25maWcgPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHNcbiAgICAgIHByZXBhcmVDb21wYXJ0bWVudEdsb2JhbEZyb21Db25maWcocGFja2FnZUNvbXBhcnRtZW50LCBnbG9iYWxzQ29uZmlnLCBlbmRvd21lbnRzLCBnbG9iYWxTdG9yZSwgZ2xvYmFsVGhpc1JlZnMpXG5cbiAgICAgIC8vIHNhdmUgdGhlIGNvbXBhcnRtZW50IGZvciB1c2UgYnkgb3RoZXIgbW9kdWxlcyBpbiB0aGUgcGFja2FnZVxuICAgICAgcGFja2FnZUNvbXBhcnRtZW50Q2FjaGUuc2V0KHBhY2thZ2VOYW1lLCBwYWNrYWdlQ29tcGFydG1lbnQpXG5cbiAgICAgIHJldHVybiBwYWNrYWdlQ29tcGFydG1lbnRcbiAgICB9XG5cbiAgICAvLyB0aGlzIGdldHMgdGhlIGxhdmFNb2F0IGNvbmZpZyBmb3IgYSBtb2R1bGUgYnkgcGFja2FnZU5hbWVcbiAgICAvLyBpZiB0aGVyZSB3ZXJlIGdsb2JhbCBkZWZhdWx0cyAoZS5nLiBldmVyeXRoaW5nIGdldHMgXCJjb25zb2xlXCIpIHRoZXkgY291bGQgYmUgYXBwbGllZCBoZXJlXG4gICAgZnVuY3Rpb24gZ2V0UG9saWN5Rm9yUGFja2FnZSAoY29uZmlnLCBwYWNrYWdlTmFtZSkge1xuICAgICAgY29uc3QgcGFja2FnZUNvbmZpZyA9IChjb25maWcucmVzb3VyY2VzIHx8IHt9KVtwYWNrYWdlTmFtZV0gfHwge31cbiAgICAgIHBhY2thZ2VDb25maWcuZ2xvYmFscyA9IHBhY2thZ2VDb25maWcuZ2xvYmFscyB8fCB7fVxuICAgICAgcGFja2FnZUNvbmZpZy5wYWNrYWdlcyA9IHBhY2thZ2VDb25maWcucGFja2FnZXMgfHwge31cbiAgICAgIHBhY2thZ2VDb25maWcuYnVpbHRpbiA9IHBhY2thZ2VDb25maWcuYnVpbHRpbiB8fCB7fVxuICAgICAgcmV0dXJuIHBhY2thZ2VDb25maWdcbiAgICB9XG5cbiAgICAvLyB1dGlsIGZvciBnZXR0aW5nIHRoZSBwcm90b3R5cGUgY2hhaW4gYXMgYW4gYXJyYXlcbiAgICAvLyBpbmNsdWRlcyB0aGUgcHJvdmlkZWQgdmFsdWUgaW4gdGhlIHJlc3VsdFxuICAgIGZ1bmN0aW9uIGdldFByb3RvdHlwZUNoYWluICh2YWx1ZSkge1xuICAgICAgY29uc3QgcHJvdG9DaGFpbiA9IFtdXG4gICAgICBsZXQgY3VycmVudCA9IHZhbHVlXG4gICAgICB3aGlsZSAoY3VycmVudCAmJiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBjdXJyZW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICBwcm90b0NoYWluLnB1c2goY3VycmVudClcbiAgICAgICAgY3VycmVudCA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudClcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm90b0NoYWluXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQXZvaWRQcm9wKHByb3BzVG9Bdm9pZCwgcHJvcCkge1xuICAgICAgZm9yIChjb25zdCBhdm9pZCBvZiBwcm9wc1RvQXZvaWQpIHtcbiAgICAgICAgaWYgKGF2b2lkIGluc3RhbmNlb2YgUmVnRXhwICYmIGF2b2lkLnRlc3QocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wc1RvQXZvaWQuaGFzKHByb3ApKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG59KSgpXG5cbiAgICBjb25zdCBrZXJuZWwgPSBjcmVhdGVLZXJuZWxDb3JlKHtcbiAgICAgIGxhdmFtb2F0Q29uZmlnLFxuICAgICAgbG9hZE1vZHVsZURhdGEsXG4gICAgICBnZXRSZWxhdGl2ZU1vZHVsZUlkLFxuICAgICAgcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyQXJncyxcbiAgICAgIGdldEV4dGVybmFsQ29tcGFydG1lbnQsXG4gICAgICBnbG9iYWxSZWYsXG4gICAgICBnbG9iYWxUaGlzUmVmcyxcbiAgICAgIHNjdXR0bGVHbG9iYWxUaGlzLFxuICAgICAgc2N1dHRsZUdsb2JhbFRoaXNFeGNlcHRpb25zLFxuICAgICAgZGVidWdNb2RlLFxuICAgICAgcnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlcyxcbiAgICAgIHJlcG9ydFN0YXRzSG9vayxcbiAgICB9KVxuICAgIHJldHVybiBrZXJuZWxcbiAgfVxufSkoKVxuXG4gIGNvbnN0IGtlcm5lbCA9IGNyZWF0ZUtlcm5lbCh7XG4gICAgcnVuV2l0aFByZWNvbXBpbGVkTW9kdWxlczogdHJ1ZSxcbiAgICBsYXZhbW9hdENvbmZpZzogbGF2YW1vYXRQb2xpY3ksXG4gICAgbG9hZE1vZHVsZURhdGEsXG4gICAgZ2V0UmVsYXRpdmVNb2R1bGVJZCxcbiAgICBwcmVwYXJlTW9kdWxlSW5pdGlhbGl6ZXJBcmdzLFxuICAgIGdsb2JhbFRoaXNSZWZzOiBbJ3dpbmRvdycsICdzZWxmJywgJ2dsb2JhbCcsICdnbG9iYWxUaGlzJ10sXG4gICAgZGVidWdNb2RlLFxuICAgIHJlcG9ydFN0YXRzSG9vayxcbiAgfSlcbiAgY29uc3QgeyBpbnRlcm5hbFJlcXVpcmUgfSA9IGtlcm5lbFxuXG4gIC8vIGNyZWF0ZSBhIGxhdmFtb2F0IHB1bGljIEFQSSBmb3IgbG9hZGluZyBtb2R1bGVzIG92ZXIgbXVsdGlwbGUgZmlsZXNcbiAgY29uc3QgTGF2YVBhY2sgPSBPYmplY3QuZnJlZXplKHtcbiAgICBsb2FkUG9saWN5OiBPYmplY3QuZnJlZXplKGxvYWRQb2xpY3kpLFxuICAgIGxvYWRCdW5kbGU6IE9iamVjdC5mcmVlemUobG9hZEJ1bmRsZSksXG4gICAgcnVuTW9kdWxlOiBPYmplY3QuZnJlZXplKHJ1bk1vZHVsZSksXG4gIH0pXG4gIC8vIGluIGRlYnVnIG1vZGUsIGV4cG9zZSB0aGUga2VybmVsIG9uIHRoZSBMYXZhUGFjayBBUElcbiAgaWYgKGRlYnVnTW9kZSkge1xuICAgIExhdmFQYWNrLl9rZXJuZWwgPSBrZXJuZWxcbiAgfVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnbG9iYWxUaGlzLCAnTGF2YVBhY2snLCB7dmFsdWU6IExhdmFQYWNrfSlcbiAgcmV0dXJuXG5cblxuICBmdW5jdGlvbiBsb2FkTW9kdWxlRGF0YSAobW9kdWxlSWQpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHJlcXVpcmUgPT09ICdmdW5jdGlvbicgJiYgcmVxdWlyZSgnbm9kZTptb2R1bGUnKS5pc0J1aWx0aW4obW9kdWxlSWQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnYnVpbHRpbicsXG4gICAgICAgIHBhY2thZ2U6IG1vZHVsZUlkLFxuICAgICAgICBpZDogbW9kdWxlSWQsXG4gICAgICAgIC8vIFVzaW5nIHVucHJvdGVjdGVkIHJlcXVpcmVcbiAgICAgICAgbW9kdWxlSW5pdGlhbGl6ZXI6IChfLCBtb2R1bGUpID0+IHtcbiAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUobW9kdWxlSWQpO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIW1vZHVsZVJlZ2lzdHJ5Lmhhcyhtb2R1bGVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbW9kdWxlIHJlZ2lzdGVyZWQgZm9yIFwiJHttb2R1bGVJZH1cIiAoJHt0eXBlb2YgbW9kdWxlSWR9KWApXG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVSZWdpc3RyeS5nZXQobW9kdWxlSWQpXG4gIH1cblxuICBmdW5jdGlvbiBnZXRSZWxhdGl2ZU1vZHVsZUlkIChwYXJlbnRNb2R1bGVJZCwgcmVxdWVzdGVkTmFtZSkge1xuICAgIGNvbnN0IHBhcmVudE1vZHVsZURhdGEgPSBsb2FkTW9kdWxlRGF0YShwYXJlbnRNb2R1bGVJZClcbiAgICBpZiAoIShyZXF1ZXN0ZWROYW1lIGluIHBhcmVudE1vZHVsZURhdGEuZGVwcykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgbWlzc2luZyBkZXA6ICR7cGFyZW50TW9kdWxlRGF0YS5wYWNrYWdlfSByZXF1ZXN0ZWQgJHtyZXF1ZXN0ZWROYW1lfWApXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRNb2R1bGVEYXRhLmRlcHNbcmVxdWVzdGVkTmFtZV0gfHwgcmVxdWVzdGVkTmFtZVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlcGFyZU1vZHVsZUluaXRpYWxpemVyQXJncyAocmVxdWlyZVJlbGF0aXZlV2l0aENvbnRleHQsIG1vZHVsZU9iaiwgbW9kdWxlRGF0YSkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSByZXF1aXJlUmVsYXRpdmVXaXRoQ29udGV4dFxuICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZU9ialxuICAgIGNvbnN0IGV4cG9ydHMgPSBtb2R1bGVPYmouZXhwb3J0c1xuICAgIC8vIGJpZnkgZGlyZWN0IG1vZHVsZSBpbnN0YW50aWF0aW9uIGRpc2FibGVkIChcImFyZ3VtZW50c1s0XVwiKVxuICAgIHJldHVybiBbcmVxdWlyZSwgbW9kdWxlLCBleHBvcnRzLCBudWxsLCBudWxsXVxuICB9XG5cbiAgLy8gaXQgaXMgY2FsbGVkIGJ5IHRoZSBwb2xpY3kgbG9hZGVyIG9yIG1vZHVsZXMgY29sbGVjdGlvblxuICBmdW5jdGlvbiBsb2FkUG9saWN5IChidW5kbGVQb2xpY3kpIHtcbiAgICAvLyB2ZXJpZnkgKyBsb2FkIGNvbmZpZ1xuICAgIE9iamVjdC5lbnRyaWVzKGJ1bmRsZVBvbGljeS5yZXNvdXJjZXMgfHwge30pLmZvckVhY2goKFtwYWNrYWdlTmFtZSwgcGFja2FnZUNvbmZpZ10pID0+IHtcbiAgICAgIGlmIChwYWNrYWdlTmFtZSBpbiBsYXZhbW9hdFBvbGljeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gbG9hZEJ1bmRsZSBlbmNvdW50ZXJlZCByZWR1bmRhbnQgY29uZmlnIGRlZmluaXRpb24gZm9yIHBhY2thZ2UgXCIke3BhY2thZ2VOYW1lfVwiYClcbiAgICAgIH1cbiAgICAgIGxhdmFtb2F0UG9saWN5LnJlc291cmNlc1twYWNrYWdlTmFtZV0gPSBwYWNrYWdlQ29uZmlnXG4gICAgfSlcbiAgfVxuXG4gIC8vIGl0IGlzIGNhbGxlZCBieSB0aGUgbW9kdWxlcyBjb2xsZWN0aW9uXG4gIGZ1bmN0aW9uIGxvYWRCdW5kbGUgKG5ld01vZHVsZXMsIGVudHJ5UG9pbnRzLCBidW5kbGVQb2xpY3kpIHtcbiAgICAvLyB2ZXJpZnkgKyBsb2FkIGNvbmZpZ1xuICAgIGlmIChidW5kbGVQb2xpY3kpIHtcbiAgICAgIGxvYWRQb2xpY3koYnVuZGxlUG9saWN5KVxuICAgIH1cbiAgICAvLyB2ZXJpZnkgKyBsb2FkIGluIGVhY2ggbW9kdWxlXG4gICAgZm9yIChjb25zdCBbbW9kdWxlSWQsIG1vZHVsZURlcHMsIGluaXRGbiwgeyBwYWNrYWdlOiBwYWNrYWdlTmFtZSwgdHlwZSB9XSBvZiBuZXdNb2R1bGVzKSB7XG4gICAgICAvLyB2ZXJpZnkgdGhhdCBtb2R1bGUgaXMgbmV3XG4gICAgICBpZiAobW9kdWxlUmVnaXN0cnkuaGFzKG1vZHVsZUlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExhdmFNb2F0IC0gbG9hZEJ1bmRsZSBlbmNvdW50ZXJlZCByZWR1bmRhbnQgbW9kdWxlIGRlZmluaXRpb24gZm9yIGlkIFwiJHttb2R1bGVJZH1cImApXG4gICAgICB9XG4gICAgICAvLyBhZGQgdGhlIG1vZHVsZVxuICAgICAgbW9kdWxlUmVnaXN0cnkuc2V0KG1vZHVsZUlkLCB7XG4gICAgICAgIHR5cGU6IHR5cGUgfHwgJ2pzJyxcbiAgICAgICAgaWQ6IG1vZHVsZUlkLFxuICAgICAgICBkZXBzOiBtb2R1bGVEZXBzLFxuICAgICAgICAvLyBzb3VyY2U6IGAoJHtpbml0Rm59KWAsXG4gICAgICAgIHByZWNvbXBpbGVkSW5pdGlhbGl6ZXI6IGluaXRGbixcbiAgICAgICAgcGFja2FnZTogcGFja2FnZU5hbWUsXG4gICAgICB9KVxuICAgIH1cbiAgICAvLyBydW4gZWFjaCBvZiBlbnRyeVBvaW50c1xuICAgIGNvbnN0IGVudHJ5RXhwb3J0cyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbChlbnRyeVBvaW50cywgKGVudHJ5SWQpID0+IHtcbiAgICAgIHJldHVybiBydW5Nb2R1bGUoZW50cnlJZClcbiAgICB9KVxuICAgIC8vIHdlYnBhY2sgY29tcGF0OiByZXR1cm4gdGhlIGZpcnN0IG1vZHVsZSdzIGV4cG9ydHNcbiAgICByZXR1cm4gZW50cnlFeHBvcnRzWzBdXG4gIH1cblxuICBmdW5jdGlvbiBydW5Nb2R1bGUgKG1vZHVsZUlkKSB7XG4gICAgaWYgKCFtb2R1bGVSZWdpc3RyeS5oYXMobW9kdWxlSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIG1vZHVsZSByZWdpc3RlcmVkIGZvciBcIiR7bW9kdWxlSWR9XCIgKCR7dHlwZW9mIG1vZHVsZUlkfSlgKVxuICAgIH1cbiAgICByZXR1cm4gaW50ZXJuYWxSZXF1aXJlKG1vZHVsZUlkKVxuICB9XG5cbiAgLy8gY2FsbGVkIGJ5IHJlcG9ydFN0YXRzSG9va1xuICBmdW5jdGlvbiBvblN0YXRzUmVhZHkgKG1vZHVsZUdyYXBoU3RhdHNPYmopIHtcbiAgICBjb25zdCBncmFwaElkID0gRGF0ZS5ub3coKVxuICAgIGNvbnNvbGUud2FybihgY29tcGxldGVkIG1vZHVsZSBncmFwaCBpbml0IFwiJHtncmFwaElkfVwiIGluICR7bW9kdWxlR3JhcGhTdGF0c09iai52YWx1ZX1tcyAoXCIke21vZHVsZUdyYXBoU3RhdHNPYmoubmFtZX1cIilgKVxuICAgIGNvbnNvbGUud2FybignbG9nZ2luZyBtb2R1bGUgaW5pdCBzdGF0cyBvYmplY3Q6JylcbiAgICBjb25zb2xlLndhcm4oSlNPTi5zdHJpbmdpZnkobW9kdWxlR3JhcGhTdGF0c09iaiwgbnVsbCwgMikpXG4gIH1cblxufSkoKVxuIl19
|