inversify 6.1.5-beta.0 → 6.1.5-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/{es → lib/cjs}/annotation/decorator_utils.d.ts +1 -0
- package/lib/cjs/annotation/decorator_utils.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/decorator_utils.js +8 -0
- package/lib/cjs/annotation/decorator_utils.js.map +1 -0
- package/{es → lib/cjs}/annotation/inject.d.ts +1 -0
- package/lib/cjs/annotation/inject.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/inject.js +1 -0
- package/lib/cjs/annotation/inject.js.map +1 -0
- package/{es → lib/cjs}/annotation/inject_base.d.ts +1 -0
- package/lib/cjs/annotation/inject_base.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/inject_base.js +2 -0
- package/lib/cjs/annotation/inject_base.js.map +1 -0
- package/{es → lib/cjs}/annotation/injectable.d.ts +1 -0
- package/lib/cjs/annotation/injectable.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/injectable.js +2 -0
- package/lib/cjs/annotation/injectable.js.map +1 -0
- package/lib/{annotation → cjs/annotation}/multi_inject.d.ts +1 -0
- package/lib/cjs/annotation/multi_inject.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/multi_inject.js +1 -0
- package/lib/cjs/annotation/multi_inject.js.map +1 -0
- package/{es → lib/cjs}/annotation/named.d.ts +1 -0
- package/lib/cjs/annotation/named.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/named.js +2 -0
- package/lib/cjs/annotation/named.js.map +1 -0
- package/{es → lib/cjs}/annotation/optional.d.ts +1 -0
- package/lib/cjs/annotation/optional.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/optional.js +1 -0
- package/lib/cjs/annotation/optional.js.map +1 -0
- package/{es → lib/cjs}/annotation/post_construct.d.ts +1 -0
- package/lib/cjs/annotation/post_construct.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/post_construct.js +1 -0
- package/lib/cjs/annotation/post_construct.js.map +1 -0
- package/{es → lib/cjs}/annotation/pre_destroy.d.ts +1 -0
- package/lib/cjs/annotation/pre_destroy.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/pre_destroy.js +1 -0
- package/lib/cjs/annotation/pre_destroy.js.map +1 -0
- package/lib/{annotation → cjs/annotation}/property_event_decorator.d.ts +1 -0
- package/lib/cjs/annotation/property_event_decorator.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/property_event_decorator.js +1 -0
- package/lib/cjs/annotation/property_event_decorator.js.map +1 -0
- package/{es → lib/cjs}/annotation/tagged.d.ts +1 -0
- package/lib/cjs/annotation/tagged.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/tagged.js +2 -0
- package/lib/cjs/annotation/tagged.js.map +1 -0
- package/lib/{annotation → cjs/annotation}/target_name.d.ts +1 -0
- package/lib/cjs/annotation/target_name.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/target_name.js +1 -0
- package/lib/cjs/annotation/target_name.js.map +1 -0
- package/lib/{annotation → cjs/annotation}/unmanaged.d.ts +1 -0
- package/lib/cjs/annotation/unmanaged.d.ts.map +1 -0
- package/lib/{annotation → cjs/annotation}/unmanaged.js +1 -0
- package/lib/cjs/annotation/unmanaged.js.map +1 -0
- package/lib/{bindings → cjs/bindings}/binding.d.ts +1 -0
- package/lib/cjs/bindings/binding.d.ts.map +1 -0
- package/lib/{bindings → cjs/bindings}/binding.js +15 -0
- package/lib/cjs/bindings/binding.js.map +1 -0
- package/lib/{bindings → cjs/bindings}/binding_count.d.ts +1 -0
- package/lib/cjs/bindings/binding_count.d.ts.map +1 -0
- package/lib/{bindings → cjs/bindings}/binding_count.js +1 -0
- package/lib/cjs/bindings/binding_count.js.map +1 -0
- package/{es → lib/cjs}/constants/error_msgs.d.ts +1 -0
- package/lib/cjs/constants/error_msgs.d.ts.map +1 -0
- package/lib/{constants → cjs/constants}/error_msgs.js +2 -0
- package/lib/cjs/constants/error_msgs.js.map +1 -0
- package/lib/{constants → cjs/constants}/literal_types.d.ts +1 -0
- package/lib/cjs/constants/literal_types.d.ts.map +1 -0
- package/lib/{constants → cjs/constants}/literal_types.js +4 -0
- package/lib/cjs/constants/literal_types.js.map +1 -0
- package/{es → lib/cjs}/constants/metadata_keys.d.ts +1 -0
- package/lib/cjs/constants/metadata_keys.d.ts.map +1 -0
- package/lib/{constants → cjs/constants}/metadata_keys.js +13 -0
- package/lib/cjs/constants/metadata_keys.js.map +1 -0
- package/lib/{container → cjs/container}/container.d.ts +1 -0
- package/lib/cjs/container/container.d.ts.map +1 -0
- package/lib/{container → cjs/container}/container.js +29 -1
- package/lib/cjs/container/container.js.map +1 -0
- package/{es → lib/cjs}/container/container_module.d.ts +1 -0
- package/lib/cjs/container/container_module.d.ts.map +1 -0
- package/lib/{container → cjs/container}/container_module.js +1 -0
- package/lib/cjs/container/container_module.js.map +1 -0
- package/lib/{container → cjs/container}/container_snapshot.d.ts +1 -0
- package/lib/cjs/container/container_snapshot.d.ts.map +1 -0
- package/lib/{container → cjs/container}/container_snapshot.js +1 -0
- package/lib/cjs/container/container_snapshot.js.map +1 -0
- package/lib/{container → cjs/container}/lookup.d.ts +1 -0
- package/lib/cjs/container/lookup.d.ts.map +1 -0
- package/lib/{container → cjs/container}/lookup.js +8 -0
- package/lib/cjs/container/lookup.js.map +1 -0
- package/{es → lib/cjs}/container/module_activation_store.d.ts +1 -0
- package/lib/cjs/container/module_activation_store.d.ts.map +1 -0
- package/lib/{container → cjs/container}/module_activation_store.js +1 -0
- package/lib/cjs/container/module_activation_store.js.map +1 -0
- package/{es/inversify.d.ts → lib/cjs/index.d.ts} +1 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/{inversify.js → cjs/index.js} +2 -0
- package/lib/cjs/index.js.map +1 -0
- package/{es → lib/cjs}/interfaces/interfaces.d.ts +2 -1
- package/lib/cjs/interfaces/interfaces.d.ts.map +1 -0
- package/lib/{interfaces → cjs/interfaces}/interfaces.js +1 -0
- package/lib/cjs/interfaces/interfaces.js.map +1 -0
- package/lib/cjs/interfaces/interfaces_common_exports.d.ts +4 -0
- package/lib/cjs/interfaces/interfaces_common_exports.d.ts.map +1 -0
- package/lib/{annotation/lazy_service_identifier.js → cjs/interfaces/interfaces_common_exports.js} +1 -0
- package/lib/cjs/interfaces/interfaces_common_exports.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/{es → lib/cjs}/planning/context.d.ts +1 -0
- package/lib/cjs/planning/context.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/context.js +1 -0
- package/lib/cjs/planning/context.js.map +1 -0
- package/lib/{planning → cjs/planning}/metadata.d.ts +1 -0
- package/lib/cjs/planning/metadata.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/metadata.js +1 -0
- package/lib/cjs/planning/metadata.js.map +1 -0
- package/lib/{planning → cjs/planning}/metadata_reader.d.ts +1 -0
- package/lib/cjs/planning/metadata_reader.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/metadata_reader.js +4 -0
- package/lib/cjs/planning/metadata_reader.js.map +1 -0
- package/{es → lib/cjs}/planning/plan.d.ts +1 -0
- package/lib/cjs/planning/plan.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/plan.js +1 -0
- package/lib/cjs/planning/plan.js.map +1 -0
- package/{es → lib/cjs}/planning/planner.d.ts +1 -0
- package/lib/cjs/planning/planner.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/planner.js +10 -0
- package/lib/cjs/planning/planner.js.map +1 -0
- package/{es → lib/cjs}/planning/queryable_string.d.ts +1 -0
- package/lib/cjs/planning/queryable_string.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/queryable_string.js +2 -0
- package/lib/cjs/planning/queryable_string.js.map +1 -0
- package/{es → lib/cjs}/planning/reflection_utils.d.ts +1 -0
- package/lib/cjs/planning/reflection_utils.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/reflection_utils.js +8 -1
- package/lib/cjs/planning/reflection_utils.js.map +1 -0
- package/{es → lib/cjs}/planning/request.d.ts +1 -0
- package/lib/cjs/planning/request.d.ts.map +1 -0
- package/lib/{planning → cjs/planning}/request.js +5 -1
- package/lib/cjs/planning/request.js.map +1 -0
- package/lib/{resolution → cjs/resolution}/instantiation.d.ts +1 -0
- package/lib/cjs/resolution/instantiation.d.ts.map +1 -0
- package/lib/{resolution → cjs/resolution}/instantiation.js +1 -0
- package/lib/cjs/resolution/instantiation.js.map +1 -0
- package/{es → lib/cjs}/resolution/resolver.d.ts +1 -0
- package/lib/cjs/resolution/resolver.d.ts.map +1 -0
- package/lib/{resolution → cjs/resolution}/resolver.js +18 -0
- package/lib/cjs/resolution/resolver.js.map +1 -0
- package/{es → lib/cjs}/scope/scope.d.ts +1 -0
- package/lib/cjs/scope/scope.d.ts.map +1 -0
- package/lib/{scope → cjs/scope}/scope.js +7 -0
- package/lib/cjs/scope/scope.js.map +1 -0
- package/{es → lib/cjs}/syntax/binding_in_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_in_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_in_syntax.js +1 -0
- package/lib/cjs/syntax/binding_in_syntax.js.map +1 -0
- package/{es → lib/cjs}/syntax/binding_in_when_on_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_in_when_on_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_in_when_on_syntax.js +1 -0
- package/lib/cjs/syntax/binding_in_when_on_syntax.js.map +1 -0
- package/{es → lib/cjs}/syntax/binding_on_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_on_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_on_syntax.js +1 -0
- package/lib/cjs/syntax/binding_on_syntax.js.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_to_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_to_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_to_syntax.js +7 -0
- package/lib/cjs/syntax/binding_to_syntax.js.map +1 -0
- package/{es → lib/cjs}/syntax/binding_when_on_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_when_on_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_when_on_syntax.js +1 -0
- package/lib/cjs/syntax/binding_when_on_syntax.js.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_when_syntax.d.ts +1 -0
- package/lib/cjs/syntax/binding_when_syntax.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/binding_when_syntax.js +4 -1
- package/lib/cjs/syntax/binding_when_syntax.js.map +1 -0
- package/{es → lib/cjs}/syntax/constraint_helpers.d.ts +1 -0
- package/lib/cjs/syntax/constraint_helpers.d.ts.map +1 -0
- package/lib/{syntax → cjs/syntax}/constraint_helpers.js +5 -0
- package/lib/cjs/syntax/constraint_helpers.js.map +1 -0
- package/{es → lib/cjs}/utils/async.d.ts +1 -0
- package/lib/cjs/utils/async.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/async.js +1 -0
- package/lib/cjs/utils/async.js.map +1 -0
- package/{es → lib/cjs}/utils/binding_utils.d.ts +1 -0
- package/lib/cjs/utils/binding_utils.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/binding_utils.js +4 -0
- package/lib/cjs/utils/binding_utils.js.map +1 -0
- package/{es → lib/cjs}/utils/clonable.d.ts +1 -0
- package/lib/cjs/utils/clonable.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/clonable.js +1 -0
- package/lib/cjs/utils/clonable.js.map +1 -0
- package/{es → lib/cjs}/utils/exceptions.d.ts +1 -0
- package/lib/cjs/utils/exceptions.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/exceptions.js +1 -0
- package/lib/cjs/utils/exceptions.js.map +1 -0
- package/lib/{utils → cjs/utils}/factory_type.d.ts +1 -0
- package/lib/cjs/utils/factory_type.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/factory_type.js +1 -0
- package/lib/cjs/utils/factory_type.js.map +1 -0
- package/{es → lib/cjs}/utils/id.d.ts +1 -0
- package/lib/cjs/utils/id.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/id.js +1 -0
- package/lib/cjs/utils/id.js.map +1 -0
- package/{es → lib/cjs}/utils/js.d.ts +1 -0
- package/lib/cjs/utils/js.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/js.js +1 -0
- package/lib/cjs/utils/js.js.map +1 -0
- package/{es → lib/cjs}/utils/serialization.d.ts +1 -0
- package/lib/cjs/utils/serialization.d.ts.map +1 -0
- package/lib/{utils → cjs/utils}/serialization.js +6 -0
- package/lib/cjs/utils/serialization.js.map +1 -0
- package/lib/{interfaces/interfaces.d.ts → esm/index.d.ts} +206 -4
- package/lib/esm/index.d.ts.map +1 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +1 -0
- package/package.json +21 -24
- package/es/annotation/decorator_utils.js +0 -90
- package/es/annotation/inject.js +0 -4
- package/es/annotation/inject_base.js +0 -14
- package/es/annotation/injectable.js +0 -13
- package/es/annotation/lazy_service_identifier.js +0 -1
- package/es/annotation/multi_inject.d.ts +0 -5
- package/es/annotation/multi_inject.js +0 -4
- package/es/annotation/named.js +0 -7
- package/es/annotation/optional.js +0 -7
- package/es/annotation/post_construct.js +0 -5
- package/es/annotation/pre_destroy.js +0 -5
- package/es/annotation/property_event_decorator.d.ts +0 -4
- package/es/annotation/property_event_decorator.js +0 -13
- package/es/annotation/tagged.js +0 -6
- package/es/annotation/target_name.d.ts +0 -3
- package/es/annotation/target_name.js +0 -10
- package/es/annotation/unmanaged.d.ts +0 -3
- package/es/annotation/unmanaged.js +0 -10
- package/es/bindings/binding.d.ts +0 -20
- package/es/bindings/binding.js +0 -37
- package/es/bindings/binding_count.d.ts +0 -5
- package/es/bindings/binding_count.js +0 -6
- package/es/constants/error_msgs.js +0 -62
- package/es/constants/literal_types.d.ts +0 -5
- package/es/constants/literal_types.js +0 -21
- package/es/constants/metadata_keys.js +0 -23
- package/es/container/container.d.ts +0 -75
- package/es/container/container.js +0 -750
- package/es/container/container_module.js +0 -17
- package/es/container/container_snapshot.d.ts +0 -10
- package/es/container/container_snapshot.js +0 -15
- package/es/container/lookup.d.ts +0 -17
- package/es/container/lookup.js +0 -105
- package/es/container/module_activation_store.js +0 -47
- package/es/interfaces/interfaces.js +0 -1
- package/es/inversify.js +0 -3
- package/es/inversify.js.LICENSE.txt +0 -14
- package/es/planning/context.js +0 -15
- package/es/planning/metadata.d.ts +0 -8
- package/es/planning/metadata.js +0 -17
- package/es/planning/metadata_reader.d.ts +0 -6
- package/es/planning/metadata_reader.js +0 -21
- package/es/planning/plan.js +0 -8
- package/es/planning/planner.js +0 -168
- package/es/planning/queryable_string.js +0 -28
- package/es/planning/reflection_utils.js +0 -27
- package/es/planning/request.js +0 -20
- package/es/planning/target.js +0 -87
- package/es/resolution/instantiation.d.ts +0 -3
- package/es/resolution/instantiation.js +0 -195
- package/es/resolution/resolver.js +0 -214
- package/es/scope/scope.js +0 -88
- package/es/syntax/binding_in_syntax.js +0 -21
- package/es/syntax/binding_in_when_on_syntax.js +0 -73
- package/es/syntax/binding_on_syntax.js +0 -16
- package/es/syntax/binding_to_syntax.d.ts +0 -18
- package/es/syntax/binding_to_syntax.js +0 -91
- package/es/syntax/binding_when_on_syntax.js +0 -62
- package/es/syntax/binding_when_syntax.d.ts +0 -21
- package/es/syntax/binding_when_syntax.js +0 -104
- package/es/syntax/constraint_helpers.js +0 -36
- package/es/utils/async.js +0 -12
- package/es/utils/binding_utils.js +0 -58
- package/es/utils/clonable.js +0 -7
- package/es/utils/exceptions.js +0 -16
- package/es/utils/factory_type.d.ts +0 -5
- package/es/utils/factory_type.js +0 -6
- package/es/utils/id.js +0 -5
- package/es/utils/js.js +0 -13
- package/es/utils/serialization.js +0 -103
- package/lib/annotation/decorator_utils.d.ts +0 -16
- package/lib/annotation/inject.d.ts +0 -5
- package/lib/annotation/inject_base.d.ts +0 -4
- package/lib/annotation/injectable.d.ts +0 -2
- package/lib/annotation/lazy_service_identifier.d.ts +0 -3
- package/lib/annotation/named.d.ts +0 -2
- package/lib/annotation/optional.d.ts +0 -2
- package/lib/annotation/post_construct.d.ts +0 -4
- package/lib/annotation/pre_destroy.d.ts +0 -4
- package/lib/annotation/tagged.d.ts +0 -2
- package/lib/constants/error_msgs.d.ts +0 -30
- package/lib/constants/metadata_keys.d.ts +0 -13
- package/lib/container/container_module.d.ts +0 -11
- package/lib/container/module_activation_store.d.ts +0 -10
- package/lib/inversify.d.ts +0 -25
- package/lib/planning/context.d.ts +0 -11
- package/lib/planning/plan.d.ts +0 -7
- package/lib/planning/planner.d.ts +0 -5
- package/lib/planning/queryable_string.d.ts +0 -10
- package/lib/planning/reflection_utils.d.ts +0 -5
- package/lib/planning/request.d.ts +0 -14
- package/lib/planning/target.d.ts +0 -23
- package/lib/planning/target.js +0 -113
- package/lib/resolution/resolver.d.ts +0 -3
- package/lib/scope/scope.d.ts +0 -3
- package/lib/syntax/binding_in_syntax.d.ts +0 -9
- package/lib/syntax/binding_in_when_on_syntax.d.ts +0 -29
- package/lib/syntax/binding_on_syntax.d.ts +0 -8
- package/lib/syntax/binding_when_on_syntax.d.ts +0 -25
- package/lib/syntax/constraint_helpers.d.ts +0 -6
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/utils/async.d.ts +0 -3
- package/lib/utils/binding_utils.d.ts +0 -4
- package/lib/utils/clonable.d.ts +0 -3
- package/lib/utils/exceptions.d.ts +0 -2
- package/lib/utils/id.d.ts +0 -2
- package/lib/utils/js.d.ts +0 -1
- package/lib/utils/serialization.d.ts +0 -10
- /package/{es → lib/esm}/package.json +0 -0
package/es/inversify.js
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
/*! For license information please see inversify.js.LICENSE.txt */
|
|
2
|
-
import*as t from"@inversifyjs/common";import*as e from"@inversifyjs/core";var n={630:(t,e,n)=>{var i;!function(t){!function(){var e="object"==typeof globalThis?globalThis:"object"==typeof n.g?n.g:"object"==typeof self?self:"object"==typeof this?this:function(){try{return Function("return this;")()}catch(t){}}()||function(){try{return(0,eval)("(function() { return this; })()")}catch(t){}}(),i=r(t);function r(t,e){return function(n,i){Object.defineProperty(t,n,{configurable:!0,writable:!0,value:i}),e&&e(n,i)}}void 0!==e.Reflect&&(i=r(e.Reflect,i)),function(t,e){var n=Object.prototype.hasOwnProperty,i="function"==typeof Symbol,r=i&&void 0!==Symbol.toPrimitive?Symbol.toPrimitive:"@@toPrimitive",o=i&&void 0!==Symbol.iterator?Symbol.iterator:"@@iterator",a="function"==typeof Object.create,s={__proto__:[]}instanceof Array,c=!a&&!s,u={create:a?function(){return K(Object.create(null))}:s?function(){return K({__proto__:null})}:function(){return K({})},has:c?function(t,e){return n.call(t,e)}:function(t,e){return e in t},get:c?function(t,e){return n.call(t,e)?t[e]:void 0}:function(t,e){return t[e]}},d=Object.getPrototypeOf(Function),h="function"==typeof Map&&"function"==typeof Map.prototype.entries?Map:function(){var t={},e=[],n=function(){function t(t,e,n){this._index=0,this._keys=t,this._values=e,this._selector=n}return t.prototype["@@iterator"]=function(){return this},t.prototype[o]=function(){return this},t.prototype.next=function(){var t=this._index;if(t>=0&&t<this._keys.length){var n=this._selector(this._keys[t],this._values[t]);return t+1>=this._keys.length?(this._index=-1,this._keys=e,this._values=e):this._index++,{value:n,done:!1}}return{value:void 0,done:!0}},t.prototype.throw=function(t){throw this._index>=0&&(this._index=-1,this._keys=e,this._values=e),t},t.prototype.return=function(t){return this._index>=0&&(this._index=-1,this._keys=e,this._values=e),{value:t,done:!0}},t}();return function(){function e(){this._keys=[],this._values=[],this._cacheKey=t,this._cacheIndex=-2}return Object.defineProperty(e.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),e.prototype.has=function(t){return this._find(t,!1)>=0},e.prototype.get=function(t){var e=this._find(t,!1);return e>=0?this._values[e]:void 0},e.prototype.set=function(t,e){var n=this._find(t,!0);return this._values[n]=e,this},e.prototype.delete=function(e){var n=this._find(e,!1);if(n>=0){for(var i=this._keys.length,r=n+1;r<i;r++)this._keys[r-1]=this._keys[r],this._values[r-1]=this._values[r];return this._keys.length--,this._values.length--,N(e,this._cacheKey)&&(this._cacheKey=t,this._cacheIndex=-2),!0}return!1},e.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=t,this._cacheIndex=-2},e.prototype.keys=function(){return new n(this._keys,this._values,i)},e.prototype.values=function(){return new n(this._keys,this._values,r)},e.prototype.entries=function(){return new n(this._keys,this._values,a)},e.prototype["@@iterator"]=function(){return this.entries()},e.prototype[o]=function(){return this.entries()},e.prototype._find=function(t,e){if(!N(this._cacheKey,t)){this._cacheIndex=-1;for(var n=0;n<this._keys.length;n++)if(N(this._keys[n],t)){this._cacheIndex=n;break}}return this._cacheIndex<0&&e&&(this._cacheIndex=this._keys.length,this._keys.push(t),this._values.push(void 0)),this._cacheIndex},e}();function i(t,e){return t}function r(t,e){return e}function a(t,e){return[t,e]}}(),l="function"==typeof Set&&"function"==typeof Set.prototype.entries?Set:function(){function t(){this._map=new h}return Object.defineProperty(t.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),t.prototype.has=function(t){return this._map.has(t)},t.prototype.add=function(t){return this._map.set(t,t),this},t.prototype.delete=function(t){return this._map.delete(t)},t.prototype.clear=function(){this._map.clear()},t.prototype.keys=function(){return this._map.keys()},t.prototype.values=function(){return this._map.keys()},t.prototype.entries=function(){return this._map.entries()},t.prototype["@@iterator"]=function(){return this.keys()},t.prototype[o]=function(){return this.keys()},t}(),f="function"==typeof WeakMap?WeakMap:function(){var t=u.create(),e=i();return function(){function t(){this._key=i()}return t.prototype.has=function(t){var e=r(t,!1);return void 0!==e&&u.has(e,this._key)},t.prototype.get=function(t){var e=r(t,!1);return void 0!==e?u.get(e,this._key):void 0},t.prototype.set=function(t,e){return r(t,!0)[this._key]=e,this},t.prototype.delete=function(t){var e=r(t,!1);return void 0!==e&&delete e[this._key]},t.prototype.clear=function(){this._key=i()},t}();function i(){var e;do{e="@@WeakMap@@"+a()}while(u.has(t,e));return t[e]=!0,e}function r(t,i){if(!n.call(t,e)){if(!i)return;Object.defineProperty(t,e,{value:u.create()})}return t[e]}function o(t,e){for(var n=0;n<e;++n)t[n]=255*Math.random()|0;return t}function a(){var t=function(t){if("function"==typeof Uint8Array){var e=new Uint8Array(t);return"undefined"!=typeof crypto?crypto.getRandomValues(e):"undefined"!=typeof msCrypto?msCrypto.getRandomValues(e):o(e,t),e}return o(new Array(t),t)}(16);t[6]=79&t[6]|64,t[8]=191&t[8]|128;for(var e="",n=0;n<16;++n){var i=t[n];4!==n&&6!==n&&8!==n||(e+="-"),i<16&&(e+="0"),e+=i.toString(16).toLowerCase()}return e}}(),g=i?Symbol.for("@reflect-metadata:registry"):void 0,y=function(){var t;return!I(g)&&E(e.Reflect)&&Object.isExtensible(e.Reflect)&&(t=e.Reflect[g]),I(t)&&(t=function(){var t,n,i,r;I(g)||void 0===e.Reflect||g in e.Reflect||"function"!=typeof e.Reflect.defineMetadata||(t=function(t){var e=t.defineMetadata,n=t.hasOwnMetadata,i=t.getOwnMetadata,r=t.getOwnMetadataKeys,o=t.deleteMetadata,a=new f;return{isProviderFor:function(t,e){var n=a.get(t);return!(I(n)||!n.has(e))||!!r(t,e).length&&(I(n)&&(n=new l,a.set(t,n)),n.add(e),!0)},OrdinaryDefineOwnMetadata:e,OrdinaryHasOwnMetadata:n,OrdinaryGetOwnMetadata:i,OrdinaryOwnMetadataKeys:r,OrdinaryDeleteMetadata:o}}(e.Reflect));var o=new f,a={registerProvider:s,getProvider:u,setProvider:y};return a;function s(e){if(!Object.isExtensible(a))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case t===e:break;case I(n):n=e;break;case n===e:break;case I(i):i=e;break;case i===e:break;default:void 0===r&&(r=new l),r.add(e)}}function c(e,o){if(!I(n)){if(n.isProviderFor(e,o))return n;if(!I(i)){if(i.isProviderFor(e,o))return n;if(!I(r))for(var a=j(r);;){var s=q(a);if(!s)return;var c=F(s);if(c.isProviderFor(e,o))return B(a),c}}}if(!I(t)&&t.isProviderFor(e,o))return t}function u(t,e){var n,i=o.get(t);return I(i)||(n=i.get(e)),I(n)?(I(n=c(t,e))||(I(i)&&(i=new h,o.set(t,i)),i.set(e,n)),n):n}function d(t){if(I(t))throw new TypeError;return n===t||i===t||!I(r)&&r.has(t)}function y(t,e,n){if(!d(n))throw new Error("Metadata provider not registered.");var i=u(t,e);if(i!==n){if(!I(i))return!1;var r=o.get(t);I(r)&&(r=new h,o.set(t,r)),r.set(e,n)}return!0}}()),!I(g)&&E(e.Reflect)&&Object.isExtensible(e.Reflect)&&Object.defineProperty(e.Reflect,g,{enumerable:!1,configurable:!1,writable:!1,value:t}),t}(),p=function(t){var e=new f,n={isProviderFor:function(t,n){var i=e.get(t);return!I(i)&&i.has(n)},OrdinaryDefineOwnMetadata:function(t,e,n,r){i(n,r,!0).set(t,e)},OrdinaryHasOwnMetadata:function(t,e,n){var r=i(e,n,!1);return!I(r)&&C(r.has(t))},OrdinaryGetOwnMetadata:function(t,e,n){var r=i(e,n,!1);if(!I(r))return r.get(t)},OrdinaryOwnMetadataKeys:function(t,e){var n=[],r=i(t,e,!1);if(I(r))return n;for(var o=j(r.keys()),a=0;;){var s=q(o);if(!s)return n.length=a,n;var c=F(s);try{n[a]=c}catch(t){try{B(o)}finally{throw t}}a++}},OrdinaryDeleteMetadata:function(t,n,r){var o=i(n,r,!1);if(I(o))return!1;if(!o.delete(t))return!1;if(0===o.size){var a=e.get(n);I(a)||(a.delete(r),0===a.size&&e.delete(a))}return!0}};return y.registerProvider(n),n;function i(i,r,o){var a=e.get(i),s=!1;if(I(a)){if(!o)return;a=new h,e.set(i,a),s=!0}var c=a.get(r);if(I(c)){if(!o)return;if(c=new h,a.set(r,c),!t.setProvider(i,r,n))throw a.delete(r),s&&e.delete(i),new Error("Wrong provider for target.")}return c}}(y);function v(t,e,n){if(_(t,e,n))return!0;var i=$(e);return!M(i)&&v(t,i,n)}function _(t,e,n){var i=W(e,n,!1);return!I(i)&&C(i.OrdinaryHasOwnMetadata(t,e,n))}function w(t,e,n){if(_(t,e,n))return b(t,e,n);var i=$(e);return M(i)?void 0:w(t,i,n)}function b(t,e,n){var i=W(e,n,!1);if(!I(i))return i.OrdinaryGetOwnMetadata(t,e,n)}function m(t,e,n,i){W(n,i,!0).OrdinaryDefineOwnMetadata(t,e,n,i)}function A(t,e){var n=S(t,e),i=$(t);if(null===i)return n;var r=A(i,e);if(r.length<=0)return n;if(n.length<=0)return r;for(var o=new l,a=[],s=0,c=n;s<c.length;s++){var u=c[s];o.has(u)||(o.add(u),a.push(u))}for(var d=0,h=r;d<h.length;d++)u=h[d],o.has(u)||(o.add(u),a.push(u));return a}function S(t,e){var n=W(t,e,!1);return n?n.OrdinaryOwnMetadataKeys(t,e):[]}function T(t){if(null===t)return 1;switch(typeof t){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return null===t?1:6;default:return 6}}function I(t){return void 0===t}function M(t){return null===t}function E(t){return"object"==typeof t?null!==t:"function"==typeof t}function D(t,e){switch(T(t)){case 0:case 1:case 2:case 3:case 4:case 5:return t}var n=3===e?"string":5===e?"number":"default",i=P(t,r);if(void 0!==i){var o=i.call(t,n);if(E(o))throw new TypeError;return o}return function(t,e){if("string"===e){var n=t.toString;if(R(n)&&!E(r=n.call(t)))return r;if(R(i=t.valueOf)&&!E(r=i.call(t)))return r}else{var i;if(R(i=t.valueOf)&&!E(r=i.call(t)))return r;var r,o=t.toString;if(R(o)&&!E(r=o.call(t)))return r}throw new TypeError}(t,"default"===n?"number":n)}function C(t){return!!t}function x(t){var e=D(t,3);return"symbol"==typeof e?e:function(t){return""+t}(e)}function O(t){return Array.isArray?Array.isArray(t):t instanceof Object?t instanceof Array:"[object Array]"===Object.prototype.toString.call(t)}function R(t){return"function"==typeof t}function k(t){return"function"==typeof t}function N(t,e){return t===e||t!=t&&e!=e}function P(t,e){var n=t[e];if(null!=n){if(!R(n))throw new TypeError;return n}}function j(t){var e=P(t,o);if(!R(e))throw new TypeError;var n=e.call(t);if(!E(n))throw new TypeError;return n}function F(t){return t.value}function q(t){var e=t.next();return!e.done&&e}function B(t){var e=t.return;e&&e.call(t)}function $(t){var e=Object.getPrototypeOf(t);if("function"!=typeof t||t===d)return e;if(e!==d)return e;var n=t.prototype,i=n&&Object.getPrototypeOf(n);if(null==i||i===Object.prototype)return e;var r=i.constructor;return"function"!=typeof r||r===t?e:r}function W(t,e,n){var i=y.getProvider(t,e);if(!I(i))return i;if(n){if(y.setProvider(t,e,p))return p;throw new Error("Illegal state.")}}function K(t){return t.__=void 0,delete t.__,t}t("decorate",(function(t,e,n,i){if(I(n)){if(!O(t))throw new TypeError;if(!k(e))throw new TypeError;return function(t,e){for(var n=t.length-1;n>=0;--n){var i=(0,t[n])(e);if(!I(i)&&!M(i)){if(!k(i))throw new TypeError;e=i}}return e}(t,e)}if(!O(t))throw new TypeError;if(!E(e))throw new TypeError;if(!E(i)&&!I(i)&&!M(i))throw new TypeError;return M(i)&&(i=void 0),function(t,e,n,i){for(var r=t.length-1;r>=0;--r){var o=(0,t[r])(e,n,i);if(!I(o)&&!M(o)){if(!E(o))throw new TypeError;i=o}}return i}(t,e,n=x(n),i)})),t("metadata",(function(t,e){return function(n,i){if(!E(n))throw new TypeError;if(!I(i)&&!function(t){switch(T(t)){case 3:case 4:return!0;default:return!1}}(i))throw new TypeError;m(t,e,n,i)}})),t("defineMetadata",(function(t,e,n,i){if(!E(n))throw new TypeError;return I(i)||(i=x(i)),m(t,e,n,i)})),t("hasMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),v(t,e,n)})),t("hasOwnMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),_(t,e,n)})),t("getMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),w(t,e,n)})),t("getOwnMetadata",(function(t,e,n){if(!E(e))throw new TypeError;return I(n)||(n=x(n)),b(t,e,n)})),t("getMetadataKeys",(function(t,e){if(!E(t))throw new TypeError;return I(e)||(e=x(e)),A(t,e)})),t("getOwnMetadataKeys",(function(t,e){if(!E(t))throw new TypeError;return I(e)||(e=x(e)),S(t,e)})),t("deleteMetadata",(function(t,e,n){if(!E(e))throw new TypeError;if(I(n)||(n=x(n)),!E(e))throw new TypeError;I(n)||(n=x(n));var i=W(e,n,!1);return!I(i)&&i.OrdinaryDeleteMetadata(t,e,n)}))}(i,e),void 0===e.Reflect&&(e.Reflect=t)}()}(i||(i={}))}},i={};function r(t){var e=i[t];if(void 0!==e)return e.exports;var o=i[t]={exports:{}};return n[t](o,o.exports,r),o.exports}r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};r.d(o,{QC:()=>Pt,bU:()=>m,XK:()=>A,mc:()=>kt,i0:()=>Nt,FU:()=>b.LazyServiceIdentifier,KK:()=>te,PG:()=>P,$Z:()=>S,OZ:()=>qt,Yi:()=>Wt,A$:()=>B,id:()=>E,WQ:()=>Ut,_G:()=>Kt,F$:()=>ot,tt:()=>Yt,KT:()=>Gt,dU:()=>At,lq:()=>Ht,kr:()=>Jt,E3:()=>Xt,VK:()=>Vt,w:()=>mt,je:()=>Qt,Nu:()=>bt,if:()=>St,Fz:()=>zt});var a={};r.r(a),r.d(a,{DESIGN_PARAM_TYPES:()=>p,INJECT_TAG:()=>h,MULTI_INJECT_TAG:()=>l,NAMED_TAG:()=>s,NAME_TAG:()=>c,NON_CUSTOM_TAG_KEYS:()=>w,OPTIONAL_TAG:()=>d,PARAM_TYPES:()=>y,POST_CONSTRUCT:()=>v,PRE_DESTROY:()=>_,TAGGED:()=>f,TAGGED_PROP:()=>g,UNMANAGED_TAG:()=>u}),r(630);const s="named",c="name",u="unmanaged",d="optional",h="inject",l="multi_inject",f="inversify:tagged",g="inversify:tagged_props",y="inversify:paramtypes",p="design:paramtypes",v="post_construct",_="pre_destroy",w=[h,l,c,u,s,d],b=(T={LazyServiceIdentifier:()=>t.LazyServiceIdentifier},I={},r.d(I,T),I),m={Request:"Request",Singleton:"Singleton",Transient:"Transient"},A={ConstantValue:"ConstantValue",Constructor:"Constructor",DynamicValue:"DynamicValue",Factory:"Factory",Function:"Function",Instance:"Instance",Invalid:"Invalid",Provider:"Provider"},S={ClassProperty:"ClassProperty",ConstructorArgument:"ConstructorArgument",Variable:"Variable"};var T,I;let M=0;function E(){return M++}class D{id;moduleId;activated;serviceIdentifier;implementationType;cache;dynamicValue;scope;type;factory;provider;constraint;onActivation;onDeactivation;constructor(t,e){this.id=E(),this.activated=!1,this.serviceIdentifier=t,this.scope=e,this.type=A.Invalid,this.constraint=t=>!0,this.implementationType=null,this.cache=null,this.factory=null,this.provider=null,this.onActivation=null,this.onDeactivation=null,this.dynamicValue=null}clone(){const t=new D(this.serviceIdentifier,this.scope);return t.activated=t.scope===m.Singleton&&this.activated,t.implementationType=this.implementationType,t.dynamicValue=this.dynamicValue,t.scope=this.scope,t.type=this.type,t.factory=this.factory,t.provider=this.provider,t.constraint=this.constraint,t.onActivation=this.onActivation,t.onDeactivation=this.onDeactivation,t.cache=this.cache,t}}const C="Cannot apply @injectable decorator multiple times.",x="Metadata key was used more than once in a parameter:",O="NULL argument",R="Key Not Found",k="The @inject @multiInject @tagged and @named decorators must be applied to the parameters of a class constructor or a class property.",N=(t,e)=>`onDeactivation() error in class ${t}: ${e}`;class P{getConstructorMetadata(t){return{compilerGeneratedMetadata:Reflect.getMetadata(p,t)??[],userGeneratedMetadata:Reflect.getMetadata(f,t)??{}}}getPropertiesMetadata(t){return Reflect.getMetadata(g,t)??{}}}const j=(t=>{var e={};return r.d(e,t),e})({ClassElementMetadataKind:()=>e.ClassElementMetadataKind,LegacyTargetImpl:()=>e.LegacyTargetImpl,getClassElementMetadataFromLegacyMetadata:()=>e.getClassElementMetadataFromLegacyMetadata,getTargets:()=>e.getTargets});var F;function q(t){return t instanceof RangeError||"Maximum call stack size exceeded"===t.message}function B(t){return"function"==typeof t?t.name:"symbol"==typeof t?t.toString():t}function $(t,e,n){let i="";const r=n(t,e);return 0!==r.length&&(i="\nRegistered bindings:",r.forEach((t=>{let e="Object";null!==t.implementationType&&(e=V(t.implementationType)),i=`${i}\n ${e}`,t.constraint.metaData&&(i=`${i} - ${t.constraint.metaData}`)}))),i}function W(t,e){return null!==t.parentRequest&&(t.parentRequest.serviceIdentifier===e||W(t.parentRequest,e))}function K(t){t.childRequests.forEach((e=>{if(W(t,e.serviceIdentifier)){const t=function(t){return function t(e,n=[]){const i=B(e.serviceIdentifier);return n.push(i),null!==e.parentRequest?t(e.parentRequest,n):n}(t).reverse().join(" --\x3e ")}(e);throw new Error(`Circular dependency found: ${t}`)}K(e)}))}function V(t){if(null!=t.name&&""!==t.name)return t.name;{const e=t.toString(),n=e.match(/^function\s*([^\s(]+)/);return null===n?`Anonymous function: ${e}`:n[1]}}function G(t){return`{"key":"${t.key.toString()}","value":"${t.value.toString()}"}`}!function(t){t[t.MultipleBindingsAvailable=2]="MultipleBindingsAvailable",t[t.NoBindingsAvailable=0]="NoBindingsAvailable",t[t.OnlyOneBindingAvailable=1]="OnlyOneBindingAvailable"}(F||(F={}));class L{id;container;plan;currentRequest;constructor(t){this.id=E(),this.container=t}addPlan(t){this.plan=t}setCurrentRequest(t){this.currentRequest=t}}class U{key;value;constructor(t,e){this.key=t,this.value=e}toString(){return this.key===s?`named: ${String(this.value).toString()} `:`tagged: { key:${this.key.toString()}, value: ${String(this.value)} }`}}class H{parentContext;rootRequest;constructor(t,e){this.parentContext=t,this.rootRequest=e}}function z(t,e){const n=Object.getPrototypeOf(e.prototype).constructor;if(n!==Object){const e=(0,j.getTargets)(t)(n),i=e.map((t=>t.metadata.filter((t=>t.key===u)))),r=[].concat.apply([],i).length,o=e.length-r;return o>0?o:z(t,n)}return 0}class Y{id;serviceIdentifier;parentContext;parentRequest;bindings;childRequests;target;requestScope;constructor(t,e,n,i,r){this.id=E(),this.serviceIdentifier=t,this.parentContext=e,this.parentRequest=n,this.target=r,this.childRequests=[],this.bindings=Array.isArray(i)?i:[i],this.requestScope=null===n?new Map:null}addChildRequest(t,e,n){const i=new Y(t,this.parentContext,this,e,n);return this.childRequests.push(i),i}}function Q(t){return t._bindingDictionary}function Z(t,e,n,i,r){let o=tt(n.container,r.serviceIdentifier),a=[];return o.length===F.NoBindingsAvailable&&!0===n.container.options.autoBindInjectable&&"function"==typeof r.serviceIdentifier&&t.getConstructorMetadata(r.serviceIdentifier).compilerGeneratedMetadata&&(n.container.bind(r.serviceIdentifier).toSelf(),o=tt(n.container,r.serviceIdentifier)),a=e?o:o.filter((t=>{const e=new Y(t.serviceIdentifier,n,i,t,r);return t.constraint(e)})),function(t,e,n,i,r){switch(e.length){case F.NoBindingsAvailable:if(i.isOptional())return e;{const e=B(t);let o="No matching bindings found for serviceIdentifier:";throw o+=function(t,e){if(e.isTagged()||e.isNamed()){let n="";const i=e.getNamedTag(),r=e.getCustomTags();return null!==i&&(n+=G(i)+"\n"),null!==r&&r.forEach((t=>{n+=G(t)+"\n"})),` ${t}\n ${t} - ${n}`}return` ${t}`}(e,i),o+=$(r,e,tt),null!==n&&(o+=`\nTrying to resolve bindings for "${B(n.serviceIdentifier)}"`),new Error(o)}case F.OnlyOneBindingAvailable:return e;case F.MultipleBindingsAvailable:default:if(i.isArray())return e;{const e=B(t);let n=`Ambiguous match found for serviceIdentifier: ${e}`;throw n+=$(r,e,tt),new Error(n)}}}(r.serviceIdentifier,a,i,r,n.container),a}function J(t,e,n,i){const r=[new U(t?l:h,e)];return void 0!==n&&r.push(new U(n,i)),r}function X(t,e,n,i,r,o){let a,s;if(null===r){a=Z(t,e,i,null,o),s=new Y(n,i,null,a,o);const r=new H(i,s);i.addPlan(r)}else a=Z(t,e,i,r,o),s=r.addChildRequest(o.serviceIdentifier,a,o);a.forEach((e=>{let n=null;if(o.isArray())n=s.addChildRequest(e.serviceIdentifier,e,o);else{if(null!==e.cache)return;n=s}if(e.type===A.Instance&&null!==e.implementationType){const r=function(t,e){return(0,j.getTargets)(t)(e)}(t,e.implementationType);if(!0!==i.container.options.skipBaseClassChecks){const n=z(t,e.implementationType);if(r.length<n){const t=`The number of constructor arguments in the derived class ${V(e.implementationType)} must be >= than the number of constructor arguments of its base class.`;throw new Error(t)}}r.forEach((e=>{X(t,!1,e.serviceIdentifier,i,n,e)}))}}))}function tt(t,e){let n=[];const i=Q(t);return i.hasKey(e)?n=i.get(e):null!==t.parent&&(n=tt(t.parent,e)),n}function et(t){return("object"==typeof t&&null!==t||"function"==typeof t)&&"function"==typeof t.then}function nt(t){return!!et(t)||Array.isArray(t)&&t.some(et)}const it=async(t,e)=>{try{const n=await e;t.cache=n}catch(e){throw t.cache=null,t.activated=!1,e}};var rt;!function(t){t.DynamicValue="toDynamicValue",t.Factory="toFactory",t.Provider="toProvider"}(rt||(rt={}));const ot=t=>e=>(...n)=>{n.forEach((n=>{t.bind(n).toService(e)}))};function at(t){const e=new t.constr(...t.constructorInjections);return t.propertyRequests.forEach(((n,i)=>{const r=n.target.identifier,o=t.propertyInjections[i];n.target.isOptional()&&void 0===o||(e[r]=o)})),e}async function st(t){const e=[];for(const n of t)Array.isArray(n)?e.push(Promise.all(n)):e.push(n);return Promise.all(e)}function ct(t,e){const n=function(t,e){if(Reflect.hasMetadata(v,t)){const n=Reflect.getMetadata(v,t);try{return e[n.value]?.()}catch(e){if(e instanceof Error)throw new Error(`@postConstruct error in class ${t.name}: ${e.message}`)}}}(t,e);return et(n)?n.then((()=>e)):e}const ut=t=>e=>{e.parentContext.setCurrentRequest(e);const n=e.bindings,i=e.childRequests,r=e.target&&e.target.isArray(),o=!(e.parentRequest&&e.parentRequest.target&&e.target&&e.parentRequest.target.matchesArray(e.target.serviceIdentifier));if(r&&o)return i.map((e=>ut(t)(e)));{if(e.target.isOptional()&&0===n.length)return;const i=n[0];return ft(t,e,i)}},dt=(t,e)=>{const n=(t=>{switch(t.type){case A.Factory:return{factory:t.factory,factoryType:rt.Factory};case A.Provider:return{factory:t.provider,factoryType:rt.Provider};case A.DynamicValue:return{factory:t.dynamicValue,factoryType:rt.DynamicValue};default:throw new Error(`Unexpected factory type ${t.type}`)}})(t);return(()=>{try{return n.factory.bind(t)(e)}catch(t){if(q(t))throw new Error((i=n.factoryType,r=e.currentRequest.serviceIdentifier.toString(),`It looks like there is a circular dependency in one of the '${i}' bindings. Please investigate bindings with service identifier '${r}'.`));throw t}var i,r})()},ht=(t,e,n)=>{let i;const r=e.childRequests;switch((t=>{let e=null;switch(t.type){case A.ConstantValue:case A.Function:e=t.cache;break;case A.Constructor:case A.Instance:e=t.implementationType;break;case A.DynamicValue:e=t.dynamicValue;break;case A.Provider:e=t.provider;break;case A.Factory:e=t.factory}if(null===e){const e=B(t.serviceIdentifier);throw new Error(`Invalid binding type: ${e}`)}})(n),n.type){case A.ConstantValue:case A.Function:i=n.cache;break;case A.Constructor:i=n.implementationType;break;case A.Instance:i=function(t,e,n,i){!function(t,e){t.scope!==m.Singleton&&function(t,e){const n=`Class cannot be instantiated in ${t.scope===m.Request?"request":"transient"} scope.`;if("function"==typeof t.onDeactivation)throw new Error(N(e.name,n));if(Reflect.hasMetadata(_,e))throw new Error(`@preDestroy error in class ${e.name}: ${n}`)}(t,e)}(t,e);const r=function(t,e,n){let i;if(e.length>0){const r=function(t,e){return t.reduce(((t,n)=>{const i=e(n);return n.target.type===S.ConstructorArgument?t.constructorInjections.push(i):(t.propertyRequests.push(n),t.propertyInjections.push(i)),t.isAsync||(t.isAsync=nt(i)),t}),{constructorInjections:[],isAsync:!1,propertyInjections:[],propertyRequests:[]})}(e,n),o={...r,constr:t};i=r.isAsync?async function(t){const e=await st(t.constructorInjections),n=await st(t.propertyInjections);return at({...t,constructorInjections:e,propertyInjections:n})}(o):at(o)}else i=new t;return i}(e,n,i);return et(r)?r.then((t=>ct(e,t))):ct(e,r)}(n,n.implementationType,r,ut(t));break;default:i=dt(n,e.parentContext)}return i},lt=(t,e,n)=>{let i=((t,e)=>e.scope===m.Singleton&&e.activated?e.cache:e.scope===m.Request&&t.has(e.id)?t.get(e.id):null)(t,e);return null!==i||(i=n(),((t,e,n)=>{e.scope===m.Singleton&&((t,e)=>{t.cache=e,t.activated=!0,et(e)&&it(t,e)})(e,n),e.scope===m.Request&&((t,e,n)=>{t.has(e.id)||t.set(e.id,n)})(t,e,n)})(t,e,i)),i},ft=(t,e,n)=>lt(t,n,(()=>{let i=ht(t,e,n);return i=et(i)?i.then((t=>gt(e,n,t))):gt(e,n,i),i}));function gt(t,e,n){let i=yt(t.parentContext,e,n);const r=wt(t.parentContext.container);let o,a=r.next();do{o=a.value;const e=t.parentContext,n=t.serviceIdentifier,s=_t(o,n);i=et(i)?vt(s,e,i):pt(s,e,i),a=r.next()}while(!0!==a.done&&!Q(o).hasKey(t.serviceIdentifier));return i}const yt=(t,e,n)=>{let i;return i="function"==typeof e.onActivation?e.onActivation(t,n):n,i},pt=(t,e,n)=>{let i=t.next();for(;!0!==i.done;){if(et(n=i.value(e,n)))return vt(t,e,n);i=t.next()}return n},vt=async(t,e,n)=>{let i=await n,r=t.next();for(;!0!==r.done;)i=await r.value(e,i),r=t.next();return i},_t=(t,e)=>{const n=t._activations;return n.hasKey(e)?n.get(e).values():[].values()},wt=t=>{const e=[t];let n=t.parent;for(;null!==n;)e.push(n),n=n.parent;return{next:()=>{const t=e.pop();return void 0!==t?{done:!1,value:t}:{done:!0,value:void 0}}}},bt=(t,e)=>{const n=t.parentRequest;return null!==n&&(!!e(n)||bt(n,e))},mt=t=>e=>{const n=n=>null!==n&&null!==n.target&&n.target.matchesTag(t)(e);return n.metaData=new U(t,e),n},At=mt(s),St=t=>e=>{let n=null;if(null!==e){if(n=e.bindings[0],"string"==typeof t)return n.serviceIdentifier===t;{const n=e.bindings[0].implementationType;return t===n}}return!1};class Tt{_binding;constructor(t){this._binding=t}when(t){return this._binding.constraint=t,new It(this._binding)}whenTargetNamed(t){return this._binding.constraint=At(t),new It(this._binding)}whenTargetIsDefault(){return this._binding.constraint=t=>null!==t&&(null!==t.target&&!t.target.isNamed()&&!t.target.isTagged()),new It(this._binding)}whenTargetTagged(t,e){return this._binding.constraint=mt(t)(e),new It(this._binding)}whenInjectedInto(t){return this._binding.constraint=e=>null!==e&&St(t)(e.parentRequest),new It(this._binding)}whenParentNamed(t){return this._binding.constraint=e=>null!==e&&At(t)(e.parentRequest),new It(this._binding)}whenParentTagged(t,e){return this._binding.constraint=n=>null!==n&&mt(t)(e)(n.parentRequest),new It(this._binding)}whenAnyAncestorIs(t){return this._binding.constraint=e=>null!==e&&bt(e,St(t)),new It(this._binding)}whenNoAncestorIs(t){return this._binding.constraint=e=>null!==e&&!bt(e,St(t)),new It(this._binding)}whenAnyAncestorNamed(t){return this._binding.constraint=e=>null!==e&&bt(e,At(t)),new It(this._binding)}whenNoAncestorNamed(t){return this._binding.constraint=e=>null!==e&&!bt(e,At(t)),new It(this._binding)}whenAnyAncestorTagged(t,e){return this._binding.constraint=n=>null!==n&&bt(n,mt(t)(e)),new It(this._binding)}whenNoAncestorTagged(t,e){return this._binding.constraint=n=>null!==n&&!bt(n,mt(t)(e)),new It(this._binding)}whenAnyAncestorMatches(t){return this._binding.constraint=e=>null!==e&&bt(e,t),new It(this._binding)}whenNoAncestorMatches(t){return this._binding.constraint=e=>null!==e&&!bt(e,t),new It(this._binding)}}class It{_binding;constructor(t){this._binding=t}onActivation(t){return this._binding.onActivation=t,new Tt(this._binding)}onDeactivation(t){return this._binding.onDeactivation=t,new Tt(this._binding)}}class Mt{_bindingWhenSyntax;_bindingOnSyntax;_binding;constructor(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new It(this._binding)}when(t){return this._bindingWhenSyntax.when(t)}whenTargetNamed(t){return this._bindingWhenSyntax.whenTargetNamed(t)}whenTargetIsDefault(){return this._bindingWhenSyntax.whenTargetIsDefault()}whenTargetTagged(t,e){return this._bindingWhenSyntax.whenTargetTagged(t,e)}whenInjectedInto(t){return this._bindingWhenSyntax.whenInjectedInto(t)}whenParentNamed(t){return this._bindingWhenSyntax.whenParentNamed(t)}whenParentTagged(t,e){return this._bindingWhenSyntax.whenParentTagged(t,e)}whenAnyAncestorIs(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)}whenNoAncestorIs(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)}whenAnyAncestorNamed(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)}whenAnyAncestorTagged(t,e){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,e)}whenNoAncestorNamed(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)}whenNoAncestorTagged(t,e){return this._bindingWhenSyntax.whenNoAncestorTagged(t,e)}whenAnyAncestorMatches(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)}whenNoAncestorMatches(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)}onActivation(t){return this._bindingOnSyntax.onActivation(t)}onDeactivation(t){return this._bindingOnSyntax.onDeactivation(t)}}class Et{_binding;constructor(t){this._binding=t}inRequestScope(){return this._binding.scope=m.Request,new Mt(this._binding)}inSingletonScope(){return this._binding.scope=m.Singleton,new Mt(this._binding)}inTransientScope(){return this._binding.scope=m.Transient,new Mt(this._binding)}}class Dt{_bindingInSyntax;_bindingWhenSyntax;_bindingOnSyntax;_binding;constructor(t){this._binding=t,this._bindingWhenSyntax=new Tt(this._binding),this._bindingOnSyntax=new It(this._binding),this._bindingInSyntax=new Et(t)}inRequestScope(){return this._bindingInSyntax.inRequestScope()}inSingletonScope(){return this._bindingInSyntax.inSingletonScope()}inTransientScope(){return this._bindingInSyntax.inTransientScope()}when(t){return this._bindingWhenSyntax.when(t)}whenTargetNamed(t){return this._bindingWhenSyntax.whenTargetNamed(t)}whenTargetIsDefault(){return this._bindingWhenSyntax.whenTargetIsDefault()}whenTargetTagged(t,e){return this._bindingWhenSyntax.whenTargetTagged(t,e)}whenInjectedInto(t){return this._bindingWhenSyntax.whenInjectedInto(t)}whenParentNamed(t){return this._bindingWhenSyntax.whenParentNamed(t)}whenParentTagged(t,e){return this._bindingWhenSyntax.whenParentTagged(t,e)}whenAnyAncestorIs(t){return this._bindingWhenSyntax.whenAnyAncestorIs(t)}whenNoAncestorIs(t){return this._bindingWhenSyntax.whenNoAncestorIs(t)}whenAnyAncestorNamed(t){return this._bindingWhenSyntax.whenAnyAncestorNamed(t)}whenAnyAncestorTagged(t,e){return this._bindingWhenSyntax.whenAnyAncestorTagged(t,e)}whenNoAncestorNamed(t){return this._bindingWhenSyntax.whenNoAncestorNamed(t)}whenNoAncestorTagged(t,e){return this._bindingWhenSyntax.whenNoAncestorTagged(t,e)}whenAnyAncestorMatches(t){return this._bindingWhenSyntax.whenAnyAncestorMatches(t)}whenNoAncestorMatches(t){return this._bindingWhenSyntax.whenNoAncestorMatches(t)}onActivation(t){return this._bindingOnSyntax.onActivation(t)}onDeactivation(t){return this._bindingOnSyntax.onDeactivation(t)}}class Ct{_binding;constructor(t){this._binding=t}to(t){return this._binding.type=A.Instance,this._binding.implementationType=t,new Dt(this._binding)}toSelf(){if("function"!=typeof this._binding.serviceIdentifier)throw new Error("The toSelf function can only be applied when a constructor is used as service identifier");const t=this._binding.serviceIdentifier;return this.to(t)}toConstantValue(t){return this._binding.type=A.ConstantValue,this._binding.cache=t,this._binding.dynamicValue=null,this._binding.implementationType=null,this._binding.scope=m.Singleton,new Mt(this._binding)}toDynamicValue(t){return this._binding.type=A.DynamicValue,this._binding.cache=null,this._binding.dynamicValue=t,this._binding.implementationType=null,new Dt(this._binding)}toConstructor(t){return this._binding.type=A.Constructor,this._binding.implementationType=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toFactory(t){return this._binding.type=A.Factory,this._binding.factory=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toFunction(t){if("function"!=typeof t)throw new Error("Value provided to function binding must be a function!");const e=this.toConstantValue(t);return this._binding.type=A.Function,this._binding.scope=m.Singleton,e}toAutoFactory(t){return this._binding.type=A.Factory,this._binding.factory=e=>()=>e.container.get(t),this._binding.scope=m.Singleton,new Mt(this._binding)}toAutoNamedFactory(t){return this._binding.type=A.Factory,this._binding.factory=e=>n=>e.container.getNamed(t,n),new Mt(this._binding)}toProvider(t){return this._binding.type=A.Provider,this._binding.provider=t,this._binding.scope=m.Singleton,new Mt(this._binding)}toService(t){this._binding.type=A.DynamicValue,Object.defineProperty(this._binding,"cache",{configurable:!0,enumerable:!0,get:()=>null,set(t){}}),this._binding.dynamicValue=e=>{try{return e.container.get(t)}catch(n){return e.container.getAsync(t)}},this._binding.implementationType=null}}class xt{bindings;activations;deactivations;middleware;moduleActivationStore;static of(t,e,n,i,r){const o=new xt;return o.bindings=t,o.middleware=e,o.deactivations=i,o.activations=n,o.moduleActivationStore=r,o}}class Ot{_map;constructor(){this._map=new Map}getMap(){return this._map}add(t,e){if(this._checkNonNulish(t),null==e)throw new Error(O);const n=this._map.get(t);void 0!==n?n.push(e):this._map.set(t,[e])}get(t){this._checkNonNulish(t);const e=this._map.get(t);if(void 0!==e)return e;throw new Error(R)}remove(t){if(this._checkNonNulish(t),!this._map.delete(t))throw new Error(R)}removeIntersection(t){this.traverse(((e,n)=>{const i=t.hasKey(e)?t.get(e):void 0;if(void 0!==i){const t=n.filter((t=>!i.some((e=>t===e))));this._setValue(e,t)}}))}removeByCondition(t){const e=[];return this._map.forEach(((n,i)=>{const r=[];for(const i of n)t(i)?e.push(i):r.push(i);this._setValue(i,r)})),e}hasKey(t){return this._checkNonNulish(t),this._map.has(t)}clone(){const t=new Ot;return this._map.forEach(((e,n)=>{e.forEach((e=>{var i;t.add(n,"object"==typeof(i=e)&&null!==i&&"clone"in i&&"function"==typeof i.clone?e.clone():e)}))})),t}traverse(t){this._map.forEach(((e,n)=>{t(n,e)}))}_checkNonNulish(t){if(null==t)throw new Error(O)}_setValue(t,e){e.length>0?this._map.set(t,e):this._map.delete(t)}}class Rt{_map=new Map;remove(t){const e=this._map.get(t);return void 0===e?this._getEmptyHandlersStore():(this._map.delete(t),e)}addDeactivation(t,e,n){this._getModuleActivationHandlers(t).onDeactivations.add(e,n)}addActivation(t,e,n){this._getModuleActivationHandlers(t).onActivations.add(e,n)}clone(){const t=new Rt;return this._map.forEach(((e,n)=>{t._map.set(n,{onActivations:e.onActivations.clone(),onDeactivations:e.onDeactivations.clone()})})),t}_getModuleActivationHandlers(t){let e=this._map.get(t);return void 0===e&&(e=this._getEmptyHandlersStore(),this._map.set(t,e)),e}_getEmptyHandlersStore(){return{onActivations:new Ot,onDeactivations:new Ot}}}class kt{id;parent;options;_middleware;_bindingDictionary;_activations;_deactivations;_snapshots;_metadataReader;_moduleActivationStore;constructor(t){const e=t||{};if("object"!=typeof e)throw new Error("Invalid Container constructor argument. Container options must be an object.");if(void 0===e.defaultScope)e.defaultScope=m.Transient;else if(e.defaultScope!==m.Singleton&&e.defaultScope!==m.Transient&&e.defaultScope!==m.Request)throw new Error('Invalid Container option. Default scope must be a string ("singleton" or "transient").');if(void 0===e.autoBindInjectable)e.autoBindInjectable=!1;else if("boolean"!=typeof e.autoBindInjectable)throw new Error("Invalid Container option. Auto bind injectable must be a boolean");if(void 0===e.skipBaseClassChecks)e.skipBaseClassChecks=!1;else if("boolean"!=typeof e.skipBaseClassChecks)throw new Error("Invalid Container option. Skip base check must be a boolean");this.options={autoBindInjectable:e.autoBindInjectable,defaultScope:e.defaultScope,skipBaseClassChecks:e.skipBaseClassChecks},this.id=E(),this._bindingDictionary=new Ot,this._snapshots=[],this._middleware=null,this._activations=new Ot,this._deactivations=new Ot,this.parent=null,this._metadataReader=new P,this._moduleActivationStore=new Rt}static merge(t,e,...n){const i=new kt,r=[t,e,...n].map((t=>Q(t))),o=Q(i);return r.forEach((t=>{var e;e=o,t.traverse(((t,n)=>{n.forEach((t=>{e.add(t.serviceIdentifier,t.clone())}))}))})),i}load(...t){const e=this._getContainerModuleHelpersFactory();for(const n of t){const t=e(n.id);n.registry(t.bindFunction,t.unbindFunction,t.isboundFunction,t.rebindFunction,t.unbindAsyncFunction,t.onActivationFunction,t.onDeactivationFunction)}}async loadAsync(...t){const e=this._getContainerModuleHelpersFactory();for(const n of t){const t=e(n.id);await n.registry(t.bindFunction,t.unbindFunction,t.isboundFunction,t.rebindFunction,t.unbindAsyncFunction,t.onActivationFunction,t.onDeactivationFunction)}}unload(...t){t.forEach((t=>{const e=this._removeModuleBindings(t.id);this._deactivateSingletons(e),this._removeModuleHandlers(t.id)}))}async unloadAsync(...t){for(const e of t){const t=this._removeModuleBindings(e.id);await this._deactivateSingletonsAsync(t),this._removeModuleHandlers(e.id)}}bind(t){return this._bind(this._buildBinding(t))}rebind(t){return this.unbind(t),this.bind(t)}async rebindAsync(t){return await this.unbindAsync(t),this.bind(t)}unbind(t){if(this._bindingDictionary.hasKey(t)){const e=this._bindingDictionary.get(t);this._deactivateSingletons(e)}this._removeServiceFromDictionary(t)}async unbindAsync(t){if(this._bindingDictionary.hasKey(t)){const e=this._bindingDictionary.get(t);await this._deactivateSingletonsAsync(e)}this._removeServiceFromDictionary(t)}unbindAll(){this._bindingDictionary.traverse(((t,e)=>{this._deactivateSingletons(e)})),this._bindingDictionary=new Ot}async unbindAllAsync(){const t=[];this._bindingDictionary.traverse(((e,n)=>{t.push(this._deactivateSingletonsAsync(n))})),await Promise.all(t),this._bindingDictionary=new Ot}onActivation(t,e){this._activations.add(t,e)}onDeactivation(t,e){this._deactivations.add(t,e)}isBound(t){let e=this._bindingDictionary.hasKey(t);return!e&&this.parent&&(e=this.parent.isBound(t)),e}isCurrentBound(t){return this._bindingDictionary.hasKey(t)}isBoundNamed(t,e){return this.isBoundTagged(t,s,e)}isBoundTagged(t,e,n){let i=!1;if(this._bindingDictionary.hasKey(t)){const r=this._bindingDictionary.get(t),o=function(t,e,n,i){const r=J(!1,e,n,i),o=(0,j.getClassElementMetadataFromLegacyMetadata)(r);if(o.kind===j.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");const a=new j.LegacyTargetImpl("",o,"Variable"),s=new L(t);return new Y(e,s,null,[],a)}(this,t,e,n);i=r.some((t=>t.constraint(o)))}return!i&&this.parent&&(i=this.parent.isBoundTagged(t,e,n)),i}snapshot(){this._snapshots.push(xt.of(this._bindingDictionary.clone(),this._middleware,this._activations.clone(),this._deactivations.clone(),this._moduleActivationStore.clone()))}restore(){const t=this._snapshots.pop();if(void 0===t)throw new Error("No snapshot available to restore.");this._bindingDictionary=t.bindings,this._activations=t.activations,this._deactivations=t.deactivations,this._middleware=t.middleware,this._moduleActivationStore=t.moduleActivationStore}createChild(t){const e=new kt(t||this.options);return e.parent=this,e}applyMiddleware(...t){const e=this._middleware?this._middleware:this._planAndResolve();this._middleware=t.reduce(((t,e)=>e(t)),e)}applyCustomMetadataReader(t){this._metadataReader=t}get(t){const e=this._getNotAllArgs(t,!1);return this._getButThrowIfAsync(e)}async getAsync(t){const e=this._getNotAllArgs(t,!1);return this._get(e)}getTagged(t,e,n){const i=this._getNotAllArgs(t,!1,e,n);return this._getButThrowIfAsync(i)}async getTaggedAsync(t,e,n){const i=this._getNotAllArgs(t,!1,e,n);return this._get(i)}getNamed(t,e){return this.getTagged(t,s,e)}async getNamedAsync(t,e){return this.getTaggedAsync(t,s,e)}getAll(t){const e=this._getAllArgs(t);return this._getButThrowIfAsync(e)}async getAllAsync(t){const e=this._getAllArgs(t);return this._getAll(e)}getAllTagged(t,e,n){const i=this._getNotAllArgs(t,!0,e,n);return this._getButThrowIfAsync(i)}async getAllTaggedAsync(t,e,n){const i=this._getNotAllArgs(t,!0,e,n);return this._getAll(i)}getAllNamed(t,e){return this.getAllTagged(t,s,e)}async getAllNamedAsync(t,e){return this.getAllTaggedAsync(t,s,e)}resolve(t){const e=this.isBound(t);e||this.bind(t).toSelf();const n=this.get(t);return e||this.unbind(t),n}_preDestroy(t,e){if(void 0!==t&&Reflect.hasMetadata(_,t)){const n=Reflect.getMetadata(_,t);return e[n.value]?.()}}_removeModuleHandlers(t){const e=this._moduleActivationStore.remove(t);this._activations.removeIntersection(e.onActivations),this._deactivations.removeIntersection(e.onDeactivations)}_removeModuleBindings(t){return this._bindingDictionary.removeByCondition((e=>e.moduleId===t))}_deactivate(t,e){const n=null==e?void 0:Object.getPrototypeOf(e).constructor;try{if(this._deactivations.hasKey(t.serviceIdentifier)){const i=this._deactivateContainer(e,this._deactivations.get(t.serviceIdentifier).values());if(et(i))return this._handleDeactivationError(i.then((async()=>this._propagateContainerDeactivationThenBindingAndPreDestroyAsync(t,e,n))),t.serviceIdentifier)}const i=this._propagateContainerDeactivationThenBindingAndPreDestroy(t,e,n);if(et(i))return this._handleDeactivationError(i,t.serviceIdentifier)}catch(e){if(e instanceof Error)throw new Error(N(B(t.serviceIdentifier),e.message))}}async _handleDeactivationError(t,e){try{await t}catch(t){if(t instanceof Error)throw new Error(N(B(e),t.message))}}_deactivateContainer(t,e){let n=e.next();for(;"function"==typeof n.value;){const i=n.value(t);if(et(i))return i.then((async()=>this._deactivateContainerAsync(t,e)));n=e.next()}}async _deactivateContainerAsync(t,e){let n=e.next();for(;"function"==typeof n.value;)await n.value(t),n=e.next()}_getContainerModuleHelpersFactory(){const t=t=>e=>{const n=this._buildBinding(e);return n.moduleId=t,this._bind(n)},e=()=>t=>{this.unbind(t)},n=()=>async t=>this.unbindAsync(t),i=()=>t=>this.isBound(t),r=e=>{const n=t(e);return t=>(this.unbind(t),n(t))},o=t=>(e,n)=>{this._moduleActivationStore.addActivation(t,e,n),this.onActivation(e,n)},a=t=>(e,n)=>{this._moduleActivationStore.addDeactivation(t,e,n),this.onDeactivation(e,n)};return s=>({bindFunction:t(s),isboundFunction:i(),onActivationFunction:o(s),onDeactivationFunction:a(s),rebindFunction:r(s),unbindAsyncFunction:n(),unbindFunction:e()})}_bind(t){return this._bindingDictionary.add(t.serviceIdentifier,t),new Ct(t)}_buildBinding(t){const e=this.options.defaultScope||m.Transient;return new D(t,e)}async _getAll(t){return Promise.all(this._get(t))}_get(t){const e={...t,contextInterceptor:t=>t,targetType:S.Variable};if(this._middleware){const t=this._middleware(e);if(null==t)throw new Error("Invalid return type in middleware. Middleware must return!");return t}return this._planAndResolve()(e)}_getButThrowIfAsync(t){const e=this._get(t);if(nt(e))throw new Error(`You are attempting to construct ${n=t.serviceIdentifier,"function"==typeof n?`[function/class ${n.name||"<anonymous>"}]`:"symbol"==typeof n?n.toString():`'${n}'`} in a synchronous way but it has asynchronous dependencies.`);var n;return e}_getAllArgs(t){return{avoidConstraints:!0,isMultiInject:!0,serviceIdentifier:t}}_getNotAllArgs(t,e,n,i){return{avoidConstraints:!1,isMultiInject:e,key:n,serviceIdentifier:t,value:i}}_planAndResolve(){return t=>{let e=function(t,e,n,i,r,o,a,s=!1){const c=new L(e),u=function(t,e,n,i,r,o){const a=J(t,n,r,o),s=(0,j.getClassElementMetadataFromLegacyMetadata)(a);if(s.kind===j.ClassElementMetadataKind.unmanaged)throw new Error("Unexpected metadata when creating target");return new j.LegacyTargetImpl("",s,e)}(n,i,r,0,o,a);try{return X(t,s,r,c,null,u),c}catch(t){throw q(t)&&K(c.plan.rootRequest),t}}(this._metadataReader,this,t.isMultiInject,t.targetType,t.serviceIdentifier,t.key,t.value,t.avoidConstraints);e=t.contextInterceptor(e);const n=function(t){return ut(t.plan.rootRequest.requestScope)(t.plan.rootRequest)}(e);return n}}_deactivateIfSingleton(t){if(t.activated)return et(t.cache)?t.cache.then((e=>this._deactivate(t,e))):this._deactivate(t,t.cache)}_deactivateSingletons(t){for(const e of t)if(et(this._deactivateIfSingleton(e)))throw new Error("Attempting to unbind dependency with asynchronous destruction (@preDestroy or onDeactivation)")}async _deactivateSingletonsAsync(t){await Promise.all(t.map((async t=>this._deactivateIfSingleton(t))))}_propagateContainerDeactivationThenBindingAndPreDestroy(t,e,n){return this.parent?this._deactivate.bind(this.parent)(t,e):this._bindingDeactivationAndPreDestroy(t,e,n)}async _propagateContainerDeactivationThenBindingAndPreDestroyAsync(t,e,n){this.parent?await this._deactivate.bind(this.parent)(t,e):await this._bindingDeactivationAndPreDestroyAsync(t,e,n)}_removeServiceFromDictionary(t){try{this._bindingDictionary.remove(t)}catch(e){throw new Error(`Could not unbind serviceIdentifier: ${B(t)}`)}}_bindingDeactivationAndPreDestroy(t,e,n){if("function"==typeof t.onDeactivation){const i=t.onDeactivation(e);if(et(i))return i.then((()=>this._preDestroy(n,e)))}return this._preDestroy(n,e)}async _bindingDeactivationAndPreDestroyAsync(t,e,n){"function"==typeof t.onDeactivation&&await t.onDeactivation(e),await this._preDestroy(n,e)}}class Nt{id;registry;constructor(t){this.id=E(),this.registry=t}}class Pt{id;registry;constructor(t){this.id=E(),this.registry=t}}function jt(t,e,n,i){!function(t){if(void 0!==t)throw new Error(k)}(e),Ft(f,t,n.toString(),i)}function Ft(t,e,n,i){const r=function(t){let e=[];if(Array.isArray(t)){e=t;const n=function(t){const e=new Set;for(const n of t){if(e.has(n))return n;e.add(n)}}(e.map((t=>t.key)));if(void 0!==n)throw new Error(`${x} ${n.toString()}`)}else e=[t];return e}(i);let o={};Reflect.hasOwnMetadata(t,e)&&(o=Reflect.getMetadata(t,e));let a=o[n];if(void 0===a)a=[];else for(const t of a)if(r.some((e=>e.key===t.key)))throw new Error(`${x} ${t.key.toString()}`);a.push(...r),o[n]=a,Reflect.defineMetadata(t,o,e)}function qt(t){return(e,n,i)=>{"number"==typeof i?jt(e,n,i,t):function(t,e,n){if(void 0!==t.prototype)throw new Error(k);Ft(g,t.constructor,e,n)}(e,n,t)}}function Bt(t,e){Reflect.decorate(t,e)}function $t(t,e){return function(n,i){e(n,i,t)}}function Wt(t,e,n){"number"==typeof n?Bt([$t(n,t)],e):"string"==typeof n?Reflect.decorate([t],e,n):Bt([t],e)}function Kt(){return function(t){if(Reflect.hasOwnMetadata(y,t))throw new Error(C);const e=Reflect.getMetadata(p,t)||[];return Reflect.defineMetadata(y,e,t),t}}function Vt(t,e){return qt(new U(t,e))}function Gt(t){return qt(new U(s,t))}function Lt(t){return e=>(n,i,r)=>{if(void 0===e){const t="function"==typeof n?n.name:n.constructor.name;throw new Error(`@inject called with undefined this could mean that the class ${t} has a circular dependency problem. You can use a LazyServiceIdentifer to overcome this limitation.`)}qt(new U(t,e))(n,i,r)}}const Ut=Lt(h);function Ht(){return qt(new U(d,!0))}function zt(){return function(t,e,n){jt(t,e,n,new U(u,!0))}}const Yt=Lt(l);function Qt(t){return function(e,n,i){jt(e,n,i,new U(c,t))}}function Zt(t,e){return()=>(n,i)=>{const r=new U(t,i);if(Reflect.hasOwnMetadata(t,n.constructor))throw new Error(e);Reflect.defineMetadata(t,r,n.constructor)}}const Jt=Zt(v,"Cannot apply @postConstruct decorator multiple times in the same class"),Xt=Zt(_,"Cannot apply @preDestroy decorator multiple times in the same class"),te=a;var ee=o.QC,ne=o.bU,ie=o.XK,re=o.mc,oe=o.i0,ae=o.FU,se=o.KK,ce=o.PG,ue=o.$Z,de=o.OZ,he=o.Yi,le=o.A$,fe=o.id,ge=o.WQ,ye=o._G,pe=o.F$,ve=o.tt,_e=o.KT,we=o.dU,be=o.lq,me=o.kr,Ae=o.E3,Se=o.VK,Te=o.w,Ie=o.je,Me=o.Nu,Ee=o.if,De=o.Fz;export{ee as AsyncContainerModule,ne as BindingScopeEnum,ie as BindingTypeEnum,re as Container,oe as ContainerModule,ae as LazyServiceIdentifier,se as METADATA_KEY,ce as MetadataReader,ue as TargetTypeEnum,de as createTaggedDecorator,he as decorate,le as getServiceIdentifierAsString,fe as id,ge as inject,ye as injectable,pe as multiBindToService,ve as multiInject,_e as named,we as namedConstraint,be as optional,me as postConstruct,Ae as preDestroy,Se as tagged,Te as taggedConstraint,Ie as targetName,Me as traverseAncerstors,Ee as typeConstraint,De as unmanaged};
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxTQUFTb1osR0FBdUJDLEVBQVVuYSxHQUN0QyxNQUFPLElBQ0ksQ0FBQ3RSLEVBQVF5TSxLQUNaLE1BQU0xRCxFQUFXLElBQUlrTCxFQUFTd1gsRUFBVWhmLEdBQ3hDLEdBQUl0TixRQUFRMEgsZUFBZTRrQixFQUFVenJCLEVBQU9xTSxhQUN4QyxNQUFNLElBQUluRSxNQUFNb0osR0FFcEJuUyxRQUFRd0gsZUFBZThrQixFQUFVMWlCLEVBQVUvSSxFQUFPcU0sWUFBWSxDQUcxRSxDQ1JBLE1BQU1xZixHQUFnQkYsR0FBdUIsRTNDNEJFLDBFNEM1QnpDRyxHQUFhSCxHQUF1QixFNUMyQkUsdUU2QzNCL0JJLEdBQWUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9ub2RlX21vZHVsZXMvcmVmbGVjdC1tZXRhZGF0YS9SZWZsZWN0LmpzIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL2ludmVyc2lmeS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb25zdGFudHMvbWV0YWRhdGFfa2V5cy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvZXh0ZXJuYWwgbW9kdWxlIFwiQGludmVyc2lmeWpzL2NvbW1vblwiIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb25zdGFudHMvbGl0ZXJhbF90eXBlcy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvaWQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2JpbmRpbmdzL2JpbmRpbmcudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2NvbnN0YW50cy9lcnJvcl9tc2dzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9tZXRhZGF0YV9yZWFkZXIudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5L2V4dGVybmFsIG1vZHVsZSBcIkBpbnZlcnNpZnlqcy9jb3JlXCIiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2JpbmRpbmdzL2JpbmRpbmdfY291bnQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2V4Y2VwdGlvbnMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3BsYW5uaW5nL2NvbnRleHQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3BsYW5uaW5nL21ldGFkYXRhLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9wbGFuLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9yZWZsZWN0aW9uX3V0aWxzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9yZXF1ZXN0LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9wbGFubmluZy9wbGFubmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9hc3luYy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc2NvcGUvc2NvcGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2ZhY3RvcnlfdHlwZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvdXRpbHMvYmluZGluZ191dGlscy50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvcmVzb2x1dGlvbi9pbnN0YW50aWF0aW9uLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9yZXNvbHV0aW9uL3Jlc29sdmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvY29uc3RyYWludF9oZWxwZXJzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ193aGVuX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfb25fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ193aGVuX29uX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfaW5fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9zeW50YXgvYmluZGluZ19pbl93aGVuX29uX3N5bnRheC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvc3ludGF4L2JpbmRpbmdfdG9fc3ludGF4LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyX3NuYXBzaG90LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvbG9va3VwLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy91dGlscy9jbG9uYWJsZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvY29udGFpbmVyL21vZHVsZV9hY3RpdmF0aW9uX3N0b3JlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9jb250YWluZXIvY29udGFpbmVyX21vZHVsZS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL3V0aWxzL2pzLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdGFibGUudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vdGFnZ2VkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL25hbWVkLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdF9iYXNlLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL2luamVjdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi91bm1hbmFnZWQudHMiLCJ3ZWJwYWNrOi8vaW52ZXJzaWZ5Ly4vc3JjL2Fubm90YXRpb24vbXVsdGlfaW5qZWN0LnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL3RhcmdldF9uYW1lLnRzIiwid2VicGFjazovL2ludmVyc2lmeS8uL3NyYy9hbm5vdGF0aW9uL3Byb3BlcnR5X2V2ZW50X2RlY29yYXRvci50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9wb3N0X2NvbnN0cnVjdC50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvYW5ub3RhdGlvbi9wcmVfZGVzdHJveS50cyIsIndlYnBhY2s6Ly9pbnZlcnNpZnkvLi9zcmMvaW52ZXJzaWZ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcbnRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlXG5MaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5USElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG5LSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVEXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxuTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC5cblxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG5hbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xudmFyIFJlZmxlY3Q7XG4oZnVuY3Rpb24gKFJlZmxlY3QpIHtcbiAgICAvLyBNZXRhZGF0YSBQcm9wb3NhbFxuICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvXG4gICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgICAgIHZhciByb290ID0gdHlwZW9mIGdsb2JhbFRoaXMgPT09IFwib2JqZWN0XCIgPyBnbG9iYWxUaGlzIDpcbiAgICAgICAgICAgIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxmID09PSBcIm9iamVjdFwiID8gc2VsZiA6XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzID09PSBcIm9iamVjdFwiID8gdGhpcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICBzbG9wcHlNb2RlVGhpcygpO1xuICAgICAgICB2YXIgZXhwb3J0ZXIgPSBtYWtlRXhwb3J0ZXIoUmVmbGVjdCk7XG4gICAgICAgIGlmICh0eXBlb2Ygcm9vdC5SZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBleHBvcnRlciA9IG1ha2VFeHBvcnRlcihyb290LlJlZmxlY3QsIGV4cG9ydGVyKTtcbiAgICAgICAgfVxuICAgICAgICBmYWN0b3J5KGV4cG9ydGVyLCByb290KTtcbiAgICAgICAgaWYgKHR5cGVvZiByb290LlJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJvb3QuUmVmbGVjdCA9IFJlZmxlY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbWFrZUV4cG9ydGVyKHRhcmdldCwgcHJldmlvdXMpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgeyBjb25maWd1cmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzKVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyhrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZnVuY3Rpb25UaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oXCJyZXR1cm4gdGhpcztcIikoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChfKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbmRpcmVjdEV2YWxUaGlzKCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgMCwgZXZhbCkoXCIoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSgpXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF8pIHsgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHNsb3BweU1vZGVUaGlzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uVGhpcygpIHx8IGluZGlyZWN0RXZhbFRoaXMoKTtcbiAgICAgICAgfVxuICAgIH0pKGZ1bmN0aW9uIChleHBvcnRlciwgcm9vdCkge1xuICAgICAgICB2YXIgaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgICAgICAgLy8gZmVhdHVyZSB0ZXN0IGZvciBTeW1ib2wgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCI7XG4gICAgICAgIHZhciB0b1ByaW1pdGl2ZVN5bWJvbCA9IHN1cHBvcnRzU3ltYm9sICYmIHR5cGVvZiBTeW1ib2wudG9QcmltaXRpdmUgIT09IFwidW5kZWZpbmVkXCIgPyBTeW1ib2wudG9QcmltaXRpdmUgOiBcIkBAdG9QcmltaXRpdmVcIjtcbiAgICAgICAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gXCJ1bmRlZmluZWRcIiA/IFN5bWJvbC5pdGVyYXRvciA6IFwiQEBpdGVyYXRvclwiO1xuICAgICAgICB2YXIgc3VwcG9ydHNDcmVhdGUgPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiOyAvLyBmZWF0dXJlIHRlc3QgZm9yIE9iamVjdC5jcmVhdGUgc3VwcG9ydFxuICAgICAgICB2YXIgc3VwcG9ydHNQcm90byA9IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXk7IC8vIGZlYXR1cmUgdGVzdCBmb3IgX19wcm90b19fIHN1cHBvcnRcbiAgICAgICAgdmFyIGRvd25MZXZlbCA9ICFzdXBwb3J0c0NyZWF0ZSAmJiAhc3VwcG9ydHNQcm90bztcbiAgICAgICAgdmFyIEhhc2hNYXAgPSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYW4gb2JqZWN0IGluIGRpY3Rpb25hcnkgbW9kZSAoYS5rLmEuIFwic2xvd1wiIG1vZGUgaW4gdjgpXG4gICAgICAgICAgICBjcmVhdGU6IHN1cHBvcnRzQ3JlYXRlXG4gICAgICAgICAgICAgICAgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBNYWtlRGljdGlvbmFyeShPYmplY3QuY3JlYXRlKG51bGwpKTsgfVxuICAgICAgICAgICAgICAgIDogc3VwcG9ydHNQcm90b1xuICAgICAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uICgpIHsgcmV0dXJuIE1ha2VEaWN0aW9uYXJ5KHsgX19wcm90b19fOiBudWxsIH0pOyB9XG4gICAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTWFrZURpY3Rpb25hcnkoe30pOyB9LFxuICAgICAgICAgICAgaGFzOiBkb3duTGV2ZWxcbiAgICAgICAgICAgICAgICA/IGZ1bmN0aW9uIChtYXAsIGtleSkgeyByZXR1cm4gaGFzT3duLmNhbGwobWFwLCBrZXkpOyB9XG4gICAgICAgICAgICAgICAgOiBmdW5jdGlvbiAobWFwLCBrZXkpIHsgcmV0dXJuIGtleSBpbiBtYXA7IH0sXG4gICAgICAgICAgICBnZXQ6IGRvd25MZXZlbFxuICAgICAgICAgICAgICAgID8gZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBoYXNPd24uY2FsbChtYXAsIGtleSkgPyBtYXBba2V5XSA6IHVuZGVmaW5lZDsgfVxuICAgICAgICAgICAgICAgIDogZnVuY3Rpb24gKG1hcCwga2V5KSB7IHJldHVybiBtYXBba2V5XTsgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gTG9hZCBnbG9iYWwgb3Igc2hpbSB2ZXJzaW9ucyBvZiBNYXAsIFNldCwgYW5kIFdlYWtNYXBcbiAgICAgICAgdmFyIGZ1bmN0aW9uUHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKEZ1bmN0aW9uKTtcbiAgICAgICAgdmFyIF9NYXAgPSB0eXBlb2YgTWFwID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gTWFwIDogQ3JlYXRlTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9TZXQgPSB0eXBlb2YgU2V0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUuZW50cmllcyA9PT0gXCJmdW5jdGlvblwiID8gU2V0IDogQ3JlYXRlU2V0UG9seWZpbGwoKTtcbiAgICAgICAgdmFyIF9XZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09IFwiZnVuY3Rpb25cIiA/IFdlYWtNYXAgOiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKTtcbiAgICAgICAgdmFyIHJlZ2lzdHJ5U3ltYm9sID0gc3VwcG9ydHNTeW1ib2wgPyBTeW1ib2wuZm9yKFwiQHJlZmxlY3QtbWV0YWRhdGE6cmVnaXN0cnlcIikgOiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBtZXRhZGF0YVJlZ2lzdHJ5ID0gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCk7XG4gICAgICAgIHZhciBtZXRhZGF0YVByb3ZpZGVyID0gQ3JlYXRlTWV0YWRhdGFQcm92aWRlcihtZXRhZGF0YVJlZ2lzdHJ5KTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFwcGxpZXMgYSBzZXQgb2YgZGVjb3JhdG9ycyB0byBhIHByb3BlcnR5IG9mIGEgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIGRlY29yYXRvcnMgQW4gYXJyYXkgb2YgZGVjb3JhdG9ycy5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSB0byBkZWNvcmF0ZS5cbiAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIHRhcmdldCBrZXkuXG4gICAgICAgICAqIEByZW1hcmtzIERlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgRXhhbXBsZSA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9yc0FycmF5LCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnNBcnJheSwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIixcbiAgICAgICAgICogICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIsXG4gICAgICAgICAqICAgICAgICAgUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzQXJyYXksIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiLFxuICAgICAgICAgKiAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKSkpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzQXJyYXkoZGVjb3JhdG9ycykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGF0dHJpYnV0ZXMpICYmICFJc1VuZGVmaW5lZChhdHRyaWJ1dGVzKSAmJiAhSXNOdWxsKGF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKElzTnVsbChhdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBEZWNvcmF0ZVByb3BlcnR5KGRlY29yYXRvcnMsIHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0FycmF5KGRlY29yYXRvcnMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc0NvbnN0cnVjdG9yKHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRGVjb3JhdGVDb25zdHJ1Y3RvcihkZWNvcmF0b3JzLCB0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVjb3JhdGVcIiwgZGVjb3JhdGUpO1xuICAgICAgICAvLyA0LjEuMiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNyZWZsZWN0Lm1ldGFkYXRhXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGRlZmF1bHQgbWV0YWRhdGEgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCBvbiBhIGNsYXNzLCBjbGFzcyBtZW1iZXIsIG9yIHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSBlbnRyeS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhVmFsdWUgVGhlIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEgZW50cnkuXG4gICAgICAgICAqIEByZXR1cm5zIEEgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICAgICAgICAgKiBAcmVtYXJrc1xuICAgICAgICAgKiBJZiBgbWV0YWRhdGFLZXlgIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgdGhlIHRhcmdldCBhbmQgdGFyZ2V0IGtleSwgdGhlXG4gICAgICAgICAqIG1ldGFkYXRhVmFsdWUgZm9yIHRoYXQga2V5IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yLCBUeXBlU2NyaXB0IG9ubHkpXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICBAUmVmbGVjdC5tZXRhZGF0YShrZXksIHZhbHVlKVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUsIFR5cGVTY3JpcHQgb25seSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgcHJvcGVydHk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgQFJlZmxlY3QubWV0YWRhdGEoa2V5LCB2YWx1ZSlcbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIEBSZWZsZWN0Lm1ldGFkYXRhKGtleSwgdmFsdWUpXG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBtZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICAgICAgICAgICAgZnVuY3Rpb24gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSAmJiAhSXNQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJtZXRhZGF0YVwiLCBtZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWZpbmUgYSB1bmlxdWUgbWV0YWRhdGEgZW50cnkgb24gdGhlIHRhcmdldC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGFWYWx1ZSBBIHZhbHVlIHRoYXQgY29udGFpbnMgYXR0YWNoZWQgbWV0YWRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdG8gZGVmaW5lIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIG9wdGlvbnMsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgb3B0aW9ucywgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gZGVjb3JhdG9yIGZhY3RvcnkgYXMgbWV0YWRhdGEtcHJvZHVjaW5nIGFubm90YXRpb24uXG4gICAgICAgICAqICAgICBmdW5jdGlvbiBNeUFubm90YXRpb24ob3B0aW9ucyk6IERlY29yYXRvciB7XG4gICAgICAgICAqICAgICAgICAgcmV0dXJuICh0YXJnZXQsIGtleT8pID0+IFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBvcHRpb25zLCB0YXJnZXQsIGtleSk7XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBkZWZpbmVNZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJkZWZpbmVNZXRhZGF0YVwiLCBkZWZpbmVNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4gaGFzIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGtleSB3YXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBvciBpdHMgcHJvdG90eXBlIGNoYWluOyBvdGhlcndpc2UsIGBmYWxzZWAuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY1Byb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLnByb3RvdHlwZSwgXCJtZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBoYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgICAgICAgICAgaWYgKCFJc09iamVjdCh0YXJnZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvcGVydHlLZXkpKVxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5ID0gVG9Qcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlIYXNNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZXhwb3J0ZXIoXCJoYXNNZXRhZGF0YVwiLCBoYXNNZXRhZGF0YSk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0YXJnZXQgb2JqZWN0IGhhcyB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBtZXRhZGF0YSBrZXkgd2FzIGRlZmluZWQgb24gdGhlIHRhcmdldCBvYmplY3Q7IG90aGVyd2lzZSwgYGZhbHNlYC5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuaGFzT3duTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5oYXNPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImhhc093bk1ldGFkYXRhXCIsIGhhc093bk1ldGFkYXRhKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgcHJvdmlkZWQgbWV0YWRhdGEga2V5IG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0TWV0YWRhdGFcIiwgZ2V0TWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBtZXRhZGF0YSBrZXkgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gICAgICAgICAqIEBwYXJhbSBtZXRhZGF0YUtleSBBIGtleSB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIHZhbHVlIGZvciB0aGUgbWV0YWRhdGEga2V5IGlmIGZvdW5kOyBvdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljTWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFwiY3VzdG9tOmFubm90YXRpb25cIiwgRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFcIiwgZ2V0T3duTWV0YWRhdGEpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgbWV0YWRhdGEga2V5cyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgb2JqZWN0IG9yIGl0cyBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIGRlZmluZWQuXG4gICAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAoT3B0aW9uYWwpIFRoZSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSB0YXJnZXQuXG4gICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHVuaXF1ZSBtZXRhZGF0YSBrZXlzLlxuICAgICAgICAgKiBAZXhhbXBsZVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgY2xhc3MgRXhhbXBsZSB7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHkgZGVjbGFyYXRpb25zIGFyZSBub3QgcGFydCBvZiBFUzYsIHRob3VnaCB0aGV5IGFyZSB2YWxpZCBpbiBUeXBlU2NyaXB0OlxuICAgICAgICAgKiAgICAgICAgIC8vIHN0YXRpYyBzdGF0aWNQcm9wZXJ0eTtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgICAgICBjb25zdHJ1Y3RvcihwKSB7IH1cbiAgICAgICAgICogICAgICAgICBzdGF0aWMgc3RhdGljTWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIG1ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgIH1cbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIGNvbnN0cnVjdG9yXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE1ldGFkYXRhS2V5cyhFeGFtcGxlKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwicHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRNZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNNZXRob2RcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBtZXRob2QgKG9uIHByb3RvdHlwZSlcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0TWV0YWRhdGFLZXlzKEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGdldE1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeU1ldGFkYXRhS2V5cyh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgfVxuICAgICAgICBleHBvcnRlcihcImdldE1ldGFkYXRhS2V5c1wiLCBnZXRNZXRhZGF0YUtleXMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIG1ldGFkYXRhIGtleXMgZGVmaW5lZCBvbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdCBvbiB3aGljaCB0aGUgbWV0YWRhdGEgaXMgZGVmaW5lZC5cbiAgICAgICAgICogQHBhcmFtIHByb3BlcnR5S2V5IChPcHRpb25hbCkgVGhlIHByb3BlcnR5IGtleSBmb3IgdGhlIHRhcmdldC5cbiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdW5pcXVlIG1ldGFkYXRhIGtleXMuXG4gICAgICAgICAqIEBleGFtcGxlXG4gICAgICAgICAqXG4gICAgICAgICAqICAgICBjbGFzcyBFeGFtcGxlIHtcbiAgICAgICAgICogICAgICAgICAvLyBwcm9wZXJ0eSBkZWNsYXJhdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIEVTNiwgdGhvdWdoIHRoZXkgYXJlIHZhbGlkIGluIFR5cGVTY3JpcHQ6XG4gICAgICAgICAqICAgICAgICAgLy8gc3RhdGljIHN0YXRpY1Byb3BlcnR5O1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5O1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgICAgIGNvbnN0cnVjdG9yKHApIHsgfVxuICAgICAgICAgKiAgICAgICAgIHN0YXRpYyBzdGF0aWNNZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgbWV0aG9kKHApIHsgfVxuICAgICAgICAgKiAgICAgfVxuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gY29uc3RydWN0b3JcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzKEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZSwgXCJzdGF0aWNQcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIHByb3BlcnR5IChvbiBwcm90b3R5cGUpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLnByb3RvdHlwZSwgXCJwcm9wZXJ0eVwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gY29uc3RydWN0b3IpXG4gICAgICAgICAqICAgICByZXN1bHQgPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhS2V5cyhFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YUtleXMoRXhhbXBsZS5wcm90b3R5cGUsIFwibWV0aG9kXCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gZ2V0T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZ2V0T3duTWV0YWRhdGFLZXlzXCIsIGdldE93bk1ldGFkYXRhS2V5cyk7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBEZWxldGVzIHRoZSBtZXRhZGF0YSBlbnRyeSBmcm9tIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIHByb3ZpZGVkIGtleS5cbiAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhS2V5IEEga2V5IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIG1ldGFkYXRhLlxuICAgICAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyBkZWZpbmVkLlxuICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgKE9wdGlvbmFsKSBUaGUgcHJvcGVydHkga2V5IGZvciB0aGUgdGFyZ2V0LlxuICAgICAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1ldGFkYXRhIGVudHJ5IHdhcyBmb3VuZCBhbmQgZGVsZXRlZDsgb3RoZXJ3aXNlLCBmYWxzZS5cbiAgICAgICAgICogQGV4YW1wbGVcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIGNsYXNzIEV4YW1wbGUge1xuICAgICAgICAgKiAgICAgICAgIC8vIHByb3BlcnR5IGRlY2xhcmF0aW9ucyBhcmUgbm90IHBhcnQgb2YgRVM2LCB0aG91Z2ggdGhleSBhcmUgdmFsaWQgaW4gVHlwZVNjcmlwdDpcbiAgICAgICAgICogICAgICAgICAvLyBzdGF0aWMgc3RhdGljUHJvcGVydHk7XG4gICAgICAgICAqICAgICAgICAgLy8gcHJvcGVydHk7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAgICAgY29uc3RydWN0b3IocCkgeyB9XG4gICAgICAgICAqICAgICAgICAgc3RhdGljIHN0YXRpY01ldGhvZChwKSB7IH1cbiAgICAgICAgICogICAgICAgICBtZXRob2QocCkgeyB9XG4gICAgICAgICAqICAgICB9XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBjb25zdHJ1Y3RvclxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gcHJvcGVydHkgKG9uIGNvbnN0cnVjdG9yKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUsIFwic3RhdGljUHJvcGVydHlcIik7XG4gICAgICAgICAqXG4gICAgICAgICAqICAgICAvLyBwcm9wZXJ0eSAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcInByb3BlcnR5XCIpO1xuICAgICAgICAgKlxuICAgICAgICAgKiAgICAgLy8gbWV0aG9kIChvbiBjb25zdHJ1Y3RvcilcbiAgICAgICAgICogICAgIHJlc3VsdCA9IFJlZmxlY3QuZGVsZXRlTWV0YWRhdGEoXCJjdXN0b206YW5ub3RhdGlvblwiLCBFeGFtcGxlLCBcInN0YXRpY01ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICogICAgIC8vIG1ldGhvZCAob24gcHJvdG90eXBlKVxuICAgICAgICAgKiAgICAgcmVzdWx0ID0gUmVmbGVjdC5kZWxldGVNZXRhZGF0YShcImN1c3RvbTphbm5vdGF0aW9uXCIsIEV4YW1wbGUucHJvdG90eXBlLCBcIm1ldGhvZFwiKTtcbiAgICAgICAgICpcbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIGRlbGV0ZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHRhcmdldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChwcm9wZXJ0eUtleSkpXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXkgPSBUb1Byb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QodGFyZ2V0KSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3BlcnR5S2V5KSlcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSA9IFRvUHJvcGVydHlLZXkocHJvcGVydHlLZXkpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcih0YXJnZXQsIHByb3BlcnR5S2V5LCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlcikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLk9yZGluYXJ5RGVsZXRlTWV0YWRhdGEobWV0YWRhdGFLZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGV4cG9ydGVyKFwiZGVsZXRlTWV0YWRhdGFcIiwgZGVsZXRlTWV0YWRhdGEpO1xuICAgICAgICBmdW5jdGlvbiBEZWNvcmF0ZUNvbnN0cnVjdG9yKGRlY29yYXRvcnMsIHRhcmdldCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdG9yID0gZGVjb3JhdG9yc1tpXTtcbiAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzQ29uc3RydWN0b3IoZGVjb3JhdGVkKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZGVjb3JhdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gRGVjb3JhdGVQcm9wZXJ0eShkZWNvcmF0b3JzLCB0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3IgPSBkZWNvcmF0b3JzW2ldO1xuICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG4gICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChkZWNvcmF0ZWQpICYmICFJc051bGwoZGVjb3JhdGVkKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KGRlY29yYXRlZCkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBkZWNvcmF0ZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjEuMSBPcmRpbmFyeUhhc01ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc21ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBoYXNPd24gPSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIGlmIChoYXNPd24pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB2YXIgcGFyZW50ID0gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKTtcbiAgICAgICAgICAgIGlmICghSXNOdWxsKHBhcmVudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5SGFzTWV0YWRhdGEoTWV0YWRhdGFLZXksIHBhcmVudCwgUCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWhhc293bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4ocHJvdmlkZXIuT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS4zLjEgT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlnZXRtZXRhZGF0YVxuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICB2YXIgaGFzT3duID0gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCk7XG4gICAgICAgICAgICBpZiAoaGFzT3duKVxuICAgICAgICAgICAgICAgIHJldHVybiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgICAgIHZhciBwYXJlbnQgPSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pO1xuICAgICAgICAgICAgaWYgKCFJc051bGwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gT3JkaW5hcnlHZXRNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjQuMSBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEdldE1ldGFkYXRhUHJvdmlkZXIoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5PcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAzLjEuNS4xIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApXG4gICAgICAgIC8vIGh0dHBzOi8vcmJ1Y2t0b24uZ2l0aHViLmlvL3JlZmxlY3QtbWV0YWRhdGEvI29yZGluYXJ5ZGVmaW5lb3dubWV0YWRhdGFcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKkNyZWF0ZSovIHRydWUpO1xuICAgICAgICAgICAgcHJvdmlkZXIuT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMy4xLjYuMSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeW1ldGFkYXRha2V5c1xuICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeU1ldGFkYXRhS2V5cyhPLCBQKSB7XG4gICAgICAgICAgICB2YXIgb3duS2V5cyA9IE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApO1xuICAgICAgICAgICAgdmFyIHBhcmVudCA9IE9yZGluYXJ5R2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBvd25LZXlzO1xuICAgICAgICAgICAgdmFyIHBhcmVudEtleXMgPSBPcmRpbmFyeU1ldGFkYXRhS2V5cyhwYXJlbnQsIFApO1xuICAgICAgICAgICAgaWYgKHBhcmVudEtleXMubGVuZ3RoIDw9IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG93bktleXM7XG4gICAgICAgICAgICBpZiAob3duS2V5cy5sZW5ndGggPD0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50S2V5cztcbiAgICAgICAgICAgIHZhciBzZXQgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgdmFyIGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgb3duS2V5c18xID0gb3duS2V5czsgX2kgPCBvd25LZXlzXzEubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IG93bktleXNfMVtfaV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgcGFyZW50S2V5c18xID0gcGFyZW50S2V5czsgX2EgPCBwYXJlbnRLZXlzXzEubGVuZ3RoOyBfYSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IHBhcmVudEtleXNfMVtfYV07XG4gICAgICAgICAgICAgICAgdmFyIGhhc0tleSA9IHNldC5oYXMoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0tleSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIDMuMS43LjEgT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUClcbiAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCkge1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCAvKmNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuT3JkaW5hcnlPd25NZXRhZGF0YUtleXMoTywgUCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNiBFQ01BU2NyaXB0IERhdGEgVHlwZXMgYW5kIFZhbHVlc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWRhdGEtdHlwZXMtYW5kLXZhbHVlc1xuICAgICAgICBmdW5jdGlvbiBUeXBlKHgpIHtcbiAgICAgICAgICAgIGlmICh4ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE51bGwgKi87XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB4KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOiByZXR1cm4gMCAvKiBVbmRlZmluZWQgKi87XG4gICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjogcmV0dXJuIDIgLyogQm9vbGVhbiAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHJldHVybiAzIC8qIFN0cmluZyAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6IHJldHVybiA0IC8qIFN5bWJvbCAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6IHJldHVybiA1IC8qIE51bWJlciAqLztcbiAgICAgICAgICAgICAgICBjYXNlIFwib2JqZWN0XCI6IHJldHVybiB4ID09PSBudWxsID8gMSAvKiBOdWxsICovIDogNiAvKiBPYmplY3QgKi87XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDYgLyogT2JqZWN0ICovO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS4xIFRoZSBVbmRlZmluZWQgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLXVuZGVmaW5lZC10eXBlXG4gICAgICAgIGZ1bmN0aW9uIElzVW5kZWZpbmVkKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjIgVGhlIE51bGwgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzLW51bGwtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc051bGwoeCkge1xuICAgICAgICAgICAgcmV0dXJuIHggPT09IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNi4xLjUgVGhlIFN5bWJvbCBUeXBlXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMtc3ltYm9sLXR5cGVcbiAgICAgICAgZnVuY3Rpb24gSXNTeW1ib2woeCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDYuMS43IFRoZSBPYmplY3QgVHlwZVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vYmplY3QtdHlwZVxuICAgICAgICBmdW5jdGlvbiBJc09iamVjdCh4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09IFwib2JqZWN0XCIgPyB4ICE9PSBudWxsIDogdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjEgVHlwZSBDb252ZXJzaW9uXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXR5cGUtY29udmVyc2lvblxuICAgICAgICAvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9wcmltaXRpdmVcbiAgICAgICAgZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQsIFByZWZlcnJlZFR5cGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoVHlwZShpbnB1dCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDAgLyogVW5kZWZpbmVkICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSAxIC8qIE51bGwgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDIgLyogQm9vbGVhbiAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgICAgICBjYXNlIDQgLyogU3ltYm9sICovOiByZXR1cm4gaW5wdXQ7XG4gICAgICAgICAgICAgICAgY2FzZSA1IC8qIE51bWJlciAqLzogcmV0dXJuIGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGhpbnQgPSBQcmVmZXJyZWRUeXBlID09PSAzIC8qIFN0cmluZyAqLyA/IFwic3RyaW5nXCIgOiBQcmVmZXJyZWRUeXBlID09PSA1IC8qIE51bWJlciAqLyA/IFwibnVtYmVyXCIgOiBcImRlZmF1bHRcIjtcbiAgICAgICAgICAgIHZhciBleG90aWNUb1ByaW0gPSBHZXRNZXRob2QoaW5wdXQsIHRvUHJpbWl0aXZlU3ltYm9sKTtcbiAgICAgICAgICAgIGlmIChleG90aWNUb1ByaW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleG90aWNUb1ByaW0uY2FsbChpbnB1dCwgaGludCk7XG4gICAgICAgICAgICAgICAgaWYgKElzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9yZGluYXJ5VG9QcmltaXRpdmUoaW5wdXQsIGhpbnQgPT09IFwiZGVmYXVsdFwiID8gXCJudW1iZXJcIiA6IGhpbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xLjEgT3JkaW5hcnlUb1ByaW1pdGl2ZShPLCBoaW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeXRvcHJpbWl0aXZlXG4gICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5VG9QcmltaXRpdmUoTywgaGludCkge1xuICAgICAgICAgICAgaWYgKGhpbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMSA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzEuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlT2YgPSBPLnZhbHVlT2Y7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlT2YuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVPZiA9IE8udmFsdWVPZjtcbiAgICAgICAgICAgICAgICBpZiAoSXNDYWxsYWJsZSh2YWx1ZU9mKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdmFsdWVPZi5jYWxsKE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzT2JqZWN0KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdG9TdHJpbmdfMiA9IE8udG9TdHJpbmc7XG4gICAgICAgICAgICAgICAgaWYgKElzQ2FsbGFibGUodG9TdHJpbmdfMikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRvU3RyaW5nXzIuY2FsbChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc09iamVjdChyZXN1bHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjIgVG9Cb29sZWFuKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvMjAxNi8jc2VjLXRvYm9vbGVhblxuICAgICAgICBmdW5jdGlvbiBUb0Jvb2xlYW4oYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAhIWFyZ3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMS4xMiBUb1N0cmluZyhhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9zdHJpbmdcbiAgICAgICAgZnVuY3Rpb24gVG9TdHJpbmcoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlwiICsgYXJndW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4xLjE0IFRvUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gVG9Qcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgdmFyIGtleSA9IFRvUHJpbWl0aXZlKGFyZ3VtZW50LCAzIC8qIFN0cmluZyAqLyk7XG4gICAgICAgICAgICBpZiAoSXNTeW1ib2woa2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4yIFRlc3RpbmcgYW5kIENvbXBhcmlzb24gT3BlcmF0aW9uc1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10ZXN0aW5nLWFuZC1jb21wYXJpc29uLW9wZXJhdGlvbnNcbiAgICAgICAgLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxuICAgICAgICBmdW5jdGlvbiBJc0FycmF5KGFyZ3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheVxuICAgICAgICAgICAgICAgID8gQXJyYXkuaXNBcnJheShhcmd1bWVudClcbiAgICAgICAgICAgICAgICA6IGFyZ3VtZW50IGluc3RhbmNlb2YgT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgID8gYXJndW1lbnQgaW5zdGFuY2VvZiBBcnJheVxuICAgICAgICAgICAgICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCkgPT09IFwiW29iamVjdCBBcnJheV1cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuMyBJc0NhbGxhYmxlKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NhbGxhYmxlXG4gICAgICAgIGZ1bmN0aW9uIElzQ2FsbGFibGUoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgYXJndW1lbnQgPT09IFwiZnVuY3Rpb25cIjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjIuNCBJc0NvbnN0cnVjdG9yKGFyZ3VtZW50KVxuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pc2NvbnN0cnVjdG9yXG4gICAgICAgIGZ1bmN0aW9uIElzQ29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBhcyB3ZSBjYW5ub3QgY2hlY2sgZm9yIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLlxuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmd1bWVudCA9PT0gXCJmdW5jdGlvblwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuMi43IElzUHJvcGVydHlLZXkoYXJndW1lbnQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcHJvcGVydHlrZXlcbiAgICAgICAgZnVuY3Rpb24gSXNQcm9wZXJ0eUtleShhcmd1bWVudCkge1xuICAgICAgICAgICAgc3dpdGNoIChUeXBlKGFyZ3VtZW50KSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBTdHJpbmcgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBTeW1ib2wgKi86IHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBTYW1lVmFsdWVaZXJvKHgsIHkpIHtcbiAgICAgICAgICAgIHJldHVybiB4ID09PSB5IHx8IHggIT09IHggJiYgeSAhPT0geTtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjMgT3BlcmF0aW9ucyBvbiBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24tb2JqZWN0c1xuICAgICAgICAvLyA3LjMuOSBHZXRNZXRob2QoViwgUClcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0bWV0aG9kXG4gICAgICAgIGZ1bmN0aW9uIEdldE1ldGhvZChWLCBQKSB7XG4gICAgICAgICAgICB2YXIgZnVuYyA9IFZbUF07XG4gICAgICAgICAgICBpZiAoZnVuYyA9PT0gdW5kZWZpbmVkIHx8IGZ1bmMgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICghSXNDYWxsYWJsZShmdW5jKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQgT3BlcmF0aW9ucyBvbiBJdGVyYXRvciBPYmplY3RzXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9wZXJhdGlvbnMtb24taXRlcmF0b3Itb2JqZWN0c1xuICAgICAgICBmdW5jdGlvbiBHZXRJdGVyYXRvcihvYmopIHtcbiAgICAgICAgICAgIHZhciBtZXRob2QgPSBHZXRNZXRob2Qob2JqLCBpdGVyYXRvclN5bWJvbCk7XG4gICAgICAgICAgICBpZiAoIUlzQ2FsbGFibGUobWV0aG9kKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7IC8vIGZyb20gQ2FsbFxuICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbWV0aG9kLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghSXNPYmplY3QoaXRlcmF0b3IpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyA3LjQuNCBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8yMDE2LyNzZWMtaXRlcmF0b3J2YWx1ZVxuICAgICAgICBmdW5jdGlvbiBJdGVyYXRvclZhbHVlKGl0ZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBpdGVyUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC41IEl0ZXJhdG9yU3RlcChpdGVyYXRvcilcbiAgICAgICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwXG4gICAgICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU3RlcChpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IGZhbHNlIDogcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY2xvc2VcbiAgICAgICAgZnVuY3Rpb24gSXRlcmF0b3JDbG9zZShpdGVyYXRvcikge1xuICAgICAgICAgICAgdmFyIGYgPSBpdGVyYXRvcltcInJldHVyblwiXTtcbiAgICAgICAgICAgIGlmIChmKVxuICAgICAgICAgICAgICAgIGYuY2FsbChpdGVyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gOS4xIE9yZGluYXJ5IE9iamVjdCBJbnRlcm5hbCBNZXRob2RzIGFuZCBJbnRlcm5hbCBTbG90c1xuICAgICAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1vcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgLy8gOS4xLjEuMSBPcmRpbmFyeUdldFByb3RvdHlwZU9mKE8pXG4gICAgICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9yZGluYXJ5Z2V0cHJvdG90eXBlb2ZcbiAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlHZXRQcm90b3R5cGVPZihPKSB7XG4gICAgICAgICAgICB2YXIgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIE8gIT09IFwiZnVuY3Rpb25cIiB8fCBPID09PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBUeXBlU2NyaXB0IGRvZXNuJ3Qgc2V0IF9fcHJvdG9fXyBpbiBFUzUsIGFzIGl0J3Mgbm9uLXN0YW5kYXJkLlxuICAgICAgICAgICAgLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3Rvci4gQ29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbnNcbiAgICAgICAgICAgIC8vIG11c3QgZWl0aGVyIHNldCBfX3Byb3RvX18gb24gYSBzdWJjbGFzcyBjb25zdHJ1Y3RvciB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvcixcbiAgICAgICAgICAgIC8vIG9yIGVuc3VyZSBlYWNoIGNsYXNzIGhhcyBhIHZhbGlkIGBjb25zdHJ1Y3RvcmAgcHJvcGVydHkgb24gaXRzIHByb3RvdHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBwb2ludHMgYmFjayB0byB0aGUgY29uc3RydWN0b3IuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBGdW5jdGlvbi5bW1Byb3RvdHlwZV1dLCB0aGVuIHRoaXMgaXMgZGVmaW5hdGVseSBpbmhlcml0ZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gaW4gRVM2IG9yIHdoZW4gdXNpbmcgX19wcm90b19fIGluIGEgY29tcGF0aWJsZSBicm93c2VyLlxuICAgICAgICAgICAgaWYgKHByb3RvICE9PSBmdW5jdGlvblByb3RvdHlwZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB0aGUgc3VwZXIgcHJvdG90eXBlIGlzIE9iamVjdC5wcm90b3R5cGUsIG51bGwsIG9yIHVuZGVmaW5lZCwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPLnByb3RvdHlwZTtcbiAgICAgICAgICAgIHZhciBwcm90b3R5cGVQcm90byA9IHByb3RvdHlwZSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKTtcbiAgICAgICAgICAgIGlmIChwcm90b3R5cGVQcm90byA9PSBudWxsIHx8IHByb3RvdHlwZVByb3RvID09PSBPYmplY3QucHJvdG90eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm90bztcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb25zdHJ1Y3RvciB3YXMgbm90IGEgZnVuY3Rpb24sIHRoZW4gd2UgY2Fubm90IGRldGVybWluZSB0aGUgaGVyaXRhZ2UuXG4gICAgICAgICAgICB2YXIgY29uc3RydWN0b3IgPSBwcm90b3R5cGVQcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uc3RydWN0b3IgIT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHNvbWUga2luZCBvZiBzZWxmLXJlZmVyZW5jZSwgdGhlbiB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHRoZSBoZXJpdGFnZS5cbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3RvciA9PT0gTylcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG87XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGEgcHJldHR5IGdvb2QgZ3Vlc3MgYXQgdGhlIGhlcml0YWdlLlxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdsb2JhbCBtZXRhZGF0YSByZWdpc3RyeVxuICAgICAgICAvLyAtIEFsbG93cyBgaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiYCBhbmQgYGltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGEvbm8tY29uZmxpY3RcImAgdG8gaW50ZXJvcGVyYXRlLlxuICAgICAgICAvLyAtIFVzZXMgaXNvbGF0ZWQgbWV0YWRhdGEgaWYgYFJlZmxlY3RgIGlzIGZyb3plbiBiZWZvcmUgdGhlIHJlZ2lzdHJ5IGNhbiBiZSBpbnN0YWxsZWQuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGVzIGEgcmVnaXN0cnkgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSBgcmVmbGVjdC1tZXRhZGF0YWAgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gQ3JlYXRlTWV0YWRhdGFSZWdpc3RyeSgpIHtcbiAgICAgICAgICAgIHZhciBmYWxsYmFjaztcbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvb3QuUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICAgICAgICAgICAgICAgICEocmVnaXN0cnlTeW1ib2wgaW4gcm9vdC5SZWZsZWN0KSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByb290LlJlZmxlY3QuZGVmaW5lTWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIGludGVyb3BlcmF0ZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgYHJlZmxlY3QtbWV0YWRhdGFgIHRoYXQgZGlkIG5vdCBzdXBwb3J0IGEgcmVnaXN0cnkuXG4gICAgICAgICAgICAgICAgZmFsbGJhY2sgPSBDcmVhdGVGYWxsYmFja1Byb3ZpZGVyKHJvb3QuUmVmbGVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZmlyc3Q7XG4gICAgICAgICAgICB2YXIgc2Vjb25kO1xuICAgICAgICAgICAgdmFyIHJlc3Q7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0UHJvdmlkZXJNYXAgPSBuZXcgX1dlYWtNYXAoKTtcbiAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IHtcbiAgICAgICAgICAgICAgICByZWdpc3RlclByb3ZpZGVyOiByZWdpc3RlclByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGdldFByb3ZpZGVyOiBnZXRQcm92aWRlcixcbiAgICAgICAgICAgICAgICBzZXRQcm92aWRlcjogc2V0UHJvdmlkZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmlzRXh0ZW5zaWJsZShyZWdpc3RyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBwcm92aWRlciB0byBhIGZyb3plbiByZWdpc3RyeS5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZhbGxiYWNrID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoZmlyc3QpOlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIGZpcnN0ID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXNVbmRlZmluZWQoc2Vjb25kKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Vjb25kID09PSBwcm92aWRlcjogYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSBuZXcgX1NldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdC5hZGQocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaXNQcm92aWRlckZvcihPLCBQKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChzZWNvbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kLmlzUHJvdmlkZXJGb3IoTywgUCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZXN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpdGVyYXRvciA9IEdldEl0ZXJhdG9yKHJlc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlciA9IEl0ZXJhdG9yVmFsdWUobmV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKGZhbGxiYWNrKSAmJiBmYWxsYmFjay5pc1Byb3ZpZGVyRm9yKE8sIFApKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFByb3ZpZGVyKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIgcHJvdmlkZXJNYXAgPSB0YXJnZXRQcm92aWRlck1hcC5nZXQoTyk7XG4gICAgICAgICAgICAgICAgdmFyIHByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXJNYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gcHJvdmlkZXJNYXAuZ2V0KFApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByb3ZpZGVyID0gZ2V0UHJvdmlkZXJOb0NhY2hlKE8sIFApO1xuICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChwcm92aWRlck1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyTWFwID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3ZpZGVyTWFwLnNldChPLCBwcm92aWRlck1hcCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAuc2V0KFAsIHByb3ZpZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gaGFzUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQocHJvdmlkZXIpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09PSBwcm92aWRlciB8fCBzZWNvbmQgPT09IHByb3ZpZGVyIHx8ICFJc1VuZGVmaW5lZChyZXN0KSAmJiByZXN0Lmhhcyhwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQcm92aWRlcihPLCBQLCBwcm92aWRlcikge1xuICAgICAgICAgICAgICAgIGlmICghaGFzUHJvdmlkZXIocHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGFkYXRhIHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nUHJvdmlkZXIgPSBnZXRQcm92aWRlcihPLCBQKTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcm92aWRlciAhPT0gcHJvdmlkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwcm92aWRlck1hcCA9IHRhcmdldFByb3ZpZGVyTWFwLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHByb3ZpZGVyTWFwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAgPSBuZXcgX01hcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvdmlkZXJNYXAuc2V0KE8sIHByb3ZpZGVyTWFwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwcm92aWRlck1hcC5zZXQoUCwgcHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0cyBvciBjcmVhdGVzIHRoZSBzaGFyZWQgcmVnaXN0cnkgb2YgbWV0YWRhdGEgcHJvdmlkZXJzLlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5KCkge1xuICAgICAgICAgICAgdmFyIG1ldGFkYXRhUmVnaXN0cnk7XG4gICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHJlZ2lzdHJ5U3ltYm9sKSAmJiBJc09iamVjdChyb290LlJlZmxlY3QpICYmIE9iamVjdC5pc0V4dGVuc2libGUocm9vdC5SZWZsZWN0KSkge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkgPSByb290LlJlZmxlY3RbcmVnaXN0cnlTeW1ib2xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhUmVnaXN0cnkpKSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGFSZWdpc3RyeSA9IENyZWF0ZU1ldGFkYXRhUmVnaXN0cnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQocmVnaXN0cnlTeW1ib2wpICYmIElzT2JqZWN0KHJvb3QuUmVmbGVjdCkgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShyb290LlJlZmxlY3QpKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3QuUmVmbGVjdCwgcmVnaXN0cnlTeW1ib2wsIHtcbiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGFkYXRhUmVnaXN0cnlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YVJlZ2lzdHJ5O1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1ldGFkYXRhUHJvdmlkZXIocmVnaXN0cnkpIHtcbiAgICAgICAgICAgIC8vIFtbTWV0YWRhdGFdXSBpbnRlcm5hbCBzbG90XG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeS1vYmplY3QtaW50ZXJuYWwtbWV0aG9kcy1hbmQtaW50ZXJuYWwtc2xvdHNcbiAgICAgICAgICAgIHZhciBtZXRhZGF0YSA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldE1ldGFkYXRhLmhhcyhQKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGE6IE9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogT3JkaW5hcnlIYXNPd25NZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeUdldE93bk1ldGFkYXRhOiBPcmRpbmFyeUdldE93bk1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzOiBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1ldGFkYXRhUmVnaXN0cnkucmVnaXN0ZXJQcm92aWRlcihwcm92aWRlcik7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZU1ldGFkYXRhTWFwKE8sIFAsIENyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHZhciB0YXJnZXRNZXRhZGF0YSA9IG1ldGFkYXRhLmdldChPKTtcbiAgICAgICAgICAgICAgICB2YXIgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhID0gbmV3IF9NYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuc2V0KE8sIHRhcmdldE1ldGFkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlZFRhcmdldE1ldGFkYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gdGFyZ2V0TWV0YWRhdGEuZ2V0KFApO1xuICAgICAgICAgICAgICAgIGlmIChJc1VuZGVmaW5lZChtZXRhZGF0YU1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDcmVhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldE1ldGFkYXRhLnNldChQLCBtZXRhZGF0YU1hcCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVnaXN0cnkuc2V0UHJvdmlkZXIoTywgUCwgcHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNZXRhZGF0YS5kZWxldGUoUCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRlZFRhcmdldE1ldGFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZGVsZXRlKE8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiV3JvbmcgcHJvdmlkZXIgZm9yIHRhcmdldC5cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhTWFwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjIuMSBPcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnloYXNvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlIYXNPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBUb0Jvb2xlYW4obWV0YWRhdGFNYXAuaGFzKE1ldGFkYXRhS2V5KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAzLjEuNC4xIE9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApXG4gICAgICAgICAgICAvLyBodHRwczovL3JidWNrdG9uLmdpdGh1Yi5pby9yZWZsZWN0LW1ldGFkYXRhLyNvcmRpbmFyeWdldG93bm1ldGFkYXRhXG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeUdldE93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5nZXQoTWV0YWRhdGFLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjUuMSBPcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBNZXRhZGF0YVZhbHVlLCBPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlkZWZpbmVvd25tZXRhZGF0YVxuICAgICAgICAgICAgZnVuY3Rpb24gT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YShNZXRhZGF0YUtleSwgTWV0YWRhdGFWYWx1ZSwgTywgUCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YU1hcC5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMy4xLjcuMSBPcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9yYnVja3Rvbi5naXRodWIuaW8vcmVmbGVjdC1tZXRhZGF0YS8jb3JkaW5hcnlvd25tZXRhZGF0YWtleXNcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKE8sIFApIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YU1hcCA9IEdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgLypDcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKElzVW5kZWZpbmVkKG1ldGFkYXRhTWFwKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgICAgICAgICAgICAgdmFyIGtleXNPYmogPSBtZXRhZGF0YU1hcC5rZXlzKCk7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gR2V0SXRlcmF0b3Ioa2V5c09iaik7XG4gICAgICAgICAgICAgICAgdmFyIGsgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gSXRlcmF0b3JTdGVwKGl0ZXJhdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLmxlbmd0aCA9IGs7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gSXRlcmF0b3JWYWx1ZShuZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNba10gPSBuZXh0VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDbG9zZShpdGVyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhTWFwID0gR2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCAvKkNyZWF0ZSovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFNYXApKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5kZWxldGUoTWV0YWRhdGFLZXkpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldE1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0KE8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVW5kZWZpbmVkKHRhcmdldE1ldGFkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWV0YWRhdGEuZGVsZXRlKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldE1ldGFkYXRhLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5kZWxldGUodGFyZ2V0TWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZUZhbGxiYWNrUHJvdmlkZXIocmVmbGVjdCkge1xuICAgICAgICAgICAgdmFyIGRlZmluZU1ldGFkYXRhID0gcmVmbGVjdC5kZWZpbmVNZXRhZGF0YSwgaGFzT3duTWV0YWRhdGEgPSByZWZsZWN0Lmhhc093bk1ldGFkYXRhLCBnZXRPd25NZXRhZGF0YSA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGEsIGdldE93bk1ldGFkYXRhS2V5cyA9IHJlZmxlY3QuZ2V0T3duTWV0YWRhdGFLZXlzLCBkZWxldGVNZXRhZGF0YSA9IHJlZmxlY3QuZGVsZXRlTWV0YWRhdGE7XG4gICAgICAgICAgICB2YXIgbWV0YWRhdGFPd25lciA9IG5ldyBfV2Vha01hcCgpO1xuICAgICAgICAgICAgdmFyIHByb3ZpZGVyID0ge1xuICAgICAgICAgICAgICAgIGlzUHJvdmlkZXJGb3I6IGZ1bmN0aW9uIChPLCBQKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbWV0YWRhdGFPd25lci5nZXQoTyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkgJiYgbWV0YWRhdGFQcm9wZXJ0eVNldC5oYXMoUCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25NZXRhZGF0YUtleXMoTywgUCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSXNVbmRlZmluZWQobWV0YWRhdGFQcm9wZXJ0eVNldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVByb3BlcnR5U2V0ID0gbmV3IF9TZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU93bmVyLnNldChPLCBtZXRhZGF0YVByb3BlcnR5U2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhUHJvcGVydHlTZXQuYWRkKFApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YTogZGVmaW5lTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlIYXNPd25NZXRhZGF0YTogaGFzT3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlHZXRPd25NZXRhZGF0YTogZ2V0T3duTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgT3JkaW5hcnlPd25NZXRhZGF0YUtleXM6IGdldE93bk1ldGFkYXRhS2V5cyxcbiAgICAgICAgICAgICAgICBPcmRpbmFyeURlbGV0ZU1ldGFkYXRhOiBkZWxldGVNZXRhZGF0YSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIHByb3ZpZGVyIGZvciBhbiBvYmplY3QuIElmIHRoZSBvYmplY3QgaGFzIG5vIG1ldGFkYXRhIHByb3ZpZGVyIGFuZCB0aGlzIGlzIGZvciBhIGNyZWF0ZSBvcGVyYXRpb24sXG4gICAgICAgICAqIHRoZW4gdGhpcyBtb2R1bGUncyBtZXRhZGF0YSBwcm92aWRlciBpcyBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gR2V0TWV0YWRhdGFQcm92aWRlcihPLCBQLCBDcmVhdGUpIHtcbiAgICAgICAgICAgIHZhciByZWdpc3RlcmVkUHJvdmlkZXIgPSBtZXRhZGF0YVJlZ2lzdHJ5LmdldFByb3ZpZGVyKE8sIFApO1xuICAgICAgICAgICAgaWYgKCFJc1VuZGVmaW5lZChyZWdpc3RlcmVkUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRQcm92aWRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChDcmVhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGFSZWdpc3RyeS5zZXRQcm92aWRlcihPLCBQLCBtZXRhZGF0YVByb3ZpZGVyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFQcm92aWRlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBzdGF0ZS5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIE1hcCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZU1hcFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIGNhY2hlU2VudGluZWwgPSB7fTtcbiAgICAgICAgICAgIHZhciBhcnJheVNlbnRpbmVsID0gW107XG4gICAgICAgICAgICB2YXIgTWFwSXRlcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwSXRlcmF0b3Ioa2V5cywgdmFsdWVzLCBzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSB2YWx1ZXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdG9yID0gc2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuICAgICAgICAgICAgICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLl9rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX3NlbGVjdG9yKHRoaXMuX2tleXNbaW5kZXhdLCB0aGlzLl92YWx1ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gdGhpcy5fa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHJlc3VsdCwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gYXJyYXlTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBNYXBJdGVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cyA9IGFycmF5U2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMgPSBhcnJheVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB2YWx1ZSwgZG9uZTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcEl0ZXJhdG9yO1xuICAgICAgICAgICAgfSgpKTtcbiAgICAgICAgICAgIHZhciBNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlzID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUtleSA9IGNhY2hlU2VudGluZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE1hcC5wcm90b3R5cGUsIFwic2l6ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5cy5sZW5ndGg7IH0sXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gdGhpcy5fZmluZChrZXksIC8qaW5zZXJ0Ki8gZmFsc2UpID49IDA7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmQoa2V5LCAvKmluc2VydCovIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyB0aGlzLl92YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kKGtleSwgLyppbnNlcnQqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4ICsgMTsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXNbaSAtIDFdID0gdGhpcy5fa2V5c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXNbaSAtIDFdID0gdGhpcy5fdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTYW1lVmFsdWVaZXJvKGtleSwgdGhpcy5fY2FjaGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVLZXkgPSBjYWNoZVNlbnRpbmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleXMubGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlS2V5ID0gY2FjaGVTZW50aW5lbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IC0yO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcywgZ2V0S2V5KTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLl9rZXlzLCB0aGlzLl92YWx1ZXMsIGdldFZhbHVlKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgTWFwSXRlcmF0b3IodGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzLCBnZXRFbnRyeSk7IH07XG4gICAgICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtcIkBAaXRlcmF0b3JcIl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBNYXAucHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuZW50cmllcygpOyB9O1xuICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGUuX2ZpbmQgPSBmdW5jdGlvbiAoa2V5LCBpbnNlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFTYW1lVmFsdWVaZXJvKHRoaXMuX2NhY2hlS2V5LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZUluZGV4ID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2FtZVZhbHVlWmVybyh0aGlzLl9rZXlzW2ldLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlSW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlSW5kZXggPCAwICYmIGluc2VydCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVJbmRleCA9IHRoaXMuX2tleXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZUluZGV4O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hcDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gTWFwO1xuICAgICAgICAgICAgZnVuY3Rpb24gZ2V0S2V5KGtleSwgXykge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBnZXRWYWx1ZShfLCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFNldCBzaGltXG4gICAgICAgIGZ1bmN0aW9uIENyZWF0ZVNldFBvbHlmaWxsKCkge1xuICAgICAgICAgICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTZXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBfTWFwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTZXQucHJvdG90eXBlLCBcInNpemVcIiwge1xuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5zaXplOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmhhcyh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHRoaXMuX21hcC5zZXQodmFsdWUsIHZhbHVlKSwgdGhpczsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh2YWx1ZSk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fbWFwLmNsZWFyKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmtleXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlLnZhbHVlcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX21hcC5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgU2V0LnByb3RvdHlwZS5lbnRyaWVzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fbWFwLmVudHJpZXMoKTsgfTtcbiAgICAgICAgICAgICAgICBTZXQucHJvdG90eXBlW1wiQEBpdGVyYXRvclwiXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMua2V5cygpOyB9O1xuICAgICAgICAgICAgICAgIFNldC5wcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5rZXlzKCk7IH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNldDtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICByZXR1cm4gU2V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIG5haXZlIFdlYWtNYXAgc2hpbVxuICAgICAgICBmdW5jdGlvbiBDcmVhdGVXZWFrTWFwUG9seWZpbGwoKSB7XG4gICAgICAgICAgICB2YXIgVVVJRF9TSVpFID0gMTY7XG4gICAgICAgICAgICB2YXIga2V5cyA9IEhhc2hNYXAuY3JlYXRlKCk7XG4gICAgICAgICAgICB2YXIgcm9vdEtleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgcmV0dXJuIC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXkgPSBDcmVhdGVVbmlxdWVLZXkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUgIT09IHVuZGVmaW5lZCA/IEhhc2hNYXAuaGFzKHRhYmxlLCB0aGlzLl9rZXkpIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gSGFzaE1hcC5nZXQodGFibGUsIHRoaXMuX2tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAodGFyZ2V0LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGUgPSBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIC8qY3JlYXRlKi8gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlW3RoaXMuX2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBXZWFrTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWJsZSA9IEdldE9yQ3JlYXRlV2Vha01hcFRhYmxlKHRhcmdldCwgLypjcmVhdGUqLyBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZSAhPT0gdW5kZWZpbmVkID8gZGVsZXRlIHRhYmxlW3RoaXMuX2tleV0gOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFdlYWtNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBub3QgYSByZWFsIGNsZWFyLCBqdXN0IG1ha2VzIHRoZSBwcmV2aW91cyBkYXRhIHVucmVhY2hhYmxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleSA9IENyZWF0ZVVuaXF1ZUtleSgpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIFdlYWtNYXA7XG4gICAgICAgICAgICB9KCkpO1xuICAgICAgICAgICAgZnVuY3Rpb24gQ3JlYXRlVW5pcXVlS2V5KCkge1xuICAgICAgICAgICAgICAgIHZhciBrZXk7XG4gICAgICAgICAgICAgICAgZG9cbiAgICAgICAgICAgICAgICAgICAga2V5ID0gXCJAQFdlYWtNYXBAQFwiICsgQ3JlYXRlVVVJRCgpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChIYXNoTWFwLmhhcyhrZXlzLCBrZXkpKTtcbiAgICAgICAgICAgICAgICBrZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSh0YXJnZXQsIGNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzT3duLmNhbGwodGFyZ2V0LCByb290S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHJvb3RLZXksIHsgdmFsdWU6IEhhc2hNYXAuY3JlYXRlKCkgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcm9vdEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBGaWxsUmFuZG9tQnl0ZXMoYnVmZmVyLCBzaXplKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpXG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IE1hdGgucmFuZG9tKCkgKiAweGZmIHwgMDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZnVuY3Rpb24gR2VuUmFuZG9tQnl0ZXMoc2l6ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVWludDhBcnJheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG1zQ3J5cHRvICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgRmlsbFJhbmRvbUJ5dGVzKGFycmF5LCBzaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxsUmFuZG9tQnl0ZXMobmV3IEFycmF5KHNpemUpLCBzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZ1bmN0aW9uIENyZWF0ZVVVSUQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBHZW5SYW5kb21CeXRlcyhVVUlEX1NJWkUpO1xuICAgICAgICAgICAgICAgIC8vIG1hcmsgYXMgcmFuZG9tIC0gUkZDIDQxMjIgwqcgNC40XG4gICAgICAgICAgICAgICAgZGF0YVs2XSA9IGRhdGFbNl0gJiAweDRmIHwgMHg0MDtcbiAgICAgICAgICAgICAgICBkYXRhWzhdID0gZGF0YVs4XSAmIDB4YmYgfCAweDgwO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IFVVSURfU0laRTsgKytvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJ5dGUgPSBkYXRhW29mZnNldF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPT09IDQgfHwgb2Zmc2V0ID09PSA2IHx8IG9mZnNldCA9PT0gOClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIi1cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGUgPCAxNilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGJ5dGUudG9TdHJpbmcoMTYpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXNlcyBhIGhldXJpc3RpYyB1c2VkIGJ5IHY4IGFuZCBjaGFrcmEgdG8gZm9yY2UgYW4gb2JqZWN0IGludG8gZGljdGlvbmFyeSBtb2RlLlxuICAgICAgICBmdW5jdGlvbiBNYWtlRGljdGlvbmFyeShvYmopIHtcbiAgICAgICAgICAgIG9iai5fXyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGRlbGV0ZSBvYmouX187XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG4gICAgfSk7XG59KShSZWZsZWN0IHx8IChSZWZsZWN0ID0ge30pKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJleHBvcnQgY29uc3QgTkFNRURfVEFHID0gJ25hbWVkJztcbmV4cG9ydCBjb25zdCBOQU1FX1RBRyA9ICduYW1lJztcbmV4cG9ydCBjb25zdCBVTk1BTkFHRURfVEFHID0gJ3VubWFuYWdlZCc7XG5leHBvcnQgY29uc3QgT1BUSU9OQUxfVEFHID0gJ29wdGlvbmFsJztcbmV4cG9ydCBjb25zdCBJTkpFQ1RfVEFHID0gJ2luamVjdCc7XG5leHBvcnQgY29uc3QgTVVMVElfSU5KRUNUX1RBRyA9ICdtdWx0aV9pbmplY3QnO1xuZXhwb3J0IGNvbnN0IFRBR0dFRCA9ICdpbnZlcnNpZnk6dGFnZ2VkJztcbmV4cG9ydCBjb25zdCBUQUdHRURfUFJPUCA9ICdpbnZlcnNpZnk6dGFnZ2VkX3Byb3BzJztcbmV4cG9ydCBjb25zdCBQQVJBTV9UWVBFUyA9ICdpbnZlcnNpZnk6cGFyYW10eXBlcyc7XG5leHBvcnQgY29uc3QgREVTSUdOX1BBUkFNX1RZUEVTID0gJ2Rlc2lnbjpwYXJhbXR5cGVzJztcbmV4cG9ydCBjb25zdCBQT1NUX0NPTlNUUlVDVCA9ICdwb3N0X2NvbnN0cnVjdCc7XG5leHBvcnQgY29uc3QgUFJFX0RFU1RST1kgPSAncHJlX2Rlc3Ryb3knO1xuZnVuY3Rpb24gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICBJTkpFQ1RfVEFHLFxuICAgICAgICBNVUxUSV9JTkpFQ1RfVEFHLFxuICAgICAgICBOQU1FX1RBRyxcbiAgICAgICAgVU5NQU5BR0VEX1RBRyxcbiAgICAgICAgTkFNRURfVEFHLFxuICAgICAgICBPUFRJT05BTF9UQUcsXG4gICAgXTtcbn1cbmV4cG9ydCBjb25zdCBOT05fQ1VTVE9NX1RBR19LRVlTID0gZ2V0Tm9uQ3VzdG9tVGFnS2V5cygpO1xuIiwidmFyIHggPSAoeSkgPT4ge1xuXHR2YXIgeCA9IHt9OyBfX3dlYnBhY2tfcmVxdWlyZV9fLmQoeCwgeSk7IHJldHVybiB4XG59IFxudmFyIHkgPSAoeCkgPT4gKCgpID0+ICh4KSlcbmNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSB4KHsgW1wiTGF6eVNlcnZpY2VJZGVudGlmaWVyXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29tbW9uXzA4MWQ4YzA3X18uTGF6eVNlcnZpY2VJZGVudGlmaWVyKSB9KTsiLCJjb25zdCBCaW5kaW5nU2NvcGVFbnVtID0ge1xuICAgIFJlcXVlc3Q6ICdSZXF1ZXN0JyxcbiAgICBTaW5nbGV0b246ICdTaW5nbGV0b24nLFxuICAgIFRyYW5zaWVudDogJ1RyYW5zaWVudCcsXG59O1xuY29uc3QgQmluZGluZ1R5cGVFbnVtID0ge1xuICAgIENvbnN0YW50VmFsdWU6ICdDb25zdGFudFZhbHVlJyxcbiAgICBDb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdG9yJyxcbiAgICBEeW5hbWljVmFsdWU6ICdEeW5hbWljVmFsdWUnLFxuICAgIEZhY3Rvcnk6ICdGYWN0b3J5JyxcbiAgICBGdW5jdGlvbjogJ0Z1bmN0aW9uJyxcbiAgICBJbnN0YW5jZTogJ0luc3RhbmNlJyxcbiAgICBJbnZhbGlkOiAnSW52YWxpZCcsXG4gICAgUHJvdmlkZXI6ICdQcm92aWRlcicsXG59O1xuY29uc3QgVGFyZ2V0VHlwZUVudW0gPSB7XG4gICAgQ2xhc3NQcm9wZXJ0eTogJ0NsYXNzUHJvcGVydHknLFxuICAgIENvbnN0cnVjdG9yQXJndW1lbnQ6ICdDb25zdHJ1Y3RvckFyZ3VtZW50JyxcbiAgICBWYXJpYWJsZTogJ1ZhcmlhYmxlJyxcbn07XG5leHBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0sIFRhcmdldFR5cGVFbnVtIH07XG4iLCJsZXQgaWRDb3VudGVyID0gMDtcbmZ1bmN0aW9uIGlkKCkge1xuICAgIHJldHVybiBpZENvdW50ZXIrKztcbn1cbmV4cG9ydCB7IGlkIH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmNsYXNzIEJpbmRpbmcge1xuICAgIGlkO1xuICAgIG1vZHVsZUlkO1xuICAgIGFjdGl2YXRlZDtcbiAgICBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICBpbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgY2FjaGU7XG4gICAgZHluYW1pY1ZhbHVlO1xuICAgIHNjb3BlO1xuICAgIHR5cGU7XG4gICAgZmFjdG9yeTtcbiAgICBwcm92aWRlcjtcbiAgICBjb25zdHJhaW50O1xuICAgIG9uQWN0aXZhdGlvbjtcbiAgICBvbkRlYWN0aXZhdGlvbjtcbiAgICBjb25zdHJ1Y3RvcihzZXJ2aWNlSWRlbnRpZmllciwgc2NvcGUpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgICAgICB0aGlzLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uSW52YWxpZDtcbiAgICAgICAgdGhpcy5jb25zdHJhaW50ID0gKF9yZXF1ZXN0KSA9PiB0cnVlO1xuICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLmZhY3RvcnkgPSBudWxsO1xuICAgICAgICB0aGlzLnByb3ZpZGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbkFjdGl2YXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm9uRGVhY3RpdmF0aW9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5keW5hbWljVmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICBjbG9uZSgpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgQmluZGluZyh0aGlzLnNlcnZpY2VJZGVudGlmaWVyLCB0aGlzLnNjb3BlKTtcbiAgICAgICAgY2xvbmUuYWN0aXZhdGVkID1cbiAgICAgICAgICAgIGNsb25lLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbiA/IHRoaXMuYWN0aXZhdGVkIDogZmFsc2U7XG4gICAgICAgIGNsb25lLmltcGxlbWVudGF0aW9uVHlwZSA9IHRoaXMuaW1wbGVtZW50YXRpb25UeXBlO1xuICAgICAgICBjbG9uZS5keW5hbWljVmFsdWUgPSB0aGlzLmR5bmFtaWNWYWx1ZTtcbiAgICAgICAgY2xvbmUuc2NvcGUgPSB0aGlzLnNjb3BlO1xuICAgICAgICBjbG9uZS50eXBlID0gdGhpcy50eXBlO1xuICAgICAgICBjbG9uZS5mYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuICAgICAgICBjbG9uZS5wcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgIGNsb25lLmNvbnN0cmFpbnQgPSB0aGlzLmNvbnN0cmFpbnQ7XG4gICAgICAgIGNsb25lLm9uQWN0aXZhdGlvbiA9IHRoaXMub25BY3RpdmF0aW9uO1xuICAgICAgICBjbG9uZS5vbkRlYWN0aXZhdGlvbiA9IHRoaXMub25EZWFjdGl2YXRpb247XG4gICAgICAgIGNsb25lLmNhY2hlID0gdGhpcy5jYWNoZTtcbiAgICAgICAgcmV0dXJuIGNsb25lO1xuICAgIH1cbn1cbmV4cG9ydCB7IEJpbmRpbmcgfTtcbiIsImV4cG9ydCBjb25zdCBEVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SID0gJ0Nhbm5vdCBhcHBseSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IgbXVsdGlwbGUgdGltZXMuJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVEX01FVEFEQVRBID0gJ01ldGFkYXRhIGtleSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIHBhcmFtZXRlcjonO1xuZXhwb3J0IGNvbnN0IE5VTExfQVJHVU1FTlQgPSAnTlVMTCBhcmd1bWVudCc7XG5leHBvcnQgY29uc3QgS0VZX05PVF9GT1VORCA9ICdLZXkgTm90IEZvdW5kJztcbmV4cG9ydCBjb25zdCBBTUJJR1VPVVNfTUFUQ0ggPSAnQW1iaWd1b3VzIG1hdGNoIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IENBTk5PVF9VTkJJTkQgPSAnQ291bGQgbm90IHVuYmluZCBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IE5PVF9SRUdJU1RFUkVEID0gJ05vIG1hdGNoaW5nIGJpbmRpbmdzIGZvdW5kIGZvciBzZXJ2aWNlSWRlbnRpZmllcjonO1xuZXhwb3J0IGNvbnN0IFRSWUlOR19UT19SRVNPTFZFX0JJTkRJTkdTID0gKG5hbWUpID0+IGBUcnlpbmcgdG8gcmVzb2x2ZSBiaW5kaW5ncyBmb3IgXCIke25hbWV9XCJgO1xuZXhwb3J0IGNvbnN0IFVOREVGSU5FRF9JTkpFQ1RfQU5OT1RBVElPTiA9IChuYW1lKSA9PiBgQGluamVjdCBjYWxsZWQgd2l0aCB1bmRlZmluZWQgdGhpcyBjb3VsZCBtZWFuIHRoYXQgdGhlIGNsYXNzICR7bmFtZX0gaGFzIGAgK1xuICAgICdhIGNpcmN1bGFyIGRlcGVuZGVuY3kgcHJvYmxlbS4gWW91IGNhbiB1c2UgYSBMYXp5U2VydmljZUlkZW50aWZlciB0byAnICtcbiAgICAnb3ZlcmNvbWUgdGhpcyBsaW1pdGF0aW9uLic7XG5leHBvcnQgY29uc3QgQ0lSQ1VMQVJfREVQRU5ERU5DWSA9ICdDaXJjdWxhciBkZXBlbmRlbmN5IGZvdW5kOic7XG5leHBvcnQgY29uc3QgSU5WQUxJRF9CSU5ESU5HX1RZUEUgPSAnSW52YWxpZCBiaW5kaW5nIHR5cGU6JztcbmV4cG9ydCBjb25zdCBOT19NT1JFX1NOQVBTSE9UU19BVkFJTEFCTEUgPSAnTm8gc25hcHNob3QgYXZhaWxhYmxlIHRvIHJlc3RvcmUuJztcbmV4cG9ydCBjb25zdCBJTlZBTElEX01JRERMRVdBUkVfUkVUVVJOID0gJ0ludmFsaWQgcmV0dXJuIHR5cGUgaW4gbWlkZGxld2FyZS4gTWlkZGxld2FyZSBtdXN0IHJldHVybiEnO1xuZXhwb3J0IGNvbnN0IElOVkFMSURfRlVOQ1RJT05fQklORElORyA9ICdWYWx1ZSBwcm92aWRlZCB0byBmdW5jdGlvbiBiaW5kaW5nIG11c3QgYmUgYSBmdW5jdGlvbiEnO1xuZXhwb3J0IGNvbnN0IExBWllfSU5fU1lOQyA9IChrZXkpID0+IGBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gY29uc3RydWN0ICR7a2V5VG9TdHJpbmcoa2V5KX0gaW4gYSBzeW5jaHJvbm91cyB3YXkgYCArXG4gICAgJ2J1dCBpdCBoYXMgYXN5bmNocm9ub3VzIGRlcGVuZGVuY2llcy4nO1xuZXhwb3J0IGNvbnN0IElOVkFMSURfVE9fU0VMRl9WQUxVRSA9ICdUaGUgdG9TZWxmIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgd2hlbiBhIGNvbnN0cnVjdG9yIGlzICcgK1xuICAgICd1c2VkIGFzIHNlcnZpY2UgaWRlbnRpZmllcic7XG5leHBvcnQgY29uc3QgSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OID0gJ1RoZSBAaW5qZWN0IEBtdWx0aUluamVjdCBAdGFnZ2VkIGFuZCBAbmFtZWQgZGVjb3JhdG9ycyAnICtcbiAgICAnbXVzdCBiZSBhcHBsaWVkIHRvIHRoZSBwYXJhbWV0ZXJzIG9mIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYSBjbGFzcyBwcm9wZXJ0eS4nO1xuZXhwb3J0IGNvbnN0IEFSR1VNRU5UU19MRU5HVEhfTUlTTUFUQ0ggPSAobmFtZSkgPT4gJ1RoZSBudW1iZXIgb2YgY29uc3RydWN0b3IgYXJndW1lbnRzIGluIHRoZSBkZXJpdmVkIGNsYXNzICcgK1xuICAgIGAke25hbWV9IG11c3QgYmUgPj0gdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBvZiBpdHMgYmFzZSBjbGFzcy5gO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUl9PUFRJT05TX01VU1RfQkVfQU5fT0JKRUNUID0gJ0ludmFsaWQgQ29udGFpbmVyIGNvbnN0cnVjdG9yIGFyZ3VtZW50LiBDb250YWluZXIgb3B0aW9ucyAnICtcbiAgICAnbXVzdCBiZSBhbiBvYmplY3QuJztcbmV4cG9ydCBjb25zdCBDT05UQUlORVJfT1BUSU9OU19JTlZBTElEX0RFRkFVTFRfU0NPUEUgPSAnSW52YWxpZCBDb250YWluZXIgb3B0aW9uLiBEZWZhdWx0IHNjb3BlIG11c3QgJyArXG4gICAgJ2JlIGEgc3RyaW5nIChcInNpbmdsZXRvblwiIG9yIFwidHJhbnNpZW50XCIpLic7XG5leHBvcnQgY29uc3QgQ09OVEFJTkVSX09QVElPTlNfSU5WQUxJRF9BVVRPX0JJTkRfSU5KRUNUQUJMRSA9ICdJbnZhbGlkIENvbnRhaW5lciBvcHRpb24uIEF1dG8gYmluZCBpbmplY3RhYmxlIG11c3QgJyArICdiZSBhIGJvb2xlYW4nO1xuZXhwb3J0IGNvbnN0IENPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfU0tJUF9CQVNFX0NIRUNLID0gJ0ludmFsaWQgQ29udGFpbmVyIG9wdGlvbi4gU2tpcCBiYXNlIGNoZWNrIG11c3QgJyArICdiZSBhIGJvb2xlYW4nO1xuZXhwb3J0IGNvbnN0IE1VTFRJUExFX1BSRV9ERVNUUk9ZX01FVEhPRFMgPSAnQ2Fubm90IGFwcGx5IEBwcmVEZXN0cm95IGRlY29yYXRvciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBjbGFzcyc7XG5leHBvcnQgY29uc3QgTVVMVElQTEVfUE9TVF9DT05TVFJVQ1RfTUVUSE9EUyA9ICdDYW5ub3QgYXBwbHkgQHBvc3RDb25zdHJ1Y3QgZGVjb3JhdG9yIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIGNsYXNzJztcbmV4cG9ydCBjb25zdCBBU1lOQ19VTkJJTkRfUkVRVUlSRUQgPSAnQXR0ZW1wdGluZyB0byB1bmJpbmQgZGVwZW5kZW5jeSB3aXRoIGFzeW5jaHJvbm91cyBkZXN0cnVjdGlvbiAoQHByZURlc3Ryb3kgb3Igb25EZWFjdGl2YXRpb24pJztcbmV4cG9ydCBjb25zdCBQT1NUX0NPTlNUUlVDVF9FUlJPUiA9IChjbGF6eiwgZXJyb3JNZXNzYWdlKSA9PiBgQHBvc3RDb25zdHJ1Y3QgZXJyb3IgaW4gY2xhc3MgJHtjbGF6en06ICR7ZXJyb3JNZXNzYWdlfWA7XG5leHBvcnQgY29uc3QgUFJFX0RFU1RST1lfRVJST1IgPSAoY2xhenosIGVycm9yTWVzc2FnZSkgPT4gYEBwcmVEZXN0cm95IGVycm9yIGluIGNsYXNzICR7Y2xhenp9OiAke2Vycm9yTWVzc2FnZX1gO1xuZXhwb3J0IGNvbnN0IE9OX0RFQUNUSVZBVElPTl9FUlJPUiA9IChjbGF6eiwgZXJyb3JNZXNzYWdlKSA9PiBgb25EZWFjdGl2YXRpb24oKSBlcnJvciBpbiBjbGFzcyAke2NsYXp6fTogJHtlcnJvck1lc3NhZ2V9YDtcbmV4cG9ydCBjb25zdCBDSVJDVUxBUl9ERVBFTkRFTkNZX0lOX0ZBQ1RPUlkgPSAoZmFjdG9yeVR5cGUsIHNlcnZpY2VJZGVudGlmaWVyKSA9PiBgSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW4gb25lIG9mIHRoZSAnJHtmYWN0b3J5VHlwZX0nIGJpbmRpbmdzLiBQbGVhc2UgaW52ZXN0aWdhdGUgYmluZGluZ3Mgd2l0aCBgICtcbiAgICBgc2VydmljZSBpZGVudGlmaWVyICcke3NlcnZpY2VJZGVudGlmaWVyfScuYDtcbmV4cG9ydCBjb25zdCBTVEFDS19PVkVSRkxPVyA9ICdNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZCc7XG5mdW5jdGlvbiBrZXlUb1N0cmluZyhrZXkpIHtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gYFtmdW5jdGlvbi9jbGFzcyAke2tleS5uYW1lIHx8ICc8YW5vbnltb3VzPid9XWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4ga2V5LnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBgJyR7a2V5fSdgO1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmNsYXNzIE1ldGFkYXRhUmVhZGVyIHtcbiAgICBnZXRDb25zdHJ1Y3Rvck1ldGFkYXRhKGNvbnN0cnVjdG9yRnVuYykge1xuICAgICAgICBjb25zdCBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCBjb25zdHJ1Y3RvckZ1bmMpID8/IFtdO1xuICAgICAgICBjb25zdCB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5UQUdHRUQsIGNvbnN0cnVjdG9yRnVuYyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhLFxuICAgICAgICAgICAgdXNlckdlbmVyYXRlZE1ldGFkYXRhOiB1c2VyR2VuZXJhdGVkTWV0YWRhdGEgPz8ge30sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldFByb3BlcnRpZXNNZXRhZGF0YShjb25zdHJ1Y3RvckZ1bmMpIHtcbiAgICAgICAgY29uc3QgdXNlckdlbmVyYXRlZE1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGNvbnN0cnVjdG9yRnVuYykgPz8ge307XG4gICAgICAgIHJldHVybiB1c2VyR2VuZXJhdGVkTWV0YWRhdGE7XG4gICAgfVxufVxuZXhwb3J0IHsgTWV0YWRhdGFSZWFkZXIgfTtcbiIsInZhciB4ID0gKHkpID0+IHtcblx0dmFyIHggPSB7fTsgX193ZWJwYWNrX3JlcXVpcmVfXy5kKHgsIHkpOyByZXR1cm4geFxufSBcbnZhciB5ID0gKHgpID0+ICgoKSA9PiAoeCkpXG5jb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0geCh7IFtcIkNsYXNzRWxlbWVudE1ldGFkYXRhS2luZFwiXTogKCkgPT4gKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvcmVfYzA4Y2Y0YTFfXy5DbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQpLCBbXCJMZWdhY3lUYXJnZXRJbXBsXCJdOiAoKSA9PiAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9faW52ZXJzaWZ5anNfY29yZV9jMDhjZjRhMV9fLkxlZ2FjeVRhcmdldEltcGwpLCBbXCJnZXRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21MZWdhY3lNZXRhZGF0YVwiXTogKCkgPT4gKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfX2ludmVyc2lmeWpzX2NvcmVfYzA4Y2Y0YTFfXy5nZXRDbGFzc0VsZW1lbnRNZXRhZGF0YUZyb21MZWdhY3lNZXRhZGF0YSksIFtcImdldFRhcmdldHNcIl06ICgpID0+IChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18uZ2V0VGFyZ2V0cykgfSk7IiwiZXhwb3J0IHZhciBCaW5kaW5nQ291bnQ7XG4oZnVuY3Rpb24gKEJpbmRpbmdDb3VudCkge1xuICAgIEJpbmRpbmdDb3VudFtCaW5kaW5nQ291bnRbXCJNdWx0aXBsZUJpbmRpbmdzQXZhaWxhYmxlXCJdID0gMl0gPSBcIk11bHRpcGxlQmluZGluZ3NBdmFpbGFibGVcIjtcbiAgICBCaW5kaW5nQ291bnRbQmluZGluZ0NvdW50W1wiTm9CaW5kaW5nc0F2YWlsYWJsZVwiXSA9IDBdID0gXCJOb0JpbmRpbmdzQXZhaWxhYmxlXCI7XG4gICAgQmluZGluZ0NvdW50W0JpbmRpbmdDb3VudFtcIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlXCJdID0gMV0gPSBcIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlXCI7XG59KShCaW5kaW5nQ291bnQgfHwgKEJpbmRpbmdDb3VudCA9IHt9KSk7XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24oZXJyb3IpIHtcbiAgICByZXR1cm4gKGVycm9yIGluc3RhbmNlb2YgUmFuZ2VFcnJvciB8fFxuICAgICAgICBlcnJvci5tZXNzYWdlID09PSBFUlJPUl9NU0dTLlNUQUNLX09WRVJGTE9XKTtcbn1cbmV4cG9ydCBjb25zdCB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93ID0gKGZuLCBlcnJvckNhbGxiYWNrKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoaXNTdGFja092ZXJmbG93RXhjZXB0aW9uKGVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmZ1bmN0aW9uIGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICBpZiAodHlwZW9mIHNlcnZpY2VJZGVudGlmaWVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlSWRlbnRpZmllci5uYW1lO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc2VydmljZUlkZW50aWZpZXIgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiBzZXJ2aWNlSWRlbnRpZmllci50b1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlcnZpY2VJZGVudGlmaWVyO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllcihjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyLCBnZXRCaW5kaW5ncykge1xuICAgIGxldCByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gJyc7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEJpbmRpbmdzID0gZ2V0QmluZGluZ3MoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgaWYgKHJlZ2lzdGVyZWRCaW5kaW5ncy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9ICdcXG5SZWdpc3RlcmVkIGJpbmRpbmdzOic7XG4gICAgICAgIHJlZ2lzdGVyZWRCaW5kaW5ncy5mb3JFYWNoKChiaW5kaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9ICdPYmplY3QnO1xuICAgICAgICAgICAgaWYgKGJpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IGdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZWdpc3RlcmVkQmluZGluZ3NMaXN0ID0gYCR7cmVnaXN0ZXJlZEJpbmRpbmdzTGlzdH1cXG4gJHtuYW1lfWA7XG4gICAgICAgICAgICBpZiAoYmluZGluZy5jb25zdHJhaW50Lm1ldGFEYXRhKSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJlZEJpbmRpbmdzTGlzdCA9IGAke3JlZ2lzdGVyZWRCaW5kaW5nc0xpc3R9IC0gJHtiaW5kaW5nLmNvbnN0cmFpbnQubWV0YURhdGF9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RlcmVkQmluZGluZ3NMaXN0O1xufVxuZnVuY3Rpb24gYWxyZWFkeURlcGVuZGVuY3lDaGFpbihyZXF1ZXN0LCBzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIGlmIChyZXF1ZXN0LnBhcmVudFJlcXVlc3QgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXF1ZXN0LnBhcmVudFJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIgPT09IHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFscmVhZHlEZXBlbmRlbmN5Q2hhaW4ocmVxdWVzdC5wYXJlbnRSZXF1ZXN0LCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgfVxufVxuZnVuY3Rpb24gZGVwZW5kZW5jeUNoYWluVG9TdHJpbmcocmVxdWVzdCkge1xuICAgIGZ1bmN0aW9uIF9jcmVhdGVTdHJpbmdBcnIocmVxLCByZXN1bHQgPSBbXSkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllciA9IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcocmVxLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgcmVzdWx0LnB1c2goc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAocmVxLnBhcmVudFJlcXVlc3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlU3RyaW5nQXJyKHJlcS5wYXJlbnRSZXF1ZXN0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHN0cmluZ0FyciA9IF9jcmVhdGVTdHJpbmdBcnIocmVxdWVzdCk7XG4gICAgcmV0dXJuIHN0cmluZ0Fyci5yZXZlcnNlKCkuam9pbignIC0tPiAnKTtcbn1cbmZ1bmN0aW9uIGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uKHJlcXVlc3QpIHtcbiAgICByZXF1ZXN0LmNoaWxkUmVxdWVzdHMuZm9yRWFjaCgoY2hpbGRSZXF1ZXN0KSA9PiB7XG4gICAgICAgIGlmIChhbHJlYWR5RGVwZW5kZW5jeUNoYWluKHJlcXVlc3QsIGNoaWxkUmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VzID0gZGVwZW5kZW5jeUNoYWluVG9TdHJpbmcoY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkNJUkNVTEFSX0RFUEVOREVOQ1l9ICR7c2VydmljZXN9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjaXJjdWxhckRlcGVuZGVuY3lUb0V4Y2VwdGlvbihjaGlsZFJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBsaXN0TWV0YWRhdGFGb3JUYXJnZXQoc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIHRhcmdldCkge1xuICAgIGlmICh0YXJnZXQuaXNUYWdnZWQoKSB8fCB0YXJnZXQuaXNOYW1lZCgpKSB7XG4gICAgICAgIGxldCBtID0gJyc7XG4gICAgICAgIGNvbnN0IG5hbWVkVGFnID0gdGFyZ2V0LmdldE5hbWVkVGFnKCk7XG4gICAgICAgIGNvbnN0IG90aGVyVGFncyA9IHRhcmdldC5nZXRDdXN0b21UYWdzKCk7XG4gICAgICAgIGlmIChuYW1lZFRhZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbSArPSBzdHJpbmdpZnlNZXRhZGF0YShuYW1lZFRhZykgKyAnXFxuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXJUYWdzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBvdGhlclRhZ3MuZm9yRWFjaCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgbSArPSBzdHJpbmdpZnlNZXRhZGF0YSh0YWcpICsgJ1xcbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCAke3NlcnZpY2VJZGVudGlmaWVyU3RyaW5nfVxcbiAke3NlcnZpY2VJZGVudGlmaWVyU3RyaW5nfSAtICR7bX1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAgJHtzZXJ2aWNlSWRlbnRpZmllclN0cmluZ31gO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmdW5jKSB7XG4gICAgaWYgKGZ1bmMubmFtZSAhPSBudWxsICYmIGZ1bmMubmFtZSAhPT0gJycpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmdW5jLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gbmFtZS5tYXRjaCgvXmZ1bmN0aW9uXFxzKihbXlxccyhdKykvKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoID09PSBudWxsXG4gICAgICAgICAgICA/IGBBbm9ueW1vdXMgZnVuY3Rpb246ICR7bmFtZX1gXG4gICAgICAgICAgICA6IG1hdGNoWzFdO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFN5bWJvbERlc2NyaXB0aW9uKHN5bWJvbCkge1xuICAgIHJldHVybiBzeW1ib2wudG9TdHJpbmcoKS5zbGljZSg3LCAtMSk7XG59XG5mdW5jdGlvbiBzdHJpbmdpZnlNZXRhZGF0YShtZXRhZGF0YSkge1xuICAgIHJldHVybiBge1wia2V5XCI6XCIke21ldGFkYXRhLmtleS50b1N0cmluZygpfVwiLFwidmFsdWVcIjpcIiR7bWV0YWRhdGEudmFsdWUudG9TdHJpbmcoKX1cIn1gO1xufVxuZXhwb3J0IHsgZ2V0RnVuY3Rpb25OYW1lLCBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nLCBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIsIGxpc3RNZXRhZGF0YUZvclRhcmdldCwgY2lyY3VsYXJEZXBlbmRlbmN5VG9FeGNlcHRpb24sIGdldFN5bWJvbERlc2NyaXB0aW9uLCB9O1xuIiwiaW1wb3J0IHsgaWQgfSBmcm9tICcuLi91dGlscy9pZCc7XG5jbGFzcyBDb250ZXh0IHtcbiAgICBpZDtcbiAgICBjb250YWluZXI7XG4gICAgcGxhbjtcbiAgICBjdXJyZW50UmVxdWVzdDtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIH1cbiAgICBhZGRQbGFuKHBsYW4pIHtcbiAgICAgICAgdGhpcy5wbGFuID0gcGxhbjtcbiAgICB9XG4gICAgc2V0Q3VycmVudFJlcXVlc3QoY3VycmVudFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVxdWVzdCA9IGN1cnJlbnRSZXF1ZXN0O1xuICAgIH1cbn1cbmV4cG9ydCB7IENvbnRleHQgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5jbGFzcyBNZXRhZGF0YSB7XG4gICAga2V5O1xuICAgIHZhbHVlO1xuICAgIGNvbnN0cnVjdG9yKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIGlmICh0aGlzLmtleSA9PT0gTUVUQURBVEFfS0VZLk5BTUVEX1RBRykge1xuICAgICAgICAgICAgcmV0dXJuIGBuYW1lZDogJHtTdHJpbmcodGhpcy52YWx1ZSkudG9TdHJpbmcoKX0gYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgdGFnZ2VkOiB7IGtleToke3RoaXMua2V5LnRvU3RyaW5nKCl9LCB2YWx1ZTogJHtTdHJpbmcodGhpcy52YWx1ZSl9IH1gO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IHsgTWV0YWRhdGEgfTtcbiIsImNsYXNzIFBsYW4ge1xuICAgIHBhcmVudENvbnRleHQ7XG4gICAgcm9vdFJlcXVlc3Q7XG4gICAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcm9vdFJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5yb290UmVxdWVzdCA9IHJvb3RSZXF1ZXN0O1xuICAgIH1cbn1cbmV4cG9ydCB7IFBsYW4gfTtcbiIsImltcG9ydCB7IGdldFRhcmdldHMgfSBmcm9tICdAaW52ZXJzaWZ5anMvY29yZSc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5mdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICByZXR1cm4gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlcikoZnVuYyk7XG59XG5mdW5jdGlvbiBnZXRCYXNlQ2xhc3NEZXBlbmRlbmN5Q291bnQobWV0YWRhdGFSZWFkZXIsIGZ1bmMpIHtcbiAgICBjb25zdCBiYXNlQ29uc3RydWN0b3IgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnVuYy5wcm90b3R5cGUpLmNvbnN0cnVjdG9yO1xuICAgIGlmIChiYXNlQ29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gZ2V0VGFyZ2V0cyhtZXRhZGF0YVJlYWRlcikoYmFzZUNvbnN0cnVjdG9yKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0YXJnZXRzLm1hcCgodCkgPT4gdC5tZXRhZGF0YS5maWx0ZXIoKG0pID0+IG0ua2V5ID09PSBNRVRBREFUQV9LRVkuVU5NQU5BR0VEX1RBRykpO1xuICAgICAgICBjb25zdCB1bm1hbmFnZWRDb3VudCA9IFtdLmNvbmNhdC5hcHBseShbXSwgbWV0YWRhdGEpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeUNvdW50ID0gdGFyZ2V0cy5sZW5ndGggLSB1bm1hbmFnZWRDb3VudDtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3lDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBkZXBlbmRlbmN5Q291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50KG1ldGFkYXRhUmVhZGVyLCBiYXNlQ29uc3RydWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG5leHBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCwgZ2V0RnVuY3Rpb25OYW1lIH07XG4iLCJpbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmNsYXNzIFJlcXVlc3Qge1xuICAgIGlkO1xuICAgIHNlcnZpY2VJZGVudGlmaWVyO1xuICAgIHBhcmVudENvbnRleHQ7XG4gICAgcGFyZW50UmVxdWVzdDtcbiAgICBiaW5kaW5ncztcbiAgICBjaGlsZFJlcXVlc3RzO1xuICAgIHRhcmdldDtcbiAgICByZXF1ZXN0U2NvcGU7XG4gICAgY29uc3RydWN0b3Ioc2VydmljZUlkZW50aWZpZXIsIHBhcmVudENvbnRleHQsIHBhcmVudFJlcXVlc3QsIGJpbmRpbmdzLCB0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMuc2VydmljZUlkZW50aWZpZXIgPSBzZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgdGhpcy5wYXJlbnRSZXF1ZXN0ID0gcGFyZW50UmVxdWVzdDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgIHRoaXMuY2hpbGRSZXF1ZXN0cyA9IFtdO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gQXJyYXkuaXNBcnJheShiaW5kaW5ncykgPyBiaW5kaW5ncyA6IFtiaW5kaW5nc107XG4gICAgICAgIHRoaXMucmVxdWVzdFNjb3BlID0gcGFyZW50UmVxdWVzdCA9PT0gbnVsbCA/IG5ldyBNYXAoKSA6IG51bGw7XG4gICAgfVxuICAgIGFkZENoaWxkUmVxdWVzdChzZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZ3MsIHRhcmdldCkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5ldyBSZXF1ZXN0KHNlcnZpY2VJZGVudGlmaWVyLCB0aGlzLnBhcmVudENvbnRleHQsIHRoaXMsIGJpbmRpbmdzLCB0YXJnZXQpO1xuICAgICAgICB0aGlzLmNoaWxkUmVxdWVzdHMucHVzaChjaGlsZCk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG59XG5leHBvcnQgeyBSZXF1ZXN0IH07XG4iLCJpbXBvcnQgeyBDbGFzc0VsZW1lbnRNZXRhZGF0YUtpbmQsIGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhLCBMZWdhY3lUYXJnZXRJbXBsIGFzIFRhcmdldEltcGwsIH0gZnJvbSAnQGludmVyc2lmeWpzL2NvcmUnO1xuaW1wb3J0IHsgQmluZGluZ0NvdW50IH0gZnJvbSAnLi4vYmluZGluZ3MvYmluZGluZ19jb3VudCc7XG5pbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24gfSBmcm9tICcuLi91dGlscy9leGNlcHRpb25zJztcbmltcG9ydCB7IGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uLCBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nLCBsaXN0TWV0YWRhdGFGb3JUYXJnZXQsIGxpc3RSZWdpc3RlcmVkQmluZGluZ3NGb3JTZXJ2aWNlSWRlbnRpZmllciwgfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuL2NvbnRleHQnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7IFBsYW4gfSBmcm9tICcuL3BsYW4nO1xuaW1wb3J0IHsgZ2V0QmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50LCBnZXREZXBlbmRlbmNpZXMsIGdldEZ1bmN0aW9uTmFtZSwgfSBmcm9tICcuL3JlZmxlY3Rpb25fdXRpbHMnO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5mdW5jdGlvbiBnZXRCaW5kaW5nRGljdGlvbmFyeShjbnRucikge1xuICAgIHJldHVybiBjbnRuci5fYmluZGluZ0RpY3Rpb25hcnk7XG59XG5mdW5jdGlvbiBfY3JlYXRlVGFyZ2V0KGlzTXVsdGlJbmplY3QsIHRhcmdldFR5cGUsIHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgbWV0YWRhdGFMaXN0ID0gX2dldFRhcmdldE1ldGFkYXRhKGlzTXVsdGlJbmplY3QsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICBjb25zdCBjbGFzc0VsZW1lbnRNZXRhZGF0YSA9IGdldENsYXNzRWxlbWVudE1ldGFkYXRhRnJvbUxlZ2FjeU1ldGFkYXRhKG1ldGFkYXRhTGlzdCk7XG4gICAgaWYgKGNsYXNzRWxlbWVudE1ldGFkYXRhLmtpbmQgPT09IENsYXNzRWxlbWVudE1ldGFkYXRhS2luZC51bm1hbmFnZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG1ldGFkYXRhIHdoZW4gY3JlYXRpbmcgdGFyZ2V0Jyk7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IG5ldyBUYXJnZXRJbXBsKG5hbWUsIGNsYXNzRWxlbWVudE1ldGFkYXRhLCB0YXJnZXRUeXBlKTtcbiAgICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQpIHtcbiAgICBsZXQgYmluZGluZ3MgPSBnZXRCaW5kaW5ncyhjb250ZXh0LmNvbnRhaW5lciwgdGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICBsZXQgYWN0aXZlQmluZGluZ3MgPSBbXTtcbiAgICBpZiAoYmluZGluZ3MubGVuZ3RoID09PSBCaW5kaW5nQ291bnQuTm9CaW5kaW5nc0F2YWlsYWJsZSAmJlxuICAgICAgICBjb250ZXh0LmNvbnRhaW5lci5vcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSA9PT0gdHJ1ZSAmJlxuICAgICAgICB0eXBlb2YgdGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIG1ldGFkYXRhUmVhZGVyLmdldENvbnN0cnVjdG9yTWV0YWRhdGEodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyKVxuICAgICAgICAgICAgLmNvbXBpbGVyR2VuZXJhdGVkTWV0YWRhdGEpIHtcbiAgICAgICAgY29udGV4dC5jb250YWluZXIuYmluZCh0YXJnZXQuc2VydmljZUlkZW50aWZpZXIpLnRvU2VsZigpO1xuICAgICAgICBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKGNvbnRleHQuY29udGFpbmVyLCB0YXJnZXQuc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBpZiAoIWF2b2lkQ29uc3RyYWludHMpIHtcbiAgICAgICAgYWN0aXZlQmluZGluZ3MgPSBiaW5kaW5ncy5maWx0ZXIoKGJpbmRpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyLCBjb250ZXh0LCBwYXJlbnRSZXF1ZXN0LCBiaW5kaW5nLCB0YXJnZXQpO1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuY29uc3RyYWludChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdzO1xuICAgIH1cbiAgICBfdmFsaWRhdGVBY3RpdmVCaW5kaW5nQ291bnQodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyLCBhY3RpdmVCaW5kaW5ncywgcGFyZW50UmVxdWVzdCwgdGFyZ2V0LCBjb250ZXh0LmNvbnRhaW5lcik7XG4gICAgcmV0dXJuIGFjdGl2ZUJpbmRpbmdzO1xufVxuZnVuY3Rpb24gX2dldFRhcmdldE1ldGFkYXRhKGlzTXVsdGlJbmplY3QsIHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgbWV0YWRhdGFLZXkgPSBpc011bHRpSW5qZWN0XG4gICAgICAgID8gTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUdcbiAgICAgICAgOiBNRVRBREFUQV9LRVkuSU5KRUNUX1RBRztcbiAgICBjb25zdCBtZXRhZGF0YUxpc3QgPSBbXG4gICAgICAgIG5ldyBNZXRhZGF0YShtZXRhZGF0YUtleSwgc2VydmljZUlkZW50aWZpZXIpLFxuICAgIF07XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGFkYXRhTGlzdC5wdXNoKG5ldyBNZXRhZGF0YShrZXksIHZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBtZXRhZGF0YUxpc3Q7XG59XG5mdW5jdGlvbiBfdmFsaWRhdGVBY3RpdmVCaW5kaW5nQ291bnQoc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmdzLCBwYXJlbnRSZXF1ZXN0LCB0YXJnZXQsIGNvbnRhaW5lcikge1xuICAgIHN3aXRjaCAoYmluZGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgQmluZGluZ0NvdW50Lk5vQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgICAgICBpZiAodGFyZ2V0LmlzT3B0aW9uYWwoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5ncztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IEVSUk9SX01TR1MuTk9UX1JFR0lTVEVSRUQ7XG4gICAgICAgICAgICAgICAgbXNnICs9IGxpc3RNZXRhZGF0YUZvclRhcmdldChzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICBtc2cgKz0gbGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyKGNvbnRhaW5lciwgc2VydmljZUlkZW50aWZpZXJTdHJpbmcsIGdldEJpbmRpbmdzKTtcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50UmVxdWVzdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBtc2cgKz0gYFxcbiR7RVJST1JfTVNHUy5UUllJTkdfVE9fUkVTT0xWRV9CSU5ESU5HUyhnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nKHBhcmVudFJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIpKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBCaW5kaW5nQ291bnQuT25seU9uZUJpbmRpbmdBdmFpbGFibGU6XG4gICAgICAgICAgICByZXR1cm4gYmluZGluZ3M7XG4gICAgICAgIGNhc2UgQmluZGluZ0NvdW50Lk11bHRpcGxlQmluZGluZ3NBdmFpbGFibGU6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoIXRhcmdldC5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllclN0cmluZyA9IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgICAgIGxldCBtc2cgPSBgJHtFUlJPUl9NU0dTLkFNQklHVU9VU19NQVRDSH0gJHtzZXJ2aWNlSWRlbnRpZmllclN0cmluZ31gO1xuICAgICAgICAgICAgICAgIG1zZyArPSBsaXN0UmVnaXN0ZXJlZEJpbmRpbmdzRm9yU2VydmljZUlkZW50aWZpZXIoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllclN0cmluZywgZ2V0QmluZGluZ3MpO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmdzO1xuICAgICAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIF9jcmVhdGVTdWJSZXF1ZXN0cyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIHBhcmVudFJlcXVlc3QsIHRhcmdldCkge1xuICAgIGxldCBhY3RpdmVCaW5kaW5ncztcbiAgICBsZXQgY2hpbGRSZXF1ZXN0O1xuICAgIGlmIChwYXJlbnRSZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgIGFjdGl2ZUJpbmRpbmdzID0gX2dldEFjdGl2ZUJpbmRpbmdzKG1ldGFkYXRhUmVhZGVyLCBhdm9pZENvbnN0cmFpbnRzLCBjb250ZXh0LCBudWxsLCB0YXJnZXQpO1xuICAgICAgICBjaGlsZFJlcXVlc3QgPSBuZXcgUmVxdWVzdChzZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgbnVsbCwgYWN0aXZlQmluZGluZ3MsIHRhcmdldCk7XG4gICAgICAgIGNvbnN0IHRoZVBsYW4gPSBuZXcgUGxhbihjb250ZXh0LCBjaGlsZFJlcXVlc3QpO1xuICAgICAgICBjb250ZXh0LmFkZFBsYW4odGhlUGxhbik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhY3RpdmVCaW5kaW5ncyA9IF9nZXRBY3RpdmVCaW5kaW5ncyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgY29udGV4dCwgcGFyZW50UmVxdWVzdCwgdGFyZ2V0KTtcbiAgICAgICAgY2hpbGRSZXF1ZXN0ID0gcGFyZW50UmVxdWVzdC5hZGRDaGlsZFJlcXVlc3QodGFyZ2V0LnNlcnZpY2VJZGVudGlmaWVyLCBhY3RpdmVCaW5kaW5ncywgdGFyZ2V0KTtcbiAgICB9XG4gICAgYWN0aXZlQmluZGluZ3MuZm9yRWFjaCgoYmluZGluZykgPT4ge1xuICAgICAgICBsZXQgc3ViQ2hpbGRSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgaWYgKHRhcmdldC5pc0FycmF5KCkpIHtcbiAgICAgICAgICAgIHN1YkNoaWxkUmVxdWVzdCA9IGNoaWxkUmVxdWVzdC5hZGRDaGlsZFJlcXVlc3QoYmluZGluZy5zZXJ2aWNlSWRlbnRpZmllciwgYmluZGluZywgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChiaW5kaW5nLmNhY2hlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3ViQ2hpbGRSZXF1ZXN0ID0gY2hpbGRSZXF1ZXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiaW5kaW5nLnR5cGUgPT09IEJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZSAmJlxuICAgICAgICAgICAgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGdldERlcGVuZGVuY2llcyhtZXRhZGF0YVJlYWRlciwgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgaWYgKGNvbnRleHQuY29udGFpbmVyLm9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCA9IGdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudChtZXRhZGF0YVJlYWRlciwgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUpO1xuICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoIDwgYmFzZUNsYXNzRGVwZW5kZW5jeUNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gRVJST1JfTVNHUy5BUkdVTUVOVFNfTEVOR1RIX01JU01BVENIKGdldEZ1bmN0aW9uTmFtZShiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChkZXBlbmRlbmN5KSA9PiB7XG4gICAgICAgICAgICAgICAgX2NyZWF0ZVN1YlJlcXVlc3RzKG1ldGFkYXRhUmVhZGVyLCBmYWxzZSwgZGVwZW5kZW5jeS5zZXJ2aWNlSWRlbnRpZmllciwgY29udGV4dCwgc3ViQ2hpbGRSZXF1ZXN0LCBkZXBlbmRlbmN5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRCaW5kaW5ncyhjb250YWluZXIsIHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgbGV0IGJpbmRpbmdzID0gW107XG4gICAgY29uc3QgYmluZGluZ0RpY3Rpb25hcnkgPSBnZXRCaW5kaW5nRGljdGlvbmFyeShjb250YWluZXIpO1xuICAgIGlmIChiaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgIGJpbmRpbmdzID0gYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29udGFpbmVyLnBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBiaW5kaW5ncyA9IGdldEJpbmRpbmdzKGNvbnRhaW5lci5wYXJlbnQsIHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGJpbmRpbmdzO1xufVxuZnVuY3Rpb24gcGxhbihtZXRhZGF0YVJlYWRlciwgY29udGFpbmVyLCBpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSwgYXZvaWRDb25zdHJhaW50cyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IG5ldyBDb250ZXh0KGNvbnRhaW5lcik7XG4gICAgY29uc3QgdGFyZ2V0ID0gX2NyZWF0ZVRhcmdldChpc011bHRpSW5qZWN0LCB0YXJnZXRUeXBlLCBzZXJ2aWNlSWRlbnRpZmllciwgJycsIGtleSwgdmFsdWUpO1xuICAgIHRyeSB7XG4gICAgICAgIF9jcmVhdGVTdWJSZXF1ZXN0cyhtZXRhZGF0YVJlYWRlciwgYXZvaWRDb25zdHJhaW50cywgc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGlzU3RhY2tPdmVyZmxvd0V4Y2VwdGlvbihlcnJvcikpIHtcbiAgICAgICAgICAgIGNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uKGNvbnRleHQucGxhbi5yb290UmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlTW9ja1JlcXVlc3QoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgIGNvbnN0IG1ldGFkYXRhTGlzdCA9IF9nZXRUYXJnZXRNZXRhZGF0YShmYWxzZSwgc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpO1xuICAgIGNvbnN0IGNsYXNzRWxlbWVudE1ldGFkYXRhID0gZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEobWV0YWRhdGFMaXN0KTtcbiAgICBpZiAoY2xhc3NFbGVtZW50TWV0YWRhdGEua2luZCA9PT0gQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kLnVubWFuYWdlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbWV0YWRhdGEgd2hlbiBjcmVhdGluZyB0YXJnZXQnKTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IFRhcmdldEltcGwoJycsIGNsYXNzRWxlbWVudE1ldGFkYXRhLCAnVmFyaWFibGUnKTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IENvbnRleHQoY29udGFpbmVyKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3Qoc2VydmljZUlkZW50aWZpZXIsIGNvbnRleHQsIG51bGwsIFtdLCB0YXJnZXQpO1xuICAgIHJldHVybiByZXF1ZXN0O1xufVxuZXhwb3J0IHsgcGxhbiwgY3JlYXRlTW9ja1JlcXVlc3QsIGdldEJpbmRpbmdEaWN0aW9uYXJ5IH07XG4iLCJmdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgY29uc3QgaXNPYmplY3RPckZ1bmN0aW9uID0gKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkgfHxcbiAgICAgICAgdHlwZW9mIG9iamVjdCA9PT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gKGlzT2JqZWN0T3JGdW5jdGlvbiAmJiB0eXBlb2Ygb2JqZWN0LnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuZnVuY3Rpb24gaXNQcm9taXNlT3JDb250YWluc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgaWYgKGlzUHJvbWlzZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShvYmplY3QpICYmIG9iamVjdC5zb21lKGlzUHJvbWlzZSk7XG59XG5leHBvcnQgeyBpc1Byb21pc2UsIGlzUHJvbWlzZU9yQ29udGFpbnNQcm9taXNlIH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnLi4vdXRpbHMvYXN5bmMnO1xuZXhwb3J0IGNvbnN0IHRyeUdldEZyb21TY29wZSA9IChyZXF1ZXN0U2NvcGUsIGJpbmRpbmcpID0+IHtcbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5TaW5nbGV0b24gJiYgYmluZGluZy5hY3RpdmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmcuY2FjaGU7XG4gICAgfVxuICAgIGlmIChiaW5kaW5nLnNjb3BlID09PSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3QgJiZcbiAgICAgICAgcmVxdWVzdFNjb3BlLmhhcyhiaW5kaW5nLmlkKSkge1xuICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlLmdldChiaW5kaW5nLmlkKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuZXhwb3J0IGNvbnN0IHNhdmVUb1Njb3BlID0gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGJpbmRpbmcuc2NvcGUgPT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uKSB7XG4gICAgICAgIF9zYXZlVG9TaW5nbGV0b25TY29wZShiaW5kaW5nLCByZXN1bHQpO1xuICAgIH1cbiAgICBpZiAoYmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0KSB7XG4gICAgICAgIF9zYXZlVG9SZXF1ZXN0U2NvcGUocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXN1bHQpO1xuICAgIH1cbn07XG5jb25zdCBfc2F2ZVRvUmVxdWVzdFNjb3BlID0gKHJlcXVlc3RTY29wZSwgYmluZGluZywgcmVzdWx0KSA9PiB7XG4gICAgaWYgKCFyZXF1ZXN0U2NvcGUuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgIHJlcXVlc3RTY29wZS5zZXQoYmluZGluZy5pZCwgcmVzdWx0KTtcbiAgICB9XG59O1xuY29uc3QgX3NhdmVUb1NpbmdsZXRvblNjb3BlID0gKGJpbmRpbmcsIHJlc3VsdCkgPT4ge1xuICAgIGJpbmRpbmcuY2FjaGUgPSByZXN1bHQ7XG4gICAgYmluZGluZy5hY3RpdmF0ZWQgPSB0cnVlO1xuICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICB2b2lkIF9zYXZlQXN5bmNSZXN1bHRUb1NpbmdsZXRvblNjb3BlKGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgfVxufTtcbmNvbnN0IF9zYXZlQXN5bmNSZXN1bHRUb1NpbmdsZXRvblNjb3BlID0gYXN5bmMgKGJpbmRpbmcsIGFzeW5jUmVzdWx0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXN5bmNSZXN1bHQ7XG4gICAgICAgIGJpbmRpbmcuY2FjaGUgPSByZXN1bHQ7XG4gICAgfVxuICAgIGNhdGNoIChleCkge1xuICAgICAgICBiaW5kaW5nLmNhY2hlID0gbnVsbDtcbiAgICAgICAgYmluZGluZy5hY3RpdmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgZXg7XG4gICAgfVxufTtcbiIsImV4cG9ydCB2YXIgRmFjdG9yeVR5cGU7XG4oZnVuY3Rpb24gKEZhY3RvcnlUeXBlKSB7XG4gICAgRmFjdG9yeVR5cGVbXCJEeW5hbWljVmFsdWVcIl0gPSBcInRvRHluYW1pY1ZhbHVlXCI7XG4gICAgRmFjdG9yeVR5cGVbXCJGYWN0b3J5XCJdID0gXCJ0b0ZhY3RvcnlcIjtcbiAgICBGYWN0b3J5VHlwZVtcIlByb3ZpZGVyXCJdID0gXCJ0b1Byb3ZpZGVyXCI7XG59KShGYWN0b3J5VHlwZSB8fCAoRmFjdG9yeVR5cGUgPSB7fSkpO1xuIiwiaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBCaW5kaW5nVHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgeyBGYWN0b3J5VHlwZSB9IGZyb20gJy4vZmFjdG9yeV90eXBlJztcbmV4cG9ydCBjb25zdCBtdWx0aUJpbmRUb1NlcnZpY2UgPSAoY29udGFpbmVyKSA9PiAoc2VydmljZSkgPT4gKC4uLnR5cGVzKSA9PiB7XG4gICAgdHlwZXMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICBjb250YWluZXIuYmluZCh0KS50b1NlcnZpY2Uoc2VydmljZSk7XG4gICAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IGVuc3VyZUZ1bGx5Qm91bmQgPSAoYmluZGluZykgPT4ge1xuICAgIGxldCBib3VuZFZhbHVlID0gbnVsbDtcbiAgICBzd2l0Y2ggKGJpbmRpbmcudHlwZSkge1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Db25zdGFudFZhbHVlOlxuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GdW5jdGlvbjpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLmNhY2hlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yOlxuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5JbnN0YW5jZTpcbiAgICAgICAgICAgIGJvdW5kVmFsdWUgPSBiaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU6XG4gICAgICAgICAgICBib3VuZFZhbHVlID0gYmluZGluZy5keW5hbWljVmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uUHJvdmlkZXI6XG4gICAgICAgICAgICBib3VuZFZhbHVlID0gYmluZGluZy5wcm92aWRlcjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5OlxuICAgICAgICAgICAgYm91bmRWYWx1ZSA9IGJpbmRpbmcuZmFjdG9yeTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoYm91bmRWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nID0gZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VSUk9SX01TR1MuSU5WQUxJRF9CSU5ESU5HX1RZUEV9ICR7c2VydmljZUlkZW50aWZpZXJBc1N0cmluZ31gKTtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldEZhY3RvcnlEZXRhaWxzID0gKGJpbmRpbmcpID0+IHtcbiAgICBzd2l0Y2ggKGJpbmRpbmcudHlwZSkge1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5GYWN0b3J5OlxuICAgICAgICAgICAgcmV0dXJuIHsgZmFjdG9yeTogYmluZGluZy5mYWN0b3J5LCBmYWN0b3J5VHlwZTogRmFjdG9yeVR5cGUuRmFjdG9yeSB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5Qcm92aWRlcjpcbiAgICAgICAgICAgIHJldHVybiB7IGZhY3Rvcnk6IGJpbmRpbmcucHJvdmlkZXIsIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5Qcm92aWRlciB9O1xuICAgICAgICBjYXNlIEJpbmRpbmdUeXBlRW51bS5EeW5hbWljVmFsdWU6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZhY3Rvcnk6IGJpbmRpbmcuZHluYW1pY1ZhbHVlLFxuICAgICAgICAgICAgICAgIGZhY3RvcnlUeXBlOiBGYWN0b3J5VHlwZS5EeW5hbWljVmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGZhY3RvcnkgdHlwZSAke2JpbmRpbmcudHlwZX1gKTtcbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgT05fREVBQ1RJVkFUSU9OX0VSUk9SLCBQT1NUX0NPTlNUUlVDVF9FUlJPUiwgUFJFX0RFU1RST1lfRVJST1IsIH0gZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1Njb3BlRW51bSwgVGFyZ2V0VHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlLCBpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSB9IGZyb20gJy4uL3V0aWxzL2FzeW5jJztcbmZ1bmN0aW9uIF9yZXNvbHZlUmVxdWVzdHMoY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpIHtcbiAgICByZXR1cm4gY2hpbGRSZXF1ZXN0cy5yZWR1Y2UoKHJlc29sdmVkUmVxdWVzdHMsIGNoaWxkUmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBpbmplY3Rpb24gPSByZXNvbHZlUmVxdWVzdChjaGlsZFJlcXVlc3QpO1xuICAgICAgICBjb25zdCB0YXJnZXRUeXBlID0gY2hpbGRSZXF1ZXN0LnRhcmdldC50eXBlO1xuICAgICAgICBpZiAodGFyZ2V0VHlwZSA9PT0gVGFyZ2V0VHlwZUVudW0uQ29uc3RydWN0b3JBcmd1bWVudCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5jb25zdHJ1Y3RvckluamVjdGlvbnMucHVzaChpbmplY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5wcm9wZXJ0eVJlcXVlc3RzLnB1c2goY2hpbGRSZXF1ZXN0KTtcbiAgICAgICAgICAgIHJlc29sdmVkUmVxdWVzdHMucHJvcGVydHlJbmplY3Rpb25zLnB1c2goaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJlc29sdmVkUmVxdWVzdHMuaXNBc3luYykge1xuICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0cy5pc0FzeW5jID0gaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UoaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWRSZXF1ZXN0cztcbiAgICB9LCB7XG4gICAgICAgIGNvbnN0cnVjdG9ySW5qZWN0aW9uczogW10sXG4gICAgICAgIGlzQXN5bmM6IGZhbHNlLFxuICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnM6IFtdLFxuICAgICAgICBwcm9wZXJ0eVJlcXVlc3RzOiBbXSxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIF9jcmVhdGVJbnN0YW5jZShjb25zdHIsIGNoaWxkUmVxdWVzdHMsIHJlc29sdmVSZXF1ZXN0KSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoY2hpbGRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gX3Jlc29sdmVSZXF1ZXN0cyhjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBcmcgPSB7XG4gICAgICAgICAgICAuLi5yZXNvbHZlZCxcbiAgICAgICAgICAgIGNvbnN0cixcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmlzQXN5bmMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnNBc3luYyhjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXJnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnMoY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FyZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBjb25zdHIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlV2l0aEluamVjdGlvbnMoYXJncykge1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGFyZ3MuY29uc3RyKC4uLmFyZ3MuY29uc3RydWN0b3JJbmplY3Rpb25zKTtcbiAgICBhcmdzLnByb3BlcnR5UmVxdWVzdHMuZm9yRWFjaCgociwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSByLnRhcmdldC5pZGVudGlmaWVyO1xuICAgICAgICBjb25zdCBpbmplY3Rpb24gPSBhcmdzLnByb3BlcnR5SW5qZWN0aW9uc1tpbmRleF07XG4gICAgICAgIGlmICghci50YXJnZXQuaXNPcHRpb25hbCgpIHx8IGluamVjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpbnN0YW5jZVtwcm9wZXJ0eV0gPSBpbmplY3Rpb247XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG59XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXN5bmMoYXJncykge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9ySW5qZWN0aW9ucyA9IGF3YWl0IHBvc3NpYmx5V2FpdEluamVjdGlvbnMoYXJncy5jb25zdHJ1Y3RvckluamVjdGlvbnMpO1xuICAgIGNvbnN0IHByb3BlcnR5SW5qZWN0aW9ucyA9IGF3YWl0IHBvc3NpYmx5V2FpdEluamVjdGlvbnMoYXJncy5wcm9wZXJ0eUluamVjdGlvbnMpO1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zKHtcbiAgICAgICAgLi4uYXJncyxcbiAgICAgICAgY29uc3RydWN0b3JJbmplY3Rpb25zLFxuICAgICAgICBwcm9wZXJ0eUluamVjdGlvbnMsXG4gICAgfSk7XG59XG5hc3luYyBmdW5jdGlvbiBwb3NzaWJseVdhaXRJbmplY3Rpb25zKHBvc3NpYmxlUHJvbWlzZWluamVjdGlvbnMpIHtcbiAgICBjb25zdCBpbmplY3Rpb25zID0gW107XG4gICAgZm9yIChjb25zdCBpbmplY3Rpb24gb2YgcG9zc2libGVQcm9taXNlaW5qZWN0aW9ucykge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbmplY3Rpb24pKSB7XG4gICAgICAgICAgICBpbmplY3Rpb25zLnB1c2goUHJvbWlzZS5hbGwoaW5qZWN0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpbmplY3Rpb25zLnB1c2goaW5qZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5qZWN0aW9ucyk7XG59XG5mdW5jdGlvbiBfZ2V0SW5zdGFuY2VBZnRlclBvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpIHtcbiAgICBjb25zdCBwb3N0Q29uc3RydWN0UmVzdWx0ID0gX3Bvc3RDb25zdHJ1Y3QoY29uc3RyLCByZXN1bHQpO1xuICAgIGlmIChpc1Byb21pc2UocG9zdENvbnN0cnVjdFJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHBvc3RDb25zdHJ1Y3RSZXN1bHQudGhlbigoKSA9PiByZXN1bHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5mdW5jdGlvbiBfcG9zdENvbnN0cnVjdChjb25zdHIsIGluc3RhbmNlKSB7XG4gICAgaWYgKFJlZmxlY3QuaGFzTWV0YWRhdGEoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBjb25zdHIpKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QT1NUX0NPTlNUUlVDVCwgY29uc3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZVtkYXRhLnZhbHVlXT8uKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoUE9TVF9DT05TVFJVQ1RfRVJST1IoY29uc3RyLm5hbWUsIGUubWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuZnVuY3Rpb24gX3ZhbGlkYXRlSW5zdGFuY2VSZXNvbHV0aW9uKGJpbmRpbmcsIGNvbnN0cikge1xuICAgIGlmIChiaW5kaW5nLnNjb3BlICE9PSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbikge1xuICAgICAgICBfdGhyb3dJZkhhbmRsaW5nRGVhY3RpdmF0aW9uKGJpbmRpbmcsIGNvbnN0cik7XG4gICAgfVxufVxuZnVuY3Rpb24gX3Rocm93SWZIYW5kbGluZ0RlYWN0aXZhdGlvbihiaW5kaW5nLCBjb25zdHIpIHtcbiAgICBjb25zdCBzY29wZUVycm9yTWVzc2FnZSA9IGBDbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGluICR7YmluZGluZy5zY29wZSA9PT0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0ID8gJ3JlcXVlc3QnIDogJ3RyYW5zaWVudCd9IHNjb3BlLmA7XG4gICAgaWYgKHR5cGVvZiBiaW5kaW5nLm9uRGVhY3RpdmF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihPTl9ERUFDVElWQVRJT05fRVJST1IoY29uc3RyLm5hbWUsIHNjb3BlRXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuICAgIGlmIChSZWZsZWN0Lmhhc01ldGFkYXRhKE1FVEFEQVRBX0tFWS5QUkVfREVTVFJPWSwgY29uc3RyKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoUFJFX0RFU1RST1lfRVJST1IoY29uc3RyLm5hbWUsIHNjb3BlRXJyb3JNZXNzYWdlKSk7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUluc3RhbmNlKGJpbmRpbmcsIGNvbnN0ciwgY2hpbGRSZXF1ZXN0cywgcmVzb2x2ZVJlcXVlc3QpIHtcbiAgICBfdmFsaWRhdGVJbnN0YW5jZVJlc29sdXRpb24oYmluZGluZywgY29uc3RyKTtcbiAgICBjb25zdCByZXN1bHQgPSBfY3JlYXRlSW5zdGFuY2UoY29uc3RyLCBjaGlsZFJlcXVlc3RzLCByZXNvbHZlUmVxdWVzdCk7XG4gICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzb2x2ZWRSZXN1bHQpID0+IF9nZXRJbnN0YW5jZUFmdGVyUG9zdENvbnN0cnVjdChjb25zdHIsIHJlc29sdmVkUmVzdWx0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gX2dldEluc3RhbmNlQWZ0ZXJQb3N0Q29uc3RydWN0KGNvbnN0ciwgcmVzdWx0KTtcbiAgICB9XG59XG5leHBvcnQgeyByZXNvbHZlSW5zdGFuY2UgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1R5cGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgZ2V0QmluZGluZ0RpY3Rpb25hcnkgfSBmcm9tICcuLi9wbGFubmluZy9wbGFubmVyJztcbmltcG9ydCB7IHNhdmVUb1Njb3BlLCB0cnlHZXRGcm9tU2NvcGUgfSBmcm9tICcuLi9zY29wZS9zY29wZSc7XG5pbXBvcnQgeyBpc1Byb21pc2UgfSBmcm9tICcuLi91dGlscy9hc3luYyc7XG5pbXBvcnQgeyBlbnN1cmVGdWxseUJvdW5kLCBnZXRGYWN0b3J5RGV0YWlscyB9IGZyb20gJy4uL3V0aWxzL2JpbmRpbmdfdXRpbHMnO1xuaW1wb3J0IHsgdHJ5QW5kVGhyb3dFcnJvcklmU3RhY2tPdmVyZmxvdyB9IGZyb20gJy4uL3V0aWxzL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgcmVzb2x2ZUluc3RhbmNlIH0gZnJvbSAnLi9pbnN0YW50aWF0aW9uJztcbmNvbnN0IF9yZXNvbHZlUmVxdWVzdCA9IChyZXF1ZXN0U2NvcGUpID0+IChyZXF1ZXN0KSA9PiB7XG4gICAgcmVxdWVzdC5wYXJlbnRDb250ZXh0LnNldEN1cnJlbnRSZXF1ZXN0KHJlcXVlc3QpO1xuICAgIGNvbnN0IGJpbmRpbmdzID0gcmVxdWVzdC5iaW5kaW5ncztcbiAgICBjb25zdCBjaGlsZFJlcXVlc3RzID0gcmVxdWVzdC5jaGlsZFJlcXVlc3RzO1xuICAgIGNvbnN0IHRhcmdldElzQW5BcnJheSA9IHJlcXVlc3QudGFyZ2V0ICYmIHJlcXVlc3QudGFyZ2V0LmlzQXJyYXkoKTtcbiAgICBjb25zdCB0YXJnZXRQYXJlbnRJc05vdEFuQXJyYXkgPSAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0IHx8XG4gICAgICAgICFyZXF1ZXN0LnBhcmVudFJlcXVlc3QudGFyZ2V0IHx8XG4gICAgICAgICFyZXF1ZXN0LnRhcmdldCB8fFxuICAgICAgICAhcmVxdWVzdC5wYXJlbnRSZXF1ZXN0LnRhcmdldC5tYXRjaGVzQXJyYXkocmVxdWVzdC50YXJnZXQuc2VydmljZUlkZW50aWZpZXIpO1xuICAgIGlmICh0YXJnZXRJc0FuQXJyYXkgJiYgdGFyZ2V0UGFyZW50SXNOb3RBbkFycmF5KSB7XG4gICAgICAgIHJldHVybiBjaGlsZFJlcXVlc3RzLm1hcCgoY2hpbGRSZXF1ZXN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlUmVxdWVzdCA9IF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVSZXF1ZXN0KGNoaWxkUmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKHJlcXVlc3QudGFyZ2V0LmlzT3B0aW9uYWwoKSAmJiBiaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmluZGluZyA9IGJpbmRpbmdzWzBdO1xuICAgICAgICByZXR1cm4gX3Jlc29sdmVCaW5kaW5nKHJlcXVlc3RTY29wZSwgcmVxdWVzdCwgYmluZGluZyk7XG4gICAgfVxufTtcbmNvbnN0IF9yZXNvbHZlRmFjdG9yeUZyb21CaW5kaW5nID0gKGJpbmRpbmcsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBmYWN0b3J5RGV0YWlscyA9IGdldEZhY3RvcnlEZXRhaWxzKGJpbmRpbmcpO1xuICAgIHJldHVybiB0cnlBbmRUaHJvd0Vycm9ySWZTdGFja092ZXJmbG93KCgpID0+IGZhY3RvcnlEZXRhaWxzLmZhY3RvcnkuYmluZChiaW5kaW5nKShjb250ZXh0KSwgKCkgPT4gbmV3IEVycm9yKEVSUk9SX01TR1MuQ0lSQ1VMQVJfREVQRU5ERU5DWV9JTl9GQUNUT1JZKGZhY3RvcnlEZXRhaWxzLmZhY3RvcnlUeXBlLCBjb250ZXh0LmN1cnJlbnRSZXF1ZXN0LnNlcnZpY2VJZGVudGlmaWVyLnRvU3RyaW5nKCkpKSk7XG59O1xuY29uc3QgX2dldFJlc29sdmVkRnJvbUJpbmRpbmcgPSAocmVxdWVzdFNjb3BlLCByZXF1ZXN0LCBiaW5kaW5nKSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBjb25zdCBjaGlsZFJlcXVlc3RzID0gcmVxdWVzdC5jaGlsZFJlcXVlc3RzO1xuICAgIGVuc3VyZUZ1bGx5Qm91bmQoYmluZGluZyk7XG4gICAgc3dpdGNoIChiaW5kaW5nLnR5cGUpIHtcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uQ29uc3RhbnRWYWx1ZTpcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb246XG4gICAgICAgICAgICByZXN1bHQgPSBiaW5kaW5nLmNhY2hlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQmluZGluZ1R5cGVFbnVtLkNvbnN0cnVjdG9yOlxuICAgICAgICAgICAgcmVzdWx0ID0gYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBCaW5kaW5nVHlwZUVudW0uSW5zdGFuY2U6XG4gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlSW5zdGFuY2UoYmluZGluZywgYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUsIGNoaWxkUmVxdWVzdHMsIF9yZXNvbHZlUmVxdWVzdChyZXF1ZXN0U2NvcGUpKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmVzdWx0ID0gX3Jlc29sdmVGYWN0b3J5RnJvbUJpbmRpbmcoYmluZGluZywgcmVxdWVzdC5wYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfcmVzb2x2ZUluU2NvcGUgPSAocmVxdWVzdFNjb3BlLCBiaW5kaW5nLCByZXNvbHZlRnJvbUJpbmRpbmcpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gdHJ5R2V0RnJvbVNjb3BlKHJlcXVlc3RTY29wZSwgYmluZGluZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXN1bHQgPSByZXNvbHZlRnJvbUJpbmRpbmcoKTtcbiAgICBzYXZlVG9TY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfcmVzb2x2ZUJpbmRpbmcgPSAocmVxdWVzdFNjb3BlLCByZXF1ZXN0LCBiaW5kaW5nKSA9PiB7XG4gICAgcmV0dXJuIF9yZXNvbHZlSW5TY29wZShyZXF1ZXN0U2NvcGUsIGJpbmRpbmcsICgpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IF9nZXRSZXNvbHZlZEZyb21CaW5kaW5nKHJlcXVlc3RTY29wZSwgcmVxdWVzdCwgYmluZGluZyk7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRoZW4oKHJlc29sdmVkKSA9PiBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc29sdmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbn07XG5mdW5jdGlvbiBfb25BY3RpdmF0aW9uKHJlcXVlc3QsIGJpbmRpbmcsIHJlc29sdmVkKSB7XG4gICAgbGV0IHJlc3VsdCA9IF9iaW5kaW5nQWN0aXZhdGlvbihyZXF1ZXN0LnBhcmVudENvbnRleHQsIGJpbmRpbmcsIHJlc29sdmVkKTtcbiAgICBjb25zdCBjb250YWluZXJzSXRlcmF0b3IgPSBfZ2V0Q29udGFpbmVyc0l0ZXJhdG9yKHJlcXVlc3QucGFyZW50Q29udGV4dC5jb250YWluZXIpO1xuICAgIGxldCBjb250YWluZXI7XG4gICAgbGV0IGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgZG8ge1xuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXJzSXRlcmF0b3JSZXN1bHQudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSByZXF1ZXN0LnBhcmVudENvbnRleHQ7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyID0gcmVxdWVzdC5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgY29uc3QgYWN0aXZhdGlvbnNJdGVyYXRvciA9IF9nZXRDb250YWluZXJBY3RpdmF0aW9uc0ZvclNlcnZpY2UoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gX2FjdGl2YXRlQ29udGFpbmVyQXN5bmMoYWN0aXZhdGlvbnNJdGVyYXRvciwgY29udGV4dCwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IF9hY3RpdmF0ZUNvbnRhaW5lcihhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCA9IGNvbnRhaW5lcnNJdGVyYXRvci5uZXh0KCk7XG4gICAgfSB3aGlsZSAoY29udGFpbmVyc0l0ZXJhdG9yUmVzdWx0LmRvbmUgIT09IHRydWUgJiZcbiAgICAgICAgIWdldEJpbmRpbmdEaWN0aW9uYXJ5KGNvbnRhaW5lcikuaGFzS2V5KHJlcXVlc3Quc2VydmljZUlkZW50aWZpZXIpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgX2JpbmRpbmdBY3RpdmF0aW9uID0gKGNvbnRleHQsIGJpbmRpbmcsIHByZXZpb3VzUmVzdWx0KSA9PiB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcub25BY3RpdmF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc3VsdCA9IGJpbmRpbmcub25BY3RpdmF0aW9uKGNvbnRleHQsIHByZXZpb3VzUmVzdWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHByZXZpb3VzUmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IF9hY3RpdmF0ZUNvbnRhaW5lciA9IChhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpID0+IHtcbiAgICBsZXQgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgIHdoaWxlIChhY3RpdmF0aW9uLmRvbmUgIT09IHRydWUpIHtcbiAgICAgICAgcmVzdWx0ID0gYWN0aXZhdGlvbi52YWx1ZShjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBfYWN0aXZhdGVDb250YWluZXJBc3luYyhhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5jb25zdCBfYWN0aXZhdGVDb250YWluZXJBc3luYyA9IGFzeW5jIChhY3RpdmF0aW9uc0l0ZXJhdG9yLCBjb250ZXh0LCByZXN1bHRQcm9taXNlKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHJlc3VsdFByb21pc2U7XG4gICAgbGV0IGFjdGl2YXRpb24gPSBhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICB3aGlsZSAoYWN0aXZhdGlvbi5kb25lICE9PSB0cnVlKSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGFjdGl2YXRpb24udmFsdWUoY29udGV4dCwgcmVzdWx0KTtcbiAgICAgICAgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmNvbnN0IF9nZXRDb250YWluZXJBY3RpdmF0aW9uc0ZvclNlcnZpY2UgPSAoY29udGFpbmVyLCBzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgIGNvbnN0IGFjdGl2YXRpb25zID0gY29udGFpbmVyLl9hY3RpdmF0aW9ucztcbiAgICByZXR1cm4gYWN0aXZhdGlvbnMuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKVxuICAgICAgICA/IGFjdGl2YXRpb25zLmdldChzZXJ2aWNlSWRlbnRpZmllcikudmFsdWVzKClcbiAgICAgICAgOiBbXS52YWx1ZXMoKTtcbn07XG5jb25zdCBfZ2V0Q29udGFpbmVyc0l0ZXJhdG9yID0gKGNvbnRhaW5lcikgPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5lcnNTdGFjayA9IFtjb250YWluZXJdO1xuICAgIGxldCBwYXJlbnQgPSBjb250YWluZXIucGFyZW50O1xuICAgIHdoaWxlIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgY29udGFpbmVyc1N0YWNrLnB1c2gocGFyZW50KTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcbiAgICB9XG4gICAgY29uc3QgZ2V0TmV4dENvbnRhaW5lciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dENvbnRhaW5lciA9IGNvbnRhaW5lcnNTdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKG5leHRDb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBuZXh0Q29udGFpbmVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGNvbnRhaW5lcnNJdGVyYXRvciA9IHtcbiAgICAgICAgbmV4dDogZ2V0TmV4dENvbnRhaW5lcixcbiAgICB9O1xuICAgIHJldHVybiBjb250YWluZXJzSXRlcmF0b3I7XG59O1xuZnVuY3Rpb24gcmVzb2x2ZShjb250ZXh0KSB7XG4gICAgY29uc3QgcmVzb2x2ZVJlcXVlc3RGdW5jdGlvbiA9IF9yZXNvbHZlUmVxdWVzdChjb250ZXh0LnBsYW4ucm9vdFJlcXVlc3QucmVxdWVzdFNjb3BlKTtcbiAgICByZXR1cm4gcmVzb2x2ZVJlcXVlc3RGdW5jdGlvbihjb250ZXh0LnBsYW4ucm9vdFJlcXVlc3QpO1xufVxuZXhwb3J0IHsgcmVzb2x2ZSB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuY29uc3QgdHJhdmVyc2VBbmNlcnN0b3JzID0gKHJlcXVlc3QsIGNvbnN0cmFpbnQpID0+IHtcbiAgICBjb25zdCBwYXJlbnQgPSByZXF1ZXN0LnBhcmVudFJlcXVlc3Q7XG4gICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gY29uc3RyYWludChwYXJlbnQpID8gdHJ1ZSA6IHRyYXZlcnNlQW5jZXJzdG9ycyhwYXJlbnQsIGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCB0YWdnZWRDb25zdHJhaW50ID0gKGtleSkgPT4gKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgY29uc3RyYWludCA9IChyZXF1ZXN0KSA9PiByZXF1ZXN0ICE9PSBudWxsICYmXG4gICAgICAgIHJlcXVlc3QudGFyZ2V0ICE9PSBudWxsICYmXG4gICAgICAgIHJlcXVlc3QudGFyZ2V0Lm1hdGNoZXNUYWcoa2V5KSh2YWx1ZSk7XG4gICAgY29uc3RyYWludC5tZXRhRGF0YSA9IG5ldyBNZXRhZGF0YShrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gY29uc3RyYWludDtcbn07XG5jb25zdCBuYW1lZENvbnN0cmFpbnQgPSB0YWdnZWRDb25zdHJhaW50KE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcpO1xuY29uc3QgdHlwZUNvbnN0cmFpbnQgPSAodHlwZSkgPT4gKHJlcXVlc3QpID0+IHtcbiAgICBsZXQgYmluZGluZyA9IG51bGw7XG4gICAgaWYgKHJlcXVlc3QgIT09IG51bGwpIHtcbiAgICAgICAgYmluZGluZyA9IHJlcXVlc3QuYmluZGluZ3NbMF07XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyID09PSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSByZXF1ZXN0LmJpbmRpbmdzWzBdLmltcGxlbWVudGF0aW9uVHlwZTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IHsgdHJhdmVyc2VBbmNlcnN0b3JzLCB0YWdnZWRDb25zdHJhaW50LCBuYW1lZENvbnN0cmFpbnQsIHR5cGVDb25zdHJhaW50LCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBuYW1lZENvbnN0cmFpbnQsIHRhZ2dlZENvbnN0cmFpbnQsIHRyYXZlcnNlQW5jZXJzdG9ycywgdHlwZUNvbnN0cmFpbnQsIH0gZnJvbSAnLi9jb25zdHJhaW50X2hlbHBlcnMnO1xuY2xhc3MgQmluZGluZ1doZW5TeW50YXgge1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIHdoZW4oY29uc3RyYWludCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSBjb25zdHJhaW50O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldE5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gbmFtZWRDb25zdHJhaW50KG5hbWUpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldElzRGVmYXVsdCgpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNEZWZhdWx0ID0gcmVxdWVzdC50YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAhcmVxdWVzdC50YXJnZXQuaXNOYW1lZCgpICYmXG4gICAgICAgICAgICAgICAgIXJlcXVlc3QudGFyZ2V0LmlzVGFnZ2VkKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0SXNEZWZhdWx0O1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlblRhcmdldFRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IHRhZ2dlZENvbnN0cmFpbnQodGFnKSh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuSW5qZWN0ZWRJbnRvKHBhcmVudCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0eXBlQ29uc3RyYWludChwYXJlbnQpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuUGFyZW50TmFtZWQobmFtZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiBuYW1lZENvbnN0cmFpbnQobmFtZSkocmVxdWVzdC5wYXJlbnRSZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKHJlcXVlc3QucGFyZW50UmVxdWVzdCk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmNvbnN0cmFpbnQgPSAocmVxdWVzdCkgPT4gcmVxdWVzdCAhPT0gbnVsbCAmJiB0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdHlwZUNvbnN0cmFpbnQoYW5jZXN0b3IpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9ySXMoYW5jZXN0b3IpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdHlwZUNvbnN0cmFpbnQoYW5jZXN0b3IpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiYgdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIG5hbWVkQ29uc3RyYWludChuYW1lKSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiYgIXRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBuYW1lZENvbnN0cmFpbnQobmFtZSkpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCB0YWdnZWRDb25zdHJhaW50KHRhZykodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICF0cmF2ZXJzZUFuY2Vyc3RvcnMocmVxdWVzdCwgdGFnZ2VkQ29uc3RyYWludCh0YWcpKHZhbHVlKSk7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jb25zdHJhaW50ID0gKHJlcXVlc3QpID0+IHJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlQW5jZXJzdG9ycyhyZXF1ZXN0LCBjb25zdHJhaW50KTtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuY29uc3RyYWludCA9IChyZXF1ZXN0KSA9PiByZXF1ZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAhdHJhdmVyc2VBbmNlcnN0b3JzKHJlcXVlc3QsIGNvbnN0cmFpbnQpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdPblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9O1xuIiwiaW1wb3J0IHsgQmluZGluZ1doZW5TeW50YXggfSBmcm9tICcuL2JpbmRpbmdfd2hlbl9zeW50YXgnO1xuY2xhc3MgQmluZGluZ09uU3ludGF4IHtcbiAgICBfYmluZGluZztcbiAgICBjb25zdHJ1Y3RvcihiaW5kaW5nKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcgPSBiaW5kaW5nO1xuICAgIH1cbiAgICBvbkFjdGl2YXRpb24oaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLm9uQWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIG9uRGVhY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9IGhhbmRsZXI7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ09uU3ludGF4IH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nT25TeW50YXggfSBmcm9tICcuL2JpbmRpbmdfb25fc3ludGF4JztcbmltcG9ydCB7IEJpbmRpbmdXaGVuU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX3doZW5fc3ludGF4JztcbmNsYXNzIEJpbmRpbmdXaGVuT25TeW50YXgge1xuICAgIF9iaW5kaW5nV2hlblN5bnRheDtcbiAgICBfYmluZGluZ09uU3ludGF4O1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4ID0gbmV3IEJpbmRpbmdXaGVuU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nT25TeW50YXggPSBuZXcgQmluZGluZ09uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB3aGVuKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW4oY29uc3RyYWludCk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXROYW1lZChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0TmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXRJc0RlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuVGFyZ2V0SXNEZWZhdWx0KCk7XG4gICAgfVxuICAgIHdoZW5UYXJnZXRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9XG4gICAgd2hlbkluamVjdGVkSW50byhwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5JbmplY3RlZEludG8ocGFyZW50KTtcbiAgICB9XG4gICAgd2hlblBhcmVudE5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5QYXJlbnROYW1lZChuYW1lKTtcbiAgICB9XG4gICAgd2hlblBhcmVudFRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50VGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9yTmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3RvclRhZ2dlZCh0YWcsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JOYW1lZChuYW1lKTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KTtcbiAgICB9XG4gICAgb25BY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkFjdGl2YXRpb24oaGFuZGxlcik7XG4gICAgfVxuICAgIG9uRGVhY3RpdmF0aW9uKGhhbmRsZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdPblN5bnRheC5vbkRlYWN0aXZhdGlvbihoYW5kbGVyKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nV2hlbk9uU3ludGF4IH07XG4iLCJpbXBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtIH0gZnJvbSAnLi4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuaW1wb3J0IHsgQmluZGluZ1doZW5PblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX29uX3N5bnRheCc7XG5jbGFzcyBCaW5kaW5nSW5TeW50YXgge1xuICAgIF9iaW5kaW5nO1xuICAgIGNvbnN0cnVjdG9yKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZyA9IGJpbmRpbmc7XG4gICAgfVxuICAgIGluUmVxdWVzdFNjb3BlKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5SZXF1ZXN0O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIGluU2luZ2xldG9uU2NvcGUoKSB7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICBpblRyYW5zaWVudFNjb3BlKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZ1doZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG59XG5leHBvcnQgeyBCaW5kaW5nSW5TeW50YXggfTtcbiIsImltcG9ydCB7IEJpbmRpbmdJblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl9zeW50YXgnO1xuaW1wb3J0IHsgQmluZGluZ09uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlblN5bnRheCB9IGZyb20gJy4vYmluZGluZ193aGVuX3N5bnRheCc7XG5jbGFzcyBCaW5kaW5nSW5XaGVuT25TeW50YXgge1xuICAgIF9iaW5kaW5nSW5TeW50YXg7XG4gICAgX2JpbmRpbmdXaGVuU3ludGF4O1xuICAgIF9iaW5kaW5nT25TeW50YXg7XG4gICAgX2JpbmRpbmc7XG4gICAgY29uc3RydWN0b3IoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICAgICAgdGhpcy5fYmluZGluZ1doZW5TeW50YXggPSBuZXcgQmluZGluZ1doZW5TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdPblN5bnRheCA9IG5ldyBCaW5kaW5nT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdJblN5bnRheCA9IG5ldyBCaW5kaW5nSW5TeW50YXgoYmluZGluZyk7XG4gICAgfVxuICAgIGluUmVxdWVzdFNjb3BlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0luU3ludGF4LmluUmVxdWVzdFNjb3BlKCk7XG4gICAgfVxuICAgIGluU2luZ2xldG9uU2NvcGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nSW5TeW50YXguaW5TaW5nbGV0b25TY29wZSgpO1xuICAgIH1cbiAgICBpblRyYW5zaWVudFNjb3BlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0luU3ludGF4LmluVHJhbnNpZW50U2NvcGUoKTtcbiAgICB9XG4gICAgd2hlbihjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuKGNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0TmFtZWQobmFtZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldE5hbWVkKG5hbWUpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0SXNEZWZhdWx0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblRhcmdldElzRGVmYXVsdCgpO1xuICAgIH1cbiAgICB3aGVuVGFyZ2V0VGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5UYXJnZXRUYWdnZWQodGFnLCB2YWx1ZSk7XG4gICAgfVxuICAgIHdoZW5JbmplY3RlZEludG8ocGFyZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuSW5qZWN0ZWRJbnRvKHBhcmVudCk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnROYW1lZChuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuUGFyZW50TmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5QYXJlbnRUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlblBhcmVudFRhZ2dlZCh0YWcsIHZhbHVlKTtcbiAgICB9XG4gICAgd2hlbkFueUFuY2VzdG9ySXMoYW5jZXN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3RvcklzKGFuY2VzdG9yKTtcbiAgICB9XG4gICAgd2hlbk5vQW5jZXN0b3JJcyhhbmNlc3Rvcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbk5vQW5jZXN0b3JJcyhhbmNlc3Rvcik7XG4gICAgfVxuICAgIHdoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck5hbWVkKG5hbWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JUYWdnZWQodGFnLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ1doZW5TeW50YXgud2hlbkFueUFuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuTm9BbmNlc3Rvck5hbWVkKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yTmFtZWQobmFtZSk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5Ob0FuY2VzdG9yVGFnZ2VkKHRhZywgdmFsdWUpO1xuICAgIH1cbiAgICB3aGVuQW55QW5jZXN0b3JNYXRjaGVzKGNvbnN0cmFpbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JpbmRpbmdXaGVuU3ludGF4LndoZW5BbnlBbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCk7XG4gICAgfVxuICAgIHdoZW5Ob0FuY2VzdG9yTWF0Y2hlcyhjb25zdHJhaW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nV2hlblN5bnRheC53aGVuTm9BbmNlc3Rvck1hdGNoZXMoY29uc3RyYWludCk7XG4gICAgfVxuICAgIG9uQWN0aXZhdGlvbihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nT25TeW50YXgub25BY3RpdmF0aW9uKGhhbmRsZXIpO1xuICAgIH1cbiAgICBvbkRlYWN0aXZhdGlvbihoYW5kbGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nT25TeW50YXgub25EZWFjdGl2YXRpb24oaGFuZGxlcik7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ0luV2hlbk9uU3ludGF4IH07XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCB7IEJpbmRpbmdTY29wZUVudW0sIEJpbmRpbmdUeXBlRW51bSB9IGZyb20gJy4uL2NvbnN0YW50cy9saXRlcmFsX3R5cGVzJztcbmltcG9ydCB7IEJpbmRpbmdJbldoZW5PblN5bnRheCB9IGZyb20gJy4vYmluZGluZ19pbl93aGVuX29uX3N5bnRheCc7XG5pbXBvcnQgeyBCaW5kaW5nV2hlbk9uU3ludGF4IH0gZnJvbSAnLi9iaW5kaW5nX3doZW5fb25fc3ludGF4JztcbmNsYXNzIEJpbmRpbmdUb1N5bnRheCB7XG4gICAgX2JpbmRpbmc7XG4gICAgY29uc3RydWN0b3IoYmluZGluZykge1xuICAgICAgICB0aGlzLl9iaW5kaW5nID0gYmluZGluZztcbiAgICB9XG4gICAgdG8oY29uc3RydWN0b3IpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkluc3RhbmNlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IGNvbnN0cnVjdG9yO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdJbldoZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgdG9TZWxmKCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2JpbmRpbmcuc2VydmljZUlkZW50aWZpZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfVE9fU0VMRl9WQUxVRSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXMuX2JpbmRpbmdcbiAgICAgICAgICAgIC5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICAgICAgcmV0dXJuIHRoaXMudG8oc2VsZik7XG4gICAgfVxuICAgIHRvQ29uc3RhbnRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uQ29uc3RhbnRWYWx1ZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jYWNoZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmR5bmFtaWNWYWx1ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvRHluYW1pY1ZhbHVlKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkR5bmFtaWNWYWx1ZTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5jYWNoZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZHluYW1pY1ZhbHVlID0gZnVuYztcbiAgICAgICAgdGhpcy5fYmluZGluZy5pbXBsZW1lbnRhdGlvblR5cGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdJbldoZW5PblN5bnRheCh0aGlzLl9iaW5kaW5nKTtcbiAgICB9XG4gICAgdG9Db25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcikge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uQ29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuaW1wbGVtZW50YXRpb25UeXBlID0gY29uc3RydWN0b3I7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b0ZhY3RvcnkoZmFjdG9yeSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5mYWN0b3J5ID0gZmFjdG9yeTtcbiAgICAgICAgdGhpcy5fYmluZGluZy5zY29wZSA9IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvRnVuY3Rpb24oZnVuYykge1xuICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfRlVOQ1RJT05fQklORElORyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmluZGluZ1doZW5PblN5bnRheCA9IHRoaXMudG9Db25zdGFudFZhbHVlKGZ1bmMpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRnVuY3Rpb247XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIGJpbmRpbmdXaGVuT25TeW50YXg7XG4gICAgfVxuICAgIHRvQXV0b0ZhY3Rvcnkoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZmFjdG9yeSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhdXRvZmFjdG9yeSA9ICgpID0+IGNvbnRleHQuY29udGFpbmVyLmdldChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICByZXR1cm4gYXV0b2ZhY3Rvcnk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b0F1dG9OYW1lZEZhY3Rvcnkoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLkZhY3Rvcnk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuZmFjdG9yeSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKG5hbWVkKSA9PiBjb250ZXh0LmNvbnRhaW5lci5nZXROYW1lZChzZXJ2aWNlSWRlbnRpZmllciwgbmFtZWQpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdXaGVuT25TeW50YXgodGhpcy5fYmluZGluZyk7XG4gICAgfVxuICAgIHRvUHJvdmlkZXIocHJvdmlkZXIpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZy50eXBlID0gQmluZGluZ1R5cGVFbnVtLlByb3ZpZGVyO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgIHRoaXMuX2JpbmRpbmcuc2NvcGUgPSBCaW5kaW5nU2NvcGVFbnVtLlNpbmdsZXRvbjtcbiAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nV2hlbk9uU3ludGF4KHRoaXMuX2JpbmRpbmcpO1xuICAgIH1cbiAgICB0b1NlcnZpY2Uoc2VydmljZSkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nLnR5cGUgPSBCaW5kaW5nVHlwZUVudW0uRHluYW1pY1ZhbHVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5fYmluZGluZywgJ2NhY2hlJywge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQoX3ZhbHVlKSB7IH0sXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmR5bmFtaWNWYWx1ZSA9IChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5lci5nZXQoc2VydmljZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbmVyLmdldEFzeW5jKHNlcnZpY2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9iaW5kaW5nLmltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7XG4gICAgfVxufVxuZXhwb3J0IHsgQmluZGluZ1RvU3ludGF4IH07XG4iLCJjbGFzcyBDb250YWluZXJTbmFwc2hvdCB7XG4gICAgYmluZGluZ3M7XG4gICAgYWN0aXZhdGlvbnM7XG4gICAgZGVhY3RpdmF0aW9ucztcbiAgICBtaWRkbGV3YXJlO1xuICAgIG1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICBzdGF0aWMgb2YoYmluZGluZ3MsIG1pZGRsZXdhcmUsIGFjdGl2YXRpb25zLCBkZWFjdGl2YXRpb25zLCBtb2R1bGVBY3RpdmF0aW9uU3RvcmUpIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSBuZXcgQ29udGFpbmVyU25hcHNob3QoKTtcbiAgICAgICAgc25hcHNob3QuYmluZGluZ3MgPSBiaW5kaW5ncztcbiAgICAgICAgc25hcHNob3QubWlkZGxld2FyZSA9IG1pZGRsZXdhcmU7XG4gICAgICAgIHNuYXBzaG90LmRlYWN0aXZhdGlvbnMgPSBkZWFjdGl2YXRpb25zO1xuICAgICAgICBzbmFwc2hvdC5hY3RpdmF0aW9ucyA9IGFjdGl2YXRpb25zO1xuICAgICAgICBzbmFwc2hvdC5tb2R1bGVBY3RpdmF0aW9uU3RvcmUgPSBtb2R1bGVBY3RpdmF0aW9uU3RvcmU7XG4gICAgICAgIHJldHVybiBzbmFwc2hvdDtcbiAgICB9XG59XG5leHBvcnQgeyBDb250YWluZXJTbmFwc2hvdCB9O1xuIiwiaW1wb3J0ICogYXMgRVJST1JfTVNHUyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBpc0Nsb25hYmxlIH0gZnJvbSAnLi4vdXRpbHMvY2xvbmFibGUnO1xuY2xhc3MgTG9va3VwIHtcbiAgICBfbWFwO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIGdldE1hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcDtcbiAgICB9XG4gICAgYWRkKHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSkge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX21hcC5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuc2V0KHNlcnZpY2VJZGVudGlmaWVyLCBbdmFsdWVdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tOb25OdWxpc2goc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX21hcC5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuS0VZX05PVF9GT1VORCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrTm9uTnVsaXNoKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXAuZGVsZXRlKHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuS0VZX05PVF9GT1VORCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlSW50ZXJzZWN0aW9uKGxvb2t1cCkge1xuICAgICAgICB0aGlzLnRyYXZlcnNlKChzZXJ2aWNlSWRlbnRpZmllciwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvb2t1cEFjdGl2YXRpb25zID0gbG9va3VwLmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcilcbiAgICAgICAgICAgICAgICA/IGxvb2t1cC5nZXQoc2VydmljZUlkZW50aWZpZXIpXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAobG9va3VwQWN0aXZhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkVmFsdWVzID0gdmFsdWUuZmlsdGVyKChsb29rdXBWYWx1ZSkgPT4gIWxvb2t1cEFjdGl2YXRpb25zLnNvbWUoKG1vZHVsZUFjdGl2YXRpb24pID0+IGxvb2t1cFZhbHVlID09PSBtb2R1bGVBY3RpdmF0aW9uKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VydmljZUlkZW50aWZpZXIsIGZpbHRlcmVkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUJ5Q29uZGl0aW9uKGNvbmRpdGlvbikge1xuICAgICAgICBjb25zdCByZW1vdmFscyA9IFtdO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaCgoZW50cmllcywga2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRW50cmllcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlID0gY29uZGl0aW9uKGVudHJ5KTtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92YWxzLnB1c2goZW50cnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoa2V5LCB1cGRhdGVkRW50cmllcyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVtb3ZhbHM7XG4gICAgfVxuICAgIGhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLl9jaGVja05vbk51bGlzaChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNvcHkgPSBuZXcgTG9va3VwKCk7XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgICAgICAgICAgY29weS5hZGQoa2V5LCBpc0Nsb25hYmxlKGIpID8gYi5jbG9uZSgpIDogYik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb3B5O1xuICAgIH1cbiAgICB0cmF2ZXJzZShmdW5jKSB7XG4gICAgICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICBmdW5jKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2NoZWNrTm9uTnVsaXNoKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5OVUxMX0FSR1VNRU5UKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfc2V0VmFsdWUoc2VydmljZUlkZW50aWZpZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuc2V0KHNlcnZpY2VJZGVudGlmaWVyLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCB7IExvb2t1cCB9O1xuIiwiZnVuY3Rpb24gaXNDbG9uYWJsZShvYmopIHtcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmXG4gICAgICAgIG9iaiAhPT0gbnVsbCAmJlxuICAgICAgICAnY2xvbmUnIGluIG9iaiAmJlxuICAgICAgICB0eXBlb2Ygb2JqLmNsb25lID09PSAnZnVuY3Rpb24nKTtcbn1cbmV4cG9ydCB7IGlzQ2xvbmFibGUgfTtcbiIsImltcG9ydCB7IExvb2t1cCB9IGZyb20gJy4vbG9va3VwJztcbmV4cG9ydCBjbGFzcyBNb2R1bGVBY3RpdmF0aW9uU3RvcmUge1xuICAgIF9tYXAgPSBuZXcgTWFwKCk7XG4gICAgcmVtb3ZlKG1vZHVsZUlkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fbWFwLmdldChtb2R1bGVJZCk7XG4gICAgICAgIGlmIChoYW5kbGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW1wdHlIYW5kbGVyc1N0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShtb2R1bGVJZCk7XG4gICAgICAgIHJldHVybiBoYW5kbGVycztcbiAgICB9XG4gICAgYWRkRGVhY3RpdmF0aW9uKG1vZHVsZUlkLCBzZXJ2aWNlSWRlbnRpZmllciwgb25EZWFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKG1vZHVsZUlkKS5vbkRlYWN0aXZhdGlvbnMuYWRkKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbik7XG4gICAgfVxuICAgIGFkZEFjdGl2YXRpb24obW9kdWxlSWQsIHNlcnZpY2VJZGVudGlmaWVyLCBvbkFjdGl2YXRpb24pIHtcbiAgICAgICAgdGhpcy5fZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKG1vZHVsZUlkKS5vbkFjdGl2YXRpb25zLmFkZChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIGNvbnN0IGNsb25lID0gbmV3IE1vZHVsZUFjdGl2YXRpb25TdG9yZSgpO1xuICAgICAgICB0aGlzLl9tYXAuZm9yRWFjaCgoaGFuZGxlcnNTdG9yZSwgbW9kdWxlSWQpID0+IHtcbiAgICAgICAgICAgIGNsb25lLl9tYXAuc2V0KG1vZHVsZUlkLCB7XG4gICAgICAgICAgICAgICAgb25BY3RpdmF0aW9uczogaGFuZGxlcnNTdG9yZS5vbkFjdGl2YXRpb25zLmNsb25lKCksXG4gICAgICAgICAgICAgICAgb25EZWFjdGl2YXRpb25zOiBoYW5kbGVyc1N0b3JlLm9uRGVhY3RpdmF0aW9ucy5jbG9uZSgpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIF9nZXRNb2R1bGVBY3RpdmF0aW9uSGFuZGxlcnMobW9kdWxlSWQpIHtcbiAgICAgICAgbGV0IG1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyA9IHRoaXMuX21hcC5nZXQobW9kdWxlSWQpO1xuICAgICAgICBpZiAobW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vZHVsZUFjdGl2YXRpb25IYW5kbGVycyA9IHRoaXMuX2dldEVtcHR5SGFuZGxlcnNTdG9yZSgpO1xuICAgICAgICAgICAgdGhpcy5fbWFwLnNldChtb2R1bGVJZCwgbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzO1xuICAgIH1cbiAgICBfZ2V0RW1wdHlIYW5kbGVyc1N0b3JlKCkge1xuICAgICAgICBjb25zdCBoYW5kbGVyc1N0b3JlID0ge1xuICAgICAgICAgICAgb25BY3RpdmF0aW9uczogbmV3IExvb2t1cCgpLFxuICAgICAgICAgICAgb25EZWFjdGl2YXRpb25zOiBuZXcgTG9va3VwKCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1N0b3JlO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IEJpbmRpbmcgfSBmcm9tICcuLi9iaW5kaW5ncy9iaW5kaW5nJztcbmltcG9ydCAqIGFzIEVSUk9SX01TR1MgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX21zZ3MnO1xuaW1wb3J0IHsgQmluZGluZ1Njb3BlRW51bSwgVGFyZ2V0VHlwZUVudW0gfSBmcm9tICcuLi9jb25zdGFudHMvbGl0ZXJhbF90eXBlcyc7XG5pbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgTWV0YWRhdGFSZWFkZXIgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YV9yZWFkZXInO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1JlcXVlc3QsIGdldEJpbmRpbmdEaWN0aW9uYXJ5LCBwbGFuLCB9IGZyb20gJy4uL3BsYW5uaW5nL3BsYW5uZXInO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJy4uL3Jlc29sdXRpb24vcmVzb2x2ZXInO1xuaW1wb3J0IHsgQmluZGluZ1RvU3ludGF4IH0gZnJvbSAnLi4vc3ludGF4L2JpbmRpbmdfdG9fc3ludGF4JztcbmltcG9ydCB7IGlzUHJvbWlzZSwgaXNQcm9taXNlT3JDb250YWluc1Byb21pc2UgfSBmcm9tICcuLi91dGlscy9hc3luYyc7XG5pbXBvcnQgeyBpZCB9IGZyb20gJy4uL3V0aWxzL2lkJztcbmltcG9ydCB7IGdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmcgfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7IENvbnRhaW5lclNuYXBzaG90IH0gZnJvbSAnLi9jb250YWluZXJfc25hcHNob3QnO1xuaW1wb3J0IHsgTG9va3VwIH0gZnJvbSAnLi9sb29rdXAnO1xuaW1wb3J0IHsgTW9kdWxlQWN0aXZhdGlvblN0b3JlIH0gZnJvbSAnLi9tb2R1bGVfYWN0aXZhdGlvbl9zdG9yZSc7XG5jbGFzcyBDb250YWluZXIge1xuICAgIGlkO1xuICAgIHBhcmVudDtcbiAgICBvcHRpb25zO1xuICAgIF9taWRkbGV3YXJlO1xuICAgIF9iaW5kaW5nRGljdGlvbmFyeTtcbiAgICBfYWN0aXZhdGlvbnM7XG4gICAgX2RlYWN0aXZhdGlvbnM7XG4gICAgX3NuYXBzaG90cztcbiAgICBfbWV0YWRhdGFSZWFkZXI7XG4gICAgX21vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICBjb25zdHJ1Y3Rvcihjb250YWluZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb250YWluZXJPcHRpb25zIHx8IHt9O1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19NVVNUX0JFX0FOX09CSkVDVCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdFNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdFNjb3BlID0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5kZWZhdWx0U2NvcGUgIT09IEJpbmRpbmdTY29wZUVudW0uU2luZ2xldG9uICYmXG4gICAgICAgICAgICBvcHRpb25zLmRlZmF1bHRTY29wZSAhPT0gQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQgJiZcbiAgICAgICAgICAgIG9wdGlvbnMuZGVmYXVsdFNjb3BlICE9PSBCaW5kaW5nU2NvcGVFbnVtLlJlcXVlc3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfREVGQVVMVF9TQ09QRSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuYXV0b0JpbmRJbmplY3RhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkNPTlRBSU5FUl9PUFRJT05TX0lOVkFMSURfQVVUT19CSU5EX0lOSkVDVEFCTEUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucy5za2lwQmFzZUNsYXNzQ2hlY2tzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuc2tpcEJhc2VDbGFzc0NoZWNrcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5DT05UQUlORVJfT1BUSU9OU19JTlZBTElEX1NLSVBfQkFTRV9DSEVDSyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAgICAgYXV0b0JpbmRJbmplY3RhYmxlOiBvcHRpb25zLmF1dG9CaW5kSW5qZWN0YWJsZSxcbiAgICAgICAgICAgIGRlZmF1bHRTY29wZTogb3B0aW9ucy5kZWZhdWx0U2NvcGUsXG4gICAgICAgICAgICBza2lwQmFzZUNsYXNzQ2hlY2tzOiBvcHRpb25zLnNraXBCYXNlQ2xhc3NDaGVja3MsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuaWQgPSBpZCgpO1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5fc25hcHNob3RzID0gW107XG4gICAgICAgIHRoaXMuX21pZGRsZXdhcmUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9ucyA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5fZGVhY3RpdmF0aW9ucyA9IG5ldyBMb29rdXAoKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsO1xuICAgICAgICB0aGlzLl9tZXRhZGF0YVJlYWRlciA9IG5ldyBNZXRhZGF0YVJlYWRlcigpO1xuICAgICAgICB0aGlzLl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUgPSBuZXcgTW9kdWxlQWN0aXZhdGlvblN0b3JlKCk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZShjb250YWluZXIxLCBjb250YWluZXIyLCAuLi5jb250YWluZXJzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBDb250YWluZXIoKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGFpbmVycyA9IFtcbiAgICAgICAgICAgIGNvbnRhaW5lcjEsXG4gICAgICAgICAgICBjb250YWluZXIyLFxuICAgICAgICAgICAgLi4uY29udGFpbmVycyxcbiAgICAgICAgXS5tYXAoKHRhcmdldENvbnRhaW5lcikgPT4gZ2V0QmluZGluZ0RpY3Rpb25hcnkodGFyZ2V0Q29udGFpbmVyKSk7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdEaWN0aW9uYXJ5ID0gZ2V0QmluZGluZ0RpY3Rpb25hcnkoY29udGFpbmVyKTtcbiAgICAgICAgZnVuY3Rpb24gY29weURpY3Rpb25hcnkob3JpZ2luLCBkZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgb3JpZ2luLnRyYXZlcnNlKChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKGJpbmRpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcuY2xvbmUoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRDb250YWluZXJzLmZvckVhY2goKHRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5KSA9PiB7XG4gICAgICAgICAgICBjb3B5RGljdGlvbmFyeSh0YXJnZXRCaW5kaW5nRGljdGlvbmFyeSwgYmluZGluZ0RpY3Rpb25hcnkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjtcbiAgICB9XG4gICAgbG9hZCguLi5tb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IGdldEhlbHBlcnMgPSB0aGlzLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRNb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICBjdXJyZW50TW9kdWxlLnJlZ2lzdHJ5KGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnVuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLmlzYm91bmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5yZWJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRBc3luY0Z1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uQWN0aXZhdGlvbkZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uRGVhY3RpdmF0aW9uRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGxvYWRBc3luYyguLi5tb2R1bGVzKSB7XG4gICAgICAgIGNvbnN0IGdldEhlbHBlcnMgPSB0aGlzLl9nZXRDb250YWluZXJNb2R1bGVIZWxwZXJzRmFjdG9yeSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRNb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyTW9kdWxlSGVscGVycyA9IGdldEhlbHBlcnMoY3VycmVudE1vZHVsZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCBjdXJyZW50TW9kdWxlLnJlZ2lzdHJ5KGNvbnRhaW5lck1vZHVsZUhlbHBlcnMuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLnVuYmluZEZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLmlzYm91bmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy5yZWJpbmRGdW5jdGlvbiwgY29udGFpbmVyTW9kdWxlSGVscGVycy51bmJpbmRBc3luY0Z1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uQWN0aXZhdGlvbkZ1bmN0aW9uLCBjb250YWluZXJNb2R1bGVIZWxwZXJzLm9uRGVhY3RpdmF0aW9uRnVuY3Rpb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHVubG9hZCguLi5tb2R1bGVzKSB7XG4gICAgICAgIG1vZHVsZXMuZm9yRWFjaCgobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZWFjdGl2YXRpb25zID0gdGhpcy5fcmVtb3ZlTW9kdWxlQmluZGluZ3MobW9kdWxlLmlkKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKGRlYWN0aXZhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTW9kdWxlSGFuZGxlcnMobW9kdWxlLmlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHVubG9hZEFzeW5jKC4uLm1vZHVsZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgZGVhY3RpdmF0aW9ucyA9IHRoaXMuX3JlbW92ZU1vZHVsZUJpbmRpbmdzKG1vZHVsZS5pZCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWFjdGl2YXRlU2luZ2xldG9uc0FzeW5jKGRlYWN0aXZhdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTW9kdWxlSGFuZGxlcnMobW9kdWxlLmlkKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBiaW5kKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kKHRoaXMuX2J1aWxkQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllcikpO1xuICAgIH1cbiAgICByZWJpbmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdGhpcy51bmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5iaW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgYXN5bmMgcmViaW5kQXN5bmMoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy51bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICB1bmJpbmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKGJpbmRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZW1vdmVTZXJ2aWNlRnJvbURpY3Rpb25hcnkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBhc3luYyB1bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBpZiAodGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5nZXQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyhiaW5kaW5ncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICB9XG4gICAgdW5iaW5kQWxsKCkge1xuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS50cmF2ZXJzZSgoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5ID0gbmV3IExvb2t1cCgpO1xuICAgIH1cbiAgICBhc3luYyB1bmJpbmRBbGxBc3luYygpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkudHJhdmVyc2UoKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2RlYWN0aXZhdGVTaW5nbGV0b25zQXN5bmModmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkgPSBuZXcgTG9va3VwKCk7XG4gICAgfVxuICAgIG9uQWN0aXZhdGlvbihzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25zLmFkZChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICB9XG4gICAgb25EZWFjdGl2YXRpb24oc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2RlYWN0aXZhdGlvbnMuYWRkKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbik7XG4gICAgfVxuICAgIGlzQm91bmQoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgbGV0IGJvdW5kID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuaGFzS2V5KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKCFib3VuZCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYm91bmQgPSB0aGlzLnBhcmVudC5pc0JvdW5kKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgfVxuICAgIGlzQ3VycmVudEJvdW5kKHNlcnZpY2VJZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5oYXNLZXkoc2VydmljZUlkZW50aWZpZXIpO1xuICAgIH1cbiAgICBpc0JvdW5kTmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzQm91bmRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWVkKTtcbiAgICB9XG4gICAgaXNCb3VuZFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICBsZXQgYm91bmQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2JpbmRpbmdEaWN0aW9uYXJ5Lmhhc0tleShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuZ2V0KHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBjcmVhdGVNb2NrUmVxdWVzdCh0aGlzLCBzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBib3VuZCA9IGJpbmRpbmdzLnNvbWUoKGIpID0+IGIuY29uc3RyYWludChyZXF1ZXN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFib3VuZCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYm91bmQgPSB0aGlzLnBhcmVudC5pc0JvdW5kVGFnZ2VkKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgfVxuICAgIHNuYXBzaG90KCkge1xuICAgICAgICB0aGlzLl9zbmFwc2hvdHMucHVzaChDb250YWluZXJTbmFwc2hvdC5vZih0aGlzLl9iaW5kaW5nRGljdGlvbmFyeS5jbG9uZSgpLCB0aGlzLl9taWRkbGV3YXJlLCB0aGlzLl9hY3RpdmF0aW9ucy5jbG9uZSgpLCB0aGlzLl9kZWFjdGl2YXRpb25zLmNsb25lKCksIHRoaXMuX21vZHVsZUFjdGl2YXRpb25TdG9yZS5jbG9uZSgpKSk7XG4gICAgfVxuICAgIHJlc3RvcmUoKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5fc25hcHNob3RzLnBvcCgpO1xuICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX01TR1MuTk9fTU9SRV9TTkFQU0hPVFNfQVZBSUxBQkxFKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9iaW5kaW5nRGljdGlvbmFyeSA9IHNuYXBzaG90LmJpbmRpbmdzO1xuICAgICAgICB0aGlzLl9hY3RpdmF0aW9ucyA9IHNuYXBzaG90LmFjdGl2YXRpb25zO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zID0gc25hcHNob3QuZGVhY3RpdmF0aW9ucztcbiAgICAgICAgdGhpcy5fbWlkZGxld2FyZSA9IHNuYXBzaG90Lm1pZGRsZXdhcmU7XG4gICAgICAgIHRoaXMuX21vZHVsZUFjdGl2YXRpb25TdG9yZSA9IHNuYXBzaG90Lm1vZHVsZUFjdGl2YXRpb25TdG9yZTtcbiAgICB9XG4gICAgY3JlYXRlQ2hpbGQoY29udGFpbmVyT3B0aW9ucykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IG5ldyBDb250YWluZXIoY29udGFpbmVyT3B0aW9ucyB8fCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgfVxuICAgIGFwcGx5TWlkZGxld2FyZSguLi5taWRkbGV3YXJlcykge1xuICAgICAgICBjb25zdCBpbml0aWFsID0gdGhpcy5fbWlkZGxld2FyZVxuICAgICAgICAgICAgPyB0aGlzLl9taWRkbGV3YXJlXG4gICAgICAgICAgICA6IHRoaXMuX3BsYW5BbmRSZXNvbHZlKCk7XG4gICAgICAgIHRoaXMuX21pZGRsZXdhcmUgPSBtaWRkbGV3YXJlcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IGN1cnIocHJldiksIGluaXRpYWwpO1xuICAgIH1cbiAgICBhcHBseUN1c3RvbU1ldGFkYXRhUmVhZGVyKG1ldGFkYXRhUmVhZGVyKSB7XG4gICAgICAgIHRoaXMuX21ldGFkYXRhUmVhZGVyID0gbWV0YWRhdGFSZWFkZXI7XG4gICAgfVxuICAgIGdldChzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnV0VGhyb3dJZkFzeW5jKGdldEFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0KGdldEFyZ3MpO1xuICAgIH1cbiAgICBnZXRUYWdnZWQoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldE5vdEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIsIGZhbHNlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ1dFRocm93SWZBc3luYyhnZXRBcmdzKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0VGFnZ2VkQXN5bmMoc2VydmljZUlkZW50aWZpZXIsIGtleSwgdmFsdWUpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldE5vdEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIsIGZhbHNlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldChnZXRBcmdzKTtcbiAgICB9XG4gICAgZ2V0TmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBhc3luYyBnZXROYW1lZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUYWdnZWRBc3luYyhzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBnZXRBbGwoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgZ2V0QXJncyA9IHRoaXMuX2dldEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnV0VGhyb3dJZkFzeW5jKGdldEFyZ3MpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBbGxBc3luYyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRBbGwoZ2V0QXJncyk7XG4gICAgfVxuICAgIGdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBnZXRBcmdzID0gdGhpcy5fZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgdHJ1ZSwga2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCdXRUaHJvd0lmQXN5bmMoZ2V0QXJncyk7XG4gICAgfVxuICAgIGFzeW5jIGdldEFsbFRhZ2dlZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGdldEFyZ3MgPSB0aGlzLl9nZXROb3RBbGxBcmdzKHNlcnZpY2VJZGVudGlmaWVyLCB0cnVlLCBrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEFsbChnZXRBcmdzKTtcbiAgICB9XG4gICAgZ2V0QWxsTmFtZWQoc2VydmljZUlkZW50aWZpZXIsIG5hbWVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFsbFRhZ2dlZChzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICBhc3luYyBnZXRBbGxOYW1lZEFzeW5jKHNlcnZpY2VJZGVudGlmaWVyLCBuYW1lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGxUYWdnZWRBc3luYyhzZXJ2aWNlSWRlbnRpZmllciwgTUVUQURBVEFfS0VZLk5BTUVEX1RBRywgbmFtZWQpO1xuICAgIH1cbiAgICByZXNvbHZlKGNvbnN0cnVjdG9yRnVuY3Rpb24pIHtcbiAgICAgICAgY29uc3QgaXNCb3VuZCA9IHRoaXMuaXNCb3VuZChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmQoY29uc3RydWN0b3JGdW5jdGlvbikudG9TZWxmKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0aGlzLmdldChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgaWYgKCFpc0JvdW5kKSB7XG4gICAgICAgICAgICB0aGlzLnVuYmluZChjb25zdHJ1Y3RvckZ1bmN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgfVxuICAgIF9wcmVEZXN0cm95KGNvbnN0cnVjdG9yLCBpbnN0YW5jZSkge1xuICAgICAgICBpZiAoY29uc3RydWN0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgUmVmbGVjdC5oYXNNZXRhZGF0YShNRVRBREFUQV9LRVkuUFJFX0RFU1RST1ksIGNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VbZGF0YS52YWx1ZV0/LigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9yZW1vdmVNb2R1bGVIYW5kbGVycyhtb2R1bGVJZCkge1xuICAgICAgICBjb25zdCBtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzID0gdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLnJlbW92ZShtb2R1bGVJZCk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uQWN0aXZhdGlvbnMpO1xuICAgICAgICB0aGlzLl9kZWFjdGl2YXRpb25zLnJlbW92ZUludGVyc2VjdGlvbihtb2R1bGVBY3RpdmF0aW9uc0hhbmRsZXJzLm9uRGVhY3RpdmF0aW9ucyk7XG4gICAgfVxuICAgIF9yZW1vdmVNb2R1bGVCaW5kaW5ncyhtb2R1bGVJZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlQnlDb25kaXRpb24oKGJpbmRpbmcpID0+IGJpbmRpbmcubW9kdWxlSWQgPT09IG1vZHVsZUlkKTtcbiAgICB9XG4gICAgX2RlYWN0aXZhdGUoYmluZGluZywgaW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSBpbnN0YW5jZSA9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGluc3RhbmNlKS5jb25zdHJ1Y3RvcjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWFjdGl2YXRpb25zLmhhc0tleShiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlYWN0aXZhdGVDb250YWluZXIoaW5zdGFuY2UsIHRoaXMuX2RlYWN0aXZhdGlvbnMuZ2V0KGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIpLnZhbHVlcygpKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZURlYWN0aXZhdGlvbkVycm9yKHJlc3VsdC50aGVuKGFzeW5jICgpID0+IHRoaXMuX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveUFzeW5jKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3RvcikpLCBiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQgPSB0aGlzLl9wcm9wYWdhdGVDb250YWluZXJEZWFjdGl2YXRpb25UaGVuQmluZGluZ0FuZFByZURlc3Ryb3koYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocHJvcGFnYXRlRGVhY3RpdmF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVEZWFjdGl2YXRpb25FcnJvcihwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQsIGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5PTl9ERUFDVElWQVRJT05fRVJST1IoZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhiaW5kaW5nLnNlcnZpY2VJZGVudGlmaWVyKSwgZXgubWVzc2FnZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIF9oYW5kbGVEZWFjdGl2YXRpb25FcnJvcihhc3luY1Jlc3VsdCwgc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGFzeW5jUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5PTl9ERUFDVElWQVRJT05fRVJST1IoZ2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllciksIGV4Lm1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBfZGVhY3RpdmF0ZUNvbnRhaW5lcihpbnN0YW5jZSwgZGVhY3RpdmF0aW9uc0l0ZXJhdG9yKSB7XG4gICAgICAgIGxldCBkZWFjdGl2YXRpb24gPSBkZWFjdGl2YXRpb25zSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB3aGlsZSAodHlwZW9mIGRlYWN0aXZhdGlvbi52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVhY3RpdmF0aW9uLnZhbHVlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbihhc3luYyAoKSA9PiB0aGlzLl9kZWFjdGl2YXRlQ29udGFpbmVyQXN5bmMoaW5zdGFuY2UsIGRlYWN0aXZhdGlvbnNJdGVyYXRvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfZGVhY3RpdmF0ZUNvbnRhaW5lckFzeW5jKGluc3RhbmNlLCBkZWFjdGl2YXRpb25zSXRlcmF0b3IpIHtcbiAgICAgICAgbGV0IGRlYWN0aXZhdGlvbiA9IGRlYWN0aXZhdGlvbnNJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHdoaWxlICh0eXBlb2YgZGVhY3RpdmF0aW9uLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWFjdGl2YXRpb24udmFsdWUoaW5zdGFuY2UpO1xuICAgICAgICAgICAgZGVhY3RpdmF0aW9uID0gZGVhY3RpdmF0aW9uc0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkoKSB7XG4gICAgICAgIGNvbnN0IGdldEJpbmRGdW5jdGlvbiA9IChtb2R1bGVJZCkgPT4gKHNlcnZpY2VJZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5kaW5nID0gdGhpcy5fYnVpbGRCaW5kaW5nKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgICAgIGJpbmRpbmcubW9kdWxlSWQgPSBtb2R1bGVJZDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaW5kKGJpbmRpbmcpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRVbmJpbmRGdW5jdGlvbiA9ICgpID0+IChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgdGhpcy51bmJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBnZXRVbmJpbmRBc3luY0Z1bmN0aW9uID0gKCkgPT4gYXN5bmMgKHNlcnZpY2VJZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51bmJpbmRBc3luYyhzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdldElzYm91bmRGdW5jdGlvbiA9ICgpID0+IChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNCb3VuZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGdldFJlYmluZEZ1bmN0aW9uID0gKG1vZHVsZUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiaW5kID0gZ2V0QmluZEZ1bmN0aW9uKG1vZHVsZUlkKTtcbiAgICAgICAgICAgIHJldHVybiAoc2VydmljZUlkZW50aWZpZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuYmluZChzZXJ2aWNlSWRlbnRpZmllcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJpbmQoc2VydmljZUlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0T25BY3RpdmF0aW9uRnVuY3Rpb24gPSAobW9kdWxlSWQpID0+IChzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tb2R1bGVBY3RpdmF0aW9uU3RvcmUuYWRkQWN0aXZhdGlvbihtb2R1bGVJZCwgc2VydmljZUlkZW50aWZpZXIsIG9uQWN0aXZhdGlvbik7XG4gICAgICAgICAgICB0aGlzLm9uQWN0aXZhdGlvbihzZXJ2aWNlSWRlbnRpZmllciwgb25BY3RpdmF0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZ2V0T25EZWFjdGl2YXRpb25GdW5jdGlvbiA9IChtb2R1bGVJZCkgPT4gKHNlcnZpY2VJZGVudGlmaWVyLCBvbkRlYWN0aXZhdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbW9kdWxlQWN0aXZhdGlvblN0b3JlLmFkZERlYWN0aXZhdGlvbihtb2R1bGVJZCwgc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMub25EZWFjdGl2YXRpb24oc2VydmljZUlkZW50aWZpZXIsIG9uRGVhY3RpdmF0aW9uKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIChtSWQpID0+ICh7XG4gICAgICAgICAgICBiaW5kRnVuY3Rpb246IGdldEJpbmRGdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgaXNib3VuZEZ1bmN0aW9uOiBnZXRJc2JvdW5kRnVuY3Rpb24oKSxcbiAgICAgICAgICAgIG9uQWN0aXZhdGlvbkZ1bmN0aW9uOiBnZXRPbkFjdGl2YXRpb25GdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgb25EZWFjdGl2YXRpb25GdW5jdGlvbjogZ2V0T25EZWFjdGl2YXRpb25GdW5jdGlvbihtSWQpLFxuICAgICAgICAgICAgcmViaW5kRnVuY3Rpb246IGdldFJlYmluZEZ1bmN0aW9uKG1JZCksXG4gICAgICAgICAgICB1bmJpbmRBc3luY0Z1bmN0aW9uOiBnZXRVbmJpbmRBc3luY0Z1bmN0aW9uKCksXG4gICAgICAgICAgICB1bmJpbmRGdW5jdGlvbjogZ2V0VW5iaW5kRnVuY3Rpb24oKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9iaW5kKGJpbmRpbmcpIHtcbiAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkuYWRkKGJpbmRpbmcuc2VydmljZUlkZW50aWZpZXIsIGJpbmRpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IEJpbmRpbmdUb1N5bnRheChiaW5kaW5nKTtcbiAgICB9XG4gICAgX2J1aWxkQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICBjb25zdCBzY29wZSA9IHRoaXMub3B0aW9ucy5kZWZhdWx0U2NvcGUgfHwgQmluZGluZ1Njb3BlRW51bS5UcmFuc2llbnQ7XG4gICAgICAgIHJldHVybiBuZXcgQmluZGluZyhzZXJ2aWNlSWRlbnRpZmllciwgc2NvcGUpO1xuICAgIH1cbiAgICBhc3luYyBfZ2V0QWxsKGdldEFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX2dldChnZXRBcmdzKSk7XG4gICAgfVxuICAgIF9nZXQoZ2V0QXJncykge1xuICAgICAgICBjb25zdCBwbGFuQW5kUmVzb2x2ZUFyZ3MgPSB7XG4gICAgICAgICAgICAuLi5nZXRBcmdzLFxuICAgICAgICAgICAgY29udGV4dEludGVyY2VwdG9yOiAoY29udGV4dCkgPT4gY29udGV4dCxcbiAgICAgICAgICAgIHRhcmdldFR5cGU6IFRhcmdldFR5cGVFbnVtLlZhcmlhYmxlLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5fbWlkZGxld2FyZSkge1xuICAgICAgICAgICAgY29uc3QgbWlkZGxld2FyZVJlc3VsdCA9IHRoaXMuX21pZGRsZXdhcmUocGxhbkFuZFJlc29sdmVBcmdzKTtcbiAgICAgICAgICAgIGlmIChtaWRkbGV3YXJlUmVzdWx0ID09PSB1bmRlZmluZWQgfHwgbWlkZGxld2FyZVJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLklOVkFMSURfTUlERExFV0FSRV9SRVRVUk4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmVSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYW5BbmRSZXNvbHZlKCkocGxhbkFuZFJlc29sdmVBcmdzKTtcbiAgICB9XG4gICAgX2dldEJ1dFRocm93SWZBc3luYyhnZXRBcmdzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2dldChnZXRBcmdzKTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZU9yQ29udGFpbnNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkxBWllfSU5fU1lOQyhnZXRBcmdzLnNlcnZpY2VJZGVudGlmaWVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX2dldEFsbEFyZ3Moc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgZ2V0QWxsQXJncyA9IHtcbiAgICAgICAgICAgIGF2b2lkQ29uc3RyYWludHM6IHRydWUsXG4gICAgICAgICAgICBpc011bHRpSW5qZWN0OiB0cnVlLFxuICAgICAgICAgICAgc2VydmljZUlkZW50aWZpZXIsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBnZXRBbGxBcmdzO1xuICAgIH1cbiAgICBfZ2V0Tm90QWxsQXJncyhzZXJ2aWNlSWRlbnRpZmllciwgaXNNdWx0aUluamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgICBjb25zdCBnZXROb3RBbGxBcmdzID0ge1xuICAgICAgICAgICAgYXZvaWRDb25zdHJhaW50czogZmFsc2UsXG4gICAgICAgICAgICBpc011bHRpSW5qZWN0LFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgc2VydmljZUlkZW50aWZpZXIsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGdldE5vdEFsbEFyZ3M7XG4gICAgfVxuICAgIF9wbGFuQW5kUmVzb2x2ZSgpIHtcbiAgICAgICAgcmV0dXJuIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBsZXQgY29udGV4dCA9IHBsYW4odGhpcy5fbWV0YWRhdGFSZWFkZXIsIHRoaXMsIGFyZ3MuaXNNdWx0aUluamVjdCwgYXJncy50YXJnZXRUeXBlLCBhcmdzLnNlcnZpY2VJZGVudGlmaWVyLCBhcmdzLmtleSwgYXJncy52YWx1ZSwgYXJncy5hdm9pZENvbnN0cmFpbnRzKTtcbiAgICAgICAgICAgIGNvbnRleHQgPSBhcmdzLmNvbnRleHRJbnRlcmNlcHRvcihjb250ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmUoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9O1xuICAgIH1cbiAgICBfZGVhY3RpdmF0ZUlmU2luZ2xldG9uKGJpbmRpbmcpIHtcbiAgICAgICAgaWYgKCFiaW5kaW5nLmFjdGl2YXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Byb21pc2UoYmluZGluZy5jYWNoZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLmNhY2hlLnRoZW4oKHJlc29sdmVkKSA9PiB0aGlzLl9kZWFjdGl2YXRlKGJpbmRpbmcsIHJlc29sdmVkKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlYWN0aXZhdGUoYmluZGluZywgYmluZGluZy5jYWNoZSk7XG4gICAgfVxuICAgIF9kZWFjdGl2YXRlU2luZ2xldG9ucyhiaW5kaW5ncykge1xuICAgICAgICBmb3IgKGNvbnN0IGJpbmRpbmcgb2YgYmluZGluZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlYWN0aXZhdGVJZlNpbmdsZXRvbihiaW5kaW5nKTtcbiAgICAgICAgICAgIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihFUlJPUl9NU0dTLkFTWU5DX1VOQklORF9SRVFVSVJFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgX2RlYWN0aXZhdGVTaW5nbGV0b25zQXN5bmMoYmluZGluZ3MpIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoYmluZGluZ3MubWFwKGFzeW5jIChiKSA9PiB0aGlzLl9kZWFjdGl2YXRlSWZTaW5nbGV0b24oYikpKTtcbiAgICB9XG4gICAgX3Byb3BhZ2F0ZUNvbnRhaW5lckRlYWN0aXZhdGlvblRoZW5CaW5kaW5nQW5kUHJlRGVzdHJveShiaW5kaW5nLCBpbnN0YW5jZSwgY29uc3RydWN0b3IpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVhY3RpdmF0ZS5iaW5kKHRoaXMucGFyZW50KShiaW5kaW5nLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3koYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95QXN5bmMoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVhY3RpdmF0ZS5iaW5kKHRoaXMucGFyZW50KShiaW5kaW5nLCBpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9iaW5kaW5nRGVhY3RpdmF0aW9uQW5kUHJlRGVzdHJveUFzeW5jKGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX3JlbW92ZVNlcnZpY2VGcm9tRGljdGlvbmFyeShzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fYmluZGluZ0RpY3Rpb25hcnkucmVtb3ZlKHNlcnZpY2VJZGVudGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoX2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkNBTk5PVF9VTkJJTkR9ICR7Z2V0U2VydmljZUlkZW50aWZpZXJBc1N0cmluZyhzZXJ2aWNlSWRlbnRpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95KGJpbmRpbmcsIGluc3RhbmNlLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgICBpZiAodHlwZW9mIGJpbmRpbmcub25EZWFjdGl2YXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJpbmRpbmcub25EZWFjdGl2YXRpb24oaW5zdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKCgpID0+IHRoaXMuX3ByZURlc3Ryb3koY29uc3RydWN0b3IsIGluc3RhbmNlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZURlc3Ryb3koY29uc3RydWN0b3IsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgYXN5bmMgX2JpbmRpbmdEZWFjdGl2YXRpb25BbmRQcmVEZXN0cm95QXN5bmMoYmluZGluZywgaW5zdGFuY2UsIGNvbnN0cnVjdG9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYmluZGluZy5vbkRlYWN0aXZhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYXdhaXQgYmluZGluZy5vbkRlYWN0aXZhdGlvbihpbnN0YW5jZSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5fcHJlRGVzdHJveShjb25zdHJ1Y3RvciwgaW5zdGFuY2UpO1xuICAgIH1cbn1cbmV4cG9ydCB7IENvbnRhaW5lciB9O1xuIiwiaW1wb3J0IHsgaWQgfSBmcm9tICcuLi91dGlscy9pZCc7XG5leHBvcnQgY2xhc3MgQ29udGFpbmVyTW9kdWxlIHtcbiAgICBpZDtcbiAgICByZWdpc3RyeTtcbiAgICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgICAgICB0aGlzLmlkID0gaWQoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBBc3luY0NvbnRhaW5lck1vZHVsZSB7XG4gICAgaWQ7XG4gICAgcmVnaXN0cnk7XG4gICAgY29uc3RydWN0b3IocmVnaXN0cnkpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkKCk7XG4gICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBFUlJPUl9NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBnZXRGaXJzdEFycmF5RHVwbGljYXRlIH0gZnJvbSAnLi4vdXRpbHMvanMnO1xuZnVuY3Rpb24gdGFyZ2V0SXNDb25zdHJ1Y3RvckZ1bmN0aW9uKHRhcmdldCkge1xuICAgIHJldHVybiB0YXJnZXQucHJvdG90eXBlICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKSB7XG4gICAgaWYgKHBhcmFtZXRlck5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHRhZ1BhcmFtZXRlcihhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJJbmRleCwgbWV0YWRhdGEpIHtcbiAgICBfdGhyb3dJZk1ldGhvZFBhcmFtZXRlcihwYXJhbWV0ZXJOYW1lKTtcbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VELCBhbm5vdGF0aW9uVGFyZ2V0LCBwYXJhbWV0ZXJJbmRleC50b1N0cmluZygpLCBtZXRhZGF0YSk7XG59XG5mdW5jdGlvbiB0YWdQcm9wZXJ0eShhbm5vdGF0aW9uVGFyZ2V0LCBwcm9wZXJ0eU5hbWUsIG1ldGFkYXRhKSB7XG4gICAgaWYgKHRhcmdldElzQ29uc3RydWN0b3JGdW5jdGlvbihhbm5vdGF0aW9uVGFyZ2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTVNHUy5JTlZBTElEX0RFQ09SQVRPUl9PUEVSQVRJT04pO1xuICAgIH1cbiAgICBfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eShNRVRBREFUQV9LRVkuVEFHR0VEX1BST1AsIGFubm90YXRpb25UYXJnZXQuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YWRhdGEpO1xufVxuZnVuY3Rpb24gX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzKG1ldGFkYXRhKSB7XG4gICAgbGV0IG1ldGFkYXRhcyA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBtZXRhZGF0YXMgPSBtZXRhZGF0YTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlID0gZ2V0Rmlyc3RBcnJheUR1cGxpY2F0ZShtZXRhZGF0YXMubWFwKChtZCkgPT4gbWQua2V5KSk7XG4gICAgICAgIGlmIChkdXBsaWNhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke0VSUk9SX01TR1MuRFVQTElDQVRFRF9NRVRBREFUQX0gJHtkdXBsaWNhdGUudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbWV0YWRhdGFzID0gW21ldGFkYXRhXTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhcztcbn1cbmZ1bmN0aW9uIF90YWdQYXJhbWV0ZXJPclByb3BlcnR5KG1ldGFkYXRhS2V5LCBhbm5vdGF0aW9uVGFyZ2V0LCBrZXksIG1ldGFkYXRhKSB7XG4gICAgY29uc3QgbWV0YWRhdGFzID0gX2Vuc3VyZU5vTWV0YWRhdGFLZXlEdXBsaWNhdGVzKG1ldGFkYXRhKTtcbiAgICBsZXQgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEgPSB7fTtcbiAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShtZXRhZGF0YUtleSwgYW5ub3RhdGlvblRhcmdldCkpIHtcbiAgICAgICAgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBhbm5vdGF0aW9uVGFyZ2V0KTtcbiAgICB9XG4gICAgbGV0IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhID0gcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGFba2V5XTtcbiAgICBpZiAocGFyYW1PclByb3BlcnR5TWV0YWRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YSA9IFtdO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBtIG9mIHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhKSB7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGFzLnNvbWUoKG1kKSA9PiBtZC5rZXkgPT09IG0ua2V5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtFUlJPUl9NU0dTLkRVUExJQ0FURURfTUVUQURBVEF9ICR7bS5rZXkudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbU9yUHJvcGVydHlNZXRhZGF0YS5wdXNoKC4uLm1ldGFkYXRhcyk7XG4gICAgcGFyYW1zT3JQcm9wZXJ0aWVzTWV0YWRhdGFba2V5XSA9IHBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWRhdGFLZXksIHBhcmFtc09yUHJvcGVydGllc01ldGFkYXRhLCBhbm5vdGF0aW9uVGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihtZXRhZGF0YSkge1xuICAgIHJldHVybiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4T3JQcm9wZXJ0eURlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGFnUGFyYW1ldGVyKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yLCBtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0YWdQcm9wZXJ0eSh0YXJnZXQsIHRhcmdldEtleSwgbWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmZ1bmN0aW9uIF9kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQpIHtcbiAgICBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCk7XG59XG5mdW5jdGlvbiBfcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgICAgICBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpO1xuICAgIH07XG59XG5mdW5jdGlvbiBkZWNvcmF0ZShkZWNvcmF0b3IsIHRhcmdldCwgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5KSB7XG4gICAgaWYgKHR5cGVvZiBwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIF9kZWNvcmF0ZShbX3BhcmFtKHBhcmFtZXRlckluZGV4T3JQcm9wZXJ0eSwgZGVjb3JhdG9yKV0sIHRhcmdldCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJhbWV0ZXJJbmRleE9yUHJvcGVydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIFJlZmxlY3QuZGVjb3JhdGUoW2RlY29yYXRvcl0sIHRhcmdldCwgcGFyYW1ldGVySW5kZXhPclByb3BlcnR5KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIF9kZWNvcmF0ZShbZGVjb3JhdG9yXSwgdGFyZ2V0KTtcbiAgICB9XG59XG5leHBvcnQgeyBkZWNvcmF0ZSwgdGFnUGFyYW1ldGVyLCB0YWdQcm9wZXJ0eSwgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH07XG4iLCJleHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RBcnJheUR1cGxpY2F0ZShhcnJheSkge1xuICAgIGNvbnN0IHNlZW5WYWx1ZXMgPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBhcnJheSkge1xuICAgICAgICBpZiAoc2VlblZhbHVlcy5oYXMoZW50cnkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZWVuVmFsdWVzLmFkZChlbnRyeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5mdW5jdGlvbiBpbmplY3RhYmxlKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgIGlmIChSZWZsZWN0Lmhhc093bk1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QQVJBTV9UWVBFUywgdGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SU19NU0dTLkRVUExJQ0FURURfSU5KRUNUQUJMRV9ERUNPUkFUT1IpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHR5cGVzID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNRVRBREFUQV9LRVkuREVTSUdOX1BBUkFNX1RZUEVTLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKE1FVEFEQVRBX0tFWS5QQVJBTV9UWVBFUywgdHlwZXMsIHRhcmdldCk7XG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfTtcbn1cbmV4cG9ydCB7IGluamVjdGFibGUgfTtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gdGFnZ2VkKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRhZ2dlZERlY29yYXRvcihuZXcgTWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpKTtcbn1cbmV4cG9ydCB7IHRhZ2dlZCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gbmFtZWQobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVUYWdnZWREZWNvcmF0b3IobmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5OQU1FRF9UQUcsIG5hbWUpKTtcbn1cbmV4cG9ydCB7IG5hbWVkIH07XG4iLCJpbXBvcnQgeyBVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04gfSBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfbXNncyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IGNyZWF0ZVRhZ2dlZERlY29yYXRvciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlKG1ldGFkYXRhS2V5KSB7XG4gICAgcmV0dXJuIChzZXJ2aWNlSWRlbnRpZmllcikgPT4ge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VydmljZUlkZW50aWZpZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgPyB0YXJnZXQubmFtZSA6IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihVTkRFRklORURfSU5KRUNUX0FOTk9UQVRJT04oY2xhc3NOYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjcmVhdGVUYWdnZWREZWNvcmF0b3IobmV3IE1ldGFkYXRhKG1ldGFkYXRhS2V5LCBzZXJ2aWNlSWRlbnRpZmllcikpKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleE9yUHJvcGVydHlEZXNjcmlwdG9yKTtcbiAgICAgICAgfTtcbiAgICB9O1xufVxuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IGluamVjdEJhc2UgfSBmcm9tICcuL2luamVjdF9iYXNlJztcbmNvbnN0IGluamVjdCA9IGluamVjdEJhc2UoTUVUQURBVEFfS0VZLklOSkVDVF9UQUcpO1xuZXhwb3J0IHsgaW5qZWN0IH07XG4iLCJpbXBvcnQgKiBhcyBNRVRBREFUQV9LRVkgZnJvbSAnLi4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVUYWdnZWREZWNvcmF0b3IgfSBmcm9tICcuL2RlY29yYXRvcl91dGlscyc7XG5mdW5jdGlvbiBvcHRpb25hbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlVGFnZ2VkRGVjb3JhdG9yKG5ldyBNZXRhZGF0YShNRVRBREFUQV9LRVkuT1BUSU9OQUxfVEFHLCB0cnVlKSk7XG59XG5leHBvcnQgeyBvcHRpb25hbCB9O1xuIiwiaW1wb3J0ICogYXMgTUVUQURBVEFfS0VZIGZyb20gJy4uL2NvbnN0YW50cy9tZXRhZGF0YV9rZXlzJztcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSAnLi4vcGxhbm5pbmcvbWV0YWRhdGEnO1xuaW1wb3J0IHsgdGFnUGFyYW1ldGVyIH0gZnJvbSAnLi9kZWNvcmF0b3JfdXRpbHMnO1xuZnVuY3Rpb24gdW5tYW5hZ2VkKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5VTk1BTkFHRURfVEFHLCB0cnVlKTtcbiAgICAgICAgdGFnUGFyYW1ldGVyKHRhcmdldCwgdGFyZ2V0S2V5LCBpbmRleCwgbWV0YWRhdGEpO1xuICAgIH07XG59XG5leHBvcnQgeyB1bm1hbmFnZWQgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBpbmplY3RCYXNlIH0gZnJvbSAnLi9pbmplY3RfYmFzZSc7XG5jb25zdCBtdWx0aUluamVjdCA9IGluamVjdEJhc2UoTUVUQURBVEFfS0VZLk1VTFRJX0lOSkVDVF9UQUcpO1xuZXhwb3J0IHsgbXVsdGlJbmplY3QgfTtcbiIsImltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4uL3BsYW5uaW5nL21ldGFkYXRhJztcbmltcG9ydCB7IHRhZ1BhcmFtZXRlciB9IGZyb20gJy4vZGVjb3JhdG9yX3V0aWxzJztcbmZ1bmN0aW9uIHRhcmdldE5hbWUobmFtZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGluZGV4KSB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKE1FVEFEQVRBX0tFWS5OQU1FX1RBRywgbmFtZSk7XG4gICAgICAgIHRhZ1BhcmFtZXRlcih0YXJnZXQsIHRhcmdldEtleSwgaW5kZXgsIG1ldGFkYXRhKTtcbiAgICB9O1xufVxuZXhwb3J0IHsgdGFyZ2V0TmFtZSB9O1xuIiwiaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuLi9wbGFubmluZy9tZXRhZGF0YSc7XG5mdW5jdGlvbiBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yKGV2ZW50S2V5LCBlcnJvck1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRhcmdldCwgcHJvcGVydHlLZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IE1ldGFkYXRhKGV2ZW50S2V5LCBwcm9wZXJ0eUtleSk7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdC5oYXNPd25NZXRhZGF0YShldmVudEtleSwgdGFyZ2V0LmNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShldmVudEtleSwgbWV0YWRhdGEsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIH07XG4gICAgfTtcbn1cbmV4cG9ydCB7IHByb3BlcnR5RXZlbnREZWNvcmF0b3IgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3InO1xuY29uc3QgcG9zdENvbnN0cnVjdCA9IHByb3BlcnR5RXZlbnREZWNvcmF0b3IoTUVUQURBVEFfS0VZLlBPU1RfQ09OU1RSVUNULCBFUlJPUlNfTVNHUy5NVUxUSVBMRV9QT1NUX0NPTlNUUlVDVF9NRVRIT0RTKTtcbmV4cG9ydCB7IHBvc3RDb25zdHJ1Y3QgfTtcbiIsImltcG9ydCAqIGFzIEVSUk9SU19NU0dTIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9tc2dzJztcbmltcG9ydCAqIGFzIE1FVEFEQVRBX0tFWSBmcm9tICcuLi9jb25zdGFudHMvbWV0YWRhdGFfa2V5cyc7XG5pbXBvcnQgeyBwcm9wZXJ0eUV2ZW50RGVjb3JhdG9yIH0gZnJvbSAnLi9wcm9wZXJ0eV9ldmVudF9kZWNvcmF0b3InO1xuY29uc3QgcHJlRGVzdHJveSA9IHByb3BlcnR5RXZlbnREZWNvcmF0b3IoTUVUQURBVEFfS0VZLlBSRV9ERVNUUk9ZLCBFUlJPUlNfTVNHUy5NVUxUSVBMRV9QUkVfREVTVFJPWV9NRVRIT0RTKTtcbmV4cG9ydCB7IHByZURlc3Ryb3kgfTtcbiIsImltcG9ydCAncmVmbGVjdC1tZXRhZGF0YSc7XG5pbXBvcnQgKiBhcyBrZXlzIGZyb20gJy4vY29uc3RhbnRzL21ldGFkYXRhX2tleXMnO1xuZXhwb3J0IHsgTGF6eVNlcnZpY2VJZGVudGlmaWVyIH0gZnJvbSAnQGludmVyc2lmeWpzL2NvbW1vbic7XG5leHBvcnQgY29uc3QgTUVUQURBVEFfS0VZID0ga2V5cztcbmV4cG9ydCB7IENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbnRhaW5lcic7XG5leHBvcnQgeyBCaW5kaW5nU2NvcGVFbnVtLCBCaW5kaW5nVHlwZUVudW0sIFRhcmdldFR5cGVFbnVtLCB9IGZyb20gJy4vY29uc3RhbnRzL2xpdGVyYWxfdHlwZXMnO1xuZXhwb3J0IHsgQXN5bmNDb250YWluZXJNb2R1bGUsIENvbnRhaW5lck1vZHVsZSwgfSBmcm9tICcuL2NvbnRhaW5lci9jb250YWluZXJfbW9kdWxlJztcbmV4cG9ydCB7IGNyZWF0ZVRhZ2dlZERlY29yYXRvciB9IGZyb20gJy4vYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMnO1xuZXhwb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gJy4vYW5ub3RhdGlvbi9pbmplY3RhYmxlJztcbmV4cG9ydCB7IHRhZ2dlZCB9IGZyb20gJy4vYW5ub3RhdGlvbi90YWdnZWQnO1xuZXhwb3J0IHsgbmFtZWQgfSBmcm9tICcuL2Fubm90YXRpb24vbmFtZWQnO1xuZXhwb3J0IHsgaW5qZWN0IH0gZnJvbSAnLi9hbm5vdGF0aW9uL2luamVjdCc7XG5leHBvcnQgeyBvcHRpb25hbCB9IGZyb20gJy4vYW5ub3RhdGlvbi9vcHRpb25hbCc7XG5leHBvcnQgeyB1bm1hbmFnZWQgfSBmcm9tICcuL2Fubm90YXRpb24vdW5tYW5hZ2VkJztcbmV4cG9ydCB7IG11bHRpSW5qZWN0IH0gZnJvbSAnLi9hbm5vdGF0aW9uL211bHRpX2luamVjdCc7XG5leHBvcnQgeyB0YXJnZXROYW1lIH0gZnJvbSAnLi9hbm5vdGF0aW9uL3RhcmdldF9uYW1lJztcbmV4cG9ydCB7IHBvc3RDb25zdHJ1Y3QgfSBmcm9tICcuL2Fubm90YXRpb24vcG9zdF9jb25zdHJ1Y3QnO1xuZXhwb3J0IHsgcHJlRGVzdHJveSB9IGZyb20gJy4vYW5ub3RhdGlvbi9wcmVfZGVzdHJveSc7XG5leHBvcnQgeyBNZXRhZGF0YVJlYWRlciB9IGZyb20gJy4vcGxhbm5pbmcvbWV0YWRhdGFfcmVhZGVyJztcbmV4cG9ydCB7IGlkIH0gZnJvbSAnLi91dGlscy9pZCc7XG5leHBvcnQgeyBkZWNvcmF0ZSB9IGZyb20gJy4vYW5ub3RhdGlvbi9kZWNvcmF0b3JfdXRpbHMnO1xuZXhwb3J0IHsgdHJhdmVyc2VBbmNlcnN0b3JzLCB0YWdnZWRDb25zdHJhaW50LCBuYW1lZENvbnN0cmFpbnQsIHR5cGVDb25zdHJhaW50LCB9IGZyb20gJy4vc3ludGF4L2NvbnN0cmFpbnRfaGVscGVycyc7XG5leHBvcnQgeyBnZXRTZXJ2aWNlSWRlbnRpZmllckFzU3RyaW5nIH0gZnJvbSAnLi91dGlscy9zZXJpYWxpemF0aW9uJztcbmV4cG9ydCB7IG11bHRpQmluZFRvU2VydmljZSB9IGZyb20gJy4vdXRpbHMvYmluZGluZ191dGlscyc7XG4iXSwibmFtZXMiOlsiUmVmbGVjdCIsInJvb3QiLCJnbG9iYWxUaGlzIiwiZyIsInNlbGYiLCJ0aGlzIiwiRnVuY3Rpb24iLCJfIiwiZnVuY3Rpb25UaGlzIiwiZXZhbCIsImluZGlyZWN0RXZhbFRoaXMiLCJleHBvcnRlciIsIm1ha2VFeHBvcnRlciIsInRhcmdldCIsInByZXZpb3VzIiwia2V5IiwidmFsdWUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaGFzT3duIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJzdXBwb3J0c1N5bWJvbCIsIlN5bWJvbCIsInRvUHJpbWl0aXZlU3ltYm9sIiwidG9QcmltaXRpdmUiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwic3VwcG9ydHNDcmVhdGUiLCJjcmVhdGUiLCJzdXBwb3J0c1Byb3RvIiwiX19wcm90b19fIiwiQXJyYXkiLCJkb3duTGV2ZWwiLCJIYXNoTWFwIiwiTWFrZURpY3Rpb25hcnkiLCJoYXMiLCJtYXAiLCJjYWxsIiwiZ2V0IiwidW5kZWZpbmVkIiwiZnVuY3Rpb25Qcm90b3R5cGUiLCJnZXRQcm90b3R5cGVPZiIsIl9NYXAiLCJNYXAiLCJlbnRyaWVzIiwiY2FjaGVTZW50aW5lbCIsImFycmF5U2VudGluZWwiLCJNYXBJdGVyYXRvciIsImtleXMiLCJ2YWx1ZXMiLCJzZWxlY3RvciIsIl9pbmRleCIsIl9rZXlzIiwiX3ZhbHVlcyIsIl9zZWxlY3RvciIsIm5leHQiLCJpbmRleCIsImxlbmd0aCIsInJlc3VsdCIsImRvbmUiLCJ0aHJvdyIsImVycm9yIiwicmV0dXJuIiwiX2NhY2hlS2V5IiwiX2NhY2hlSW5kZXgiLCJlbnVtZXJhYmxlIiwiX2ZpbmQiLCJzZXQiLCJkZWxldGUiLCJzaXplIiwiaSIsIlNhbWVWYWx1ZVplcm8iLCJjbGVhciIsImdldEtleSIsImdldFZhbHVlIiwiZ2V0RW50cnkiLCJpbnNlcnQiLCJwdXNoIiwiQ3JlYXRlTWFwUG9seWZpbGwiLCJfU2V0IiwiU2V0IiwiX21hcCIsImFkZCIsIl9XZWFrTWFwIiwiV2Vha01hcCIsInJvb3RLZXkiLCJDcmVhdGVVbmlxdWVLZXkiLCJfa2V5IiwidGFibGUiLCJHZXRPckNyZWF0ZVdlYWtNYXBUYWJsZSIsIkNyZWF0ZVVVSUQiLCJGaWxsUmFuZG9tQnl0ZXMiLCJidWZmZXIiLCJNYXRoIiwicmFuZG9tIiwiZGF0YSIsIlVpbnQ4QXJyYXkiLCJhcnJheSIsImNyeXB0byIsImdldFJhbmRvbVZhbHVlcyIsIm1zQ3J5cHRvIiwiR2VuUmFuZG9tQnl0ZXMiLCJvZmZzZXQiLCJieXRlIiwidG9TdHJpbmciLCJ0b0xvd2VyQ2FzZSIsIkNyZWF0ZVdlYWtNYXBQb2x5ZmlsbCIsInJlZ2lzdHJ5U3ltYm9sIiwiZm9yIiwibWV0YWRhdGFSZWdpc3RyeSIsIklzVW5kZWZpbmVkIiwiSXNPYmplY3QiLCJpc0V4dGVuc2libGUiLCJmYWxsYmFjayIsImZpcnN0Iiwic2Vjb25kIiwicmVzdCIsImRlZmluZU1ldGFkYXRhIiwicmVmbGVjdCIsImhhc093bk1ldGFkYXRhIiwiZ2V0T3duTWV0YWRhdGEiLCJnZXRPd25NZXRhZGF0YUtleXMiLCJkZWxldGVNZXRhZGF0YSIsIm1ldGFkYXRhT3duZXIiLCJpc1Byb3ZpZGVyRm9yIiwiTyIsIlAiLCJtZXRhZGF0YVByb3BlcnR5U2V0IiwiT3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSIsIk9yZGluYXJ5SGFzT3duTWV0YWRhdGEiLCJPcmRpbmFyeUdldE93bk1ldGFkYXRhIiwiT3JkaW5hcnlPd25NZXRhZGF0YUtleXMiLCJPcmRpbmFyeURlbGV0ZU1ldGFkYXRhIiwiQ3JlYXRlRmFsbGJhY2tQcm92aWRlciIsInRhcmdldFByb3ZpZGVyTWFwIiwicmVnaXN0cnkiLCJyZWdpc3RlclByb3ZpZGVyIiwiZ2V0UHJvdmlkZXIiLCJzZXRQcm92aWRlciIsInByb3ZpZGVyIiwiRXJyb3IiLCJnZXRQcm92aWRlck5vQ2FjaGUiLCJHZXRJdGVyYXRvciIsIkl0ZXJhdG9yU3RlcCIsIkl0ZXJhdG9yVmFsdWUiLCJJdGVyYXRvckNsb3NlIiwicHJvdmlkZXJNYXAiLCJoYXNQcm92aWRlciIsIlR5cGVFcnJvciIsImV4aXN0aW5nUHJvdmlkZXIiLCJDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwiR2V0T3JDcmVhdGVNZXRhZGF0YVJlZ2lzdHJ5IiwibWV0YWRhdGFQcm92aWRlciIsIm1ldGFkYXRhIiwidGFyZ2V0TWV0YWRhdGEiLCJNZXRhZGF0YUtleSIsIk1ldGFkYXRhVmFsdWUiLCJHZXRPckNyZWF0ZU1ldGFkYXRhTWFwIiwibWV0YWRhdGFNYXAiLCJUb0Jvb2xlYW4iLCJrIiwibmV4dFZhbHVlIiwiZSIsIkNyZWF0ZSIsImNyZWF0ZWRUYXJnZXRNZXRhZGF0YSIsIkNyZWF0ZU1ldGFkYXRhUHJvdmlkZXIiLCJPcmRpbmFyeUhhc01ldGFkYXRhIiwicGFyZW50IiwiT3JkaW5hcnlHZXRQcm90b3R5cGVPZiIsIklzTnVsbCIsIkdldE1ldGFkYXRhUHJvdmlkZXIiLCJPcmRpbmFyeUdldE1ldGFkYXRhIiwiT3JkaW5hcnlNZXRhZGF0YUtleXMiLCJvd25LZXlzIiwicGFyZW50S2V5cyIsIl9pIiwib3duS2V5c18xIiwiX2EiLCJwYXJlbnRLZXlzXzEiLCJUeXBlIiwieCIsIlRvUHJpbWl0aXZlIiwiaW5wdXQiLCJQcmVmZXJyZWRUeXBlIiwiaGludCIsImV4b3RpY1RvUHJpbSIsIkdldE1ldGhvZCIsInRvU3RyaW5nXzEiLCJJc0NhbGxhYmxlIiwidmFsdWVPZiIsInRvU3RyaW5nXzIiLCJPcmRpbmFyeVRvUHJpbWl0aXZlIiwiYXJndW1lbnQiLCJUb1Byb3BlcnR5S2V5IiwiVG9TdHJpbmciLCJJc0FycmF5IiwiaXNBcnJheSIsIklzQ29uc3RydWN0b3IiLCJ5IiwiViIsImZ1bmMiLCJvYmoiLCJtZXRob2QiLCJpdGVyUmVzdWx0IiwiZiIsInByb3RvIiwicHJvdG90eXBlUHJvdG8iLCJjb25zdHJ1Y3RvciIsInJlZ2lzdGVyZWRQcm92aWRlciIsIl9fIiwiZGVjb3JhdG9ycyIsInByb3BlcnR5S2V5IiwiYXR0cmlidXRlcyIsImRlY29yYXRlZCIsImRlY29yYXRvciIsIkRlY29yYXRlQ29uc3RydWN0b3IiLCJkZXNjcmlwdG9yIiwiRGVjb3JhdGVQcm9wZXJ0eSIsIm1ldGFkYXRhS2V5IiwibWV0YWRhdGFWYWx1ZSIsIklzUHJvcGVydHlLZXkiLCJmYWN0b3J5IiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwiZXhwb3J0cyIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJ3aW5kb3ciLCJwcm9wIiwiciIsInRvU3RyaW5nVGFnIiwiTkFNRURfVEFHIiwiTkFNRV9UQUciLCJVTk1BTkFHRURfVEFHIiwiT1BUSU9OQUxfVEFHIiwiSU5KRUNUX1RBRyIsIk1VTFRJX0lOSkVDVF9UQUciLCJUQUdHRUQiLCJUQUdHRURfUFJPUCIsIlBBUkFNX1RZUEVTIiwiREVTSUdOX1BBUkFNX1RZUEVTIiwiUE9TVF9DT05TVFJVQ1QiLCJQUkVfREVTVFJPWSIsIk5PTl9DVVNUT01fVEFHX0tFWVMiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb21tb25fMDgxZDhjMDdfXyIsIkJpbmRpbmdTY29wZUVudW0iLCJSZXF1ZXN0IiwiU2luZ2xldG9uIiwiVHJhbnNpZW50IiwiQmluZGluZ1R5cGVFbnVtIiwiQ29uc3RhbnRWYWx1ZSIsIkNvbnN0cnVjdG9yIiwiRHluYW1pY1ZhbHVlIiwiRmFjdG9yeSIsIkluc3RhbmNlIiwiSW52YWxpZCIsIlByb3ZpZGVyIiwiVGFyZ2V0VHlwZUVudW0iLCJDbGFzc1Byb3BlcnR5IiwiQ29uc3RydWN0b3JBcmd1bWVudCIsIlZhcmlhYmxlIiwiaWRDb3VudGVyIiwiaWQiLCJCaW5kaW5nIiwiYWN0aXZhdGVkIiwic2VydmljZUlkZW50aWZpZXIiLCJpbXBsZW1lbnRhdGlvblR5cGUiLCJjYWNoZSIsImR5bmFtaWNWYWx1ZSIsInNjb3BlIiwidHlwZSIsImNvbnN0cmFpbnQiLCJvbkFjdGl2YXRpb24iLCJvbkRlYWN0aXZhdGlvbiIsIl9yZXF1ZXN0IiwiY2xvbmUiLCJEVVBMSUNBVEVEX0lOSkVDVEFCTEVfREVDT1JBVE9SIiwiRFVQTElDQVRFRF9NRVRBREFUQSIsIk5VTExfQVJHVU1FTlQiLCJLRVlfTk9UX0ZPVU5EIiwiSU5WQUxJRF9ERUNPUkFUT1JfT1BFUkFUSU9OIiwiT05fREVBQ1RJVkFUSU9OX0VSUk9SIiwiY2xhenoiLCJlcnJvck1lc3NhZ2UiLCJNZXRhZGF0YVJlYWRlciIsImdldENvbnN0cnVjdG9yTWV0YWRhdGEiLCJjb25zdHJ1Y3RvckZ1bmMiLCJjb21waWxlckdlbmVyYXRlZE1ldGFkYXRhIiwiZ2V0TWV0YWRhdGEiLCJ1c2VyR2VuZXJhdGVkTWV0YWRhdGEiLCJnZXRQcm9wZXJ0aWVzTWV0YWRhdGEiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX19pbnZlcnNpZnlqc19jb3JlX2MwOGNmNGExX18iLCJCaW5kaW5nQ291bnQiLCJpc1N0YWNrT3ZlcmZsb3dFeGNlcHRpb24iLCJSYW5nZUVycm9yIiwibWVzc2FnZSIsImdldFNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmciLCJuYW1lIiwibGlzdFJlZ2lzdGVyZWRCaW5kaW5nc0ZvclNlcnZpY2VJZGVudGlmaWVyIiwiY29udGFpbmVyIiwiZ2V0QmluZGluZ3MiLCJyZWdpc3RlcmVkQmluZGluZ3NMaXN0IiwicmVnaXN0ZXJlZEJpbmRpbmdzIiwiZm9yRWFjaCIsImJpbmRpbmciLCJnZXRGdW5jdGlvbk5hbWUiLCJtZXRhRGF0YSIsImFscmVhZHlEZXBlbmRlbmN5Q2hhaW4iLCJyZXF1ZXN0IiwicGFyZW50UmVxdWVzdCIsImNpcmN1bGFyRGVwZW5kZW5jeVRvRXhjZXB0aW9uIiwiY2hpbGRSZXF1ZXN0cyIsImNoaWxkUmVxdWVzdCIsInNlcnZpY2VzIiwiX2NyZWF0ZVN0cmluZ0FyciIsInJlcSIsInJldmVyc2UiLCJqb2luIiwiZGVwZW5kZW5jeUNoYWluVG9TdHJpbmciLCJtYXRjaCIsInN0cmluZ2lmeU1ldGFkYXRhIiwiQ29udGV4dCIsInBsYW4iLCJjdXJyZW50UmVxdWVzdCIsImFkZFBsYW4iLCJzZXRDdXJyZW50UmVxdWVzdCIsIk1ldGFkYXRhIiwiU3RyaW5nIiwiUGxhbiIsInBhcmVudENvbnRleHQiLCJyb290UmVxdWVzdCIsImdldEJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCIsIm1ldGFkYXRhUmVhZGVyIiwiYmFzZUNvbnN0cnVjdG9yIiwidGFyZ2V0cyIsImdldFRhcmdldHMiLCJ0IiwiZmlsdGVyIiwibSIsInVubWFuYWdlZENvdW50IiwiY29uY2F0IiwiYXBwbHkiLCJkZXBlbmRlbmN5Q291bnQiLCJiaW5kaW5ncyIsInJlcXVlc3RTY29wZSIsImFkZENoaWxkUmVxdWVzdCIsImNoaWxkIiwiZ2V0QmluZGluZ0RpY3Rpb25hcnkiLCJjbnRuciIsIl9iaW5kaW5nRGljdGlvbmFyeSIsIl9nZXRBY3RpdmVCaW5kaW5ncyIsImF2b2lkQ29uc3RyYWludHMiLCJjb250ZXh0IiwiYWN0aXZlQmluZGluZ3MiLCJOb0JpbmRpbmdzQXZhaWxhYmxlIiwib3B0aW9ucyIsImF1dG9CaW5kSW5qZWN0YWJsZSIsImJpbmQiLCJ0b1NlbGYiLCJpc09wdGlvbmFsIiwic2VydmljZUlkZW50aWZpZXJTdHJpbmciLCJtc2ciLCJpc1RhZ2dlZCIsImlzTmFtZWQiLCJuYW1lZFRhZyIsImdldE5hbWVkVGFnIiwib3RoZXJUYWdzIiwiZ2V0Q3VzdG9tVGFncyIsInRhZyIsImxpc3RNZXRhZGF0YUZvclRhcmdldCIsIk9ubHlPbmVCaW5kaW5nQXZhaWxhYmxlIiwiTXVsdGlwbGVCaW5kaW5nc0F2YWlsYWJsZSIsIl92YWxpZGF0ZUFjdGl2ZUJpbmRpbmdDb3VudCIsIl9nZXRUYXJnZXRNZXRhZGF0YSIsImlzTXVsdGlJbmplY3QiLCJtZXRhZGF0YUxpc3QiLCJfY3JlYXRlU3ViUmVxdWVzdHMiLCJ0aGVQbGFuIiwic3ViQ2hpbGRSZXF1ZXN0IiwiZGVwZW5kZW5jaWVzIiwiZ2V0RGVwZW5kZW5jaWVzIiwic2tpcEJhc2VDbGFzc0NoZWNrcyIsImJhc2VDbGFzc0RlcGVuZGVuY3lDb3VudCIsImRlcGVuZGVuY3kiLCJiaW5kaW5nRGljdGlvbmFyeSIsImhhc0tleSIsImlzUHJvbWlzZSIsIm9iamVjdCIsInRoZW4iLCJpc1Byb21pc2VPckNvbnRhaW5zUHJvbWlzZSIsInNvbWUiLCJfc2F2ZUFzeW5jUmVzdWx0VG9TaW5nbGV0b25TY29wZSIsImFzeW5jIiwiYXN5bmNSZXN1bHQiLCJleCIsIkZhY3RvcnlUeXBlIiwibXVsdGlCaW5kVG9TZXJ2aWNlIiwic2VydmljZSIsInR5cGVzIiwidG9TZXJ2aWNlIiwiY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9ucyIsImFyZ3MiLCJpbnN0YW5jZSIsImNvbnN0ciIsImNvbnN0cnVjdG9ySW5qZWN0aW9ucyIsInByb3BlcnR5UmVxdWVzdHMiLCJwcm9wZXJ0eSIsImlkZW50aWZpZXIiLCJpbmplY3Rpb24iLCJwcm9wZXJ0eUluamVjdGlvbnMiLCJwb3NzaWJseVdhaXRJbmplY3Rpb25zIiwicG9zc2libGVQcm9taXNlaW5qZWN0aW9ucyIsImluamVjdGlvbnMiLCJQcm9taXNlIiwiYWxsIiwiX2dldEluc3RhbmNlQWZ0ZXJQb3N0Q29uc3RydWN0IiwicG9zdENvbnN0cnVjdFJlc3VsdCIsImhhc01ldGFkYXRhIiwiX3Bvc3RDb25zdHJ1Y3QiLCJfcmVzb2x2ZVJlcXVlc3QiLCJ0YXJnZXRJc0FuQXJyYXkiLCJ0YXJnZXRQYXJlbnRJc05vdEFuQXJyYXkiLCJtYXRjaGVzQXJyYXkiLCJyZXNvbHZlUmVxdWVzdCIsIl9yZXNvbHZlQmluZGluZyIsIl9yZXNvbHZlRmFjdG9yeUZyb21CaW5kaW5nIiwiZmFjdG9yeURldGFpbHMiLCJmYWN0b3J5VHlwZSIsImdldEZhY3RvcnlEZXRhaWxzIiwidHJ5QW5kVGhyb3dFcnJvcklmU3RhY2tPdmVyZmxvdyIsIl9nZXRSZXNvbHZlZEZyb21CaW5kaW5nIiwiYm91bmRWYWx1ZSIsInNlcnZpY2VJZGVudGlmaWVyQXNTdHJpbmciLCJlbnN1cmVGdWxseUJvdW5kIiwic2NvcGVFcnJvck1lc3NhZ2UiLCJfdGhyb3dJZkhhbmRsaW5nRGVhY3RpdmF0aW9uIiwiX3ZhbGlkYXRlSW5zdGFuY2VSZXNvbHV0aW9uIiwicmVzb2x2ZWQiLCJyZWR1Y2UiLCJyZXNvbHZlZFJlcXVlc3RzIiwiaXNBc3luYyIsIl9yZXNvbHZlUmVxdWVzdHMiLCJjcmVhdGVJbnN0YW5jZVdpdGhJbmplY3Rpb25zQXJnIiwiY3JlYXRlSW5zdGFuY2VXaXRoSW5qZWN0aW9uc0FzeW5jIiwiX2NyZWF0ZUluc3RhbmNlIiwicmVzb2x2ZWRSZXN1bHQiLCJyZXNvbHZlSW5zdGFuY2UiLCJfcmVzb2x2ZUluU2NvcGUiLCJyZXNvbHZlRnJvbUJpbmRpbmciLCJ0cnlHZXRGcm9tU2NvcGUiLCJfc2F2ZVRvU2luZ2xldG9uU2NvcGUiLCJfc2F2ZVRvUmVxdWVzdFNjb3BlIiwic2F2ZVRvU2NvcGUiLCJfb25BY3RpdmF0aW9uIiwiX2JpbmRpbmdBY3RpdmF0aW9uIiwiY29udGFpbmVyc0l0ZXJhdG9yIiwiX2dldENvbnRhaW5lcnNJdGVyYXRvciIsImNvbnRhaW5lcnNJdGVyYXRvclJlc3VsdCIsImFjdGl2YXRpb25zSXRlcmF0b3IiLCJfZ2V0Q29udGFpbmVyQWN0aXZhdGlvbnNGb3JTZXJ2aWNlIiwiX2FjdGl2YXRlQ29udGFpbmVyQXN5bmMiLCJfYWN0aXZhdGVDb250YWluZXIiLCJwcmV2aW91c1Jlc3VsdCIsImFjdGl2YXRpb24iLCJyZXN1bHRQcm9taXNlIiwiYWN0aXZhdGlvbnMiLCJfYWN0aXZhdGlvbnMiLCJjb250YWluZXJzU3RhY2siLCJuZXh0Q29udGFpbmVyIiwicG9wIiwidHJhdmVyc2VBbmNlcnN0b3JzIiwidGFnZ2VkQ29uc3RyYWludCIsIm1hdGNoZXNUYWciLCJuYW1lZENvbnN0cmFpbnQiLCJ0eXBlQ29uc3RyYWludCIsIkJpbmRpbmdXaGVuU3ludGF4IiwiX2JpbmRpbmciLCJ3aGVuIiwiQmluZGluZ09uU3ludGF4Iiwid2hlblRhcmdldE5hbWVkIiwid2hlblRhcmdldElzRGVmYXVsdCIsIndoZW5UYXJnZXRUYWdnZWQiLCJ3aGVuSW5qZWN0ZWRJbnRvIiwid2hlblBhcmVudE5hbWVkIiwid2hlblBhcmVudFRhZ2dlZCIsIndoZW5BbnlBbmNlc3RvcklzIiwiYW5jZXN0b3IiLCJ3aGVuTm9BbmNlc3RvcklzIiwid2hlbkFueUFuY2VzdG9yTmFtZWQiLCJ3aGVuTm9BbmNlc3Rvck5hbWVkIiwid2hlbkFueUFuY2VzdG9yVGFnZ2VkIiwid2hlbk5vQW5jZXN0b3JUYWdnZWQiLCJ3aGVuQW55QW5jZXN0b3JNYXRjaGVzIiwid2hlbk5vQW5jZXN0b3JNYXRjaGVzIiwiaGFuZGxlciIsIkJpbmRpbmdXaGVuT25TeW50YXgiLCJfYmluZGluZ1doZW5TeW50YXgiLCJfYmluZGluZ09uU3ludGF4IiwiQmluZGluZ0luU3ludGF4IiwiaW5SZXF1ZXN0U2NvcGUiLCJpblNpbmdsZXRvblNjb3BlIiwiaW5UcmFuc2llbnRTY29wZSIsIkJpbmRpbmdJbldoZW5PblN5bnRheCIsIl9iaW5kaW5nSW5TeW50YXgiLCJCaW5kaW5nVG9TeW50YXgiLCJ0byIsInRvQ29uc3RhbnRWYWx1ZSIsInRvRHluYW1pY1ZhbHVlIiwidG9Db25zdHJ1Y3RvciIsInRvRmFjdG9yeSIsInRvRnVuY3Rpb24iLCJiaW5kaW5nV2hlbk9uU3ludGF4IiwidG9BdXRvRmFjdG9yeSIsInRvQXV0b05hbWVkRmFjdG9yeSIsIm5hbWVkIiwiZ2V0TmFtZWQiLCJ0b1Byb3ZpZGVyIiwiX3ZhbHVlIiwiX2Vycm9yIiwiZ2V0QXN5bmMiLCJDb250YWluZXJTbmFwc2hvdCIsImRlYWN0aXZhdGlvbnMiLCJtaWRkbGV3YXJlIiwibW9kdWxlQWN0aXZhdGlvblN0b3JlIiwib2YiLCJzbmFwc2hvdCIsIkxvb2t1cCIsImdldE1hcCIsIl9jaGVja05vbk51bGlzaCIsImVudHJ5IiwicmVtb3ZlIiwicmVtb3ZlSW50ZXJzZWN0aW9uIiwibG9va3VwIiwidHJhdmVyc2UiLCJsb29rdXBBY3RpdmF0aW9ucyIsImZpbHRlcmVkVmFsdWVzIiwibG9va3VwVmFsdWUiLCJtb2R1bGVBY3RpdmF0aW9uIiwiX3NldFZhbHVlIiwicmVtb3ZlQnlDb25kaXRpb24iLCJjb25kaXRpb24iLCJyZW1vdmFscyIsInVwZGF0ZWRFbnRyaWVzIiwiY29weSIsImIiLCJNb2R1bGVBY3RpdmF0aW9uU3RvcmUiLCJoYW5kbGVycyIsIl9nZXRFbXB0eUhhbmRsZXJzU3RvcmUiLCJhZGREZWFjdGl2YXRpb24iLCJfZ2V0TW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzIiwib25EZWFjdGl2YXRpb25zIiwiYWRkQWN0aXZhdGlvbiIsIm9uQWN0aXZhdGlvbnMiLCJoYW5kbGVyc1N0b3JlIiwibW9kdWxlQWN0aXZhdGlvbkhhbmRsZXJzIiwiQ29udGFpbmVyIiwiX21pZGRsZXdhcmUiLCJfZGVhY3RpdmF0aW9ucyIsIl9zbmFwc2hvdHMiLCJfbWV0YWRhdGFSZWFkZXIiLCJfbW9kdWxlQWN0aXZhdGlvblN0b3JlIiwiY29udGFpbmVyT3B0aW9ucyIsImRlZmF1bHRTY29wZSIsIm1lcmdlIiwiY29udGFpbmVyMSIsImNvbnRhaW5lcjIiLCJjb250YWluZXJzIiwidGFyZ2V0Q29udGFpbmVycyIsInRhcmdldENvbnRhaW5lciIsInRhcmdldEJpbmRpbmdEaWN0aW9uYXJ5IiwiZGVzdGluYXRpb24iLCJsb2FkIiwibW9kdWxlcyIsImdldEhlbHBlcnMiLCJfZ2V0Q29udGFpbmVyTW9kdWxlSGVscGVyc0ZhY3RvcnkiLCJjdXJyZW50TW9kdWxlIiwiY29udGFpbmVyTW9kdWxlSGVscGVycyIsImJpbmRGdW5jdGlvbiIsInVuYmluZEZ1bmN0aW9uIiwiaXNib3VuZEZ1bmN0aW9uIiwicmViaW5kRnVuY3Rpb24iLCJ1bmJpbmRBc3luY0Z1bmN0aW9uIiwib25BY3RpdmF0aW9uRnVuY3Rpb24iLCJvbkRlYWN0aXZhdGlvbkZ1bmN0aW9uIiwibG9hZEFzeW5jIiwidW5sb2FkIiwiX3JlbW92ZU1vZHVsZUJpbmRpbmdzIiwiX2RlYWN0aXZhdGVTaW5nbGV0b25zIiwiX3JlbW92ZU1vZHVsZUhhbmRsZXJzIiwidW5sb2FkQXN5bmMiLCJfZGVhY3RpdmF0ZVNpbmdsZXRvbnNBc3luYyIsIl9iaW5kIiwiX2J1aWxkQmluZGluZyIsInJlYmluZCIsInVuYmluZCIsInJlYmluZEFzeW5jIiwidW5iaW5kQXN5bmMiLCJfcmVtb3ZlU2VydmljZUZyb21EaWN0aW9uYXJ5IiwidW5iaW5kQWxsIiwidW5iaW5kQWxsQXN5bmMiLCJwcm9taXNlcyIsImlzQm91bmQiLCJib3VuZCIsImlzQ3VycmVudEJvdW5kIiwiaXNCb3VuZE5hbWVkIiwiaXNCb3VuZFRhZ2dlZCIsImNsYXNzRWxlbWVudE1ldGFkYXRhIiwiZ2V0Q2xhc3NFbGVtZW50TWV0YWRhdGFGcm9tTGVnYWN5TWV0YWRhdGEiLCJraW5kIiwiQ2xhc3NFbGVtZW50TWV0YWRhdGFLaW5kIiwidW5tYW5hZ2VkIiwiY3JlYXRlTW9ja1JlcXVlc3QiLCJyZXN0b3JlIiwiY3JlYXRlQ2hpbGQiLCJhcHBseU1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlcyIsImluaXRpYWwiLCJfcGxhbkFuZFJlc29sdmUiLCJwcmV2IiwiY3VyciIsImFwcGx5Q3VzdG9tTWV0YWRhdGFSZWFkZXIiLCJnZXRBcmdzIiwiX2dldE5vdEFsbEFyZ3MiLCJfZ2V0QnV0VGhyb3dJZkFzeW5jIiwiX2dldCIsImdldFRhZ2dlZCIsImdldFRhZ2dlZEFzeW5jIiwiZ2V0TmFtZWRBc3luYyIsImdldEFsbCIsIl9nZXRBbGxBcmdzIiwiZ2V0QWxsQXN5bmMiLCJfZ2V0QWxsIiwiZ2V0QWxsVGFnZ2VkIiwiZ2V0QWxsVGFnZ2VkQXN5bmMiLCJnZXRBbGxOYW1lZCIsImdldEFsbE5hbWVkQXN5bmMiLCJyZXNvbHZlIiwiY29uc3RydWN0b3JGdW5jdGlvbiIsIl9wcmVEZXN0cm95IiwibW9kdWxlQWN0aXZhdGlvbnNIYW5kbGVycyIsIl9kZWFjdGl2YXRlIiwiX2RlYWN0aXZhdGVDb250YWluZXIiLCJfaGFuZGxlRGVhY3RpdmF0aW9uRXJyb3IiLCJfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95QXN5bmMiLCJwcm9wYWdhdGVEZWFjdGl2YXRpb25SZXN1bHQiLCJfcHJvcGFnYXRlQ29udGFpbmVyRGVhY3RpdmF0aW9uVGhlbkJpbmRpbmdBbmRQcmVEZXN0cm95IiwiZGVhY3RpdmF0aW9uc0l0ZXJhdG9yIiwiZGVhY3RpdmF0aW9uIiwiX2RlYWN0aXZhdGVDb250YWluZXJBc3luYyIsImdldEJpbmRGdW5jdGlvbiIsImdldFVuYmluZEZ1bmN0aW9uIiwiZ2V0VW5iaW5kQXN5bmNGdW5jdGlvbiIsImdldElzYm91bmRGdW5jdGlvbiIsImdldFJlYmluZEZ1bmN0aW9uIiwiZ2V0T25BY3RpdmF0aW9uRnVuY3Rpb24iLCJnZXRPbkRlYWN0aXZhdGlvbkZ1bmN0aW9uIiwibUlkIiwicGxhbkFuZFJlc29sdmVBcmdzIiwiY29udGV4dEludGVyY2VwdG9yIiwidGFyZ2V0VHlwZSIsIm1pZGRsZXdhcmVSZXN1bHQiLCJfY3JlYXRlVGFyZ2V0IiwicmVzb2x2ZVJlcXVlc3RGdW5jdGlvbiIsIl9kZWFjdGl2YXRlSWZTaW5nbGV0b24iLCJfYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3kiLCJfYmluZGluZ0RlYWN0aXZhdGlvbkFuZFByZURlc3Ryb3lBc3luYyIsIl9lIiwiQ29udGFpbmVyTW9kdWxlIiwiQXN5bmNDb250YWluZXJNb2R1bGUiLCJ0YWdQYXJhbWV0ZXIiLCJhbm5vdGF0aW9uVGFyZ2V0IiwicGFyYW1ldGVyTmFtZSIsInBhcmFtZXRlckluZGV4IiwiX3Rocm93SWZNZXRob2RQYXJhbWV0ZXIiLCJfdGFnUGFyYW1ldGVyT3JQcm9wZXJ0eSIsIm1ldGFkYXRhcyIsImR1cGxpY2F0ZSIsInNlZW5WYWx1ZXMiLCJnZXRGaXJzdEFycmF5RHVwbGljYXRlIiwibWQiLCJfZW5zdXJlTm9NZXRhZGF0YUtleUR1cGxpY2F0ZXMiLCJwYXJhbXNPclByb3BlcnRpZXNNZXRhZGF0YSIsInBhcmFtT3JQcm9wZXJ0eU1ldGFkYXRhIiwiY3JlYXRlVGFnZ2VkRGVjb3JhdG9yIiwidGFyZ2V0S2V5IiwiaW5kZXhPclByb3BlcnR5RGVzY3JpcHRvciIsInByb3BlcnR5TmFtZSIsInRhZ1Byb3BlcnR5IiwiX2RlY29yYXRlIiwiZGVjb3JhdGUiLCJfcGFyYW0iLCJwYXJhbUluZGV4IiwicGFyYW1ldGVySW5kZXhPclByb3BlcnR5IiwiaW5qZWN0YWJsZSIsInRhZ2dlZCIsImluamVjdEJhc2UiLCJjbGFzc05hbWUiLCJpbmplY3QiLCJvcHRpb25hbCIsIm11bHRpSW5qZWN0IiwidGFyZ2V0TmFtZSIsInByb3BlcnR5RXZlbnREZWNvcmF0b3IiLCJldmVudEtleSIsInBvc3RDb25zdHJ1Y3QiLCJwcmVEZXN0cm95IiwiTUVUQURBVEFfS0VZIl0sInNvdXJjZVJvb3QiOiIifQ==
|