Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@codebakery/origami

Package Overview
Dependencies
Maintainers
2
Versions
48
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@codebakery/origami - npm Package Compare versions

Comparing version 3.0.0-beta.3 to 3.0.0-beta.4

2

bundles/origami-forms.umd.min.js

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/forms")):"function"==typeof define&&define.amd?define("@codebakery/origami/forms",["exports","@angular/core","@angular/forms"],t):t((e.codebakery=e.codebakery||{},e.codebakery.origami=e.codebakery.origami||{},e.codebakery.origami.forms={}),e.ng.core,e.ng.forms)}(this,function(e,i,r){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)};var s={provide:r.NG_VALUE_ACCESSOR,useExisting:i.forwardRef(function(){return t}),multi:!0},t=function(o){function e(e,t,i,r){var n=o.call(this,i,e,r)||this;return n.elementRef=e,n.injector=t,n.validationErrorsKey="validate",n.isWritingValue=!1,n.isUpdatingValidity=!1,n}return function t(e,t){function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}(e,o),Object.defineProperty(e.prototype,"control",{get:function(){return this._control||(this._control=this.injector.get(r.NgControl).control),this._control},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this,i=this.elementRef.nativeElement;if(this.isValidatable(i)){var e=this.control;this.statusSub=e.statusChanges.subscribe(function(){"function"==typeof t.isInvalid?i.invalid=t.isInvalid(e):i.invalid=!!e.invalid&&!!e.dirty}),"function"==typeof i.validate&&e.setValidators(r.Validators.compose([e.validator,function(){return i.validate()?null:((e={})[t.validationErrorsKey]=!0,e);var e}]))}},e.prototype.ngOnDestroy=function(){this.statusSub&&this.statusSub.unsubscribe()},e.prototype.writeValue=function(e){this.isWritingValue=!0;var t=this.elementRef.nativeElement;if(this.isMultiSelectable(t)||this.isSelectable(t)){var i=this.getSelectableProperty(t,e);i&&(t[i]=e)}else this.isCheckedElement(t)?t.checked=Boolean(e):o.prototype.writeValue.call(this,e);this.isWritingValue=!1},e.prototype.onChangedEvent=function(e){if(!this.isWritingValue){var t=this.elementRef.nativeElement,i=!1;switch(e.type){case"selected-items-changed":case"selected-item-changed":i="selectedItems"===(r=this.getSelectableProperty(t))||"selectedItem"===r;break;case"selected-values-changed":case"selected-changed":i="selectedValues"===(r=this.getSelectableProperty(t))||"selected"===r;break;default:i=!0}if(i){var r=void 0;r=this.isMultiSelectable(t)||this.isSelectable(t)?this.getSelectableProperty(t):this.isCheckedElement(t)?"checked":"value",this.onChange(t[r])}}},e.prototype.onInvalidChanged=function(){if(!this.isUpdatingValidity){var e=this.elementRef.nativeElement;this.isValidatable(e)&&this.control&&this.control.invalid!==e.invalid&&(this.isUpdatingValidity=!0,this.control.updateValueAndValidity(),this.isUpdatingValidity=!1)}},e.prototype.isCheckedElement=function(e){return this.isPropertyDefined(e,"checked")},e.prototype.isSelectable=function(e){return this.isPropertyDefined(e,"selected")||this.isPropertyDefined(e,"selectedItem")},e.prototype.isMultiSelectable=function(e){return!!e&&!0===e.multi&&(this.isPropertyDefined(e,"selectedValues")||this.isPropertyDefined(e,"selectedValues"))},e.prototype.isValidatable=function(e){return this.isPropertyDefined(e,"invalid")},e.prototype.isPropertyDefined=function(e,t){return!!e&&t in e},e.prototype.getSelectableProperty=function(e,t){var i=this.isMultiSelectable(e),r=i?"selectedItems":"selectedItem",n=i?"selectedValues":"selected";if("boolean"!=typeof this.useSelectableValueProp){var o=r in e,s=n in e;if(o&&!s)this.useSelectableValueProp=!0;else if(!o&&s)this.useSelectableValueProp=!1;else{if(null==t)return undefined;var a=e[r];try{e[r]=t}catch(l){}this.useSelectableValueProp=e[r]===t,e[r]=a}}return this.useSelectableValueProp?r:n},e.decorators=[{type:i.Directive,args:[{selector:"[ngModel][origami],[formControlName][origami],[formControl][origami]",providers:[s]}]}],e.ctorParameters=function(){return[{type:i.ElementRef},{type:i.Injector},{type:i.Renderer2},{type:Boolean,decorators:[{type:i.Optional},{type:i.Inject,args:[r.COMPOSITION_BUFFER_MODE]}]}]},e.propDecorators={isInvalid:[{type:i.Input}],validationErrorsKey:[{type:i.Input}],onChangedEvent:[{type:i.HostListener,args:["selected-items-changed",["$event"]]},{type:i.HostListener,args:["selected-item-changed",["$event"]]},{type:i.HostListener,args:["selected-values-changed",["$event"]]},{type:i.HostListener,args:["selected-changed",["$event"]]},{type:i.HostListener,args:["checked-changed",["$event"]]},{type:i.HostListener,args:["value-changed",["$event"]]}],onInvalidChanged:[{type:i.HostListener,args:["invalid-changed"]}]},e}(r.DefaultValueAccessor),o=function(){function e(){}return e.decorators=[{type:i.NgModule,args:[{declarations:[t],exports:[t]}]}],e}();e.OrigamiFormsModule=o,e.ORIGAMI_CONTROL_VALUE_ACCESSOR=s,e.OrigamiControlValueAccessor=t,Object.defineProperty(e,"__esModule",{value:!0})});
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/forms")):"function"==typeof define&&define.amd?define("@codebakery/origami/forms",["exports","@angular/core","@angular/forms"],t):t((e.codebakery=e.codebakery||{},e.codebakery.origami=e.codebakery.origami||{},e.codebakery.origami.forms={}),e.ng.core,e.ng.forms)}(this,function(e,i,n){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i])})(e,t)};var a={provide:n.NG_VALUE_ACCESSOR,useExisting:i.forwardRef(function(){return t}),multi:!0},t=function(o){function e(e,t,i,n){var r=o.call(this,i,e,n)||this;return r.elementRef=e,r.injector=t,r.renderer=i,r.validationErrorsKey="validate",r.isWritingValue=!1,r.ignoreInvalidChanges=!1,r}return function t(e,t){function i(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}(e,o),Object.defineProperty(e.prototype,"control",{get:function(){return this._control||(this._control=this.injector.get(n.NgControl).control),this._control},enumerable:!0,configurable:!0}),e.prototype.ngAfterViewInit=function(){var t=this,i=this.elementRef.nativeElement;if(this.isValidatable(i)){var e=this.control;this.statusSub=e.statusChanges.subscribe(function(){"function"==typeof t.isInvalid?i.invalid=t.isInvalid(e):i.invalid=!!e.invalid&&!!e.dirty}),this.shouldUseValidate(i)&&e.setValidators(n.Validators.compose([e.validator,function(){return i.validate()?null:((e={})[t.validationErrorsKey]=!0,e);var e}]))}},e.prototype.ngOnDestroy=function(){this.statusSub&&this.statusSub.unsubscribe()},e.prototype.writeValue=function(e){this.isWritingValue=!0;var t=this.elementRef.nativeElement;if(this.isMultiSelectable(t)||this.isSelectable(t)){var i=this.getSelectableProperty(t,e);i&&(t[i]=e)}else this.isCheckedElement(t)?t.checked=Boolean(e):o.prototype.writeValue.call(this,e);this.isWritingValue=!1},e.prototype.onChangedEvent=function(e){if(!this.isWritingValue){var t=this.elementRef.nativeElement,i=!1;switch(e.type){case"selected-items-changed":case"selected-item-changed":i="selectedItems"===(n=this.getSelectableProperty(t))||"selectedItem"===n;break;case"selected-values-changed":case"selected-changed":i="selectedValues"===(n=this.getSelectableProperty(t))||"selected"===n;break;default:i=!0}if(i){var n=void 0;n=this.isMultiSelectable(t)||this.isSelectable(t)?this.getSelectableProperty(t):this.isCheckedElement(t)?"checked":"value",this.onChange(t[n])}}},e.prototype.onInvalidChanged=function(){if(!this.ignoreInvalidChanges){var e=this.elementRef.nativeElement;this.isValidatable(e)&&this.control&&this.control.invalid!==e.invalid&&(this.ignoreInvalidChanges=!0,this.control.updateValueAndValidity(),this.ignoreInvalidChanges=!1)}},e.prototype.isCheckedElement=function(e){return this.isPropertyDefined(e,"checked")},e.prototype.isSelectable=function(e){return this.isPropertyDefined(e,"selected")||this.isPropertyDefined(e,"selectedItem")},e.prototype.isMultiSelectable=function(e){return!!e&&!0===e.multi&&(this.isPropertyDefined(e,"selectedValues")||this.isPropertyDefined(e,"selectedValues"))},e.prototype.isValidatable=function(e){return this.isPropertyDefined(e,"invalid")},e.prototype.shouldUseValidate=function(e){if("function"==typeof e.validate){this.ignoreInvalidChanges=!0;var t=e.invalid;e.validate();var i=e.invalid;e.invalid=!e.invalid,e.validate();var n=e.invalid===i;return e.invalid=t,this.ignoreInvalidChanges=!1,n}return!1},e.prototype.isPropertyDefined=function(e,t){return!!e&&t in e},e.prototype.getSelectableProperty=function(e,t){var i=this.isMultiSelectable(e),n=i?"selectedItems":"selectedItem",r=i?"selectedValues":"selected";if("boolean"!=typeof this.useSelectableValueProp){var o=n in e,a=r in e;if(o&&!a)this.useSelectableValueProp=!0;else if(!o&&a)this.useSelectableValueProp=!1;else{if(null==t)return undefined;var s=e[n];try{e[n]=t}catch(l){}this.useSelectableValueProp=e[n]===t,e[n]=s}}return this.useSelectableValueProp?n:r},e.decorators=[{type:i.Directive,args:[{selector:"[ngModel][origami],[formControlName][origami],[formControl][origami]",providers:[a]}]}],e.ctorParameters=function(){return[{type:i.ElementRef},{type:i.Injector},{type:i.Renderer2},{type:Boolean,decorators:[{type:i.Optional},{type:i.Inject,args:[n.COMPOSITION_BUFFER_MODE]}]}]},e.propDecorators={isInvalid:[{type:i.Input}],validationErrorsKey:[{type:i.Input}],onChangedEvent:[{type:i.HostListener,args:["selected-items-changed",["$event"]]},{type:i.HostListener,args:["selected-item-changed",["$event"]]},{type:i.HostListener,args:["selected-values-changed",["$event"]]},{type:i.HostListener,args:["selected-changed",["$event"]]},{type:i.HostListener,args:["checked-changed",["$event"]]},{type:i.HostListener,args:["value-changed",["$event"]]}],onInvalidChanged:[{type:i.HostListener,args:["invalid-changed"]}]},e}(n.DefaultValueAccessor),o=function(){function e(){}return e.decorators=[{type:i.NgModule,args:[{declarations:[t],exports:[t]}]}],e}();e.OrigamiFormsModule=o,e.ORIGAMI_CONTROL_VALUE_ACCESSOR=a,e.OrigamiControlValueAccessor=t,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=origami-forms.umd.min.js.map

@@ -105,2 +105,3 @@ /**

this.injector = injector;
this.renderer = renderer;
/**

@@ -122,6 +123,6 @@ * The key to use when reporting that an element's `validate()` function

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
*/
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -160,7 +161,7 @@ /**

// validity
if (typeof element.validate === 'function') {
if (this.shouldUseValidate(element)) {
control.setValidators(Validators.compose([
control.validator,
() => {
if (/** @type {?} */ ((element.validate))()) {
if (element.validate()) {
return null;

@@ -275,3 +276,3 @@ }

onInvalidChanged() {
if (!this.isUpdatingValidity) {
if (!this.ignoreInvalidChanges) {
/** @type {?} */

@@ -282,5 +283,5 @@ const element = this.elementRef.nativeElement;

this.control.invalid !== element.invalid) {
this.isUpdatingValidity = true;
this.ignoreInvalidChanges = true;
this.control.updateValueAndValidity();
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -330,2 +331,36 @@ }

/**
* @param {?} element
* @return {?}
*/
shouldUseValidate(element) {
if (typeof element.validate === 'function') {
// Some element's (such as `<vaadin-text-field>`) may not actually mutate
// the `invalid` property when `validate()` is called. In these
// situations, it's possible for Angular to set an element as invalid and
// never be able to recover since the element's `validate()` will always
// report it is invalid.
//
// In these situations, Origami should ignore the element's validate()
// function.
this.ignoreInvalidChanges = true;
/** @type {?} */
const wasInvalid = element.invalid;
// If the element does mutate `invalid`, ask it to do so first to get a
// baseline.
element.validate();
/** @type {?} */
const expected = element.invalid;
element.invalid = !element.invalid;
element.validate();
/** @type {?} */
const validateMutatesInvalid = element.invalid === expected;
element.invalid = wasInvalid;
this.ignoreInvalidChanges = false;
return validateMutatesInvalid;
}
else {
return false;
}
}
/**
* Determines whether or not a property is defined anywhere in the provided

@@ -442,7 +477,7 @@ * element's prototype chain.

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
* @type {?}
*/
OrigamiControlValueAccessor.prototype.isUpdatingValidity;
OrigamiControlValueAccessor.prototype.ignoreInvalidChanges;
/**

@@ -464,4 +499,6 @@ * Indicates whether or not to use the value property or index property for a

OrigamiControlValueAccessor.prototype.injector;
/** @type {?} */
OrigamiControlValueAccessor.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUVSLFNBQVMsRUFDVCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ3hCLGFBQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixNQUFNLGtDQUFtQyxTQUFRLG9CQUFvQjs7Ozs7OztJQXlEbkUsWUFDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBRXhCLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBUHRDLGVBQVUsR0FBVixVQUFVO1FBQ1AsYUFBUSxHQUFSLFFBQVEsQ0FBVTs7Ozs7Ozs7bUNBMUNSLFVBQVU7Ozs7Ozs4QkFzQlAsS0FBSzs7Ozs7O2tDQU1ELEtBQUs7S0FxQmpDOzs7OztJQTVDRCxJQUFJLE9BQU87UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxzQkFBRyxtQkFB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RUFDTixzRUFBc0U7Z0JBQ3hFLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2FBQzVDOzs7O1lBN0dDLFVBQVU7WUFHVixRQUFRO1lBS1IsU0FBUzswQ0FtS04sUUFBUSxZQUNSLE1BQU0sU0FBQyx1QkFBdUI7Ozt3QkF2RGhDLEtBQUs7a0NBU0wsS0FBSzs2QkErSEwsWUFBWSxTQUFDLHdCQUF3QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2pELFlBQVksU0FBQyx1QkFBdUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNoRCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDbEQsWUFBWSxTQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzNDLFlBQVksU0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMxQyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOytCQXFEeEMsWUFBWSxTQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgUHJvdmlkZXIsXG4gIFJlbmRlcmVyMixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFLFxuICBEZWZhdWx0VmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIE5nQ29udHJvbCxcbiAgVmFsaWRhdG9ycyxcbiAgQWJzdHJhY3RDb250cm9sXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgYSBjaGVja2JveC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja2VkRWxlbWVudExpa2Uge1xuICBjaGVja2VkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RhYmxlTGlrZSB7XG4gIHNlbGVjdGVkPzogc3RyaW5nIHwgbnVtYmVyO1xuICBzZWxlY3RlZEl0ZW0/OiBhbnk7XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gIHNlbGVjdGVkVmFsdWVzPzogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcbiAgc2VsZWN0ZWRJdGVtcz86IGFueVtdO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0YWJsZUxpa2Uge1xuICBpbnZhbGlkPzogYm9vbGVhbjtcbiAgdmFsaWRhdGU/KCk6IHZvaWQ7XG59XG5cbi8qKlxuICogT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIHByb3ZpZGVyLlxuICovXG5leHBvcnQgY29uc3QgT1JJR0FNSV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBQcm92aWRlciA9IHtcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciksXG4gIG11bHRpOiB0cnVlXG59O1xuXG4vKipcbiAqIEEgdmFsdWUgYWNjZXNzb3IgZm9yIGBuZ01vZGVsYCwgYGZvcm1Db250cm9sYCwgYW5kIGBmb3JtQ29udHJvbE5hbWVgLCBvblxuICogY3VzdG9tIGVsZW1lbnRzLiBJbiBhZGRpdGlvbiB0byBvbmUgb2YgdGhlIGFib3ZlIGRpcmVjdGl2ZXMsIGBvcmlnYW1pYFxuICogc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50IHRvIGRlbm90ZSB0aGF0IHRoaXMgdmFsdWUgYWNjZXNzb3Igc2hvdWxkXG4gKiBjb250cm9sIGl0LlxuICpcbiAqIEV4YW1wbGU6IGA8cGFwZXItaW5wdXQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIG9yaWdhbWk+PC9wYXBlci1pbnB1dD5gXG4gKlxuICogVGhlIGNvbm5lY3RlZCBlbGVtZW50IHNob3VsZCBpbXBsZW1lbnQgb25lIG9mIHRoZSBiZWxvd1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBjaGVja2VkYCBhcyBhIGJvb2xlYW4gZm9yIGNoZWNrYm94LWxpa2UgZWxlbWVudHMuXG4gKiAtIGBzZWxlY3RlZGAgZm9yIHNpbmdsZSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGluZGV4IG9yIHN0cmluZ1xuICogICBuYW1lIGF0dHJpYnV0ZS5cbiAqIC0gYHNlbGVjdGVkSXRlbWAgZm9yIHNpbmdsZSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKiAtIGBzZWxlY3RlZFZhbHVlc2AgZm9yIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gYXJyYXkgb2ZcbiAqICAgaW5kaWNlcyBvciBzdHJpbmcgbmFtZSBhdHRyaWJ1dGVzLlxuICogLSBgc2VsZWN0ZWRJdGVtc2AgZm9yIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gYXJyYXkgb2YgYW55XG4gKiAgIHR5cGUuXG4gKiAtIGB2YWx1ZWAgZm9yIGFueSBiYXNpYyBmb3JtIGVsZW1lbnQuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqXG4gKiBGb3Igc2VsZWN0YWJsZSBhbmQgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cywgdGhlIGF0dHJpYnV0ZSBgdXNlS2V5YCBzaG91bGRcbiAqIGJlIHNwZWNpZmllZCBpZiB0aGUgY29udHJvbCBiaW5kaW5ncyBhbiBpbmRleCBvciBuYW1lIHZhbHVlIHRvIHRoZSBlbGVtZW50XG4gKiBpbnN0ZWFkIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBBZGRpdGlvbmFsbHksIGFuIGVsZW1lbnQgbWF5IGltcGxlbWVudCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGRpc2FibGVkYCBhcyBhIGJvb2xlYW5cbiAqIC0gYGludmFsaWRgIGFzIGEgYm9vbGVhbiB0byBpbmRpY2F0ZSB2YWxpZGl0eVxuICogLSBgdmFsaWRhdGUoKWAgYXMgYSBmdW5jdGlvbiB0byBydW4gY3VzdG9tIHZhbGlkYXRpb25cbiAqXG4gKiBUbyBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlc2UgZXZlbnRzLCBhbiBlbGVtZW50IHNob3VsZCBpbXBsZW1lbnQgb25lIG9yXG4gKiBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIHRvIG5vdGlmeSBBbmd1bGFyIG9mIGFueSB1cGRhdGVzLlxuICpcbiAqIC0gYGlucHV0YCAtIHdpbGwgdXBkYXRlIGFueSBvZiB0aGUgYWJvdmUgcHJvcGVydGllc1xuICogLSBgYmx1cmBcbiAqIC0gYGNoZWNrZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW1zLWNoYW5nZWRgXG4gKiAtIGB2YWx1ZS1jaGFuZ2VkYFxuICogLSBgaW52YWxpZC1jaGFuZ2VkYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgJ1tuZ01vZGVsXVtvcmlnYW1pXSxbZm9ybUNvbnRyb2xOYW1lXVtvcmlnYW1pXSxbZm9ybUNvbnRyb2xdW29yaWdhbWldJyxcbiAgcHJvdmlkZXJzOiBbT1JJR0FNSV9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgZXh0ZW5kcyBEZWZhdWx0VmFsdWVBY2Nlc3NvclxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGxvZ2ljIHRvIGRldGVybWluZSB3aGF0IHRvIHNldCBhbiBlbGVtZW50J3MgYGludmFsaWRgXG4gICAqIHByb3BlcnR5IHRvIGdpdmVuIHRoZSBwcm92aWRlZCBgQWJzdHJhY3RDb250cm9sYC4gVGhlIGRlZmF1bHQgaXMgdG8gc2V0IHRoZVxuICAgKiBlbGVtZW50IGFzIGBpbnZhbGlkYCB3aGVuZXZlciB0aGUgY29udHJvbCBpcyBib3RoIGludmFsaWQgYW5kIGRpcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgaXNJbnZhbGlkPzogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gcmVwb3J0aW5nIHRoYXQgYW4gZWxlbWVudCdzIGB2YWxpZGF0ZSgpYCBmdW5jdGlvblxuICAgKiByZXR1cm5zIGZhbHNlLiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGNvbnRyb2wncyBgZXJyb3JzYCBvYmplY3Qgd2lsbCBiZVxuICAgKiBzZXQgd2l0aCB0aGlzIGtleSBhbmQgYSB2YWx1ZSBvZiB0cnVlLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBrZXkgaXMgXCJ2YWxpZGF0ZVwiLlxuICAgKi9cbiAgQElucHV0KClcbiAgdmFsaWRhdGlvbkVycm9yc0tleSA9ICd2YWxpZGF0ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBgQWJzdHJhY3RDb250cm9sYCBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBnZXQgY29udHJvbCgpOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fY29udHJvbCkge1xuICAgICAgdGhpcy5fY29udHJvbCA9ICg8TmdDb250cm9sPnRoaXMuaW5qZWN0b3IuZ2V0KE5nQ29udHJvbCkpLmNvbnRyb2whO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9jb250cm9sO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgTmdDb250cm9sJ3Mgc3RhdHVzQ2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0dXNTdWI/OiB7IHVuc3Vic2NyaWJlKCk6IHZvaWQgfTtcbiAgLyoqXG4gICAqIE1vc3QgY3VzdG9tIGVsZW1lbnRzIHByb3BlcnR5IHdpbGwgZW1pdCBhIGBwcm9wZXJ0eS1jaGFuZ2VkYCBldmVudCB3aGVuXG4gICAqIHRoZWlyIHZhbHVlIGlzIHNldC4gVGhpcyBmbGFnIGluZm9ybXMgdGhlIHZhbHVlIGFjY2Vzc29yIHRvIGlnbm9yZSB0aGVcbiAgICogbmV4dCBldmVudCB3aGlsZSBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIHdyaXRpbmcgYSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEZsYWcgdGhhdCBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aGF0IGl0IGlzIGN1cnJlbnRseSB1cGRhdGluZyBhblxuICAgKiBlbGVtZW50J3MgdmFsaWRpdHkgYW5kIHNob3VsZCBpZ25vcmUgYWRkaXRpb25hbCBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlc1xuICAgKiB1bnRpbCBpdCBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHByaXZhdGUgaXNVcGRhdGluZ1ZhbGlkaXR5ID0gZmFsc2U7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBvciBpbmRleCBwcm9wZXJ0eSBmb3IgYVxuICAgKiBzZWxlY3Qgb3IgbXVsaXQtc2VsZWN0IGVsZW1lbnQuIFdoZW4gdW5kZWZpbmVkLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGVcbiAgICogZGV0ZXJtaW5hdGlvbiBvZiB3aGljaCBwcm9wZXJ0eSB0byB1c2UgaGFzIG5vdCBvY2N1cnJlZCB5ZXQuXG4gICAqL1xuICBwcml2YXRlIHVzZVNlbGVjdGFibGVWYWx1ZVByb3A/OiBib29sZWFuO1xuICAvKipcbiAgICogQ2FjaGVkIGBjb250cm9sYCB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFKVxuICAgIGNvbXBvc2l0aW9uTW9kZTogYm9vbGVhblxuICApIHtcbiAgICBzdXBlcihyZW5kZXJlciwgZWxlbWVudFJlZiwgY29tcG9zaXRpb25Nb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdGhhdCB3aWxsIGNvbm5lY3QgYW4gZWxlbWVudCdzIHZhbGlkYXRhYmxlIHByb3BlcnRpZXNcbiAgICogKGlmIHRoZXkgYXJlIGltcGxlbWVudGVkKSB0byB0aGUgQW5ndWxhciBjb250cm9sLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAvLyBUaGUgY29udHJvbCB3aWxsIGFsd2F5cyBiZSBzZXQgYnkgbmdBZnRlclZpZXdJbml0IGR1ZSB0byB0aGUgbmF0dXJlIG9mXG4gICAgICAvLyB0aGUgZGlyZWN0aXZlJ3Mgc2VsZWN0b3JzXG4gICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb250cm9sITtcbiAgICAgIC8vIEFsbG93cyBBbmd1bGFyIHZhbGlkYXRvcnMgdG8gdXBkYXRlIHRoZSBjdXN0b20gZWxlbWVudCdzIHZhbGlkaXR5XG4gICAgICB0aGlzLnN0YXR1c1N1YiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcyEuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlzSW52YWxpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHRoaXMuaXNJbnZhbGlkKGNvbnRyb2wpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICEhY29udHJvbC5pbnZhbGlkICYmICEhY29udHJvbC5kaXJ0eTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBjdXN0b20gZWxlbWVudCB2YWxpZGF0ZSBmdW5jdGlvbiB0byB1cGRhdGUgQW5ndWxhciBjb250cm9sJ3NcbiAgICAgIC8vIHZhbGlkaXR5XG4gICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29udHJvbC5zZXRWYWxpZGF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICBjb250cm9sLnZhbGlkYXRvcixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudmFsaWRhdGUhKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkgJiZcbiAgICAgICAgdGhpcy5jb250cm9sICYmXG4gICAgICAgIHRoaXMuY29udHJvbC5pbnZhbGlkICE9PSBlbGVtZW50LmludmFsaWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IHRydWU7XG4gICAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBRUwsUUFBUSxFQUVSLFNBQVMsRUFDVCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBRVgsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQ3hCLGFBQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixNQUFNLGtDQUFtQyxTQUFRLG9CQUFvQjs7Ozs7OztJQXlEbkUsWUFDUyxZQUNHLFFBQWtCLEVBQ2xCLFFBQW1CLEVBRzdCLGVBQXdCO1FBRXhCLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBUHRDLGVBQVUsR0FBVixVQUFVO1FBQ1AsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFXOzs7Ozs7OzttQ0EzQ1QsVUFBVTs7Ozs7OzhCQXNCUCxLQUFLOzs7Ozs7b0NBTUMsS0FBSztLQXFCbkM7Ozs7O0lBNUNELElBQUksT0FBTztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2xC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QUMsY0FDMUMsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzsrQkFxRHhDLFlBQVksU0FBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzIHVudGlsIGl0IGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaWdub3JlSW52YWxpZENoYW5nZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIHNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgeyB2YWxpZGF0ZSgpOiB2b2lkIH0ge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZSBlbGVtZW50J3MgKHN1Y2ggYXMgYDx2YWFkaW4tdGV4dC1maWVsZD5gKSBtYXkgbm90IGFjdHVhbGx5IG11dGF0ZVxuICAgICAgLy8gdGhlIGBpbnZhbGlkYCBwcm9wZXJ0eSB3aGVuIGB2YWxpZGF0ZSgpYCBpcyBjYWxsZWQuIEluIHRoZXNlXG4gICAgICAvLyBzaXR1YXRpb25zLCBpdCdzIHBvc3NpYmxlIGZvciBBbmd1bGFyIHRvIHNldCBhbiBlbGVtZW50IGFzIGludmFsaWQgYW5kXG4gICAgICAvLyBuZXZlciBiZSBhYmxlIHRvIHJlY292ZXIgc2luY2UgdGhlIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgd2lsbCBhbHdheXNcbiAgICAgIC8vIHJlcG9ydCBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy9cbiAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIE9yaWdhbWkgc2hvdWxkIGlnbm9yZSB0aGUgZWxlbWVudCdzIHZhbGlkYXRlKClcbiAgICAgIC8vIGZ1bmN0aW9uLlxuICAgICAgdGhpcy5pZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBjb25zdCB3YXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkO1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgZG9lcyBtdXRhdGUgYGludmFsaWRgLCBhc2sgaXQgdG8gZG8gc28gZmlyc3QgdG8gZ2V0IGFcbiAgICAgIC8vIGJhc2VsaW5lLlxuICAgICAgZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgLy8gV2hlbiBgdmFsaWRhdGUoKWAgaXMgY2FsbGVkIG5leHQsIHdlIHdpbGwga25vdyBpZiB0aGUgZWxlbWVudCBtdXRhdGVzXG4gICAgICAvLyBgaW52YWxpZGAgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIG1hdGNoZXMgYGludmFsaWRgIGFmdGVyIGNoYW5naW5nXG4gICAgICAvLyBgaW52YWxpZGAgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGVsZW1lbnQuaW52YWxpZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICFlbGVtZW50LmludmFsaWQ7XG4gICAgICBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBjb25zdCB2YWxpZGF0ZU11dGF0ZXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkID09PSBleHBlY3RlZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHdhc0ludmFsaWQ7XG4gICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsaWRhdGVNdXRhdGVzSW52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ==

@@ -101,2 +101,3 @@ /**

_this.injector = injector;
_this.renderer = renderer;
/**

@@ -118,6 +119,6 @@ * The key to use when reporting that an element's `validate()` function

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
*/
_this.isUpdatingValidity = false;
_this.ignoreInvalidChanges = false;
return _this;

@@ -174,7 +175,7 @@ }

// validity
if (typeof element.validate === 'function') {
if (this.shouldUseValidate(element)) {
control_1.setValidators(Validators.compose([
control_1.validator,
function () {
if (/** @type {?} */ ((element.validate))()) {
if (element.validate()) {
return null;

@@ -344,3 +345,3 @@ }

function () {
if (!this.isUpdatingValidity) {
if (!this.ignoreInvalidChanges) {
/** @type {?} */

@@ -351,5 +352,5 @@ var element = this.elementRef.nativeElement;

this.control.invalid !== element.invalid) {
this.isUpdatingValidity = true;
this.ignoreInvalidChanges = true;
this.control.updateValueAndValidity();
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -443,2 +444,40 @@ }

/**
* @param {?} element
* @return {?}
*/
OrigamiControlValueAccessor.prototype.shouldUseValidate = /**
* @param {?} element
* @return {?}
*/
function (element) {
if (typeof element.validate === 'function') {
// Some element's (such as `<vaadin-text-field>`) may not actually mutate
// the `invalid` property when `validate()` is called. In these
// situations, it's possible for Angular to set an element as invalid and
// never be able to recover since the element's `validate()` will always
// report it is invalid.
//
// In these situations, Origami should ignore the element's validate()
// function.
this.ignoreInvalidChanges = true;
/** @type {?} */
var wasInvalid = element.invalid;
// If the element does mutate `invalid`, ask it to do so first to get a
// baseline.
element.validate();
/** @type {?} */
var expected = element.invalid;
element.invalid = !element.invalid;
element.validate();
/** @type {?} */
var validateMutatesInvalid = element.invalid === expected;
element.invalid = wasInvalid;
this.ignoreInvalidChanges = false;
return validateMutatesInvalid;
}
else {
return false;
}
};
/**
* Determines whether or not a property is defined anywhere in the provided

@@ -575,7 +614,7 @@ * element's prototype chain.

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
* @type {?}
*/
OrigamiControlValueAccessor.prototype.isUpdatingValidity;
OrigamiControlValueAccessor.prototype.ignoreInvalidChanges;
/**

@@ -597,4 +636,6 @@ * Indicates whether or not to use the value property or index property for a

OrigamiControlValueAccessor.prototype.injector;
/** @type {?} */
OrigamiControlValueAccessor.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLFFBQVEsRUFFUixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0N4QixXQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsMkJBQTJCLEVBQTNCLENBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0MsdURBQW9CO0lBeURuRSxxQ0FDUyxZQUNHLFFBQWtCLEVBQzVCLFFBQW1CLEVBR25CLGVBQXdCO1FBTjFCLFlBUUUsa0JBQU0sUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsU0FDN0M7UUFSUSxnQkFBVSxHQUFWLFVBQVU7UUFDUCxjQUFRLEdBQVIsUUFBUSxDQUFVOzs7Ozs7OztvQ0ExQ1IsVUFBVTs7Ozs7OytCQXNCUCxLQUFLOzs7Ozs7bUNBTUQsS0FBSzs7S0FxQmpDO0lBNUNELHNCQUFJLGdEQUFPO1FBSFg7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFFBQVEs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QkFBc0IsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDO2dCQUMzRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsYUFBYSxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7OztnQkEvVDlELFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQ04sc0VBQXNFO29CQUN4RSxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQztpQkFDNUM7Ozs7Z0JBN0dDLFVBQVU7Z0JBR1YsUUFBUTtnQkFLUixTQUFTOzhDQW1LTixRQUFRLFlBQ1IsTUFBTSxTQUFDLHVCQUF1Qjs7OzRCQXZEaEMsS0FBSztzQ0FTTCxLQUFLO2lDQStITCxZQUFZLFNBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDakQsWUFBWSxTQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2hELFlBQVksU0FBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNsRCxZQUFZLFNBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDM0MsWUFBWSxTQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQzFDLFlBQVksU0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7bUNBcUR4QyxZQUFZLFNBQUMsaUJBQWlCOztzQ0ExVGpDO0VBaUhpRCxvQkFBb0I7U0FBeEQsMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBQcm92aWRlcixcbiAgUmVuZGVyZXIyLFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ09NUE9TSVRJT05fQlVGRkVSX01PREUsXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgTmdDb250cm9sLFxuICBWYWxpZGF0b3JzLFxuICBBYnN0cmFjdENvbnRyb2xcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBhIGNoZWNrYm94LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gIGNoZWNrZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWQ/OiBzdHJpbmcgfCBudW1iZXI7XG4gIHNlbGVjdGVkSXRlbT86IGFueTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgc2VsZWN0ZWRWYWx1ZXM/OiBBcnJheTxzdHJpbmcgfCBudW1iZXI+O1xuICBzZWxlY3RlZEl0ZW1zPzogYW55W107XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRhYmxlTGlrZSB7XG4gIGludmFsaWQ/OiBib29sZWFuO1xuICB2YWxpZGF0ZT8oKTogdm9pZDtcbn1cblxuLyoqXG4gKiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbi8qKlxuICogQSB2YWx1ZSBhY2Nlc3NvciBmb3IgYG5nTW9kZWxgLCBgZm9ybUNvbnRyb2xgLCBhbmQgYGZvcm1Db250cm9sTmFtZWAsIG9uXG4gKiBjdXN0b20gZWxlbWVudHMuIEluIGFkZGl0aW9uIHRvIG9uZSBvZiB0aGUgYWJvdmUgZGlyZWN0aXZlcywgYG9yaWdhbWlgXG4gKiBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGVsZW1lbnQgdG8gZGVub3RlIHRoYXQgdGhpcyB2YWx1ZSBhY2Nlc3NvciBzaG91bGRcbiAqIGNvbnRyb2wgaXQuXG4gKlxuICogRXhhbXBsZTogYDxwYXBlci1pbnB1dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgb3JpZ2FtaT48L3BhcGVyLWlucHV0PmBcbiAqXG4gKiBUaGUgY29ubmVjdGVkIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb2YgdGhlIGJlbG93XG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYGNoZWNrZWRgIGFzIGEgYm9vbGVhbiBmb3IgY2hlY2tib3gtbGlrZSBlbGVtZW50cy5cbiAqIC0gYHNlbGVjdGVkYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG11c3QgYmUgYW4gaW5kZXggb3Igc3RyaW5nXG4gKiAgIG5hbWUgYXR0cmlidXRlLlxuICogLSBgc2VsZWN0ZWRJdGVtYCBmb3Igc2luZ2xlIHNlbGVjdGFibGUgZWxlbWVudHMuIEl0IG1heSBiZSBhbnkgdHlwZS5cbiAqIC0gYHNlbGVjdGVkVmFsdWVzYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZlxuICogICBpbmRpY2VzIG9yIHN0cmluZyBuYW1lIGF0dHJpYnV0ZXMuXG4gKiAtIGBzZWxlY3RlZEl0ZW1zYCBmb3IgbXVsdGkgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBhcnJheSBvZiBhbnlcbiAqICAgdHlwZS5cbiAqIC0gYHZhbHVlYCBmb3IgYW55IGJhc2ljIGZvcm0gZWxlbWVudC4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICpcbiAqIEZvciBzZWxlY3RhYmxlIGFuZCBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLCB0aGUgYXR0cmlidXRlIGB1c2VLZXlgIHNob3VsZFxuICogYmUgc3BlY2lmaWVkIGlmIHRoZSBjb250cm9sIGJpbmRpbmdzIGFuIGluZGV4IG9yIG5hbWUgdmFsdWUgdG8gdGhlIGVsZW1lbnRcbiAqIGluc3RlYWQgb2YgYW4gb2JqZWN0LlxuICpcbiAqIEFkZGl0aW9uYWxseSwgYW4gZWxlbWVudCBtYXkgaW1wbGVtZW50IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmdcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgZGlzYWJsZWRgIGFzIGEgYm9vbGVhblxuICogLSBgaW52YWxpZGAgYXMgYSBib29sZWFuIHRvIGluZGljYXRlIHZhbGlkaXR5XG4gKiAtIGB2YWxpZGF0ZSgpYCBhcyBhIGZ1bmN0aW9uIHRvIHJ1biBjdXN0b20gdmFsaWRhdGlvblxuICpcbiAqIFRvIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGVzZSBldmVudHMsIGFuIGVsZW1lbnQgc2hvdWxkIGltcGxlbWVudCBvbmUgb3JcbiAqIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBldmVudHMgdG8gbm90aWZ5IEFuZ3VsYXIgb2YgYW55IHVwZGF0ZXMuXG4gKlxuICogLSBgaW5wdXRgIC0gd2lsbCB1cGRhdGUgYW55IG9mIHRoZSBhYm92ZSBwcm9wZXJ0aWVzXG4gKiAtIGBibHVyYFxuICogLSBgY2hlY2tlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLWl0ZW0tY2hhbmdlZGBcbiAqIC0gYHNlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZGBcbiAqIC0gYHZhbHVlLWNoYW5nZWRgXG4gKiAtIGBpbnZhbGlkLWNoYW5nZWRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAnW25nTW9kZWxdW29yaWdhbWldLFtmb3JtQ29udHJvbE5hbWVdW29yaWdhbWldLFtmb3JtQ29udHJvbF1bb3JpZ2FtaV0nLFxuICBwcm92aWRlcnM6IFtPUklHQU1JX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBleHRlbmRzIERlZmF1bHRWYWx1ZUFjY2Vzc29yXG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgbG9naWMgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gc2V0IGFuIGVsZW1lbnQncyBgaW52YWxpZGBcbiAgICogcHJvcGVydHkgdG8gZ2l2ZW4gdGhlIHByb3ZpZGVkIGBBYnN0cmFjdENvbnRyb2xgLiBUaGUgZGVmYXVsdCBpcyB0byBzZXQgdGhlXG4gICAqIGVsZW1lbnQgYXMgYGludmFsaWRgIHdoZW5ldmVyIHRoZSBjb250cm9sIGlzIGJvdGggaW52YWxpZCBhbmQgZGlydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBpc0ludmFsaWQ/OiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGtleSB0byB1c2Ugd2hlbiByZXBvcnRpbmcgdGhhdCBhbiBlbGVtZW50J3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uXG4gICAqIHJldHVybnMgZmFsc2UuIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgY29udHJvbCdzIGBlcnJvcnNgIG9iamVjdCB3aWxsIGJlXG4gICAqIHNldCB3aXRoIHRoaXMga2V5IGFuZCBhIHZhbHVlIG9mIHRydWUuXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGtleSBpcyBcInZhbGlkYXRlXCIuXG4gICAqL1xuICBASW5wdXQoKVxuICB2YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3ZhbGlkYXRlJztcblxuICAvKipcbiAgICogVGhlIGBBYnN0cmFjdENvbnRyb2xgIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudC5cbiAgICovXG4gIGdldCBjb250cm9sKCk6IEFic3RyYWN0Q29udHJvbCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9jb250cm9sKSB7XG4gICAgICB0aGlzLl9jb250cm9sID0gKDxOZ0NvbnRyb2w+dGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sKSkuY29udHJvbCE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbnRyb2w7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBOZ0NvbnRyb2wncyBzdGF0dXNDaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXR1c1N1Yj86IHsgdW5zdWJzY3JpYmUoKTogdm9pZCB9O1xuICAvKipcbiAgICogTW9zdCBjdXN0b20gZWxlbWVudHMgcHJvcGVydHkgd2lsbCBlbWl0IGEgYHByb3BlcnR5LWNoYW5nZWRgIGV2ZW50IHdoZW5cbiAgICogdGhlaXIgdmFsdWUgaXMgc2V0LiBUaGlzIGZsYWcgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdG8gaWdub3JlIHRoZVxuICAgKiBuZXh0IGV2ZW50IHdoaWxlIGl0IGlzIGluIHRoZSBtaWRkbGUgb2Ygd3JpdGluZyBhIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICAvKipcbiAgICogRmxhZyB0aGF0IGluZm9ybXMgdGhlIHZhbHVlIGFjY2Vzc29yIHRoYXQgaXQgaXMgY3VycmVudGx5IHVwZGF0aW5nIGFuXG4gICAqIGVsZW1lbnQncyB2YWxpZGl0eSBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzXG4gICAqIHVudGlsIGl0IGlzIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1VwZGF0aW5nVmFsaWRpdHkgPSBmYWxzZTtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIHZhbHVlIHByb3BlcnR5IG9yIGluZGV4IHByb3BlcnR5IGZvciBhXG4gICAqIHNlbGVjdCBvciBtdWxpdC1zZWxlY3QgZWxlbWVudC4gV2hlbiB1bmRlZmluZWQsIGl0IGluZGljYXRlcyB0aGF0IHRoZVxuICAgKiBkZXRlcm1pbmF0aW9uIG9mIHdoaWNoIHByb3BlcnR5IHRvIHVzZSBoYXMgbm90IG9jY3VycmVkIHlldC5cbiAgICovXG4gIHByaXZhdGUgdXNlU2VsZWN0YWJsZVZhbHVlUHJvcD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWNoZWQgYGNvbnRyb2xgIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgIGNvbnRyb2wudmFsaWRhdG9yLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC52YWxpZGF0ZSEoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IFt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldOiB0cnVlIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucy5cbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnN0YXR1c1N1Yikge1xuICAgICAgdGhpcy5zdGF0dXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgdmFsdWUgdG8gYSBjdXN0b20gZWxlbWVudCdzIGNvcnJlY3QgdmFsdWUgcHJvcGVydHksIGJhc2VkIG9uIHdoYXRcbiAgICoga2luZCBvZiBlbGVtZW50IHRoZSBkaXJlY3RpdmUgY29udHJvbHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gd3JpdGVcbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSB0cnVlO1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50LCB2YWx1ZSk7XG4gICAgICBpZiAocHJvcGVydHkpIHtcbiAgICAgICAgKDxhbnk+ZWxlbWVudClbcHJvcGVydHldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IEJvb2xlYW4odmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBjdXN0b20gZWxlbWVudCBldmVudHMgYW5kIG5vdGlmeSBBbmd1bGFyIG9mIGFueSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgdGhlIGNoYW5nZSBldmVudFxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW0tY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ2NoZWNrZWQtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3ZhbHVlLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBvbkNoYW5nZWRFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNXcml0aW5nVmFsdWUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbXMtY2hhbmdlZCc6XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW0tY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCc6XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZFZhbHVlcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgbGV0IHByb3BlcnR5OiBzdHJpbmc7XG4gICAgICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgLy8gcHJvcGVydHkgd2lsbCBiZSBkZWZpbmVkIGlmIHdlIHJlYWNoIHRoaXMgc2luY2UgY2hhbmdlZCBjYW4gb25seVxuICAgICAgICAgIC8vIGJlIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGRlZmluZWQgZm9yIHNlbGVjdGFibGUgZWxlbWVudHNcbiAgICAgICAgICBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpITtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9ICdjaGVja2VkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wZXJ0eSA9ICd2YWx1ZSc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEb24ndCB1c2UgYGV2ZW50LmRldGFpbC52YWx1ZWAsIHNpbmNlIHdlIGNhbm5vdCBhc3N1bWUgdGhhdCBhbGxcbiAgICAgICAgLy8gY2hhbmdlIGV2ZW50cyB3aWxsIHByb3ZpZGUgdGhhdC4gQWRkaXRpb25hbGx5LCBzb21lIGV2ZW50IGRldGFpbHNcbiAgICAgICAgLy8gbWF5IGJlIHNwbGljZXMgb2YgYW4gYXJyYXkgb3Igb2JqZWN0IGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoZWxlbWVudFtwcm9wZXJ0eV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzLiBTb21lIGVsZW1lbnRzLCBzdWNoIGFzXG4gICAqIGA8dmFhZGluLWRhdGUtcGlja2VyPmAgaGF2ZSBtdWx0aXBsZSBcInZhbHVlc1wiLiBTZXR0aW5nIHRoZSBwcmltYXJ5IHZhbHVlXG4gICAqIChleC4gdGhlIGRhdGUgc3RyaW5nKSBtYXkgcmVzdWx0IGluIGEgdGVtcG9yYXJpbHkgaW52YWxpZCBlbGVtZW50IHVudGlsXG4gICAqIHN1YnNlcXVlbnQgdmFsdWVzIChleC4gdGhlIHNlbGVjdGVkIGRhdGUpIGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBTaW5jZSB0aGlzIHZhbHVlIGFjY2Vzc29yIG9ubHkgbGlzdGVucyBmb3IgdmFsdWUgY2hhbmdlcywgaXQgbWF5IG5vdCBiZVxuICAgKiBub3RpZmllZCBvZiB0aGUgY2hhbmdlIGluIHZhbGlkaXR5LiBUaGlzIGxpc3RlbmVyIHdpbGwgbGlzdGVuIGZvciBhbnlcbiAgICogZXhwbGljaXR5IHZhbGlkaXR5IGNoYW5nZXMgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmUtZXZhbHVhdGUgYSBjb250cm9sJ3NcbiAgICogdmFsaWRpdHkgaWYgaXQgYW5kIHRoZSBlbGVtZW50J3MgdmFsaWRpdHkgYXJlIG91dCBvZiBzeW5jLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignaW52YWxpZC1jaGFuZ2VkJylcbiAgb25JbnZhbGlkQ2hhbmdlZCgpIHtcbiAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaXNVcGRhdGluZ1ZhbGlkaXR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIGNoZWNrYm94LWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnY2hlY2tlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1NlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkJykgfHxcbiAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkSXRlbScpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgbXVsdGkgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBNdWx0aVNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFlbGVtZW50ICYmXG4gICAgICBlbGVtZW50Lm11bHRpID09PSB0cnVlICYmXG4gICAgICAodGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSB8fFxuICAgICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHZhbGlkYXRhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc1ZhbGlkYXRhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgVmFsaWRhdGFibGVMaWtlIHtcbiAgICByZXR1cm4gdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnaW52YWxpZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFueXdoZXJlIGluIHRoZSBwcm92aWRlZFxuICAgKiBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHByb3BlcnR5IHRvIGNoZWNrIGZvclxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50OiBhbnksIHByb3BlcnR5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFlbGVtZW50ICYmIHByb3BlcnR5IGluIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzZWxlY3RhYmxlIG9yIG11bHRpLXNlbGVjdGFibGUgZWxlbWVudFxuICAgKiB0aGF0IHNob3VsZCBiZSB1cGRhdGVkLiBUaGlzIG1ldGhvZCB3aWxsIHVzZSBkZWZpbmVkIHByb3BlcnRpZXMgYW5kIHRoZVxuICAgKiB2YWx1ZSB0eXBlIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSBzaG91bGQgYmUgdXNlZC4gSWYgaXQgY2Fubm90XG4gICAqIGRldGVybWluZSB3aGljaCBwcm9wZXJ0eSB0byB1c2UsIGl0IHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBmb3JcbiAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgZm9yIHRoZSBlbGVtZW50J3MgcHJvcGVydHlcbiAgICogQHJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudDogYW55LCB2YWx1ZT86IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaXNNdWx0aSA9IHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCk7XG4gICAgY29uc3QgdmFsdWVQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZEl0ZW1zJyA6ICdzZWxlY3RlZEl0ZW0nO1xuICAgIGNvbnN0IGluZGV4UHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRWYWx1ZXMnIDogJ3NlbGVjdGVkJztcbiAgICBpZiAodHlwZW9mIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSBzaG91bGQgYmUgc2V0dGluZyB0aGUgaW5kZXggb3IgdmFsdWUgcHJvcGVydHkgZm9yXG4gICAgICAvLyBhIHNlbGVjdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgaGFzVmFsdWVQcm9wID0gdmFsdWVQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBjb25zdCBoYXNJbmRleFByb3AgPSBpbmRleFByb3AgaW4gZWxlbWVudDtcbiAgICAgIGlmIChoYXNWYWx1ZVByb3AgJiYgIWhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmICghaGFzVmFsdWVQcm9wICYmIGhhc0luZGV4UHJvcCkge1xuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gZWxlbWVudFt2YWx1ZVByb3BdO1xuICAgICAgICAvLyBXaGVuIHRoZSBlbGVtZW50IGhhcyBib3RoIHByb3BlcnRpZXMsIHRyeSB0byBzZXQgaXQgdG8gdGhlIHZhbHVlXG4gICAgICAgIC8vIHByb3BlcnR5IGZpcnN0LiBJZiBpdCBmYWlscywgdGhlbiB1c2UgdGhlIGluZGV4IHByb3BlcnR5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gQ291bGQgdGhyb3cgaWYgdGhlIHZhbHVlIGlzIGFuIHVuZXhwZWN0ZWQgdHlwZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSB2YWx1ZSB3ZSBzZXQgaXQgdG8gaXMgc3RpbGwgYWNjdXJhdGUuIElmIGl0J3NcbiAgICAgICAgLy8gbm90IHRoZW4gdGhlIGVsZW1lbnQgc2lsZW50bHkgcmVqZWN0ZWQgdGhlIG5ldyB2YWx1ZS5cbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZWxlbWVudFt2YWx1ZVByb3BdID09PSB2YWx1ZTtcbiAgICAgICAgZWxlbWVudFt2YWx1ZVByb3BdID0gcHJldmlvdXNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA/IHZhbHVlUHJvcCA6IGluZGV4UHJvcDtcbiAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AY29kZWJha2VyeS9vcmlnYW1pL2Zvcm1zLyIsInNvdXJjZXMiOlsic3JjL3ZhbHVlLWFjY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUVMLFFBQVEsRUFFUixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0N4QixXQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsMkJBQTJCLEVBQTNCLENBQTJCLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0MsdURBQW9CO0lBeURuRSxxQ0FDUyxZQUNHLFFBQWtCLEVBQ2xCLFFBQW1CLEVBRzdCLGVBQXdCO1FBTjFCLFlBUUUsa0JBQU0sUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsU0FDN0M7UUFSUSxnQkFBVSxHQUFWLFVBQVU7UUFDUCxjQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGNBQVEsR0FBUixRQUFRLENBQVc7Ozs7Ozs7O29DQTNDVCxVQUFVOzs7Ozs7K0JBc0JQLEtBQUs7Ozs7OztxQ0FNQyxLQUFLOztLQXFCbkM7SUE1Q0Qsc0JBQUksZ0RBQU87UUFIWDs7V0FFRzs7Ozs7UUFDSDtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxzQkFBRyxtQkFBWSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDLE9BQU8sRUFBQyxDQUFDO2FBQ3BFO1lBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3RCOzs7T0FBQTtJQXdDRDs7O09BR0c7Ozs7OztJQUNILHFEQUFlOzs7OztJQUFmO1FBQUEsaUJBZ0NDOztRQS9CQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUU7O1lBRy9CLElBQU0sU0FBTyxzQkFBRyxJQUFJLENBQUMsT0FBTyxHQUFFOztZQUU5QixJQUFJLENBQUMsU0FBUyxzQkFBRyxTQUFPLENBQUMsYUFBYSxHQUFFLFNBQVMsQ0FBQztnQkFDaEQsSUFBSSxPQUFPLEtBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUFFO29CQUN4QyxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBTyxDQUFDLENBQUM7aUJBQzNDO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLFNBQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQU8sQ0FBQyxLQUFLLENBQUM7aUJBQ3hEO2FBQ0YsQ0FBQyxDQUFDOzs7WUFJSCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDbkMsU0FBTyxDQUFDLGFBQWEsQ0FDbkIsVUFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDakIsU0FBTyxDQUFDLFNBQVM7b0JBQ2pCO3dCQUNFLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFOzRCQUN0QixPQUFPLElBQUksQ0FBQzt5QkFDYjs2QkFBTTs0QkFDTCxnQkFBUyxHQUFDLEtBQUksQ0FBQyxtQkFBbUIsSUFBRyxJQUFJLEtBQUc7eUJBQzdDOztxQkFDRjtpQkFDRixDQUFDLENBQ0gsQ0FBQzthQUNIO1NBQ0Y7S0FDRjtJQUVEOztPQUVHOzs7OztJQUNILGlEQUFXOzs7O0lBQVg7UUFDRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM5QjtLQUNGO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0gsZ0RBQVU7Ozs7Ozs7SUFBVixVQUFXLEtBQVU7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7O1FBQzNCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7O1lBQ2pFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osbUJBQU0sT0FBTyxFQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ2xDO1NBQ0Y7YUFBTSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQzthQUFNO1lBQ0wsaUJBQU0sVUFBVSxZQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7S0FDN0I7SUFFRDs7OztPQUlHOzs7Ozs7O0lBT0gsb0RBQWM7Ozs7OztJQU5kLFVBTWUsS0FBWTtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs7WUFDeEIsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7O1lBQzlDLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNwQixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xCLEtBQUssd0JBQXdCLENBQUM7Z0JBQzlCLEtBQUssdUJBQXVCLENBQUMsQ0FBQzs7b0JBQzVCLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckQsT0FBTyxHQUFHLFFBQVEsS0FBSyxlQUFlLElBQUksUUFBUSxLQUFLLGNBQWMsQ0FBQztvQkFDdEUsTUFBTTtpQkFDUDtnQkFDRCxLQUFLLHlCQUF5QixDQUFDO2dCQUMvQixLQUFLLGtCQUFrQixDQUFDLENBQUM7O29CQUN2QixJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JELE9BQU8sR0FBRyxRQUFRLEtBQUssZ0JBQWdCLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQztvQkFDbkUsTUFBTTtpQkFDUDtnQkFDRDtvQkFDRSxPQUFPLEdBQUcsSUFBSSxDQUFDO2FBQ2xCO1lBRUQsSUFBSSxPQUFPLEVBQUU7O2dCQUNYLElBQUksUUFBUSxVQUFTO2dCQUNyQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFOzs7b0JBR2pFLFFBQVEsc0JBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUM7aUJBQ2pEO3FCQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUN6QyxRQUFRLEdBQUcsU0FBUyxDQUFDO2lCQUN0QjtxQkFBTTtvQkFDTCxRQUFRLEdBQUcsT0FBTyxDQUFDO2lCQUNwQjs7OztnQkFLRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7S0FDRjtJQUVEOzs7Ozs7Ozs7O09BVUc7Ozs7Ozs7Ozs7Ozs7SUFFSCxzREFBZ0I7Ozs7Ozs7Ozs7OztJQURoQjtRQUVFLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7O1lBQzlCLElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQzlDLElBQ0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxPQUFPO2dCQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQ3hDO2dCQUNBLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQzthQUNuQztTQUNGO0tBQ0Y7SUFFRDs7OztPQUlHOzs7Ozs7O0lBQ0gsc0RBQWdCOzs7Ozs7SUFBaEIsVUFBaUIsT0FBWTtRQUMzQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDbkQ7SUFFRDs7OztPQUlHOzs7Ozs7O0lBQ0gsa0RBQVk7Ozs7OztJQUFaLFVBQWEsT0FBWTtRQUN2QixPQUFPLENBQ0wsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FDaEQsQ0FBQztLQUNIO0lBRUQ7Ozs7T0FJRzs7Ozs7OztJQUNILHVEQUFpQjs7Ozs7O0lBQWpCLFVBQWtCLE9BQVk7UUFDNUIsT0FBTyxDQUNMLENBQUMsQ0FBQyxPQUFPO1lBQ1QsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJO1lBQ3RCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQ3JELENBQUM7S0FDSDtJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSCxtREFBYTs7Ozs7O0lBQWIsVUFBYyxPQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztLQUNuRDs7Ozs7SUFFRCx1REFBaUI7Ozs7SUFBakIsVUFBa0IsT0FBWTtRQUM1QixJQUFJLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUU7Ozs7Ozs7OztZQVMxQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDOztZQUNqQyxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDOzs7WUFHbkMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDOztZQUluQixJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7WUFDbkIsSUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQztZQUM1RCxPQUFPLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztZQUM3QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1lBQ2xDLE9BQU8sc0JBQXNCLENBQUM7U0FDL0I7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7S0FDRjs7Ozs7Ozs7O0lBU08sdURBQWlCOzs7Ozs7OztjQUFDLE9BQVksRUFBRSxRQUFnQjtRQUN0RCxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksUUFBUSxJQUFJLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7O0lBYWxDLDJEQUFxQjs7Ozs7Ozs7OztjQUFDLE9BQVksRUFBRSxLQUFXOztRQUNyRCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7O1FBQ2hELElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7O1FBQzdELElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUMxRCxJQUFJLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTs7WUFHcEQsSUFBTSxZQUFZLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQzs7WUFDMUMsSUFBTSxZQUFZLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQztZQUMxQyxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzthQUNwQztpQkFBTSxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksRUFBRTtnQkFDeEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzthQUNyQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFOztnQkFDekQsSUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7Z0JBR3pDLElBQUk7b0JBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDNUI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7O2lCQUVmOzs7Z0JBSUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsT0FBTyxTQUFTLENBQUM7YUFDbEI7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzs7O2dCQTdWOUQsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFDTixzRUFBc0U7b0JBQ3hFLFNBQVMsRUFBRSxDQUFDLDhCQUE4QixDQUFDO2lCQUM1Qzs7OztnQkE3R0MsVUFBVTtnQkFHVixRQUFRO2dCQUtSLFNBQVM7OENBbUtOLFFBQVEsWUFDUixNQUFNLFNBQUMsdUJBQXVCOzs7NEJBdkRoQyxLQUFLO3NDQVNMLEtBQUs7aUNBK0hMLFlBQVksU0FBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNqRCxZQUFZLFNBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDaEQsWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2xELFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMzQyxZQUFZLFNBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDMUMsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzttQ0FxRHhDLFlBQVksU0FBQyxpQkFBaUI7O3NDQTFUakM7RUFpSGlELG9CQUFvQjtTQUF4RCwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzIHVudGlsIGl0IGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaWdub3JlSW52YWxpZENoYW5nZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIHNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgeyB2YWxpZGF0ZSgpOiB2b2lkIH0ge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZSBlbGVtZW50J3MgKHN1Y2ggYXMgYDx2YWFkaW4tdGV4dC1maWVsZD5gKSBtYXkgbm90IGFjdHVhbGx5IG11dGF0ZVxuICAgICAgLy8gdGhlIGBpbnZhbGlkYCBwcm9wZXJ0eSB3aGVuIGB2YWxpZGF0ZSgpYCBpcyBjYWxsZWQuIEluIHRoZXNlXG4gICAgICAvLyBzaXR1YXRpb25zLCBpdCdzIHBvc3NpYmxlIGZvciBBbmd1bGFyIHRvIHNldCBhbiBlbGVtZW50IGFzIGludmFsaWQgYW5kXG4gICAgICAvLyBuZXZlciBiZSBhYmxlIHRvIHJlY292ZXIgc2luY2UgdGhlIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgd2lsbCBhbHdheXNcbiAgICAgIC8vIHJlcG9ydCBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy9cbiAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIE9yaWdhbWkgc2hvdWxkIGlnbm9yZSB0aGUgZWxlbWVudCdzIHZhbGlkYXRlKClcbiAgICAgIC8vIGZ1bmN0aW9uLlxuICAgICAgdGhpcy5pZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBjb25zdCB3YXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkO1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgZG9lcyBtdXRhdGUgYGludmFsaWRgLCBhc2sgaXQgdG8gZG8gc28gZmlyc3QgdG8gZ2V0IGFcbiAgICAgIC8vIGJhc2VsaW5lLlxuICAgICAgZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgLy8gV2hlbiBgdmFsaWRhdGUoKWAgaXMgY2FsbGVkIG5leHQsIHdlIHdpbGwga25vdyBpZiB0aGUgZWxlbWVudCBtdXRhdGVzXG4gICAgICAvLyBgaW52YWxpZGAgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIG1hdGNoZXMgYGludmFsaWRgIGFmdGVyIGNoYW5naW5nXG4gICAgICAvLyBgaW52YWxpZGAgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGVsZW1lbnQuaW52YWxpZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICFlbGVtZW50LmludmFsaWQ7XG4gICAgICBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBjb25zdCB2YWxpZGF0ZU11dGF0ZXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkID09PSBleHBlY3RlZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHdhc0ludmFsaWQ7XG4gICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsaWRhdGVNdXRhdGVzSW52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiJdfQ==

@@ -72,2 +72,3 @@ import { Directive, ElementRef, HostListener, Inject, Injector, Input, Optional, Renderer2, forwardRef, NgModule } from '@angular/core';

this.injector = injector;
this.renderer = renderer;
/**

@@ -89,6 +90,6 @@ * The key to use when reporting that an element's `validate()` function

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
*/
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -127,7 +128,7 @@ /**

// validity
if (typeof element.validate === 'function') {
if (this.shouldUseValidate(element)) {
control.setValidators(Validators.compose([
control.validator,
() => {
if (/** @type {?} */ ((element.validate))()) {
if (element.validate()) {
return null;

@@ -242,3 +243,3 @@ }

onInvalidChanged() {
if (!this.isUpdatingValidity) {
if (!this.ignoreInvalidChanges) {
/** @type {?} */

@@ -249,5 +250,5 @@ const element = this.elementRef.nativeElement;

this.control.invalid !== element.invalid) {
this.isUpdatingValidity = true;
this.ignoreInvalidChanges = true;
this.control.updateValueAndValidity();
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -297,2 +298,36 @@ }

/**
* @param {?} element
* @return {?}
*/
shouldUseValidate(element) {
if (typeof element.validate === 'function') {
// Some element's (such as `<vaadin-text-field>`) may not actually mutate
// the `invalid` property when `validate()` is called. In these
// situations, it's possible for Angular to set an element as invalid and
// never be able to recover since the element's `validate()` will always
// report it is invalid.
//
// In these situations, Origami should ignore the element's validate()
// function.
this.ignoreInvalidChanges = true;
/** @type {?} */
const wasInvalid = element.invalid;
// If the element does mutate `invalid`, ask it to do so first to get a
// baseline.
element.validate();
/** @type {?} */
const expected = element.invalid;
element.invalid = !element.invalid;
element.validate();
/** @type {?} */
const validateMutatesInvalid = element.invalid === expected;
element.invalid = wasInvalid;
this.ignoreInvalidChanges = false;
return validateMutatesInvalid;
}
else {
return false;
}
}
/**
* Determines whether or not a property is defined anywhere in the provided

@@ -408,2 +443,2 @@ * element's prototype chain.

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCdzIHZhbGlkaXR5IGFuZCBzaG91bGQgaWdub3JlIGFkZGl0aW9uYWwgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXNcbiAgICogdW50aWwgaXQgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSlcbiAgICBjb21wb3NpdGlvbk1vZGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIocmVuZGVyZXIsIGVsZW1lbnRSZWYsIGNvbXBvc2l0aW9uTW9kZSk7XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRoYXQgd2lsbCBjb25uZWN0IGFuIGVsZW1lbnQncyB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzXG4gICAqIChpZiB0aGV5IGFyZSBpbXBsZW1lbnRlZCkgdG8gdGhlIEFuZ3VsYXIgY29udHJvbC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSkge1xuICAgICAgLy8gVGhlIGNvbnRyb2wgd2lsbCBhbHdheXMgYmUgc2V0IGJ5IG5nQWZ0ZXJWaWV3SW5pdCBkdWUgdG8gdGhlIG5hdHVyZSBvZlxuICAgICAgLy8gdGhlIGRpcmVjdGl2ZSdzIHNlbGVjdG9yc1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXMuIFNvbWUgZWxlbWVudHMsIHN1Y2ggYXNcbiAgICogYDx2YWFkaW4tZGF0ZS1waWNrZXI+YCBoYXZlIG11bHRpcGxlIFwidmFsdWVzXCIuIFNldHRpbmcgdGhlIHByaW1hcnkgdmFsdWVcbiAgICogKGV4LiB0aGUgZGF0ZSBzdHJpbmcpIG1heSByZXN1bHQgaW4gYSB0ZW1wb3JhcmlseSBpbnZhbGlkIGVsZW1lbnQgdW50aWxcbiAgICogc3Vic2VxdWVudCB2YWx1ZXMgKGV4LiB0aGUgc2VsZWN0ZWQgZGF0ZSkgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIFNpbmNlIHRoaXMgdmFsdWUgYWNjZXNzb3Igb25seSBsaXN0ZW5zIGZvciB2YWx1ZSBjaGFuZ2VzLCBpdCBtYXkgbm90IGJlXG4gICAqIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UgaW4gdmFsaWRpdHkuIFRoaXMgbGlzdGVuZXIgd2lsbCBsaXN0ZW4gZm9yIGFueVxuICAgKiBleHBsaWNpdHkgdmFsaWRpdHkgY2hhbmdlcyBmcm9tIHRoZSBlbGVtZW50IGFuZCByZS1ldmFsdWF0ZSBhIGNvbnRyb2wnc1xuICAgKiB2YWxpZGl0eSBpZiBpdCBhbmQgdGhlIGVsZW1lbnQncyB2YWxpZGl0eSBhcmUgb3V0IG9mIHN5bmMuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnZhbGlkLWNoYW5nZWQnKVxuICBvbkludmFsaWRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuY29udHJvbCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wuaW52YWxpZCAhPT0gZWxlbWVudC5pbnZhbGlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgY2hlY2tib3gtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBDaGVja2VkRWxlbWVudExpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdjaGVja2VkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWQnKSB8fFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRJdGVtJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc011bHRpU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICAhIWVsZW1lbnQgJiZcbiAgICAgIGVsZW1lbnQubXVsdGkgPT09IHRydWUgJiZcbiAgICAgICh0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpIHx8XG4gICAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzVmFsaWRhdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBWYWxpZGF0YWJsZUxpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdpbnZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHByb3BlcnR5IGlzIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIHByb3ZpZGVkXG4gICAqIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4uXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yXG4gICAqL1xuICBwcml2YXRlIGlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWVsZW1lbnQgJiYgcHJvcGVydHkgaW4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHNlbGVjdGFibGUgb3IgbXVsdGktc2VsZWN0YWJsZSBlbGVtZW50XG4gICAqIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgdGhlXG4gICAqIHZhbHVlIHR5cGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkLiBJZiBpdCBjYW5ub3RcbiAgICogZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHRvIHVzZSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBnZXQgdGhlIHByb3BlcnR5IGZvclxuICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eVxuICAgKiBAcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50OiBhbnksIHZhbHVlPzogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc011bHRpID0gdGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KTtcbiAgICBjb25zdCB2YWx1ZVByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkSXRlbXMnIDogJ3NlbGVjdGVkSXRlbSc7XG4gICAgY29uc3QgaW5kZXhQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZFZhbHVlcycgOiAnc2VsZWN0ZWQnO1xuICAgIGlmICh0eXBlb2YgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBpbmRleCBvciB2YWx1ZSBwcm9wZXJ0eSBmb3JcbiAgICAgIC8vIGEgc2VsZWN0YWJsZSBlbGVtZW50XG4gICAgICBjb25zdCBoYXNWYWx1ZVByb3AgPSB2YWx1ZVByb3AgaW4gZWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0luZGV4UHJvcCA9IGluZGV4UHJvcCBpbiBlbGVtZW50O1xuICAgICAgaWYgKGhhc1ZhbHVlUHJvcCAmJiAhaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNWYWx1ZVByb3AgJiYgaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBlbGVtZW50W3ZhbHVlUHJvcF07XG4gICAgICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaGFzIGJvdGggcHJvcGVydGllcywgdHJ5IHRvIHNldCBpdCB0byB0aGUgdmFsdWVcbiAgICAgICAgLy8gcHJvcGVydHkgZmlyc3QuIElmIGl0IGZhaWxzLCB0aGVuIHVzZSB0aGUgaW5kZXggcHJvcGVydHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBDb3VsZCB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgYW4gdW5leHBlY3RlZCB0eXBlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIHdlIHNldCBpdCB0byBpcyBzdGlsbCBhY2N1cmF0ZS4gSWYgaXQnc1xuICAgICAgICAvLyBub3QgdGhlbiB0aGUgZWxlbWVudCBzaWxlbnRseSByZWplY3RlZCB0aGUgbmV3IHZhbHVlLlxuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBlbGVtZW50W3ZhbHVlUHJvcF0gPT09IHZhbHVlO1xuICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID8gdmFsdWVQcm9wIDogaW5kZXhQcm9wO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi92YWx1ZS1hY2Nlc3Nvcic7XG5cbi8qKlxuICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGVtcGxhdGUgYW5kIHJlYWN0aXZlIEFuZ3VsYXIgZm9ybSBkaXJlY3RpdmVzIGFuZFxuICogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdLFxuICBleHBvcnRzOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pRm9ybXNNb2R1bGUge31cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7OztBQXlEQSxNQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxNQUFNLDJCQUEyQixDQUFDO0lBQzFELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9ERixpQ0FBeUMsU0FBUSxvQkFBb0I7Ozs7Ozs7SUF5RG5FLFlBQ1MsWUFDRyxRQUFrQixFQUM1QixRQUFtQixFQUduQixlQUF3QjtRQUV4QixLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQVB0QyxlQUFVLEdBQVYsVUFBVTtRQUNQLGFBQVEsR0FBUixRQUFRLENBQVU7Ozs7Ozs7O21DQTFDUixVQUFVOzs7Ozs7OEJBc0JQLEtBQUs7Ozs7OztrQ0FNRCxLQUFLO0tBcUJqQzs7Ozs7SUE1Q0QsSUFBSSxPQUFPO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsc0JBQUcsbUJBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUUsT0FBTyxFQUFDLENBQUM7U0FDcEU7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDdEI7Ozs7OztJQTRDRCxlQUFlOztRQUNiLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTs7WUFHL0IsTUFBTSxPQUFPLHNCQUFHLElBQUksQ0FBQyxPQUFPLEdBQUU7O1lBRTlCLElBQUksQ0FBQyxTQUFTLHNCQUFHLE9BQU8sQ0FBQyxhQUFhLEdBQUUsU0FBUyxDQUFDO2dCQUNoRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUU7b0JBQ3hDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDM0M7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztpQkFDeEQ7YUFDRixDQUFDLENBQUM7OztZQUlILElBQUksT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLFVBQVUsRUFBRTtnQkFDMUMsT0FBTyxDQUFDLGFBQWEsQ0FDbkIsVUFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDakIsT0FBTyxDQUFDLFNBQVM7b0JBQ2pCO3dCQUNFLHVCQUFJLE9BQU8sQ0FBQyxRQUFRLE1BQUs7NEJBQ3ZCLE9BQU8sSUFBSSxDQUFDO3lCQUNiOzZCQUFNOzRCQUNMLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLEVBQUUsQ0FBQzt5QkFDN0M7cUJBQ0Y7aUJBQ0YsQ0FBQyxDQUNILENBQUM7YUFDSDtTQUNGO0tBQ0Y7Ozs7O0lBS0QsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzlCO0tBQ0Y7Ozs7Ozs7O0lBUUQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7O1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7O1lBQ2pFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDNUQsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osbUJBQU0sT0FBTyxHQUFFLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQzthQUNsQztTQUNGO2FBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekMsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEM7YUFBTTtZQUNMLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztLQUM3Qjs7Ozs7OztJQWFELGNBQWMsQ0FBQyxLQUFZO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOztZQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQzs7WUFDOUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLFFBQVEsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLEtBQUssd0JBQXdCLENBQUM7Z0JBQzlCLEtBQUssdUJBQXVCLEVBQUU7O29CQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3JELE9BQU8sR0FBRyxRQUFRLEtBQUssZUFBZSxJQUFJLFFBQVEsS0FBSyxjQUFjLENBQUM7b0JBQ3RFLE1BQU07aUJBQ1A7Z0JBQ0QsS0FBSyx5QkFBeUIsQ0FBQztnQkFDL0IsS0FBSyxrQkFBa0IsRUFBRTs7b0JBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDckQsT0FBTyxHQUFHLFFBQVEsS0FBSyxnQkFBZ0IsSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDO29CQUNuRSxNQUFNO2lCQUNQO2dCQUNEO29CQUNFLE9BQU8sR0FBRyxJQUFJLENBQUM7YUFDbEI7WUFFRCxJQUFJLE9BQU8sRUFBRTs7Z0JBQ1gsSUFBSSxRQUFRLENBQVM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7OztvQkFHakUsUUFBUSxzQkFBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQztpQkFDakQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pDLFFBQVEsR0FBRyxTQUFTLENBQUM7aUJBQ3RCO3FCQUFNO29CQUNMLFFBQVEsR0FBRyxPQUFPLENBQUM7aUJBQ3BCOzs7O2dCQUtELElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDRjtLQUNGOzs7Ozs7Ozs7Ozs7O0lBY0QsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTs7WUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7WUFDOUMsSUFDRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE9BQU87Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFDeEM7Z0JBQ0EsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2FBQ2pDO1NBQ0Y7S0FDRjs7Ozs7OztJQU9ELGdCQUFnQixDQUFDLE9BQVk7UUFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ25EOzs7Ozs7O0lBT0QsWUFBWSxDQUFDLE9BQVk7UUFDdkIsUUFDRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUMzQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxFQUMvQztLQUNIOzs7Ozs7O0lBT0QsaUJBQWlCLENBQUMsT0FBWTtRQUM1QixRQUNFLENBQUMsQ0FBQyxPQUFPO1lBQ1QsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJO2FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxFQUNwRDtLQUNIOzs7Ozs7O0lBT0QsYUFBYSxDQUFDLE9BQVk7UUFDeEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ25EOzs7Ozs7Ozs7SUFTTyxpQkFBaUIsQ0FBQyxPQUFZLEVBQUUsUUFBZ0I7UUFDdEQsT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUM7Ozs7Ozs7Ozs7OztJQWFsQyxxQkFBcUIsQ0FBQyxPQUFZLEVBQUUsS0FBVzs7UUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDOztRQUNoRCxNQUFNLFNBQVMsR0FBRyxPQUFPLEdBQUcsZUFBZSxHQUFHLGNBQWMsQ0FBQzs7UUFDN0QsTUFBTSxTQUFTLEdBQUcsT0FBTyxHQUFHLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztRQUMxRCxJQUFJLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTs7WUFHcEQsTUFBTSxZQUFZLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQzs7WUFDMUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxJQUFJLE9BQU8sQ0FBQztZQUMxQyxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQzthQUNwQztpQkFBTSxJQUFJLENBQUMsWUFBWSxJQUFJLFlBQVksRUFBRTtnQkFDeEMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQzthQUNyQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLFdBQVcsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFOztnQkFDekQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7Z0JBR3pDLElBQUk7b0JBQ0YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDNUI7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7O2lCQUVmOzs7Z0JBSUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLENBQUM7Z0JBQzNELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxhQUFhLENBQUM7YUFDcEM7aUJBQU07Z0JBQ0wsT0FBTyxTQUFTLENBQUM7YUFDbEI7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUM7Ozs7WUEvVDlELFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQ04sc0VBQXNFO2dCQUN4RSxTQUFTLEVBQUUsQ0FBQyw4QkFBOEIsQ0FBQzthQUM1Qzs7OztZQTdHQyxVQUFVO1lBR1YsUUFBUTtZQUtSLFNBQVM7MENBbUtOLFFBQVEsWUFDUixNQUFNLFNBQUMsdUJBQXVCOzs7d0JBdkRoQyxLQUFLO2tDQVNMLEtBQUs7NkJBK0hMLFlBQVksU0FBQyx3QkFBd0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUNqRCxZQUFZLFNBQUMsdUJBQXVCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDaEQsWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDLGNBQ2xELFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUMzQyxZQUFZLFNBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsY0FDMUMsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQzsrQkFxRHhDLFlBQVksU0FBQyxpQkFBaUI7Ozs7Ozs7QUMxVGpDOzs7O0FBV0E7OztZQUpDLFFBQVEsU0FBQztnQkFDUixZQUFZLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztnQkFDM0MsT0FBTyxFQUFFLENBQUMsMkJBQTJCLENBQUM7YUFDdkM7Ozs7Ozs7Ozs7Ozs7OzsifQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzIHVudGlsIGl0IGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaWdub3JlSW52YWxpZENoYW5nZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIHNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgeyB2YWxpZGF0ZSgpOiB2b2lkIH0ge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZSBlbGVtZW50J3MgKHN1Y2ggYXMgYDx2YWFkaW4tdGV4dC1maWVsZD5gKSBtYXkgbm90IGFjdHVhbGx5IG11dGF0ZVxuICAgICAgLy8gdGhlIGBpbnZhbGlkYCBwcm9wZXJ0eSB3aGVuIGB2YWxpZGF0ZSgpYCBpcyBjYWxsZWQuIEluIHRoZXNlXG4gICAgICAvLyBzaXR1YXRpb25zLCBpdCdzIHBvc3NpYmxlIGZvciBBbmd1bGFyIHRvIHNldCBhbiBlbGVtZW50IGFzIGludmFsaWQgYW5kXG4gICAgICAvLyBuZXZlciBiZSBhYmxlIHRvIHJlY292ZXIgc2luY2UgdGhlIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgd2lsbCBhbHdheXNcbiAgICAgIC8vIHJlcG9ydCBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy9cbiAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIE9yaWdhbWkgc2hvdWxkIGlnbm9yZSB0aGUgZWxlbWVudCdzIHZhbGlkYXRlKClcbiAgICAgIC8vIGZ1bmN0aW9uLlxuICAgICAgdGhpcy5pZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBjb25zdCB3YXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkO1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgZG9lcyBtdXRhdGUgYGludmFsaWRgLCBhc2sgaXQgdG8gZG8gc28gZmlyc3QgdG8gZ2V0IGFcbiAgICAgIC8vIGJhc2VsaW5lLlxuICAgICAgZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgLy8gV2hlbiBgdmFsaWRhdGUoKWAgaXMgY2FsbGVkIG5leHQsIHdlIHdpbGwga25vdyBpZiB0aGUgZWxlbWVudCBtdXRhdGVzXG4gICAgICAvLyBgaW52YWxpZGAgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIG1hdGNoZXMgYGludmFsaWRgIGFmdGVyIGNoYW5naW5nXG4gICAgICAvLyBgaW52YWxpZGAgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGVsZW1lbnQuaW52YWxpZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICFlbGVtZW50LmludmFsaWQ7XG4gICAgICBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBjb25zdCB2YWxpZGF0ZU11dGF0ZXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkID09PSBleHBlY3RlZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHdhc0ludmFsaWQ7XG4gICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsaWRhdGVNdXRhdGVzSW52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuL3ZhbHVlLWFjY2Vzc29yJztcblxuLyoqXG4gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB0ZW1wbGF0ZSBhbmQgcmVhY3RpdmUgQW5ndWxhciBmb3JtIGRpcmVjdGl2ZXMgYW5kXG4gKiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW09yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3Nvcl0sXG4gIGV4cG9ydHM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlGb3Jtc01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7O0FBeURBLE1BQWEsOEJBQThCLEdBQWE7SUFDdEQsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU0sMkJBQTJCLENBQUM7SUFDMUQsS0FBSyxF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

@@ -68,2 +68,3 @@ import { __extends } from 'tslib';

_this.injector = injector;
_this.renderer = renderer;
/**

@@ -85,6 +86,6 @@ * The key to use when reporting that an element's `validate()` function

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
*/
_this.isUpdatingValidity = false;
_this.ignoreInvalidChanges = false;
return _this;

@@ -141,7 +142,7 @@ }

// validity
if (typeof element.validate === 'function') {
if (this.shouldUseValidate(element)) {
control_1.setValidators(Validators.compose([
control_1.validator,
function () {
if (/** @type {?} */ ((element.validate))()) {
if (element.validate()) {
return null;

@@ -311,3 +312,3 @@ }

function () {
if (!this.isUpdatingValidity) {
if (!this.ignoreInvalidChanges) {
/** @type {?} */

@@ -318,5 +319,5 @@ var element = this.elementRef.nativeElement;

this.control.invalid !== element.invalid) {
this.isUpdatingValidity = true;
this.ignoreInvalidChanges = true;
this.control.updateValueAndValidity();
this.isUpdatingValidity = false;
this.ignoreInvalidChanges = false;
}

@@ -410,2 +411,40 @@ }

/**
* @param {?} element
* @return {?}
*/
OrigamiControlValueAccessor.prototype.shouldUseValidate = /**
* @param {?} element
* @return {?}
*/
function (element) {
if (typeof element.validate === 'function') {
// Some element's (such as `<vaadin-text-field>`) may not actually mutate
// the `invalid` property when `validate()` is called. In these
// situations, it's possible for Angular to set an element as invalid and
// never be able to recover since the element's `validate()` will always
// report it is invalid.
//
// In these situations, Origami should ignore the element's validate()
// function.
this.ignoreInvalidChanges = true;
/** @type {?} */
var wasInvalid = element.invalid;
// If the element does mutate `invalid`, ask it to do so first to get a
// baseline.
element.validate();
/** @type {?} */
var expected = element.invalid;
element.invalid = !element.invalid;
element.validate();
/** @type {?} */
var validateMutatesInvalid = element.invalid === expected;
element.invalid = wasInvalid;
this.ignoreInvalidChanges = false;
return validateMutatesInvalid;
}
else {
return false;
}
};
/**
* Determines whether or not a property is defined anywhere in the provided

@@ -543,2 +582,2 @@ * element's prototype chain.

//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCdzIHZhbGlkaXR5IGFuZCBzaG91bGQgaWdub3JlIGFkZGl0aW9uYWwgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXNcbiAgICogdW50aWwgaXQgaXMgY29tcGxldGUuXG4gICAqL1xuICBwcml2YXRlIGlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSlcbiAgICBjb21wb3NpdGlvbk1vZGU6IGJvb2xlYW5cbiAgKSB7XG4gICAgc3VwZXIocmVuZGVyZXIsIGVsZW1lbnRSZWYsIGNvbXBvc2l0aW9uTW9kZSk7XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRoYXQgd2lsbCBjb25uZWN0IGFuIGVsZW1lbnQncyB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzXG4gICAqIChpZiB0aGV5IGFyZSBpbXBsZW1lbnRlZCkgdG8gdGhlIEFuZ3VsYXIgY29udHJvbC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSkge1xuICAgICAgLy8gVGhlIGNvbnRyb2wgd2lsbCBhbHdheXMgYmUgc2V0IGJ5IG5nQWZ0ZXJWaWV3SW5pdCBkdWUgdG8gdGhlIG5hdHVyZSBvZlxuICAgICAgLy8gdGhlIGRpcmVjdGl2ZSdzIHNlbGVjdG9yc1xuICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY29udHJvbCE7XG4gICAgICAvLyBBbGxvd3MgQW5ndWxhciB2YWxpZGF0b3JzIHRvIHVwZGF0ZSB0aGUgY3VzdG9tIGVsZW1lbnQncyB2YWxpZGl0eVxuICAgICAgdGhpcy5zdGF0dXNTdWIgPSBjb250cm9sLnN0YXR1c0NoYW5nZXMhLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5pc0ludmFsaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSB0aGlzLmlzSW52YWxpZChjb250cm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmludmFsaWQgPSAhIWNvbnRyb2wuaW52YWxpZCAmJiAhIWNvbnRyb2wuZGlydHk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbGxvd3MgY3VzdG9tIGVsZW1lbnQgdmFsaWRhdGUgZnVuY3Rpb24gdG8gdXBkYXRlIEFuZ3VsYXIgY29udHJvbCdzXG4gICAgICAvLyB2YWxpZGl0eVxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlISgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV06IHRydWUgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViKSB7XG4gICAgICB0aGlzLnN0YXR1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgYSB2YWx1ZSB0byBhIGN1c3RvbSBlbGVtZW50J3MgY29ycmVjdCB2YWx1ZSBwcm9wZXJ0eSwgYmFzZWQgb24gd2hhdFxuICAgKiBraW5kIG9mIGVsZW1lbnQgdGhlIGRpcmVjdGl2ZSBjb250cm9scy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpIHx8IHRoaXMuaXNTZWxlY3RhYmxlKGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIGlmIChwcm9wZXJ0eSkge1xuICAgICAgICAoPGFueT5lbGVtZW50KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgZWxlbWVudC5jaGVja2VkID0gQm9vbGVhbih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuaXNXcml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIGN1c3RvbSBlbGVtZW50IGV2ZW50cyBhbmQgbm90aWZ5IEFuZ3VsYXIgb2YgYW55IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCB0aGUgY2hhbmdlIGV2ZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hlY2tlZC1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndmFsdWUtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIG9uQ2hhbmdlZEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghdGhpcy5pc1dyaXRpbmdWYWx1ZSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRJdGVtcycgfHwgcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW0nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLXZhbHVlcy1jaGFuZ2VkJzpcbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtY2hhbmdlZCc6IHtcbiAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMuZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQpO1xuICAgICAgICAgIGNoYW5nZWQgPSBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkVmFsdWVzJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICBsZXQgcHJvcGVydHk6IHN0cmluZztcbiAgICAgICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgICAvLyBwcm9wZXJ0eSB3aWxsIGJlIGRlZmluZWQgaWYgd2UgcmVhY2ggdGhpcyBzaW5jZSBjaGFuZ2VkIGNhbiBvbmx5XG4gICAgICAgICAgLy8gYmUgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgZGVmaW5lZCBmb3Igc2VsZWN0YWJsZSBlbGVtZW50c1xuICAgICAgICAgIHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCkhO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDaGVja2VkRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ2NoZWNrZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BlcnR5ID0gJ3ZhbHVlJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbid0IHVzZSBgZXZlbnQuZGV0YWlsLnZhbHVlYCwgc2luY2Ugd2UgY2Fubm90IGFzc3VtZSB0aGF0IGFsbFxuICAgICAgICAvLyBjaGFuZ2UgZXZlbnRzIHdpbGwgcHJvdmlkZSB0aGF0LiBBZGRpdGlvbmFsbHksIHNvbWUgZXZlbnQgZGV0YWlsc1xuICAgICAgICAvLyBtYXkgYmUgc3BsaWNlcyBvZiBhbiBhcnJheSBvciBvYmplY3QgaW5zdGVhZCBvZiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgdGhpcy5vbkNoYW5nZShlbGVtZW50W3Byb3BlcnR5XSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYGludmFsaWRgIHByb3BlcnR5IGNoYW5nZXMuIFNvbWUgZWxlbWVudHMsIHN1Y2ggYXNcbiAgICogYDx2YWFkaW4tZGF0ZS1waWNrZXI+YCBoYXZlIG11bHRpcGxlIFwidmFsdWVzXCIuIFNldHRpbmcgdGhlIHByaW1hcnkgdmFsdWVcbiAgICogKGV4LiB0aGUgZGF0ZSBzdHJpbmcpIG1heSByZXN1bHQgaW4gYSB0ZW1wb3JhcmlseSBpbnZhbGlkIGVsZW1lbnQgdW50aWxcbiAgICogc3Vic2VxdWVudCB2YWx1ZXMgKGV4LiB0aGUgc2VsZWN0ZWQgZGF0ZSkgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIFNpbmNlIHRoaXMgdmFsdWUgYWNjZXNzb3Igb25seSBsaXN0ZW5zIGZvciB2YWx1ZSBjaGFuZ2VzLCBpdCBtYXkgbm90IGJlXG4gICAqIG5vdGlmaWVkIG9mIHRoZSBjaGFuZ2UgaW4gdmFsaWRpdHkuIFRoaXMgbGlzdGVuZXIgd2lsbCBsaXN0ZW4gZm9yIGFueVxuICAgKiBleHBsaWNpdHkgdmFsaWRpdHkgY2hhbmdlcyBmcm9tIHRoZSBlbGVtZW50IGFuZCByZS1ldmFsdWF0ZSBhIGNvbnRyb2wnc1xuICAgKiB2YWxpZGl0eSBpZiBpdCBhbmQgdGhlIGVsZW1lbnQncyB2YWxpZGl0eSBhcmUgb3V0IG9mIHN5bmMuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdpbnZhbGlkLWNoYW5nZWQnKVxuICBvbkludmFsaWRDaGFuZ2VkKCkge1xuICAgIGlmICghdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5pc1ZhbGlkYXRhYmxlKGVsZW1lbnQpICYmXG4gICAgICAgIHRoaXMuY29udHJvbCAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wuaW52YWxpZCAhPT0gZWxlbWVudC5pbnZhbGlkXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5pc1VwZGF0aW5nVmFsaWRpdHkgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlzVXBkYXRpbmdWYWxpZGl0eSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgY2hlY2tib3gtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzQ2hlY2tlZEVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBDaGVja2VkRWxlbWVudExpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdjaGVja2VkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFNlbGVjdGFibGVMaWtlIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWQnKSB8fFxuICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRJdGVtJylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqL1xuICBpc011bHRpU2VsZWN0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICAhIWVsZW1lbnQgJiZcbiAgICAgIGVsZW1lbnQubXVsdGkgPT09IHRydWUgJiZcbiAgICAgICh0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZFZhbHVlcycpIHx8XG4gICAgICAgIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzVmFsaWRhdGFibGUoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBWYWxpZGF0YWJsZUxpa2Uge1xuICAgIHJldHVybiB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdpbnZhbGlkJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhIHByb3BlcnR5IGlzIGRlZmluZWQgYW55d2hlcmUgaW4gdGhlIHByb3ZpZGVkXG4gICAqIGVsZW1lbnQncyBwcm90b3R5cGUgY2hhaW4uXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGNoZWNrXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yXG4gICAqL1xuICBwcml2YXRlIGlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQ6IGFueSwgcHJvcGVydHk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWVsZW1lbnQgJiYgcHJvcGVydHkgaW4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHNlbGVjdGFibGUgb3IgbXVsdGktc2VsZWN0YWJsZSBlbGVtZW50XG4gICAqIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQuIFRoaXMgbWV0aG9kIHdpbGwgdXNlIGRlZmluZWQgcHJvcGVydGllcyBhbmQgdGhlXG4gICAqIHZhbHVlIHR5cGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkLiBJZiBpdCBjYW5ub3RcbiAgICogZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnR5IHRvIHVzZSwgaXQgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBnZXQgdGhlIHByb3BlcnR5IGZvclxuICAgKiBAcGFyYW0gdmFsdWUgYSB2YWx1ZSBmb3IgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eVxuICAgKiBAcmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSwgb3IgdW5kZWZpbmVkIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gICAqL1xuICBwcml2YXRlIGdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50OiBhbnksIHZhbHVlPzogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpc011bHRpID0gdGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KTtcbiAgICBjb25zdCB2YWx1ZVByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkSXRlbXMnIDogJ3NlbGVjdGVkSXRlbSc7XG4gICAgY29uc3QgaW5kZXhQcm9wID0gaXNNdWx0aSA/ICdzZWxlY3RlZFZhbHVlcycgOiAnc2VsZWN0ZWQnO1xuICAgIGlmICh0eXBlb2YgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHdlIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBpbmRleCBvciB2YWx1ZSBwcm9wZXJ0eSBmb3JcbiAgICAgIC8vIGEgc2VsZWN0YWJsZSBlbGVtZW50XG4gICAgICBjb25zdCBoYXNWYWx1ZVByb3AgPSB2YWx1ZVByb3AgaW4gZWxlbWVudDtcbiAgICAgIGNvbnN0IGhhc0luZGV4UHJvcCA9IGluZGV4UHJvcCBpbiBlbGVtZW50O1xuICAgICAgaWYgKGhhc1ZhbHVlUHJvcCAmJiAhaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKCFoYXNWYWx1ZVByb3AgJiYgaGFzSW5kZXhQcm9wKSB7XG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSBlbGVtZW50W3ZhbHVlUHJvcF07XG4gICAgICAgIC8vIFdoZW4gdGhlIGVsZW1lbnQgaGFzIGJvdGggcHJvcGVydGllcywgdHJ5IHRvIHNldCBpdCB0byB0aGUgdmFsdWVcbiAgICAgICAgLy8gcHJvcGVydHkgZmlyc3QuIElmIGl0IGZhaWxzLCB0aGVuIHVzZSB0aGUgaW5kZXggcHJvcGVydHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBDb3VsZCB0aHJvdyBpZiB0aGUgdmFsdWUgaXMgYW4gdW5leHBlY3RlZCB0eXBlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIHdlIHNldCBpdCB0byBpcyBzdGlsbCBhY2N1cmF0ZS4gSWYgaXQnc1xuICAgICAgICAvLyBub3QgdGhlbiB0aGUgZWxlbWVudCBzaWxlbnRseSByZWplY3RlZCB0aGUgbmV3IHZhbHVlLlxuICAgICAgICB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPSBlbGVtZW50W3ZhbHVlUHJvcF0gPT09IHZhbHVlO1xuICAgICAgICBlbGVtZW50W3ZhbHVlUHJvcF0gPSBwcmV2aW91c1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID8gdmFsdWVQcm9wIDogaW5kZXhQcm9wO1xuICB9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi92YWx1ZS1hY2Nlc3Nvcic7XG5cbi8qKlxuICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgdGVtcGxhdGUgYW5kIHJlYWN0aXZlIEFuZ3VsYXIgZm9ybSBkaXJlY3RpdmVzIGFuZFxuICogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdLFxuICBleHBvcnRzOiBbT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yXVxufSlcbmV4cG9ydCBjbGFzcyBPcmlnYW1pRm9ybXNNb2R1bGUge31cbiJdLCJuYW1lcyI6WyJ0c2xpYl8xLl9fZXh0ZW5kcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUF5REEsSUFBYSw4QkFBOEIsR0FBYTtJQUN0RCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLDJCQUEyQixHQUFBLENBQUM7SUFDMUQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9EK0NBLCtDQUFvQjtJQXlEbkUscUNBQ1MsWUFDRyxRQUFrQixFQUM1QixRQUFtQixFQUduQixlQUF3QjtRQU4xQixZQVFFLGtCQUFNLFFBQVEsRUFBRSxVQUFVLEVBQUUsZUFBZSxDQUFDLFNBQzdDO1FBUlEsZ0JBQVUsR0FBVixVQUFVO1FBQ1AsY0FBUSxHQUFSLFFBQVEsQ0FBVTs7Ozs7Ozs7b0NBMUNSLFVBQVU7Ozs7OzsrQkFzQlAsS0FBSzs7Ozs7O21DQU1ELEtBQUs7O0tBcUJqQztJQTVDRCxzQkFBSSxnREFBTzs7Ozs7Ozs7UUFBWDtZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNsQixJQUFJLENBQUMsUUFBUSxzQkFBRyxtQkFBWSxJQUFJLENBQUMs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
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JpZ2FtaS1mb3Jtcy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vQGNvZGViYWtlcnkvb3JpZ2FtaS9mb3Jtcy9zcmMvdmFsdWUtYWNjZXNzb3IudHMiLCJuZzovL0Bjb2RlYmFrZXJ5L29yaWdhbWkvZm9ybXMvc3JjL2Zvcm1zLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3B0aW9uYWwsXG4gIFByb3ZpZGVyLFxuICBSZW5kZXJlcjIsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxcbiAgRGVmYXVsdFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBOZ0NvbnRyb2wsXG4gIFZhbGlkYXRvcnMsXG4gIEFic3RyYWN0Q29udHJvbFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIGEgY2hlY2tib3guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tlZEVsZW1lbnRMaWtlIHtcbiAgY2hlY2tlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciBkZXRlcm1pbmluZyBpZiBhbiBlbGVtZW50IGlzIHNlbGVjdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZD86IHN0cmluZyB8IG51bWJlcjtcbiAgc2VsZWN0ZWRJdGVtPzogYW55O1xufVxuXG4vKipcbiAqIEFuIGludGVyZmFjZSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBpcyBtdWx0aSBzZWxlY3RhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0YWJsZUxpa2Uge1xuICBzZWxlY3RlZFZhbHVlcz86IEFycmF5PHN0cmluZyB8IG51bWJlcj47XG4gIHNlbGVjdGVkSXRlbXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaXMgdmFsaWRhdGFibGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGFibGVMaWtlIHtcbiAgaW52YWxpZD86IGJvb2xlYW47XG4gIHZhbGlkYXRlPygpOiB2b2lkO1xufVxuXG4vKipcbiAqIE9yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3NvciBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IpLFxuICBtdWx0aTogdHJ1ZVxufTtcblxuLyoqXG4gKiBBIHZhbHVlIGFjY2Vzc29yIGZvciBgbmdNb2RlbGAsIGBmb3JtQ29udHJvbGAsIGFuZCBgZm9ybUNvbnRyb2xOYW1lYCwgb25cbiAqIGN1c3RvbSBlbGVtZW50cy4gSW4gYWRkaXRpb24gdG8gb25lIG9mIHRoZSBhYm92ZSBkaXJlY3RpdmVzLCBgb3JpZ2FtaWBcbiAqIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZWxlbWVudCB0byBkZW5vdGUgdGhhdCB0aGlzIHZhbHVlIGFjY2Vzc29yIHNob3VsZFxuICogY29udHJvbCBpdC5cbiAqXG4gKiBFeGFtcGxlOiBgPHBhcGVyLWlucHV0IFsobmdNb2RlbCldPVwidmFsdWVcIiBvcmlnYW1pPjwvcGFwZXItaW5wdXQ+YFxuICpcbiAqIFRoZSBjb25uZWN0ZWQgZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvZiB0aGUgYmVsb3dcbiAqIHByb3BlcnRpZXM6XG4gKlxuICogLSBgY2hlY2tlZGAgYXMgYSBib29sZWFuIGZvciBjaGVja2JveC1saWtlIGVsZW1lbnRzLlxuICogLSBgc2VsZWN0ZWRgIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbXVzdCBiZSBhbiBpbmRleCBvciBzdHJpbmdcbiAqICAgbmFtZSBhdHRyaWJ1dGUuXG4gKiAtIGBzZWxlY3RlZEl0ZW1gIGZvciBzaW5nbGUgc2VsZWN0YWJsZSBlbGVtZW50cy4gSXQgbWF5IGJlIGFueSB0eXBlLlxuICogLSBgc2VsZWN0ZWRWYWx1ZXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mXG4gKiAgIGluZGljZXMgb3Igc3RyaW5nIG5hbWUgYXR0cmlidXRlcy5cbiAqIC0gYHNlbGVjdGVkSXRlbXNgIGZvciBtdWx0aSBzZWxlY3RhYmxlIGVsZW1lbnRzLiBJdCBtdXN0IGJlIGFuIGFycmF5IG9mIGFueVxuICogICB0eXBlLlxuICogLSBgdmFsdWVgIGZvciBhbnkgYmFzaWMgZm9ybSBlbGVtZW50LiBJdCBtYXkgYmUgYW55IHR5cGUuXG4gKlxuICogRm9yIHNlbGVjdGFibGUgYW5kIG11bHRpIHNlbGVjdGFibGUgZWxlbWVudHMsIHRoZSBhdHRyaWJ1dGUgYHVzZUtleWAgc2hvdWxkXG4gKiBiZSBzcGVjaWZpZWQgaWYgdGhlIGNvbnRyb2wgYmluZGluZ3MgYW4gaW5kZXggb3IgbmFtZSB2YWx1ZSB0byB0aGUgZWxlbWVudFxuICogaW5zdGVhZCBvZiBhbiBvYmplY3QuXG4gKlxuICogQWRkaXRpb25hbGx5LCBhbiBlbGVtZW50IG1heSBpbXBsZW1lbnQgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAtIGBkaXNhYmxlZGAgYXMgYSBib29sZWFuXG4gKiAtIGBpbnZhbGlkYCBhcyBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgdmFsaWRpdHlcbiAqIC0gYHZhbGlkYXRlKClgIGFzIGEgZnVuY3Rpb24gdG8gcnVuIGN1c3RvbSB2YWxpZGF0aW9uXG4gKlxuICogVG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZXNlIGV2ZW50cywgYW4gZWxlbWVudCBzaG91bGQgaW1wbGVtZW50IG9uZSBvclxuICogbW9yZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyB0byBub3RpZnkgQW5ndWxhciBvZiBhbnkgdXBkYXRlcy5cbiAqXG4gKiAtIGBpbnB1dGAgLSB3aWxsIHVwZGF0ZSBhbnkgb2YgdGhlIGFib3ZlIHByb3BlcnRpZXNcbiAqIC0gYGJsdXJgXG4gKiAtIGBjaGVja2VkLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkYFxuICogLSBgc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWRgXG4gKiAtIGBzZWxlY3RlZC1pdGVtcy1jaGFuZ2VkYFxuICogLSBgdmFsdWUtY2hhbmdlZGBcbiAqIC0gYGludmFsaWQtY2hhbmdlZGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOlxuICAgICdbbmdNb2RlbF1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sTmFtZV1bb3JpZ2FtaV0sW2Zvcm1Db250cm9sXVtvcmlnYW1pXScsXG4gIHByb3ZpZGVyczogW09SSUdBTUlfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgT3JpZ2FtaUNvbnRyb2xWYWx1ZUFjY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFZhbHVlQWNjZXNzb3JcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBsb2dpYyB0byBkZXRlcm1pbmUgd2hhdCB0byBzZXQgYW4gZWxlbWVudCdzIGBpbnZhbGlkYFxuICAgKiBwcm9wZXJ0eSB0byBnaXZlbiB0aGUgcHJvdmlkZWQgYEFic3RyYWN0Q29udHJvbGAuIFRoZSBkZWZhdWx0IGlzIHRvIHNldCB0aGVcbiAgICogZWxlbWVudCBhcyBgaW52YWxpZGAgd2hlbmV2ZXIgdGhlIGNvbnRyb2wgaXMgYm90aCBpbnZhbGlkIGFuZCBkaXJ0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGlzSW52YWxpZD86IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHJlcG9ydGluZyB0aGF0IGFuIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgZnVuY3Rpb25cbiAgICogcmV0dXJucyBmYWxzZS4gV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBjb250cm9sJ3MgYGVycm9yc2Agb2JqZWN0IHdpbGwgYmVcbiAgICogc2V0IHdpdGggdGhpcyBrZXkgYW5kIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQga2V5IGlzIFwidmFsaWRhdGVcIi5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHZhbGlkYXRpb25FcnJvcnNLZXkgPSAndmFsaWRhdGUnO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFic3RyYWN0Q29udHJvbGAgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50LlxuICAgKi9cbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2NvbnRyb2wpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wgPSAoPE5nQ29udHJvbD50aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wpKS5jb250cm9sITtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29udHJvbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIE5nQ29udHJvbCdzIHN0YXR1c0NoYW5nZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdHVzU3ViPzogeyB1bnN1YnNjcmliZSgpOiB2b2lkIH07XG4gIC8qKlxuICAgKiBNb3N0IGN1c3RvbSBlbGVtZW50cyBwcm9wZXJ0eSB3aWxsIGVtaXQgYSBgcHJvcGVydHktY2hhbmdlZGAgZXZlbnQgd2hlblxuICAgKiB0aGVpciB2YWx1ZSBpcyBzZXQuIFRoaXMgZmxhZyBpbmZvcm1zIHRoZSB2YWx1ZSBhY2Nlc3NvciB0byBpZ25vcmUgdGhlXG4gICAqIG5leHQgZXZlbnQgd2hpbGUgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nIGEgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIGlzV3JpdGluZ1ZhbHVlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBGbGFnIHRoYXQgaW5mb3JtcyB0aGUgdmFsdWUgYWNjZXNzb3IgdGhhdCBpdCBpcyBjdXJyZW50bHkgdXBkYXRpbmcgYW5cbiAgICogZWxlbWVudCBhbmQgc2hvdWxkIGlnbm9yZSBhZGRpdGlvbmFsIGBpbnZhbGlkYCBwcm9wZXJ0eSBjaGFuZ2VzIHVudGlsIGl0IGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBpZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IGZhbHNlO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgdmFsdWUgcHJvcGVydHkgb3IgaW5kZXggcHJvcGVydHkgZm9yIGFcbiAgICogc2VsZWN0IG9yIG11bGl0LXNlbGVjdCBlbGVtZW50LiBXaGVuIHVuZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlXG4gICAqIGRldGVybWluYXRpb24gb2Ygd2hpY2ggcHJvcGVydHkgdG8gdXNlIGhhcyBub3Qgb2NjdXJyZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB1c2VTZWxlY3RhYmxlVmFsdWVQcm9wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhY2hlZCBgY29udHJvbGAgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIF9jb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ09NUE9TSVRJT05fQlVGRkVSX01PREUpXG4gICAgY29tcG9zaXRpb25Nb2RlOiBib29sZWFuXG4gICkge1xuICAgIHN1cGVyKHJlbmRlcmVyLCBlbGVtZW50UmVmLCBjb21wb3NpdGlvbk1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpZmVjeWNsZSBjYWxsYmFjayB0aGF0IHdpbGwgY29ubmVjdCBhbiBlbGVtZW50J3MgdmFsaWRhdGFibGUgcHJvcGVydGllc1xuICAgKiAoaWYgdGhleSBhcmUgaW1wbGVtZW50ZWQpIHRvIHRoZSBBbmd1bGFyIGNvbnRyb2wuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmlzVmFsaWRhdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIC8vIFRoZSBjb250cm9sIHdpbGwgYWx3YXlzIGJlIHNldCBieSBuZ0FmdGVyVmlld0luaXQgZHVlIHRvIHRoZSBuYXR1cmUgb2ZcbiAgICAgIC8vIHRoZSBkaXJlY3RpdmUncyBzZWxlY3RvcnNcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmNvbnRyb2whO1xuICAgICAgLy8gQWxsb3dzIEFuZ3VsYXIgdmFsaWRhdG9ycyB0byB1cGRhdGUgdGhlIGN1c3RvbSBlbGVtZW50J3MgdmFsaWRpdHlcbiAgICAgIHRoaXMuc3RhdHVzU3ViID0gY29udHJvbC5zdGF0dXNDaGFuZ2VzIS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaXNJbnZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gdGhpcy5pc0ludmFsaWQoY29udHJvbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5pbnZhbGlkID0gISFjb250cm9sLmludmFsaWQgJiYgISFjb250cm9sLmRpcnR5O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGN1c3RvbSBlbGVtZW50IHZhbGlkYXRlIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbmd1bGFyIGNvbnRyb2wnc1xuICAgICAgLy8gdmFsaWRpdHlcbiAgICAgIGlmICh0aGlzLnNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhcbiAgICAgICAgICBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgICAgY29udHJvbC52YWxpZGF0b3IsXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XTogdHJ1ZSB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlmZWN5Y2xlIGNhbGxiYWNrIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5zdGF0dXNTdWIpIHtcbiAgICAgIHRoaXMuc3RhdHVzU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHZhbHVlIHRvIGEgY3VzdG9tIGVsZW1lbnQncyBjb3JyZWN0IHZhbHVlIHByb3BlcnR5LCBiYXNlZCBvbiB3aGF0XG4gICAqIGtpbmQgb2YgZWxlbWVudCB0aGUgZGlyZWN0aXZlIGNvbnRyb2xzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHdyaXRlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmlzV3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKHRoaXMuaXNNdWx0aVNlbGVjdGFibGUoZWxlbWVudCkgfHwgdGhpcy5pc1NlbGVjdGFibGUoZWxlbWVudCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCwgdmFsdWUpO1xuICAgICAgaWYgKHByb3BlcnR5KSB7XG4gICAgICAgICg8YW55PmVsZW1lbnQpW3Byb3BlcnR5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBlbGVtZW50LmNoZWNrZWQgPSBCb29sZWFuKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIud3JpdGVWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1dyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgY3VzdG9tIGVsZW1lbnQgZXZlbnRzIGFuZCBub3RpZnkgQW5ndWxhciBvZiBhbnkgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IHRoZSBjaGFuZ2UgZXZlbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdzZWxlY3RlZC12YWx1ZXMtY2hhbmdlZCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3NlbGVjdGVkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGVja2VkLWNoYW5nZWQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd2YWx1ZS1jaGFuZ2VkJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2VkRXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzV3JpdGluZ1ZhbHVlKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkLWl0ZW1zLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1pdGVtLWNoYW5nZWQnOiB7XG4gICAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KTtcbiAgICAgICAgICBjaGFuZ2VkID0gcHJvcGVydHkgPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBwcm9wZXJ0eSA9PT0gJ3NlbGVjdGVkSXRlbSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQtdmFsdWVzLWNoYW5nZWQnOlxuICAgICAgICBjYXNlICdzZWxlY3RlZC1jaGFuZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5nZXRTZWxlY3RhYmxlUHJvcGVydHkoZWxlbWVudCk7XG4gICAgICAgICAgY2hhbmdlZCA9IHByb3BlcnR5ID09PSAnc2VsZWN0ZWRWYWx1ZXMnIHx8IHByb3BlcnR5ID09PSAnc2VsZWN0ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIGxldCBwcm9wZXJ0eTogc3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5pc011bHRpU2VsZWN0YWJsZShlbGVtZW50KSB8fCB0aGlzLmlzU2VsZWN0YWJsZShlbGVtZW50KSkge1xuICAgICAgICAgIC8vIHByb3BlcnR5IHdpbGwgYmUgZGVmaW5lZCBpZiB3ZSByZWFjaCB0aGlzIHNpbmNlIGNoYW5nZWQgY2FuIG9ubHlcbiAgICAgICAgICAvLyBiZSB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWZpbmVkIGZvciBzZWxlY3RhYmxlIGVsZW1lbnRzXG4gICAgICAgICAgcHJvcGVydHkgPSB0aGlzLmdldFNlbGVjdGFibGVQcm9wZXJ0eShlbGVtZW50KSE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NoZWNrZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAnY2hlY2tlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcGVydHkgPSAndmFsdWUnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9uJ3QgdXNlIGBldmVudC5kZXRhaWwudmFsdWVgLCBzaW5jZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsXG4gICAgICAgIC8vIGNoYW5nZSBldmVudHMgd2lsbCBwcm92aWRlIHRoYXQuIEFkZGl0aW9uYWxseSwgc29tZSBldmVudCBkZXRhaWxzXG4gICAgICAgIC8vIG1heSBiZSBzcGxpY2VzIG9mIGFuIGFycmF5IG9yIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IHZhbHVlLlxuICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsZW1lbnRbcHJvcGVydHldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBgaW52YWxpZGAgcHJvcGVydHkgY2hhbmdlcy4gU29tZSBlbGVtZW50cywgc3VjaCBhc1xuICAgKiBgPHZhYWRpbi1kYXRlLXBpY2tlcj5gIGhhdmUgbXVsdGlwbGUgXCJ2YWx1ZXNcIi4gU2V0dGluZyB0aGUgcHJpbWFyeSB2YWx1ZVxuICAgKiAoZXguIHRoZSBkYXRlIHN0cmluZykgbWF5IHJlc3VsdCBpbiBhIHRlbXBvcmFyaWx5IGludmFsaWQgZWxlbWVudCB1bnRpbFxuICAgKiBzdWJzZXF1ZW50IHZhbHVlcyAoZXguIHRoZSBzZWxlY3RlZCBkYXRlKSBoYXZlIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogU2luY2UgdGhpcyB2YWx1ZSBhY2Nlc3NvciBvbmx5IGxpc3RlbnMgZm9yIHZhbHVlIGNoYW5nZXMsIGl0IG1heSBub3QgYmVcbiAgICogbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBpbiB2YWxpZGl0eS4gVGhpcyBsaXN0ZW5lciB3aWxsIGxpc3RlbiBmb3IgYW55XG4gICAqIGV4cGxpY2l0eSB2YWxpZGl0eSBjaGFuZ2VzIGZyb20gdGhlIGVsZW1lbnQgYW5kIHJlLWV2YWx1YXRlIGEgY29udHJvbCdzXG4gICAqIHZhbGlkaXR5IGlmIGl0IGFuZCB0aGUgZWxlbWVudCdzIHZhbGlkaXR5IGFyZSBvdXQgb2Ygc3luYy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2ludmFsaWQtY2hhbmdlZCcpXG4gIG9uSW52YWxpZENoYW5nZWQoKSB7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNWYWxpZGF0YWJsZShlbGVtZW50KSAmJlxuICAgICAgICB0aGlzLmNvbnRyb2wgJiZcbiAgICAgICAgdGhpcy5jb250cm9sLmludmFsaWQgIT09IGVsZW1lbnQuaW52YWxpZFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuaWdub3JlSW52YWxpZENoYW5nZXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyBjaGVja2JveC1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNDaGVja2VkRWxlbWVudChlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIENoZWNrZWRFbGVtZW50TGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2NoZWNrZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGFuIGVsZW1lbnQgaXMgc2VsZWN0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgU2VsZWN0YWJsZUxpa2Uge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZCcpIHx8XG4gICAgICB0aGlzLmlzUHJvcGVydHlEZWZpbmVkKGVsZW1lbnQsICdzZWxlY3RlZEl0ZW0nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCBhbiBlbGVtZW50IGlzIG11bHRpIHNlbGVjdGFibGUtbGlrZS5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICovXG4gIGlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgTXVsdGlTZWxlY3RhYmxlTGlrZSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhZWxlbWVudCAmJlxuICAgICAgZWxlbWVudC5tdWx0aSA9PT0gdHJ1ZSAmJlxuICAgICAgKHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ3NlbGVjdGVkVmFsdWVzJykgfHxcbiAgICAgICAgdGhpcy5pc1Byb3BlcnR5RGVmaW5lZChlbGVtZW50LCAnc2VsZWN0ZWRWYWx1ZXMnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBpcyB2YWxpZGF0YWJsZS1saWtlLlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBjaGVja1xuICAgKi9cbiAgaXNWYWxpZGF0YWJsZShlbGVtZW50OiBhbnkpOiBlbGVtZW50IGlzIFZhbGlkYXRhYmxlTGlrZSB7XG4gICAgcmV0dXJuIHRoaXMuaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudCwgJ2ludmFsaWQnKTtcbiAgfVxuXG4gIHNob3VsZFVzZVZhbGlkYXRlKGVsZW1lbnQ6IGFueSk6IGVsZW1lbnQgaXMgeyB2YWxpZGF0ZSgpOiB2b2lkIH0ge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gU29tZSBlbGVtZW50J3MgKHN1Y2ggYXMgYDx2YWFkaW4tdGV4dC1maWVsZD5gKSBtYXkgbm90IGFjdHVhbGx5IG11dGF0ZVxuICAgICAgLy8gdGhlIGBpbnZhbGlkYCBwcm9wZXJ0eSB3aGVuIGB2YWxpZGF0ZSgpYCBpcyBjYWxsZWQuIEluIHRoZXNlXG4gICAgICAvLyBzaXR1YXRpb25zLCBpdCdzIHBvc3NpYmxlIGZvciBBbmd1bGFyIHRvIHNldCBhbiBlbGVtZW50IGFzIGludmFsaWQgYW5kXG4gICAgICAvLyBuZXZlciBiZSBhYmxlIHRvIHJlY292ZXIgc2luY2UgdGhlIGVsZW1lbnQncyBgdmFsaWRhdGUoKWAgd2lsbCBhbHdheXNcbiAgICAgIC8vIHJlcG9ydCBpdCBpcyBpbnZhbGlkLlxuICAgICAgLy9cbiAgICAgIC8vIEluIHRoZXNlIHNpdHVhdGlvbnMsIE9yaWdhbWkgc2hvdWxkIGlnbm9yZSB0aGUgZWxlbWVudCdzIHZhbGlkYXRlKClcbiAgICAgIC8vIGZ1bmN0aW9uLlxuICAgICAgdGhpcy5pZ25vcmVJbnZhbGlkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBjb25zdCB3YXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkO1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgZG9lcyBtdXRhdGUgYGludmFsaWRgLCBhc2sgaXQgdG8gZG8gc28gZmlyc3QgdG8gZ2V0IGFcbiAgICAgIC8vIGJhc2VsaW5lLlxuICAgICAgZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgLy8gV2hlbiBgdmFsaWRhdGUoKWAgaXMgY2FsbGVkIG5leHQsIHdlIHdpbGwga25vdyBpZiB0aGUgZWxlbWVudCBtdXRhdGVzXG4gICAgICAvLyBgaW52YWxpZGAgaWYgdGhlIGV4cGVjdGVkIHZhbHVlIG1hdGNoZXMgYGludmFsaWRgIGFmdGVyIGNoYW5naW5nXG4gICAgICAvLyBgaW52YWxpZGAgdG8gc29tZXRoaW5nIGVsc2UuXG4gICAgICBjb25zdCBleHBlY3RlZCA9IGVsZW1lbnQuaW52YWxpZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9ICFlbGVtZW50LmludmFsaWQ7XG4gICAgICBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBjb25zdCB2YWxpZGF0ZU11dGF0ZXNJbnZhbGlkID0gZWxlbWVudC5pbnZhbGlkID09PSBleHBlY3RlZDtcbiAgICAgIGVsZW1lbnQuaW52YWxpZCA9IHdhc0ludmFsaWQ7XG4gICAgICB0aGlzLmlnbm9yZUludmFsaWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsaWRhdGVNdXRhdGVzSW52YWxpZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IGEgcHJvcGVydHkgaXMgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgcHJvdmlkZWRcbiAgICogZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gY2hlY2tcbiAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3JcbiAgICovXG4gIHByaXZhdGUgaXNQcm9wZXJ0eURlZmluZWQoZWxlbWVudDogYW55LCBwcm9wZXJ0eTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhZWxlbWVudCAmJiBwcm9wZXJ0eSBpbiBlbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgc2VsZWN0YWJsZSBvciBtdWx0aS1zZWxlY3RhYmxlIGVsZW1lbnRcbiAgICogdGhhdCBzaG91bGQgYmUgdXBkYXRlZC4gVGhpcyBtZXRob2Qgd2lsbCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCB0aGVcbiAgICogdmFsdWUgdHlwZSB0byBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQuIElmIGl0IGNhbm5vdFxuICAgKiBkZXRlcm1pbmUgd2hpY2ggcHJvcGVydHkgdG8gdXNlLCBpdCB3aWxsIHJldHVybiB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRvIGdldCB0aGUgcHJvcGVydHkgZm9yXG4gICAqIEBwYXJhbSB2YWx1ZSBhIHZhbHVlIGZvciB0aGUgZWxlbWVudCdzIHByb3BlcnR5XG4gICAqIEByZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lLCBvciB1bmRlZmluZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICovXG4gIHByaXZhdGUgZ2V0U2VsZWN0YWJsZVByb3BlcnR5KGVsZW1lbnQ6IGFueSwgdmFsdWU/OiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGlzTXVsdGkgPSB0aGlzLmlzTXVsdGlTZWxlY3RhYmxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IHZhbHVlUHJvcCA9IGlzTXVsdGkgPyAnc2VsZWN0ZWRJdGVtcycgOiAnc2VsZWN0ZWRJdGVtJztcbiAgICBjb25zdCBpbmRleFByb3AgPSBpc011bHRpID8gJ3NlbGVjdGVkVmFsdWVzJyA6ICdzZWxlY3RlZCc7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgIT09ICdib29sZWFuJykge1xuICAgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIGJlIHNldHRpbmcgdGhlIGluZGV4IG9yIHZhbHVlIHByb3BlcnR5IGZvclxuICAgICAgLy8gYSBzZWxlY3RhYmxlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhhc1ZhbHVlUHJvcCA9IHZhbHVlUHJvcCBpbiBlbGVtZW50O1xuICAgICAgY29uc3QgaGFzSW5kZXhQcm9wID0gaW5kZXhQcm9wIGluIGVsZW1lbnQ7XG4gICAgICBpZiAoaGFzVmFsdWVQcm9wICYmICFoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIWhhc1ZhbHVlUHJvcCAmJiBoYXNJbmRleFByb3ApIHtcbiAgICAgICAgdGhpcy51c2VTZWxlY3RhYmxlVmFsdWVQcm9wID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IGVsZW1lbnRbdmFsdWVQcm9wXTtcbiAgICAgICAgLy8gV2hlbiB0aGUgZWxlbWVudCBoYXMgYm90aCBwcm9wZXJ0aWVzLCB0cnkgdG8gc2V0IGl0IHRvIHRoZSB2YWx1ZVxuICAgICAgICAvLyBwcm9wZXJ0eSBmaXJzdC4gSWYgaXQgZmFpbHMsIHRoZW4gdXNlIHRoZSBpbmRleCBwcm9wZXJ0eVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIENvdWxkIHRocm93IGlmIHRoZSB2YWx1ZSBpcyBhbiB1bmV4cGVjdGVkIHR5cGVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgdmFsdWUgd2Ugc2V0IGl0IHRvIGlzIHN0aWxsIGFjY3VyYXRlLiBJZiBpdCdzXG4gICAgICAgIC8vIG5vdCB0aGVuIHRoZSBlbGVtZW50IHNpbGVudGx5IHJlamVjdGVkIHRoZSBuZXcgdmFsdWUuXG4gICAgICAgIHRoaXMudXNlU2VsZWN0YWJsZVZhbHVlUHJvcCA9IGVsZW1lbnRbdmFsdWVQcm9wXSA9PT0gdmFsdWU7XG4gICAgICAgIGVsZW1lbnRbdmFsdWVQcm9wXSA9IHByZXZpb3VzVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnVzZVNlbGVjdGFibGVWYWx1ZVByb3AgPyB2YWx1ZVByb3AgOiBpbmRleFByb3A7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICcuL3ZhbHVlLWFjY2Vzc29yJztcblxuLyoqXG4gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB0ZW1wbGF0ZSBhbmQgcmVhY3RpdmUgQW5ndWxhciBmb3JtIGRpcmVjdGl2ZXMgYW5kXG4gKiBjdXN0b20gZWxlbWVudHMuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW09yaWdhbWlDb250cm9sVmFsdWVBY2Nlc3Nvcl0sXG4gIGV4cG9ydHM6IFtPcmlnYW1pQ29udHJvbFZhbHVlQWNjZXNzb3JdXG59KVxuZXhwb3J0IGNsYXNzIE9yaWdhbWlGb3Jtc01vZHVsZSB7fVxuIl0sIm5hbWVzIjpbInRzbGliXzEuX19leHRlbmRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXlEQSxJQUFhLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsMkJB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

@@ -1,1 +0,1 @@

{"__symbolic":"module","version":4,"metadata":{"OrigamiFormsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":7,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}],"exports":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}]}]}],"members":{}},"CheckedElementLike":{"__symbolic":"interface"},"SelectableLike":{"__symbolic":"interface"},"MultiSelectableLike":{"__symbolic":"interface"},"ValidatableLike":{"__symbolic":"interface"},"ORIGAMI_CONTROL_VALUE_ACCESSOR":{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":58,"character":11},"useExisting":{"__symbolic":"reference","name":"OrigamiControlValueAccessor"},"multi":true},"OrigamiControlValueAccessor":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/forms","name":"DefaultValueAccessor","line":113,"character":49},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":108,"character":1},"arguments":[{"selector":"[ngModel][origami],[formControlName][origami],[formControl][origami]","providers":[{"__symbolic":"reference","name":"ORIGAMI_CONTROL_VALUE_ACCESSOR"}]}]}],"members":{"isInvalid":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":120,"character":3}}]}],"validationErrorsKey":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":129,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":174,"character":5}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/forms","name":"COMPOSITION_BUFFER_MODE","line":175,"character":12}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":171,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":172,"character":24},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":173,"character":14},{"__symbolic":"reference","name":"boolean"}]}],"ngAfterViewInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"onChangedEvent":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":256,"character":3},"arguments":["selected-items-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":257,"character":3},"arguments":["selected-item-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":258,"character":3},"arguments":["selected-values-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":259,"character":3},"arguments":["selected-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":260,"character":3},"arguments":["checked-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":261,"character":3},"arguments":["value-changed",["$event"]]}]}],"onInvalidChanged":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":314,"character":3},"arguments":["invalid-changed"]}]}],"isCheckedElement":[{"__symbolic":"method"}],"isSelectable":[{"__symbolic":"method"}],"isMultiSelectable":[{"__symbolic":"method"}],"isValidatable":[{"__symbolic":"method"}],"isPropertyDefined":[{"__symbolic":"method"}],"getSelectableProperty":[{"__symbolic":"method"}]}}},"origins":{"OrigamiFormsModule":"./src/forms.module","CheckedElementLike":"./src/value-accessor","SelectableLike":"./src/value-accessor","MultiSelectableLike":"./src/value-accessor","ValidatableLike":"./src/value-accessor","ORIGAMI_CONTROL_VALUE_ACCESSOR":"./src/value-accessor","OrigamiControlValueAccessor":"./src/value-accessor"},"importAs":"@codebakery/origami/forms"}
{"__symbolic":"module","version":4,"metadata":{"OrigamiFormsModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":7,"character":1},"arguments":[{"declarations":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}],"exports":[{"__symbolic":"reference","name":"OrigamiControlValueAccessor"}]}]}],"members":{}},"CheckedElementLike":{"__symbolic":"interface"},"SelectableLike":{"__symbolic":"interface"},"MultiSelectableLike":{"__symbolic":"interface"},"ValidatableLike":{"__symbolic":"interface"},"ORIGAMI_CONTROL_VALUE_ACCESSOR":{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":58,"character":11},"useExisting":{"__symbolic":"reference","name":"OrigamiControlValueAccessor"},"multi":true},"OrigamiControlValueAccessor":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@angular/forms","name":"DefaultValueAccessor","line":113,"character":49},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":108,"character":1},"arguments":[{"selector":"[ngModel][origami],[formControlName][origami],[formControl][origami]","providers":[{"__symbolic":"reference","name":"ORIGAMI_CONTROL_VALUE_ACCESSOR"}]}]}],"members":{"isInvalid":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":120,"character":3}}]}],"validationErrorsKey":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":129,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameterDecorators":[null,null,null,[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Optional","line":174,"character":5}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Inject","line":175,"character":5},"arguments":[{"__symbolic":"reference","module":"@angular/forms","name":"COMPOSITION_BUFFER_MODE","line":175,"character":12}]}]],"parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":171,"character":23},{"__symbolic":"reference","module":"@angular/core","name":"Injector","line":172,"character":24},{"__symbolic":"reference","module":"@angular/core","name":"Renderer2","line":173,"character":24},{"__symbolic":"reference","name":"boolean"}]}],"ngAfterViewInit":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"onChangedEvent":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":256,"character":3},"arguments":["selected-items-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":257,"character":3},"arguments":["selected-item-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":258,"character":3},"arguments":["selected-values-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":259,"character":3},"arguments":["selected-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":260,"character":3},"arguments":["checked-changed",["$event"]]},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":261,"character":3},"arguments":["value-changed",["$event"]]}]}],"onInvalidChanged":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":314,"character":3},"arguments":["invalid-changed"]}]}],"isCheckedElement":[{"__symbolic":"method"}],"isSelectable":[{"__symbolic":"method"}],"isMultiSelectable":[{"__symbolic":"method"}],"isValidatable":[{"__symbolic":"method"}],"shouldUseValidate":[{"__symbolic":"method"}],"isPropertyDefined":[{"__symbolic":"method"}],"getSelectableProperty":[{"__symbolic":"method"}]}}},"origins":{"OrigamiFormsModule":"./src/forms.module","CheckedElementLike":"./src/value-accessor","SelectableLike":"./src/value-accessor","MultiSelectableLike":"./src/value-accessor","ValidatableLike":"./src/value-accessor","ORIGAMI_CONTROL_VALUE_ACCESSOR":"./src/value-accessor","OrigamiControlValueAccessor":"./src/value-accessor"},"importAs":"@codebakery/origami/forms"}

@@ -82,2 +82,3 @@ import { AfterViewInit, ElementRef, Injector, OnDestroy, Provider, Renderer2 } from '@angular/core';

protected injector: Injector;
protected renderer: Renderer2;
/**

@@ -115,6 +116,6 @@ * Overrides the logic to determine what to set an element's `invalid`

* Flag that informs the value accessor that it is currently updating an
* element's validity and should ignore additional `invalid` property changes
* until it is complete.
* element and should ignore additional `invalid` property changes until it is
* complete.
*/
private isUpdatingValidity;
private ignoreInvalidChanges;
/**

@@ -189,2 +190,5 @@ * Indicates whether or not to use the value property or index property for a

isValidatable(element: any): element is ValidatableLike;
shouldUseValidate(element: any): element is {
validate(): void;
};
/**

@@ -191,0 +195,0 @@ * Determines whether or not a property is defined anywhere in the provided

{
"$schema": "./node_modules/ng-packagr/package.schema.json",
"name": "@codebakery/origami",
"version": "3.0.0-beta.3",
"version": "3.0.0-beta.4",
"description": "Angular + Polymer",

@@ -6,0 +6,0 @@ "keywords": [

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc