ids-enterprise-ng 13.4.1 → 13.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/datagrid/soho-datagrid.component.mjs +2 -2
- package/esm2020/version.json +1 -1
- package/fesm2015/ids-enterprise-ng.mjs +2 -2
- package/fesm2015/ids-enterprise-ng.mjs.map +1 -1
- package/fesm2020/ids-enterprise-ng.mjs +2 -2
- package/fesm2020/ids-enterprise-ng.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -2286,7 +2286,7 @@ export class SohoDataGridComponent {
|
|
|
2286
2286
|
.on('rowactivated', (_e, args) => this.onRowActivated(args))
|
|
2287
2287
|
.on('rowdeactivated', (_e, args) => this.onRowDeactivated(args))
|
|
2288
2288
|
.on('rowreorder', (_e, args) => this.onRowReordered(args))
|
|
2289
|
-
.on('selected', (e, args, type) => this.onSelected({ e, rows: args, type }))
|
|
2289
|
+
.on('selected', (e, args, type, rowData) => this.onSelected({ e, rows: args, type, rowData }))
|
|
2290
2290
|
.on('settingschanged', (_e, args) => this.onSettingsChanged(args))
|
|
2291
2291
|
.on('sorted', (_e, args) => this.onSorted(args))
|
|
2292
2292
|
.on('beforepaging', (_e, args) => this.onBeforePaging(args))
|
|
@@ -2632,4 +2632,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.5", ngImpor
|
|
|
2632
2632
|
}], fallbackTooltip: [{
|
|
2633
2633
|
type: Input
|
|
2634
2634
|
}] } });
|
|
2635
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29oby1kYXRhZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZHMtZW50ZXJwcmlzZS1uZy9zcmMvbGliL2RhdGFncmlkL3NvaG8tZGF0YWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBSVIsUUFBUSxFQUtULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBb0MxRCxNQUFNLE9BQU8sd0JBQXdCO0lBV25DLFlBQ1MsU0FBdUMsRUFDdkMsSUFBc0M7UUFEdEMsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBa0M7UUFSL0MsK0RBQStEO1FBQy9ELGFBQVEsR0FBRyxJQUFJLENBQUM7SUFRaEIsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFrRDtRQUNyRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsZ0ZBQWdGO1FBQ2hGLGtCQUFrQjtRQUNsQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2VBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFF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LE1BQU07Z0JBS1AsU0FBUztzQkFEUixNQUFNO2dCQVVQLE9BQU87c0JBRE4sTUFBTTtnQkFLUCxZQUFZO3NCQURYLE1BQU07Z0JBS1AsbUJBQW1CO3NCQURsQixNQUFNO2dCQU9QLGFBQWE7c0JBRFosTUFBTTtnQkFLUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsTUFBTTtzQkFETCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsa0JBQWtCO3NCQURqQixNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAscUJBQXFCO3NCQURwQixNQUFNO2dCQVFQLFVBQVU7c0JBRFQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTzVCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxXQUFXO2dCQWl5QlgsY0FBYztzQkFBMUIsS0FBSztnQkFrQk8sc0JBQXNCO3NCQUFsQyxLQUFLO2dCQWlCTyxvQkFBb0I7c0JBQWhDLEtBQUs7Z0JBaUJPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUJPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFjTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBZU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQWdCTyxhQUFhO3NCQUF6QixLQUFLO2dCQWdCTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEVsZW1lbnRSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBJbmplY3RvcixcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudFJlZixcbiAgVHlwZSxcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcmd1bWVudEhlbHBlciB9IGZyb20gJy4uL3V0aWxzL2FyZ3VtZW50LmhlbHBlcic7XG5pbXBvcnQgeyBTb2hvRGF0YUdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zb2hvLWRhdGFncmlkLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTb2hvRGF0YUdyaWRUeXBlID0gJ2F1dG8nIHwgJ2NvbnRlbnQtb25seSc7XG5cbi8qKlxuICogQ29udHJhY3QgZm9yIGNlbGwgZWRpdG9ycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IgZXh0ZW5kcyBTb2hvRGF0YUdyaWRDZWxsRWRpdG9yIHtcbiAgLy8gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+O1xuXG4gIC8vIFRoZSBhcmdzIHBhc3NlZCB0byB0aGUgZWRpdG9yXG4gIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRDZWxsRnVuY3Rpb25BcmdzO1xuXG4gIC8vIFRoaXMgaXMgdGhlIGlucHV0IGVsZW1lbnQgKHNpbmdsZSkgd2l0aGluIHRoZSBmaWVsZFxuICBpbnB1dD86IEpRdWVyeTxIVE1MRWxlbWVudD47XG5cbiAgLy8gVXNlIHRoZSBkaXJlY3QgdmFsdWUgZnJvbSB0aGUgZGF0YXNldCB2cyB0aGUgZm9ybWF0dGVkIHZhbHVlXG4gIHVzZVZhbHVlOiBib29sZWFuO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5pdGlhbGlzZSB0aGUgZWRpdCBjb250cm9sIHdpdGggdGhlIGdpdmVuIGNvbXBvbmVudC4gIFRoZSBjb250cm9sXG4gICAqIG1pc3QgY29uZm9ybSB0byB0aGUgU29ob0RhdGFHcmlkQ2VsbEVkaXRvciBjb250cmFjdC5cbiAgICovXG4gIGluaXQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBlZGl0b3IuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIgaW1wbGVtZW50cyBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3Ige1xuICBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4gfCBudWxsO1xuXG4gIGlucHV0PzogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcblxuICAvLyBVc2UgdGhlIGRpcmVjdCB2YWx1ZSBmcm9tIHRoZSBkYXRhc2V0IHZzIHRoZSBmb3JtYXR0ZWQgdmFsdWVcbiAgdXNlVmFsdWUgPSB0cnVlO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+LFxuICAgIHB1YmxpYyBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0Q2VsbEZ1bmN0aW9uQXJncykge1xuICB9XG5cbiAgaW5pdChjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPikge1xuICAgIC8vIFN0b3JlIHRoZSBjb21wb25lbnQuXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAvLyBUaGUgU29obyBkYXRhZ3JpZCB3YW50cyBhbiBpbnB1dCBjb250cm9sLCBvdGhlcndpc2UgaXQgd29udCBhY2NlcHQgdGhlIGVkaXRvclxuICAgIC8vIGFzIGEgY29tcG9uZW50LlxuICAgIC8vIEB0b2RvIHRhbGsgdG8gVGltIGFib3V0IHJlbW92aW5nIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAgdGhpcy5pbnB1dCA9ICQodGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkuZmluZCgnaW5wdXQ6Zmlyc3QnKTtcbiAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgICAmJiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbGFzc05hbWVcbiAgICAgID8gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuY2xhc3NOYW1lIDogJy5lZGl0b3InO1xuICB9XG5cbiAgdmFsKHZhbHVlPzogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlLnZhbCh2YWx1ZSk7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UuZm9jdXMoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgcmVmcmVzaCBoaW50cyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgXCJyZWZyZXNoXCIgaXNcbiAqIHJlcXVpcmVkIGFmdGVyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCBhbmQgdGhlXG4gKiBBZnRlclZpZXdDaGVja2VkIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHRvZG8gcmVzb2x2ZSBuby1zaGFkb3dcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuZW51bSBSZWZyZXNoSGludEZsYWdzIHtcbiAgLy8gTm8gcmVmcmVzaCByZXF1aXJlZC5cbiAgTm9uZSA9IDAsXG4gIC8vIFRoZSByb3dzIG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxuICBSZW5kZXJSb3dzID0gMSxcbiAgLy8gVGhlIGhlYWRlciBuZWVkcyB0byBiZSByZS1yZW5lbmRlcmVkLlxuICBSZW5kZXJIZWFkZXIgPSAyLFxuICAvLyBBIGZ1bGwgcmVidWlsZCBpcyByZXF1aXJlZC5cbiAgUmVidWlsZCA9IDRcbn1cblxuLyoqXG4gKiBBbmd1bGFyIFdyYXBwZXIgZm9yIHRoZSBTb2hvIERhdGEgR3JpZCBDb21wb25lbnQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgc2VhcmNoZXMgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgYXR0cmlidXRlXG4gKiAnc29oby1kYXRhZ3JpZCcgaW4gdGhlIHBhcmVudCdzIERPTSB0cmVlLCBpbml0aWFsaXNpbmcgaXQgd2l0aFxuICogdGhlIFNvaG8gZGF0YWdyaWQgY29udHJvbC5cbiAqXG4gKiBUaGUgZGF0YSBpcyBwcm92aWRlZCBlaXRoZXIgYnkgYSBjb21wb25lbnQgaW5wdXQgb3IgYW4gaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBEYXRhR3JpZFNlcnZpY2UgaW50ZXJmYWNlLCBieSBzcGVjaWZ5aW5nIGFuIGltcGxlbWVudGF0aW9uXG4gKiBvbiB0aGUgaG9zdGluZyBjb21wb25lbnQsIGkuZS5cbiAqXG4gKiBwcm92aWRlcnM6IFsgcHJvdmlkZTogRGF0YUdyaWRTZXJ2aWNlLCB1c2VDbGFzczogRGF0YUdyaWREZW1vU2VydmljZX0gXVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbc29oby1kYXRhZ3JpZF0nLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIHRlbXBsYXRlOiAnIDxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTb2hvRGF0YUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTb2hvIERhdGEgR3JpZCBUeXBlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgaW5qZWN0ZWQgc2VydmljZVxuICAvLyAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMsIG90aGVyd2lzZS5cbiAgc3RhdGljIEFVVE86IFNvaG9EYXRhR3JpZFR5cGUgPSAnYXV0byc7XG5cbiAgLy8gJ2NvbnRlbnQtb25seScgd2hlcmUgdGFibGUgZWxlbWVudHMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZVxuICAvLyBjb2x1bW5zIGFuZCByb3dzLlxuICBzdGF0aWMgQ09OVEVOVF9PTkxZOiBTb2hvRGF0YUdyaWRUeXBlID0gJ2NvbnRlbnQtb25seSc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb21wb25lbnQgSW5wdXRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JpZCBvcHRpb25zIGZvciB0aGUgZGF0YSBncmlkLCBtYXJraW5nIHRoaXMgY29tcG9uZW50c1xuICAgKiBhcyByZXF1aXJpbmcgYSBmdWxsIHJlYnVpbGQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGxpZmVjeWNsZS5cbiAgICpcbiAgICogQHBhcmFtIGdyaWRPcHRpb25zIC0gbm90IG51bGwgZ3JpZCBvcHRpb25zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zKSB7XG4gICAgQXJndW1lbnRIZWxwZXIuY2hlY2tOb3ROdWxsKCdncmlkT3B0aW9ucycsIGdyaWRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zID0gZ3JpZE9wdGlvbnM7XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuICAgIHRoaXMuY2hlY2tGb3JTdW1tYXJ5Um93U2V0dGluZ3MoKTtcblxuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSAnc2V0dGluZ3MnIGFzIHRoZSBSZWJ1aWxkIHdpbGwgY3JlYXRlXG4gICAgICAvLyBhIG5ldyBjb250cm9sIHdpdGggdGhlIF9ncmlkT3B0aW9ucy5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2dyaWRPcHRpb25zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGdyaWRPcHRpb25zKCk6IFNvaG9EYXRhR3JpZE9wdGlvbnMge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoaWNoIHByb3BlcnR5IGluIHRoZSBkYXRhIHJvd3MgaXMgdG8gYmUgdXNlZCBhcyB0aGUgaWQgb2YgZWFjaFxuICAgKiByb3cgb2YgdGhlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlkUHJvcGVydHkoaWRQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpZFByb3BlcnR5JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaWRQcm9wZXJ0eSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pZFByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBmcm96ZW5Db2x1bW5zIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZnJvemVuQ29sdW1ucygpOiBTb2hvRGF0YUdyaWRGcm96ZW5Db2x1bW5zIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZnJvemVuQ29sdW1ucztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZyb3plbkNvbHVtbnMgc2V0dGluZ3MgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvemVuQ29sdW1ucyAtIHRoZSBmcm96ZW5Db2x1bW5zIHNldHRpbmdzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGZyb3plbkNvbHVtbnMoZnJvemVuQ29sdW1uczogU29ob0RhdGFHcmlkRnJvemVuQ29sdW1ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmcm96ZW5Db2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSBhbGxvd3NcbiAgICovXG4gIEBJbnB1dCgpIHNldCBjZWxsTmF2aWdhdGlvbihjZWxsTmF2aWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNlbGxOYXZpZ2F0aW9uID0gY2VsbE5hdmlnYXRpb247XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jZWxsTmF2aWdhdGlvbiA9IGNlbGxOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY2VsbE5hdmlnYXRpb24nLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjZWxsTmF2aWdhdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2VsbE5hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY2VsbE5hdmlnYXRpb247XG4gIH1cblxuICBnZXQgaXNWZXJ0aWNhbFNjcm9sbFRvRW5kKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5pc1ZlcnRpY2FsU2Nyb2xsVG9FbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHJvdyBuYXZpZ2F0aW9uIHNldHRpbmcgb2YgdGhlIGRhdGEgZ3JpZC4gSWYgcm93TmF2aWdhdGlvblxuICAgKiBpcyBcImZhbHNl4oCdIHRoZW4gYSBib3JkZXIgaXMgbm90IGRpc3BsYXllZCBhcm91bmQgdGhlIHJvdy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIHJvd2xOYXZpZ2F0aW9uIGkgXCJmYWxzZeKAnSB0aGVuIGdyaWQgd2lsbCBOT1Qgc2hvdyBhIGJvcmRlciBhcm91bmQgdGhlIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dOYXZpZ2F0aW9uKHJvd05hdmlnYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uID0gcm93TmF2aWdhdGlvbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnJvd05hdmlnYXRpb24gPSByb3dOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncm93TmF2aWdhdGlvbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvd05hdmlnYXRpb24oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNwbGF5cyB0aGUgcm93cyBpbiB0aGUgZ3JpZCB1c2luZyBhbHRlcm5hdGUgc2hhZGluZywgb3RoZXJ3aXNlXG4gICAqIGFsbCB0aGUgcm93cyB1c2UgdGhlIHNhbWUgc2hhZGluZy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbHRlcm5hdGVSb3dTaGFkaW5nKGFsdGVybmF0ZVJvd1NoYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbHRlcm5hdGVSb3dTaGFkaW5nID0gYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmFsdGVybmF0ZVJvd1NoYWRpbmcgPSBhbHRlcm5hdGVSb3dTaGFkaW5nO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWx0ZXJuYXRlUm93U2hhZGluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsdGVybmF0ZVJvd1NoYWRpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgcHJvdmlkZWQgYXMgYW4gYXJyYXlcbiAgICogb2YganNvbiBvYmplY3RzIGNvbXBhdGlibGUgd2l0aCB0aGUgY29sdW1uIG1ldGFcbiAgICogZGF0YSBwcm92aWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgLSBhcnJheSBvZiBqc29uIG9iamVjdHNcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhc2V0KGRhdGFzZXQ6IEFycmF5PGFueT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICBjb25zdCBwYWdlckluZm86IFNvaG9QYWdlclBhZ2luZ0luZm8gPSB7fTtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZGF0YXNldCA9IGRhdGFzZXQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gZG8gd2UgbmVlZCBoaW50cyBhcyB0aGlzIG1heSBiZSBidW5kbGVkIHVwIHdpdGggb3RoZXIgY2hhbmdlcy5cbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVEYXRhc2V0KChkYXRhc2V0IGFzIGFueSksIHBhZ2VySW5mbyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkYXRhc2V0IGN1cnJlbnRseSBkaXNwbGF5ZWQgYnkgdGhlIGRhdGFncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBnZXQgZGF0YXNldCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG5cbiAgICAvLyBJZiB0aGUgU29obyBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZW4gdGhlIGRhdGFzZXRcbiAgICAvLyBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiB0aGUgcm93cyBjdXJyZW50bHlcbiAgICAvLyBvbiBkaXNwbGF5LlxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kYXRhc2V0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIG5vIGRhdGEgaGFzIGJlZW4gc2V0IChvciBwb3RlbnRpYWxseVxuICAgIC8vIHJldHJpZXZlZCBmcm9tIGEgc2VydmljZSksIHNvIHRoZSBvbmx5IG9wdGlvbiBpcyB0aGVcbiAgICAvLyBJbnB1dCBkYXRhc2V0LCB3aGljaCBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0IHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGNvbHVtbnMgY2FuIGJlIHJlb3JkZXJzOyBvdGhlcndpc2UgaWYgZmFsc2UgdGhleSBhcmUgZml4ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uUmVvcmRlcihjb2x1bW5SZW9yZGVyOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjb2x1bW5SZW9yZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2x1bW5SZW9yZGVyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jb2x1bW5SZW9yZGVyO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblJlb3JkZXI7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZUNsaWVudFNvcnQoZGlzYWJsZUNsaWVudFNvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydCA9IGRpc2FibGVDbGllbnRTb3J0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVDbGllbnRTb3J0ID0gZGlzYWJsZUNsaWVudFNvcnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVDbGllbnRTb3J0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlQ2xpZW50RmlsdGVyKGRpc2FibGVDbGllbnRGaWx0ZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZUNsaWVudEZpbHRlcigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBncmlkIGFsbG93cyBlZGl0cywgb3RoZXJ3aXNlIGlmIGZhbHNlIGVkaXRzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBlZGl0YWJsZShlZGl0YWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmVkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VkaXRhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWRpdGFibGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmVkaXRhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIElucHV0IHRoYXQgZGVmaW5lcyBhIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGlzIGRpc2FibGVkLCBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaXNSb3dEaXNhYmxlZChpc1Jvd0Rpc2FibGVkOiBTb2hvSXNSb3dEaXNhYmxlZEZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaXNSb3dEaXNhYmxlZCA9IGlzUm93RGlzYWJsZWQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaXNSb3dEaXNhYmxlZCA9IGlzUm93RGlzYWJsZWQ7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpc1Jvd0Rpc2FibGVkJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNSb3dEaXNhYmxlZCgpOiBTb2hvSXNSb3dEaXNhYmxlZEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaXNSb3dEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5pc1Jvd0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgc2VsZWN0IHRoZSBjZWxsIHRleHQgc29vbiBhcyBlbnRlcmluZyBlZGl0IG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RPbkVkaXQoc2VsZWN0T25FZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0T25FZGl0ID0gc2VsZWN0T25FZGl0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdE9uRWRpdCA9IHNlbGVjdE9uRWRpdDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VkaXRhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0T25FZGl0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RPbkVkaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RPbkVkaXQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXNMaXN0KGlzTGlzdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmlzTGlzdCA9IGlzTGlzdDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmlzTGlzdCA9IGlzTGlzdDtcblxuICAgICAgLy8gY2FsbGluZyByZWJ1aWxkIGFzIGEgYnJ1dGUgZm9yY2Ugd2F5IG9mIHVkcGF0aW5nIHRoZSB2aWV3LlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaXNMaXN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNMaXN0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pc0xpc3Q7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaXNMaXN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1lbnVJZChtZW51SWQ6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm1lbnVJZCA9IG1lbnVJZDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVJZCA9IG1lbnVJZDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ21lbnVJZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGJlZm9yZU9wZW4gLSBhamF4IGNhbGxiYWNrIGZvciBvcGVuIGV2ZW50ICovXG4gIEBJbnB1dCgpIHNldCBtZW51QmVmb3JlT3BlbihtZW51QmVmb3JlT3BlbjogU29ob1BvcHVwTWVudVNvdXJjZUZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMubWVudUJlZm9yZU9wZW4gPSBtZW51QmVmb3JlT3BlbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuID0gbWVudUJlZm9yZU9wZW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdtZW51QmVmb3JlT3BlbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1lbnVCZWZvcmVPcGVuKCk6IFNvaG9Qb3B1cE1lbnVTb3VyY2VGdW5jdGlvbiB7XG4gICAgcmV0dXJuICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvdyBoZWlnaHQgZm9yIHRoZSBncmlkLCB0byBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcm93SGVpZ2h0IC0gJ2V4dHJhLXNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSdcbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dIZWlnaHQocm93SGVpZ2h0OiBTb2hvRGF0YUdyaWRSb3dIZWlnaHQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5yb3dIZWlnaHQocm93SGVpZ2h0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byBzb21ldGhpbmcgb3RoZXIgdGhlbiB0aGUgdGhyZWUgYnVpbHQgaW4gcm93SGVpZ2h0cy5cbiAgICpcbiAgICogQHBhcmFtIGZpeGVkUm93SGVpZ2h0IEFueSBpbnRlZ2VyXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZml4ZWRSb3dIZWlnaHQoZml4ZWRSb3dIZWlnaHQ6IG51bWJlciB8IHN0cmluZyB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgPSBmaXhlZFJvd0hlaWdodDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZpeGVkUm93SGVpZ2h0ID0gZml4ZWRSb3dIZWlnaHQ7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmaXhlZFJvd0hlaWdodCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VsZWN0aW9uIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHZhbGlkIHZhbHVlcyBhcmU6ICdtdWx0aXBsZScsICdzaW5nbGUnLCAnbWl4ZWQnLCAnc2libGluZ3MnIGFuZCBmYWxzZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RhYmxlKHNlbGVjdGFibGU6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIEp1c3QgY2hhbmdpbmcgdGhlIGRhdGFncmlkLnNldHRpbmdzLnNlbGVjdGFibGUgdXBkYXRlcyB0aGUgZGF0YWdyaWQgdmlldy5cbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2hvd1NlbGVjdEFsbENoZWNrQm94KHNob3dTZWxlY3RBbGxDaGVja0JveDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAvLyBKdXN0IGNoYW5naW5nIHRoZSBkYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlIHVwZGF0ZXMgdGhlIGRhdGFncmlkIHZpZXcuXG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dTZWxlY3RBbGxDaGVja0JveCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dTZWxlY3RBbGxDaGVja0JveCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd1NlbGVjdEFsbENoZWNrQm94O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNsaWNrVG9TZWxlY3QoY2xpY2tUb1NlbGVjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNsaWNrVG9TZWxlY3QgPSBjbGlja1RvU2VsZWN0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdCA9IGNsaWNrVG9TZWxlY3Q7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjbGlja1RvU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2xpY2tUb1NlbGVjdCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5jbGlja1RvU2VsZWN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvb2xiYXIodG9vbGJhcjogU29ob1Rvb2xiYXJPcHRpb25zKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudG9vbGJhciA9IHRvb2xiYXI7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy50b29sYmFyID0gdG9vbGJhcjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Rvb2xiYXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzYXZlVXNlclNldHRpbmdzKHNldHRpbmdzRm9yU2F2ZTogU29ob0RhdGFHcmlkU2F2ZVVzZXJTZXR0aW5ncykge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNhdmVVc2VyU2V0dGluZ3MgPSBzZXR0aW5nc0ZvclNhdmU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zYXZlVXNlclNldHRpbmdzID0gc2V0dGluZ3NGb3JTYXZlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmcocGFnaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnaW5nID0gcGFnaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnaW5nID0gcGFnaW5nO1xuXG4gICAgICAvLyB0b2RvOiB1cGRhdGUgc29obyBkYXRhIGdyaWRzIHZpZXcgLSB0aGlzLnVwZGF0ZVBhZ2luZ0luZm8oKT9cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3BhZ2luZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnBhZ2luZztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5wYWdpbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcGFnZXNpemUocGFnZXNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnBhZ2VzaXplID0gcGFnZXNpemU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5wYWdlc2l6ZSA9IHBhZ2VzaXplO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdlc2l6ZXMocGFnZXNpemVzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemVzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2luZGV0ZXJtaW5hdGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhY3Rpb25hYmxlTW9kZShhY3Rpb25hYmxlTW9kZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmFjdGlvbmFibGVNb2RlID0gYWN0aW9uYWJsZU1vZGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hY3Rpb25hYmxlTW9kZSA9IGFjdGlvbmFibGVNb2RlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWN0aW9uYWJsZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3Rpb25hYmxlTW9kZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWN0aW9uYWJsZU1vZGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWN0aW9uYWJsZU1vZGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2F2ZUNvbHVtbnMoc2F2ZUNvbHVtbnM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zYXZlQ29sdW1ucyA9IHNhdmVDb2x1bW5zO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2F2ZUNvbHVtbnMgPSBzYXZlQ29sdW1ucztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NhdmVDb2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5wdXQgZm9yIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgdGhlIGRhdGFzZXQncyBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc291cmNlKHNvdXJjZTogU29ob0RhdGFHcmlkU291cmNlRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZSgoc291cmNlIGFzIGFueSkpO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc291cmNlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZmlsdGVyIGJhciBvbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcmFibGUgaWYgdHJ1ZSwgdGhlIGZpbHRlciBiYXIgaXMgZGlzcGxheWVkOyBvdGhlcndpc2Ugbm8gZmlsdGVyIGJhciBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyYWJsZShmaWx0ZXJhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZSA9IGZpbHRlcmFibGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5maWx0ZXJhYmxlID0gZmlsdGVyYWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZpbHRlcmFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZmlsdGVyYWJsZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmlsdGVyYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5maWx0ZXJhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGRhdGFncmlkIGlzIGRpc3BsYXllZCBhcyBhIHRyZWUsIG90aGVyd2lzZVxuICAgKiB0aGUgZ3JpZCBpcyBkaXNwbGF5ZWQgYXMgZmxhdCByb3dzLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIGR5bmFtaWMsIGFuZCB3aWxsIGNhdXNlIHRoZSBncmlkIHRvIGJlIHJlYnVpbHRcbiAgICogaWYgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHRyZWVHcmlkIC0gYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGRhdGEgaXMgaGllcmFyY2hpY2FsLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHRyZWVHcmlkKHRyZWVHcmlkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRyZWVHcmlkICE9PSB0aGlzLl9ncmlkT3B0aW9ucy50cmVlR3JpZCkge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQgPSB0cmVlR3JpZDtcblxuICAgICAgLy8gSWYgdGhlIGpRdWVyeSBjb250cm9sIGhhcyBiZWVuIGluaXRpYWxpc2VkLCB1cGRhdGUgaXQuXG4gICAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MudHJlZUdyaWQgPSB0cmVlR3JpZDtcbiAgICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgndHJlZUdyaWQnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB0cmVlR3JpZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudHJlZUdyaWQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5xaXVlIGlkZW50aWZpZXI7IHdoaWNoIG1heSBiZSB1bmRlZmluZWQuXG4gICAqL1xuICBnZXQgdW5pcXVlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudW5pcXVlSWQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMudW5pcXVlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdW5xaXVlSWQgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdW5xaXVlSWQgLSB0aGUgbmV3IGlkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHVuaXF1ZUlkKHVuaXF1ZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3VuaXF1ZUlkJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSByb3dSZW9yZGVyIGZsYWcgLSByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgdGhlIGNvbnRyb2wgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LlxuICAgKi9cbiAgZ2V0IHJvd1Jlb3JkZXIoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1Jlb3JkZXI7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93UmVvcmRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByb3dSZW9yZGVyIGZsYWcgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcm93UmVvcmRlciAtIGlmIHRydWUgdGhlIHJvd3Mgd2lsbCBiZSByZW9yZGVyYWJsZTsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcm93UmVvcmRlcih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd1Jlb3JkZXIgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dSZW9yZGVyID0gdmFsdWU7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Jvd1Jlb3JkZXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHNob3dEaXJ0eSBmbGFnIC0gcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlIGlmIHRoZSBjb250cm9sIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5cbiAgICovXG4gIGdldCBzaG93RGlydHkoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dEaXJ0eTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zaG93RGlydHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2hvd0RpcnR5IGZsYWcgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2hvd0RpcnR5IC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd0RpcnR5KHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd0RpcnR5ID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2hvd0RpcnR5ID0gdmFsdWU7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dEaXJ0eScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlc2l6ZU1vZGUgb3B0aW9uIHRvIGNoYW5nZXMgdGhlIGNvbHVtbiByZXNpemUgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSByZXNpemVNb2RlIC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcmVzaXplTW9kZSh2YWx1ZTogU29ob0RhdGFHcmlkUmVzaXplTW9kZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJlc2l6ZU1vZGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yZXNpemVNb2RlID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Jlc2l6ZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlUm93RGVhY3RpdmF0aW9uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0RlYWN0aXZhdGlvbih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb24gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVSb3dEZXNlbGVjdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlUm93RGVzZWxlY3Rpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0Rlc2VsZWN0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2VkIHRvIGhvbGQgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgaW4gZm9ybWF0dGVyc1xuICAgKiBhbmQgZWRpdG9ycyBvciBhbnl3aGVyZSBlbHNlIGEgZGF0YWdyaWQgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHVzZXJPYmplY3QodXNlck9iamVjdDogYW55IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVzZXJPYmplY3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy51c2VyT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBhYmxlIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZ3JvdXBhYmxlKCk6IFNvaG9EYXRhR3JpZEdyb3VwYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmdyb3VwYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JvdXBhYmxlIHNldHRpbmdzIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwYWJsZSAtIHRoZSBncm91cGFibGUgc2V0dGluZ3MuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZ3JvdXBhYmxlKHZhbHVlOiBTb2hvRGF0YUdyaWRHcm91cGFibGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5ncm91cGFibGUgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZ3JvdXBhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGFuIGFycmF5IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKGRhdGE6IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5ncmlkRGF0YSA9IGRhdGE7XG4gICAgaWYgKGRhdGEgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zKGNvbHVtbnM6IFNvaG9EYXRhR3JpZENvbHVtbltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuXG4gICAgaWYgKGNvbHVtbnMgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucygodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLCAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5Hcm91cHMpO1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldE9yaWdpbmFsQ29sdW1ucygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFN1bW1hcnkgcm93IGNvbHVtbnMgc2V0dGluZ3NzXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc3VtbWFyeVJvd0NvbHVtbnMoc3VtbWFyeVJvd0NvbHVtbnM6IFNvaG9EYXRhR3JpZFN1bW1hcnlSb3dDb2x1bW5TZXR0aW5nc1tdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMgPSBzdW1tYXJ5Um93Q29sdW1ucztcbiAgICB0aGlzLmNoZWNrRm9yU3VtbWFyeVJvd1NldHRpbmdzKCk7XG5cbiAgICBpZiAodGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZUNvbHVtbnMoKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMgYXMgYW55KSwgKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbkdyb3VwcyBhcyBhbnkpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCB0aGF0IGZpbGxzIHRoZSBzcGFjZS5cbiAgICogVGhpcyBhbGxvd3MgY29sdW1ucyB0byBub3Qgc3RyZXRjaCB0byBmaWxsIHNvIHRoZXkgYXJlIGEgY29uc3RhbnQgc2l6ZS5cbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggcGVyY2VudCBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNwYWNlckNvbHVtbihzcGFjZXJDb2x1bW46IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzcGFjZXJDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIGlzIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgZW5kIHRoYXQgZmlsbHMgdGhlIHNwYWNlLlxuICAgKi9cbiAgZ2V0IHNwYWNlckNvbHVtbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnM/LnNwYWNlckNvbHVtbjtcbiAgfVxuXG4gIC8qIEV4cGVyaW1lbnRhbCBGZWF0dXJlIHRvIHN0aWNrIG9uIHRoZSB0b3Agb2YgdGhlIHBhZ2UuIFRoaXMgZmVhdHVyZSBoYXMgbnVtZXJvdXMgbGltaXRhdGlvbnMuICovXG4gIEBJbnB1dCgpIHNldCBzdGlja3lIZWFkZXIoc3RpY2t5SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RpY2t5SGVhZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKiBFeHBlcmltZW50YWwgRmVhdHVyZSB0byBzdGljayBvbiB0aGUgdG9wIG9mIHRoZSBwYWdlLiBUaGlzIGZlYXR1cmUgaGFzIG51bWVyb3VzIGxpbWl0YXRpb25zLiAqL1xuICBASW5wdXQoKSBzZXQgYXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBBcnJheTxPYmplY3Q+IHwgT2JqZWN0KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2F0dHJpYnV0ZXMnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBzaXppbmcgbWV0aG9kIGZvciB0aGUgYXV0byBzaXppbmcgY29sdW1ucy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5TaXppbmcoY29sdW1uU2l6aW5nOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NvbHVtblNpemluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHNpemluZyBtZXRob2QgZm9yIHRoZSBhdXRvIHNpemluZyBjb2x1bW5zLlxuICAgKi9cbiAgZ2V0IGNvbHVtblNpemluZygpOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB3aWR0aCBvZiB0aGUgZGF0YWdyaWQsXG4gICAqIG9yICdsYXN0JyB3aGVyZSB0aGUgbGFzdCBjb2x1bW4gd2lsbCBiZSBzdHJldGNoZWQgdG8gZmlsbCB0aGVcbiAgICogcmVtYWluaW5nIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyZXRjaENvbHVtbiAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc3RyZXRjaDsgb3IgJ2xhc3QnLFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0cmV0Y2hDb2x1bW4oc3RyZXRjaENvbHVtbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbiA9IHN0cmV0Y2hDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zdHJldGNoQ29sdW1uID0gc3RyZXRjaENvbHVtbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3N0cmV0Y2hDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHN0cmV0Y2gsIG9yICdsYXN0JyBpZiB0aGVcbiAgICogbGFzdCBjb2x1bW4gaXMgc3RyZXRjaGVkLlxuICAgKi9cbiAgZ2V0IHN0cmV0Y2hDb2x1bW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjb2x1bW4gd2lsbCByZWNhbGN1bGF0ZSBpdHMgd2lkdGggYW5kIHN0cmV0Y2ggaWYgcmVxdWlyZWQgb24gY29sdW1uIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZSAtIElmIGZhbHNlIHN0cmV0Y2ggbG9naWMgd29udCBydW4gb24gY29sdW1uIGNoYW5nZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzdHJldGNoQ29sdW1uT25DaGFuZ2Uoc3RyZXRjaENvbHVtbk9uQ2hhbmdlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RyZXRjaENvbHVtbk9uQ2hhbmdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZS5cbiAgICovXG4gIGdldCBzdHJldGNoQ29sdW1uT25DaGFuZ2UoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnN0cmV0Y2hDb2x1bW5PbkNoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3RvciBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd1BhZ2VTaXplU2VsZWN0b3Ioc2hvd1BhZ2VTaXplU2VsZWN0b3I6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93UGFnZVNpemVTZWxlY3RvciA9IHNob3dQYWdlU2l6ZVNlbGVjdG9yO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2hvd1BhZ2VTaXplU2VsZWN0b3IgPSBzaG93UGFnZVNpemVTZWxlY3RvcjtcblxuICAgICAgLy8gdG9kbzogbmVlZCBhIGZ1bmN0aW9uIGluIGRhdGFncmlkLmpzIHRoYXQgYWxsb3dzIHRvZ2dsaW5nIG9mIHRoZSBwYWdlIHNpemUgc2VsZWN0b3IuIGZvciBub3cgSSBoYXZlIHRvIHJlYnVpbGQgdGhlIGRhdGFncmlkLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd1BhZ2VTaXplU2VsZWN0b3InLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBoaWRlcyB0aGUgcGFnZXIgaWYgdGhlcmUncyBvbmx5IG9uZSBwYWdlIHdvcnRoIG9mIHJlc3VsdHMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaGlkZVBhZ2VyT25PbmVQYWdlKGhpZGVQYWdlck9uT25lUGFnZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcblxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaGlkZVBhZ2VyT25PbmVQYWdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBncm91cHNcbiAgICpcbiAgICogQXMgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRyb2wgaXNcbiAgICogaW5pdGlhbGlzZWQsIHN0YXNoIHRoZSBkYXRhIGZvciBsYXRlciwgYW5kIG9ubHlcbiAgICogY2FsbCBsb2FkRGF0YSBvbiB0aGUgY29udHJvbCBhcGkgaWYgcmVhZHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uR3JvdXAoY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uR3JvdXBzID0gY29sdW1uR3JvdXBzIHx8IFtdO1xuICAgIGlmIChjb2x1bW5Hcm91cHMgJiYgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcblxuICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVDb2x1bW5zKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMsIGNvbHVtbkdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZW1wdHlNZXNzYWdlYCBkYXRhIGdyaWQgb3B0aW9uLlxuICAgKiBVc2UgbnVsbCBvciB1bmRlZmluZWQgdG8gcmVtb3ZlIGFueSBlbXB0eSBtZXNzYWdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVtcHR5TWVzc2FnZShlbXB0eU1lc3NhZ2U6IFNvaG9FbXB0eU1lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIC8vIENoZWNrIGZvciB1bmRlZmluZWQvbnVsbCBhbmQgcmVzZXQgdG8gdGhlIGRlZmF1bHQgbWVzc2FnZVxuICAgIGlmICghZW1wdHlNZXNzYWdlKSB7XG4gICAgICAvLyBzb2hvIG9ubHkgdGFrZXMgYSBudWxsIGhlcmUgc28gbWFraW5nIGl0IHNvIGFueSAhZW1wdHlNZXNzYWdlIGdldHMgc2V0IHRvIG51bGxcbiAgICAgIGVtcHR5TWVzc2FnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5zZXRFbXB0eU1lc3NhZ2UoZW1wdHlNZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbXB0eU1lc3NhZ2UoKTogU29ob0VtcHR5TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0b29saXBzIG9uIHRoZSBjZWxsIHZhbHVlcywgYXQgYSBjb3N0IG9mIHBlcmZvcm1hbmNlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVuYWJsZVRvb2x0aXBzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW5hYmxlVG9vbHRpcHMgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmVuYWJsZVRvb2x0aXBzID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VuYWJsZVRvb2x0aXBzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW5hYmxlVG9vbHRpcHMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVuYWJsZVRvb2x0aXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHNvdXJjZSB0eXBlIG9mIHRoZSBncmlkLCBlaXRoZXI6XG4gICAqXG4gICAqIC0gXCJjb250ZW50LW9ubHlcIiB3aGVyZSB0YWJsZSBlbGVtZW50cyBhcmUgcHJvdmlkZWQgaW4gdGhlIGJvZHkuXG4gICAqIC0gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZm9yIGFuXG4gICAqICAgaW5qZWN0ZWQgc2VydmljZSAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMgaWYgbm90LlxuICAgKlxuICAgKiBBbGxvdyB0aGUgaW5wdXQgdG8gYmUgb3ZlcnJpZGVuLCB0byBtYXRjaCB0aGUgY29tcG9uZW50IHNlbGVjdG9yLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdzb2hvLWRhdGFncmlkJykgc2V0IHNvaG9EYXRhZ3JpZChkYXRhZ3JpZFR5cGU6IFNvaG9EYXRhR3JpZFR5cGUpIHtcbiAgICB0aGlzLmRhdGFncmlkVHlwZSA9IGRhdGFncmlkVHlwZSA/IGRhdGFncmlkVHlwZSA6IFNvaG9EYXRhR3JpZENvbXBvbmVudC5BVVRPO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb21wb25lbnQgT3V0cHV0XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgKG9yIHJvd3MpIGFyZSBzZWxlY3RlZC5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNlbGwgaXMgY2hhbmdlZC5cbiAgQE91dHB1dCgpXG4gIGNlbGxjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaXMgcmVtb3ZlZC5cbiAgQE91dHB1dCgpXG4gIHJvd1JlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICBAT3V0cHV0KClcbiAgcm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRBZGRSb3dFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIGdyaWQgaXMgZmlsdGVyZWQuXG4gIEBPdXRwdXQoKVxuICBmaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaW4gdGhlIGdyaWQgaXMgZXhwYW5kZWQuXG4gIEBPdXRwdXQoKVxuICBleHBhbmRyb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZFxuICAgKlxuICAgKiBAdG9kbyByZW1vdmUgb3ZlcnJpZGUgb2YgbmF0aXZlIGF0dHJpYnV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKVxuICBrZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRLZXlEb3duRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGVkaXQgbW9kZSBpcyBleGl0ZWQuXG4gIEBPdXRwdXQoKVxuICBleGl0ZWRpdG1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgZWRpdCBtb2RlIGlzIHN0YXJ0ZWQuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVlbnRlcmVkaXRtb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gZWRpdCBtb2RlIGlzIGVudGVyZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZW50ZXJlZGl0bW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaW4gdGhlIGdyaWQgaXMgY29sbGFwc2VkLlxuICBAT3V0cHV0KClcbiAgY29sbGFwc2Vyb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBzb3J0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNvcnRlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVQYWdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFmdGVyUGFnaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVSb3dBY3RpdmF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcm93QWN0aXZhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0RlYWN0aXZhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0RvdWJsZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGNvbnRleHRNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dDbGlja2VkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dSZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd1Jlb3JkZXJlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvcGVuRmlsdGVyUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRPcGVuRmlsdGVyUm93RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGNsb3NlRmlsdGVyUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRDbG9zZUZpbHRlclJvd0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBzZXR0aW5nc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNldHRpbmdzQ2hhbmdlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgYWZ0ZXJSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHZlcnRpY2FsU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTY3JvbGxFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyb3BlcmF0b3JjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudD4oKTtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBIb3N0IEJpbmRpbmdzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBTZXQgdGhlIGVuYWJsZSAvIGRpc2FibGVkIGNsYXNzIChub3Qgd29ya2luZylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1kaXNhYmxlZCcpXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcm9sZSBmb3IgdGhlIGdyaWQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBkYXRhZ3JpZFJvbGUoKSB7XG4gICAgaWYgKHRoaXMuX2dyaWRPcHRpb25zLnRyZWVHcmlkKSB7XG4gICAgICByZXR1cm4gJ3RyZWVncmlkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdkYXRhZ3JpZCc7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlIE1lbWJlciBEYXRhXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGpRdWVyeSBjb250cm9sLlxuICBwcml2YXRlIGpRdWVyeUVsZW1lbnQ/OiBKUXVlcnk7XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBTb2hvIGRhdGFncmlkIGNvbnRyb2wgYXBpLlxuICBwcml2YXRlIGRhdGFncmlkPzogU29ob0RhdGFHcmlkU3RhdGljIHwgbnVsbDtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGdyaWQncyBkYXRhLlxuICBwcml2YXRlIGdyaWREYXRhPzogYW55W107XG5cbiAgLy8gVGhlIHNvdXJjZSB0eXBlIGZvciB0aGUgZ3JpZC5cbiAgcHJpdmF0ZSBkYXRhZ3JpZFR5cGU/OiBzdHJpbmc7XG5cbiAgLy8gQW4gaW50ZXJuYWwgZ3JpZE9wdGlvbnMgb2JqZWN0IHRoYXQgZ2V0cyB1cGRhdGVkIGJ5IHVzaW5nXG4gIC8vIHRoZSBjb21wb25lbnQncyBJbnB1dHMoKVxuICBwcml2YXRlIF9ncmlkT3B0aW9uczogU29ob0RhdGFHcmlkT3B0aW9ucyA9IHtcbiAgICBzdHJldGNoQ29sdW1uOiAnbGFzdCcsXG4gICAgZW5hYmxlVG9vbHRpcHM6IGZhbHNlXG4gIH07XG5cbiAgLy8gUHJvdmlkZXMgaGludHMgdG8gdGhlIGNvbXBvbmVudCBhZnRlciB0aGUgbmV4dCByZWZyZXNoLlxuICBwcml2YXRlIHJlZnJlc2hIaW50OiBSZWZyZXNoSGludEZsYWdzID0gUmVmcmVzaEhpbnRGbGFncy5Ob25lO1xuXG4gIC8vIExpc3Qgb2Ygb3B0aW9uIG5hbWVzIGNoYW5nZWQgKGZvciBkZWJ1Z2dpbmcpLlxuICBwcml2YXRlIGNoYW5nZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgZHluYW1pYyBmb3JtYXR0ZXIgY29tcG9uZW50cyAtIGtleWVkIGJ5IHRoZSBvcmlnaW5hbCBhcmdzLlxuICBwcml2YXRlIGNlbGxDb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgZHluYW1pYyByb3d0ZW1wbGF0ZSBjb21wb25lbnRzIC0ga2V5ZWQgYnkgdGhlIG9yaWdpbmFsIGFyZ3MuXG4gIHByaXZhdGUgcm93VGVtcGxhdGVDb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIG5nWm9uZSAtIHRoZSBhbmd1bGFyIHpvbmUgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gZWxlbWVudFJlZiAtIHRoZSBlbGVtZW50IG1hdGNoaW5nIHRoZSBjb21wb25lbnQncyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yIC0gdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3Rvci5cbiAgICogQHBhcmFtIHJlc29sdmVyIC0gY29tcG9uZW50IGZhY3RvcnkgcmVzb2x2ZXIgKGZvciBlZGl0b3JzL2Zvcm1hdHRlcnMpLlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBkeW5hbWljIGNvbXBvbmVudCBpbmplY3RvciAoZm9yIGVkaXRvcnMvZm9ybWF0dGVycykuXG4gICAqIEBwYXJhbSBkYXRhZ3JpZFNlcnZpY2UgLSBzZXJ2aWNlIGZvciBvYnRhaW5pbmcgZGF0YSAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhcHA6IEFwcGxpY2F0aW9uUmVmLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBkYXRhZ3JpZFNlcnZpY2U6IFNvaG9EYXRhR3JpZFNlcnZpY2UpIHtcblxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQdWJsaWMgQVBJXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBnZXRDb2x1bW5Hcm91cChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZ2V0Q29sdW1uR3JvdXAoaWR4KTtcbiAgfVxuXG4gIGdldENvbHVtbkJ5SWQoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldENvbHVtbkdyb3VwKGlkeCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBzb3J0IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRhdGFncmlkLFxuICAgKiBjYW4gb25seSBiZSB1c2VkIG9uY2UgdGhlIGdyaWQgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICpcbiAgICogQHRvZG8gdGhpcyBzaG91bGQgbWFkZSBsYXp5LlxuICAgKi9cbiAgc2V0U29ydEZ1bmN0aW9uKHNvcnRGdW5jdGlvbjogU29ob0RhdGFHcmlkU29ydEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc29ydEZ1bmN0aW9uID0gc29ydEZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGFncmlkIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29sdW1uIGFuZCBkaXJlY3Rpb24gdG8gc29ydCB0aGUgZGF0YXNldCBvbi5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgdXNlZCBvbmNlIHRoZSBncmlkIGhhcyBiZWVuIGluaXRpYWxpc2VkLCBvdGhlcndpc2VcbiAgICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uSWQgdGhlIGlkIG9mIHRoZSBjb2x1bW4gdG8gc29ydCBvbjsgbXVzdCBiZSBub24tbnVsbC5cbiAgICogQHBhcmFtIGFzY2VuZGluZyBpZiB0cnVlIHNvcnQgYXNjZW5kaW5nLCBvdGhlcndpc2UgZGVzY2VuZGluZy4gIElmIG5vdCBzdXBwbGllZCB0aGUgc2V0dGluZyBpcyB0b2dnbGVkLlxuICAgKi9cbiAgc2V0U29ydENvbHVtbihjb2x1bW5JZDogc3RyaW5nLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXRTb3J0Q29sdW1uKGNvbHVtbklkLCBhc2NlbmRpbmcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YWdyaWQgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBzb3J0IGluZGljYXRvciBvbiBhIGNvbHVtbiB3aGVuIGRpc2FibGVDbGllbnRTb3J0IGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgc2V0U29ydEluZGljYXRvcihjb2x1bW5JZDogc3RyaW5nLCBhc2NlbmRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXRTb3J0SW5kaWNhdG9yKGNvbHVtbklkLCBhc2NlbmRpbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8ucGFnZXJBUEkuc2V0dGluZ3MucGFnZXNpemU7XG4gIH1cblxuICB1cGRhdGVQYWdpbmdJbmZvKHBhZ2VJbmZvOiBTb2hvUGFnZXJQYWdpbmdJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucGFnZXJBUEkudXBkYXRlUGFnaW5nSW5mbyhwYWdlSW5mbyk7XG4gICAgfSk7XG4gIH1cblxuICBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XG4gIH1cblxuICBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gIH1cblxuICB1cGRhdGVSb3coaWR4OiBudW1iZXIsIHJvdzogYW55KTogdm9pZCB7XG4gICAgQXJndW1lbnRIZWxwZXIuY2hlY2tOb3ROdWxsKCdyb3cnLCByb3cpO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlUm93KGlkeCwgcm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIGhpZGVDb2x1bW4oaWQ6IGFueSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmhpZGVDb2x1bW4oaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvd0NvbHVtbihpZDogYW55KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2hvd0NvbHVtbihpZCk7XG4gICAgfSk7XG4gIH1cblxuICBjb2x1bW5CeUlkKGlkOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5CeUlkKGlkKTtcbiAgfVxuXG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1ucztcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwcygpOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jb2x1bW5Hcm91cHM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjb2x1bW4gaW5kZXggZnJvbSB0aGUgY29sJ3MgaWQgKi9cbiAgY29sdW1uSWR4QnlJZChjb2x1bW5JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5JZHhCeUlkKGNvbHVtbklkKTtcbiAgfVxuXG4gIGdldEhlYWRlclJvd0NvbHVtbihmbGQ6IGFueSkge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldEhlYWRlclJvd0NvbHVtbihmbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByb3cgb2YgZGF0YSB0byB0aGUgZGF0YWdyaWQgYXQgdGhlIGdpdmVuIG9wdGlvbmFsIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSB0aGUgcm93IG9mIGRhdGEgdG8gYWRkLlxuICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIG9wdGlvbmFsIGxvY2FsdGlvbiwgJ3RvcCcgb3IgJ2JvdHRvbScgb3IgYSBudW1iZXIuXG4gICAqL1xuICBhZGRSb3coZGF0YTogYW55LCBsb2NhdGlvbj86ICd0b3AnIHwgJ2JvdHRvbScgfCBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmFkZFJvdyhkYXRhLCBsb2NhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBtYXRjaGluZyB0aGUgcm93SW5kZXggcGFzc2VkIGluIGZyb20gdGhlIGRhdGEgYW5kIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dJbmRleCB0aGUgaW5kZXggb2YgdGhlIHJvdyB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmVSb3cocm93SW5kZXg6IG51bWJlciwgbm9TeW5jPzogYm9vbGVhbiwgbm9UcmlnZ2VyPzogYm9vbGVhbikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlbW92ZVJvdyhyb3dJbmRleCwgbm9TeW5jLCBub1RyaWdnZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqL1xuICBkaXJ0eVJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Um93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IGNlbGxzIGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBkaXJ0eSBjZWxscyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIGRpcnR5Q2VsbHMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Q2VsbHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZGlydHkgY2VsbHMuXG4gICAqL1xuICBjbGVhckRpcnR5KCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSBjZWxsIHRoYXQncyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlLlxuICAgKi9cbiAgY29tbWl0Q2VsbEVkaXQoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNvbW1pdENlbGxFZGl0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGRpcnR5IGNlbGxzIGluIGdpdmVuIHJvdy5cbiAgICpcbiAgICogQHBhcmFtIHJvdyAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cuXG4gICAqL1xuICBjbGVhckRpcnR5Um93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNsZWFyRGlydHlSb3cocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBkaXJ0eSBvbiBnaXZlbiBjZWxsLlxuICAgKlxuICAgKiBAcGFyYW0gcm93IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gY2VsbCAtIHRoZSBjZWxsIG51bWJlciAoaWR4KSBvZiB0aGUgY2VsbFxuICAgKi9cbiAgY2xlYXJEaXJ0eUNlbGwocm93OiBudW1iZXIsIGNlbGw6IG51bWJlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5Q2VsbChyb3csIGNlbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvciBmb3IgYSBnaXZlbiBjZWxsIGluIGEgcm93XG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqL1xuICBjbGVhckFsbENlbGxFcnJvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJBbGxDZWxsRXJyb3Iocm93LCBjZWxsKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSBjZWxsIHdpdGggYW4gZXJyb3Igb2YgYSBnaXZlbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqIEBwYXJhbSB0eXBlIG9mIGVycm9yLlxuICAgKi9cbiAgY2xlYXJDZWxsRXJyb3Iocm93OiBudW1iZXIsIGNlbGw6IG51bWJlciwgdHlwZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJDZWxsRXJyb3Iocm93LCBjZWxsLCB0eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSByb3cgbGV2ZWwgYWxsIGVycm9ycywgYWxlcnRzLCBpbmZvIG1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICovXG4gIGNsZWFyUm93RXJyb3Iocm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhclJvd0Vycm9yKHJvdykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvcnMsIGFsZXJ0cyBhbmQgaW5mbyBtZXNzYWdlcyBpbiBlbnRpcmUgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckFsbEVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhckFsbEVycm9ycygpKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbGwgcm93cyBhbmQgY2VsbHMgaW4gdGhlIGVudGlyZSBncmlkIGlmIHRoZXkgaGF2ZSB2YWxpZGF0aW9uIG9uIHRoZSBjb2x1bW4gKi9cbiAgc2hvd1Jvd0Vycm9yKHJvdzogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IFNvaG9BbGVydFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5zaG93Um93RXJyb3Iocm93LCBtZXNzYWdlLCB0eXBlKSk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgYWxsIGNlbGxzIGluIGEgc3BlY2lmaWMgcm93ICovXG4gIHZhbGlkYXRlUm93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVSb3cocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuZCBzaG93IGEgbWVzc2FnZS9lcnJvciBvbiB0aGUgZ2l2ZW4gcm93LlxuICAgKi9cbiAgdmFsaWRhdGVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVBbGwoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gcm93IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gaWR4IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gc3RhdHVzIC0gc3RhdHVzIGNsYXNzIG5hbWUgZS5nLiAnZXJyb3InXG4gICAqIEBwYXJhbSB0b29sdGlwIC0gc3RyaW5nIHZhbHVlIGZvciB0b29sdGlwIG1lc3NhZ2UgZS5nLiAnRXJyb3InXG4gICAqL1xuICByb3dTdGF0dXMoaWR4OiBudW1iZXIsIHN0YXR1czogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucm93U3RhdHVzKGlkeCwgc3RhdHVzLCB0b29sdGlwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGN1cnJlbnRseSBtb2RpZmllZCByb3dzLCB0aGUgdHlwZSBvZiBtb2RpZmljYXRpb25cbiAgICogYW5kIHRoZSBjZWxscyB0aGF0IGFyZSBkaXJ0eSBhbmQgdGhlIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGtleWVkIG9iamVjdCBzaG93aW5nIHRoZSBkaXJ0eSByb3cgaW5mby5cbiAgICovXG4gIGdldE1vZGlmaWVkUm93cygpOiBTb2hvRGF0YUdyaWRNb2RpZmllZFJvd3Mge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRNb2RpZmllZFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjZWxsIHRvIGRpcnR5IGFuZCBhZGQgdGhlIGRpcnR5IGljb24gdmlzdWFsbHkuXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleFxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBpbmRleFxuICAgKiBAcGFyYW0gdG9nZ2xlIFRydWUgdG8gc2V0IGl0IGFuZCBmYWxzZSB0byByZW1vdmUgaXRcbiAgICogQHBhcmFtIGRhdGEgQWRkcyBkaXJ0eSBkYXRhIHRvIHRoZSBpbnRlcm5hbCB0cmFja2VyXG4gICAqL1xuICBzZXREaXJ0eUluZGljYXRvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB0b2dnbGU6IGJvb2xlYW4sIGRhdGE/OiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXREaXJ0eUluZGljYXRvcihyb3csIGNlbGwsIHRvZ2dsZSwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcm93c1xuICAgKi9cbiAgcmVtb3ZlU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBmaWx0ZXIgcm93LlxuICAgKi9cbiAgdG9nZ2xlRmlsdGVyUm93KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRvZ2dsZUZpbHRlclJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBjb25kaXRpb25zIGZyb20gb3V0c2lkZSBvciBwdWxsIGZyb20gZmlsdGVyIHJvd1xuICAgKi9cbiAgYXBwbHlGaWx0ZXIoY29uZGl0aW9ucz86IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5hcHBseUZpbHRlcihjb25kaXRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbHRlciByb3cgZnJvbSBwYXNzZWQgZGF0YSAvIHNldHRpbmdzXG4gICAqL1xuICBzZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnM6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWx0ZXIgY29uZGl0aW9ucyBpbiBhcnJheSBmb3JtIGZyb20gdGhlIFVJXG4gICAqL1xuICBmaWx0ZXJDb25kaXRpb25zKCk6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5maWx0ZXJDb25kaXRpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFueSBmaWx0ZXIgZGVmaW5lZCwgZm9yIHRoaXMgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkLmNsZWFyRmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RlZFJvd3MgaW5zdGVhZC5cbiAgICovXG4gIGdldFNlbGVjdGVkUm93cygpOiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqL1xuICBzZWxlY3RlZFJvd3MoKTogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNlbGVjdGVkUm93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIHRoZSByb3dzIGluIHRoZSBncmlkLlxuICAgKi9cbiAgc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RBbGxSb3dzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zZWxlY3RzIGFsbCB0aGUgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIHVuU2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy51blNlbGVjdEFsbFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gc2VsZWN0LlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBzZWxlY3RSb3dzIGluc3RlYWQuXG4gICAqL1xuICBzZWxlY3RSb3coaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gZGVzZWxlY3QuXG4gICAqL1xuICB1bnNlbGVjdFJvdyhpZHg6IG51bWJlcikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVuc2VsZWN0Um93KGlkeCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHJhbmdlIG9mIHJvd3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHJvdyBpbmRleGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgLSB0aGUgc3RhcnQgaW5kZXhcbiAgICogQHBhcmFtIGVuZCAtIHRoZW4gZW5kIGluZGV4XG4gICAqL1xuICBzZWxlY3RSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGNvbnN0IHJhbmdlOiBudW1iZXJbXSA9IFtzdGFydCwgZW5kXTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3dzQmV0d2VlbkluZGV4ZXMocmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc2VsZWN0ZWQgcm93cyBieSBwYXNzaW5nIHRoZSByb3cgaW5kZXggb3IgYW4gYXJyYXkgb2Ygcm93IGluZGV4ZXNcbiAgICovXG4gIHNlbGVjdFJvd3Mocm93OiBudW1iZXIgfCBudW1iZXJbXSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNlbGVjdFJvd3Mocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgY2hlY2tib3ggb24gdGhlIGhlYWRlci5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlICdhbGwnLCAncGFydGlhbCcgb3IgJ2FsbCcuXG4gICAqL1xuICBwdWJsaWMgc2V0SGVhZGVyQ2hlY2tib3hTdGF0ZShzdGF0ZTogU29ob0RhdGFHcmlkSGVhZGVyQ2hlY2tib3hTdGF0ZSkge1xuICAgIGNvbnN0IGhlYWRlckNoZWNrYm94ID0gdGhpcy5qUXVlcnlFbGVtZW50Py5maW5kKCcuZGF0YWdyaWQtaGVhZGVyJykuZmluZCgnLmRhdGFncmlkLWNoZWNrYm94Jyk7XG4gICAgaWYgKGhlYWRlckNoZWNrYm94KSB7XG4gICAgICBpZiAoc3RhdGUgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICBoZWFkZXJDaGVja2JveC5kYXRhKCdzZWxlY3RlZCcsICdwYXJ0aWFsJylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLWNoZWNrZWQgaXMtcGFydGlhbCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09ICdhbGwnKSB7XG4gICAgICAgIGhlYWRlckNoZWNrYm94LmRhdGEoJ3NlbGVjdGVkJywgJ2FsbCcpXG4gICAgICAgICAgLmFkZENsYXNzKCdpcy1jaGVja2VkJykucmVtb3ZlQ2xhc3MoJ2lzLXBhcnRpYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSAnbm9uZScpIHtcbiAgICAgICAgaGVhZGVyQ2hlY2tib3guZGF0YSgnc2VsZWN0ZWQnLCAnbm9uZScpXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1jaGVja2VkIGlzLXBhcnRpYWwnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHJvdyBvZiB0aGUgcGFzc2VkLWluIGlkeC5cbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGFjdGl2YXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uYWN0aXZhdGVSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIHRoZSBjdXJyZW50bHkgYWN0aXZhdGVkIHJvdy5cbiAgICpcbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGRlYWN0aXZhdGVSb3coKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVhY3RpdmF0ZVJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2YXRlZCByb3cuXG4gICAqIE5PVEU6IHZhbGlkIG9ubHkgd2hlbiBzZWxlY3Rpb24gbW9kZSBpcyAnbWl4ZWQnXG4gICAqL1xuICBhY3RpdmF0ZWRSb3coKTogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuYWN0aXZhdGVkUm93KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgb2YgdGhlIGNlbGwgdG8gc2V0IGFjdGl2ZS5cbiAgICogQHBhcmFtIGlkeDIgVGhlIGluZGV4IG9mIHRoZSBjZWxsIHRvIHNldCBhY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgc2V0QWN0aXZlQ2VsbChpZHg6IG51bWJlciwgaWR4MjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2V0QWN0aXZlQ2VsbChpZHgsIGlkeDIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFjdGl2ZSBjZWxsIGluZm9cbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmVDZWxsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5hY3RpdmVDZWxsO1xuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgcm93IGF0IDxiPmlkeDwvYj4gaW50byB2aWV3IGluIHRoZSB2aWV3IHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgdG8gc2Nyb2xsIGludG8gdmlldy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxSb3dJbnRvVmlldyhpZHg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldEFjdGl2ZUNlbGwoaWR4LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJvdyBudW1iZXJzIGZvciB0aGUgcm93cyBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGQgbmFtZSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGluIHNlYXJjaC5cbiAgICovXG4gIGZpbmRSb3dzQnlWYWx1ZShmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZmluZFJvd3NCeVZhbHVlKGZpZWxkTmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2dyYW1tYXRpY2FsbHkgdHJpZ2dlciBhIGNhbGwgdG8gdGhlIGRhdGFncmlkLnNldHRpbmdzLnNvdXJjZVxuICAgKiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBwYWdlclR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlclR5cGUgLSBhIHZhbGlkIHBhZ2VyIHR5cGUuXG4gICAqL1xuICB0cmlnZ2VyU291cmNlKHBhZ2VyVHlwZTogU29ob0RhdGFHcmlkVHJpZ2dlclNvdXJjZVBhZ2VyVHlwZSwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRyaWdnZXJTb3VyY2UocGFnZXJUeXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBleHBvcnQgb2YgZ3JpZCBkYXRhIHRvIEV4Y2VsLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHByZWZpeCBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKiBAcGFyYW0gd29ya3NoZWV0TmFtZSBUaGUgbmFtZSB0byBiZSB1c2VkIGZvciB0aGUgd29ya3NoZWV0LlxuICAgKiBAcGFyYW0gY3VzdG9tRHMgQSBkYXRhc291cmNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IChkZXByZWNhdGVkKVxuICAgKi9cbiAgZXhwb3J0VG9FeGNlbChmaWxlTmFtZTogc3RyaW5nLCB3b3Jrc2hlZXROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBjdXN0b21Ecz86IE9iamVjdFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZXhwb3J0VG9FeGNlbChmaWxlTmFtZSwgKHdvcmtzaGVldE5hbWUgYXMgYW55KSwgKGN1c3RvbURzIGFzIGFueSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgZXhwb3J0IG9mIGdyaWQgZGF0YSB0byBDU1YgZm9ybWF0dGVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcHJlZml4IG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIGV4cG9ydGVkIGZpbGUuXG4gICAqIEBwYXJhbSBjdXN0b21EcyBBIGRhdGFzb3VyY2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuXG4gICAqIEBwYXJhbSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciB0byB1c2UgaW4gdGhlIGN2cyBmaWxlLCBkZWZhdWx0cyB0byAnc2VwPSwnXG4gICAqIEBwYXJhbSBmb3JtYXQgaWYgdHJ1ZSwgZGF0ZSBhbmQgbnVtYmVyIHZhbHVlcyB3aWxsIGJlIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgbG9jYWxlXG4gICAqL1xuICBleHBvcnRUb0NzdihmaWxlTmFtZTogc3RyaW5nLCBjdXN0b21Ecz86IE9iamVjdFtdLCBzZXBhcmF0b3I6IHN0cmluZyA9ICdzZXA9LCcsIGZvcm1hdD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5leHBvcnRUb0NzdihmaWxlTmFtZSwgKGN1c3RvbURzIGFzIGFueSksIHNlcGFyYXRvciwgZm9ybWF0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb2x1bW5zIGFuZCBjb2x1bW5Hcm91cHMgZGlzcGxheWVkIG9uIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1ucyBUaGUgZGF0YWdyaWQgY29sdW1ucyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBjb2x1bW5Hcm91cHMgVGhlIGNvbHVtbiBncm91cHMgdG8gdXBkYXRlLlxuICAgKi9cbiAgdXBkYXRlQ29sdW1ucyhjb2x1bW5zOiBTb2hvRGF0YUdyaWRDb2x1bW5bXSwgY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucyhjb2x1bW5zLCBjb2x1bW5Hcm91cHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgSlNPTiBhcnJheSB3aXRoIGNvbHVtbnMgYW5kIHJldHVybiB0aGUgY29sdW1uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtblN0ciBUaGUganNvbiByZXByZXNudGF0aW9uIG9mIHRoZSBjb2x1bW4gb2JqZWN0LlxuICAgKiBAcmV0dXJuICBUaGUgYXJyYXkgb2YgY29sdW1ucy5cbiAgICovXG4gIGNvbHVtbnNGcm9tU3RyaW5nKGNvbHVtbnM6IHN0cmluZyk6IE9iamVjdCB7IC8vIEB0b2RvIHR5cGluZ3MgZm9yIHJldHVybiB2YWx1ZVxuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5zRnJvbVN0cmluZyhjb2x1bW5zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBjb2x1bW5zIHRvIHRoZWlyIGRlZmF1bHRzICh1c2VkIG9uIHJlc3RvcmUgbWVudSBpdGVtKS5cbiAgICovXG4gIHJlc2V0Q29sdW1ucygpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVzZXRDb2x1bW5zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgcGVyc29uYWxpemUgZGlhbG9nLlxuICAgKi9cbiAgcGVyc29uYWxpemVDb2x1bW5zKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5wZXJzb25hbGl6ZUNvbHVtbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSB1c2VyIHNldHRpbmdzIGZyb20gbG9jYWwgU3RvcmFnZSBvciBhcyBwYXNzZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzIHRvIHVzZS5cbiAgICovXG4gIHJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3M6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBFdmVudCBIYW5kbGVyc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHJlcXVlc3QgdG8gbG9hZCB0aGUgZGF0YSBmb3IgdGhlIGdyaWQgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogQHRvZG8gcGFnaW5nIC0gbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZD9cbiAgICovXG4gIHByaXZhdGUgb25EYXRhUmVxdWVzdChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikge1xuICAgIC8vIFRoZSByZXF1ZXN0IGZvciBkYXRhIGlzIG1hZGUgYnkgdGhlIGRhdGFncmlkLCBzbyBqdW1wIGJhY2sgaW50byB0aGUgYW5ndWxhciB6b25lIC4uLlxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxuICAgICAgLy8gLi4uIHJlcXVlc3QgdGhlIGRhdGEgZnJvbSB0aGUgc2VydmljZSAuLi5cbiAgICAgIHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldERhdGEocmVxdWVzdClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0czogT2JqZWN0W10pID0+IHtcbiAgICAgICAgICAvLyAuLiBvbiByZWNlaXB0LCBwYXNzIHRoZSBkYXRhIGJhY2sgdG8gdGhlIGRhdGFncmlkIGJ1dFxuICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGFuZ3VsYXIgem9uZS5cbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXNwb25zZShyZXN1bHRzLCByZXF1ZXN0KSk7XG4gICAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBhIGNoaWxkIHJvdyBoYXMgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIHByaXZhdGUgb25FeHBhbmRSb3coYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmJ1aWxkUm93VGVtcGxhdGVDb21wb25lbnQoZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5leHBhbmRyb3cubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY29tcG9uZW50IGZvciByb3dUZW1wbGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd1RlbXBsYXRlQ29tcG9uZW50KGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudFxuICAgICk7XG5cbiAgICAvLyBSZW1vdmUgY29tcG9uZW50IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gZXZlbnQucm93ID09PSBjLnJvdyk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXJQYXJlbnQgPSBldmVudC5kZXRhaWxbMF0ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXJvdy1kZXRhaWwtcGFkZGluZycpO1xuICAgIGNvbnRhaW5lclBhcmVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImRhdGFncmlkLWNlbGwtbGF5b3V0XCI+PC9kaXY+JztcbiAgICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJQYXJlbnQucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLWNlbGwtbGF5b3V0Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgbGV0IGRhdGFDb21wb25lbnQ6IGFueTtcbiAgICBpZiAoZXZlbnQuaXRlbS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQpKSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gZXZlbnQuaXRlbVsodGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUZpZWxkIGFzIGFueSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogJ2FyZ3MnLFxuICAgICAgICAgIHVzZVZhbHVlOiB7IGlucHV0c0RhdGE6IHRoaXMuZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHMsIGRhdGE6IGRhdGFDb21wb25lbnQsIC4uLmV2ZW50IH0sXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgW10sIGNvbnRhaW5lcik7XG4gICAgZXZlbnRbJ3Jvd1RlbXBsYXRlQ29tcG9uZW50J10gPSBjb21wb25lbnQ7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gLi4uIGZpbmFsbHkgc3RvcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGZvciBsYXRlciwgd2UnbGwgZGVsZXRlIGl0IHdoZW5cbiAgICAvLyByZXF1ZXN0ZWQsIG9yIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLnB1c2goeyByb3c6IGV2ZW50LnJvdywgY29tcG9uZW50IH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjb250ZXh0IG1lbnUgaXMgb3BlbmVkXG4gICAqL1xuICBwcml2YXRlIG9uS2V5RG93bihlOiBKUXVlcnkuRXZlbnQsIGFyZ3M6IFNvaG9EYXRhR3JpZEtleURvd25BcmdzLCByZXNwb25zZTogRnVuY3Rpb24pIHtcbiAgICBjb25zdCBldmVudCA9IHsgZSwgYXJncywgcmVzcG9uc2UgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5rZXlkb3duLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGUua2V5ID09PSAnRjEwJyAmJiBlLnNoaWZ0S2V5KSB7XG4gICAgICAkKChlIGFzIGFueSkuY3VycmVudFRhcmdldCkudHJpZ2dlcignY29udGV4dG1lbnUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gZXhwYW5kZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IG9uQmVmb3JlU2VsZWN0KGJlZm9yZVNlbGVjdEZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRCZWZvcmVTZWxlY3RGdW5jdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uQmVmb3JlU2VsZWN0ID0gYmVmb3JlU2VsZWN0RnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3QgPSBiZWZvcmVTZWxlY3RGdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uQmVmb3JlU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IG9uQmVmb3JlU2VsZWN0KCk6IFNvaG9EYXRhR3JpZEJlZm9yZVNlbGVjdEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5vbkJlZm9yZVNlbGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgTWFrZXMgaXQgcG9zc2libGUgdG8gc2F2ZSBzZWxlY3Rpb25zIHdoZW4gY2hhbmdpbmcgcGFnZXMgb24gc2VydmVyIHNpZGUgcGFnaW5nLlxuICAgKiAgWW91IG1heSB3YW50IHRvIGFsc28gdXNlIHNob3dTZWxlY3RBbGxDaGVja0JveDogZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbGxvd1NlbGVjdEFjcm9zc1BhZ2VzKGFsbG93U2VsZWN0QWNyb3NzUGFnZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2FsbG93U2VsZWN0QWNyb3NzUGFnZXMnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuICBnZXQgYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogIFNlbGVjdCBhbGwgd2lsbCBlZmZlY3Qgb25seSBvbiBjdXJyZW50IHBhZ2UgYW5kIGl0cyBmb3IgY2xpZW50IHNpZGUgcGFnaW5nIG9ubHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2VsZWN0QWxsQ3VycmVudFBhZ2Uoc2VsZWN0QWxsQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZSA9IHNlbGVjdEFsbEN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdEFsbEN1cnJlbnRQYWdlID0gc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RBbGxDdXJyZW50UGFnZScsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzZWxlY3RBbGxDdXJyZW50UGFnZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjb2x1bW4gSURzIHVzZWQgdG8gZGVmaW5lIGFyaWEgZGVzY3JpcHRvcnMgZm9yIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbHVtbklkcyhjb2x1bW5JZHM6IEFycmF5PFN0cmluZyB8IE51bWJlcj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5JZHMgPSBjb2x1bW5JZHM7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uSWRzID0gY29sdW1uSWRzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY29sdW1uSWRzJywgUmVmcmVzaEhpbnRGbGFncy5Ob25lKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbHVtbklkcygpOiBBcnJheTxTdHJpbmcgfCBOdW1iZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1uSWRzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uSWRzO1xuICB9XG5cbiAgLyoqXG4gICAqSWYgdHJ1ZSwgdGhlIG5ldyByb3cgaW5kaWNhdG9yIHdpbGwgZGlzcGxheSBhZnRlciBhZGRpbmcgYSByb3dcbiAgICpcbiAgICogQHBhcmFtIHNob3dOZXdSb3dJbmRpY2F0b3IgYm9vbGVhbiBzaG93IG5ldyBpbmRpY2F0b3Igc2V0dGluZ1xuICAgKi9cbiAgQElucHV0KCkgc2V0IHNob3dOZXdSb3dJbmRpY2F0b3Ioc2hvd05ld1Jvd0luZGljYXRvcjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd05ld1Jvd0luZGljYXRvcicsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzaG93TmV3Um93SW5kaWNhdG9yKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkV4cGFuZENoaWxkcmVuKGV4cGFuZENoaWxkcmVuRnVuY3Rpb246IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uRXhwYW5kQ2hpbGRyZW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBvbkV4cGFuZENoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMub25FeHBhbmRDaGlsZHJlbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkNvbGxhcHNlQ2hpbGRyZW4oY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRDb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkNvbGxhcHNlQ2hpbGRyZW4gPSBjb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25Db2xsYXBzZUNoaWxkcmVuID0gY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnb25Db2xsYXBzZUNoaWxkcmVuJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb25Db2xsYXBzZUNoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZENvbGxhcHNlQ2hpbGRyZW5GdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgfVxuXG4gIC8qIEljb24gbmFtZSBmb3IgZmFsbGJhY2tzIGlmIHRoZSBpbWFnZSBkb2VzIG5vdCBsb2FkICovXG4gIEBJbnB1dCgpIHNldCBmYWxsYmFja0ltYWdlKGZhbGxiYWNrSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrSW1hZ2UgPSBmYWxsYmFja0ltYWdlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZhbGxiYWNrSW1hZ2UgPSBmYWxsYmFja0ltYWdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZmFsbGJhY2tJbWFnZScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZhbGxiYWNrSW1hZ2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZmFsbGJhY2tJbWFnZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrSW1hZ2U7XG4gIH1cblxuICAvKiBUb29sdGlwIHRvIHNob3cgaWYgaXQgdGhlIGZhbGxiYWNrIGFwcGVhcnMgKi9cbiAgQElucHV0KCkgc2V0IGZhbGxiYWNrVG9vbHRpcChmYWxsYmFja1Rvb2x0aXA6IFNvaG9GYWxsYmFja1Rvb2x0aXBPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmFsbGJhY2tUb29sdGlwID0gZmFsbGJhY2tUb29sdGlwO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZhbGxiYWNrVG9vbHRpcCA9IGZhbGxiYWNrVG9vbHRpcDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZhbGxiYWNrVG9vbHRpcCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZhbGxiYWNrVG9vbHRpcCgpOiBTb2hvRmFsbGJhY2tUb29sdGlwT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZhbGxiYWNrVG9vbHRpcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrVG9vbHRpcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBlZGl0IG1vZGUgaXMgYWN0aXZhdGVkIG9uIGFuIGVkaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgdGhlIGV2ZW50IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBvbkV4aXRFZGl0TW9kZShhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5leGl0ZWRpdG1vZGUubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYmVmb3JlIGVkaXQgbW9kZSBpcyBhY3RpdmF0ZWQgb24gYW4gZWRpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgZXZlbnQgYXJndW1lbnRzXG4gICAqL1xuICBwcml2YXRlIG9uQmVmb3JlRW50ZXJFZGl0TW9kZShhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5iZWZvcmVlbnRlcmVkaXRtb2RlLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gZWRpdCBtb2RlIGlzIGFjdGl2YXRlZCBvbiBhbiBlZGl0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBldmVudCBhcmd1bWVudHNcbiAgICovXG4gIHByaXZhdGUgb25FbnRlckVkaXRNb2RlKGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmVudGVyZWRpdG1vZGUubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gY29sbGFwc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkNvbGxhcHNlUm93KGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NvbGxhcHNlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxhcHNlcm93Lm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaGFzIGJlZW4gYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93QWRkKGFyZ3M6IFNvaG9EYXRhR3JpZEFkZFJvd0V2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93QWRkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIGNlbGwgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ2VsbENoYW5nZShhcmdzOiBTb2hvRGF0YUdyaWRDZWxsQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jZWxsY2hhbmdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0NsaWNrZWQoYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd0NsaWNrZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBmaWx0ZXIgcm93IGlzIGNsb3NlZC5cbiAgICovXG4gIHByaXZhdGUgb25DbG9zZUZpbHRlclJvdyhhcmdzOiBTb2hvRGF0YUdyaWRDbG9zZUZpbHRlclJvd0V2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VGaWx0ZXJSb3cubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgY29udGV4dCBtZW51IGlzIGlzIGNsaWNrZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ29udGV4dE1lbnUoYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51Py5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSBjb250ZXh0IG1lbnUgaXMgaXMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgb25Eb3VibGVDbGljayhhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93RG91YmxlQ2xpY2tlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgZmlsdGVyZWQuXG4gICAqL1xuICBwcml2YXRlIG9uRmlsdGVyZWQoYXJnczogU29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZpbHRlcmVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBmaWx0ZXIgcm93IG9wZW5lZC5cbiAgICovXG4gIHByaXZhdGUgb25PcGVuRmlsdGVyUm93KGFyZ3M6IFNvaG9EYXRhR3JpZE9wZW5GaWx0ZXJSb3dFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLm9wZW5GaWx0ZXJSb3cubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIHJlbW92ZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93UmVtb3ZlKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1JlbW92ZUV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93UmVtb3ZlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZGF0YSBpcyByZW5kZXJlZFxuICAgKi9cbiAgcHJpdmF0ZSBvblJlbmRlcmVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJlbmRlcmVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgZmlsdGVyZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJSZW5kZXIoYXJnczogU29ob0RhdGFHcmlkQWZ0ZXJSZW5kZXJFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYmVmb3JlIGEgcm93IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVSb3dBY3RpdmF0ZWQoYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5iZWZvcmVSb3dBY3RpdmF0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dBY3RpdmF0ZWQoYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dBY3RpdmF0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIGRlYWN0aXZhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0RlYWN0aXZhdGVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dEZWFjdGl2YXRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgcmVvcmRlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd1Jlb3JkZXJlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dSZW9yZGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd1Jlb3JkZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgb25TZWxlY3RlZChhcmdzOiBTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHNldHRpbmdzIGFyZSBjaGFuZ2VkIG9uIHRoZSBncmlkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNldHRpbmdzQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzQ2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgc29ydGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNvcnRlZChhcmdzOiBTb2hvRGF0YUdyaWRTb3J0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNvcnRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGJlZm9yZSBwYWdpbmdcbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVQYWdpbmcoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZVBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHBhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyUGFnaW5nKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvblZlcnRpY2FsU2Nyb2xsKGFyZ3M6IFNvaG9EYXRhR3JpZFNjcm9sbEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMudmVydGljYWxTY3JvbGwubmV4dChhcmdzKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZpbHRlcm9wZXJhdG9yY2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IGRvbSBqUXVlcnkgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBpbmNsdWRlR3JvdXBzIElmIHRydWUgZ3JvdXBzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAqIEByZXR1cm4gVGhlIGRvbSBqUXVlcnkgbm9kZVxuICAgKi9cbiAgcm93Tm9kZShyb3c6IG51bWJlciwgaW5jbHVkZUdyb3VwczogYm9vbGVhbik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5yb3dOb2RlKHJvdywgaW5jbHVkZUdyb3Vwcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2VsbCBkb20gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBjZWxsIFRoZSBjZWxsIGluZGV4LlxuICAgKiBAcGFyYW0gIGluY2x1ZGVHcm91cHMgSWYgdHJ1ZSBncm91cHMgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICogQHJldHVybiBUaGUgZG9tIG5vZGVcbiAgICovXG4gIGNlbGxOb2RlKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIGluY2x1ZGVHcm91cHM6IGJvb2xlYW4pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8uY2VsbE5vZGUocm93LCBjZWxsLCBpbmNsdWRlR3JvdXBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGUgRXZlbnRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBpbml0aWFsaXplcyB0aGUgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVTb3VyY2UodGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgQW5ndWxhciBwcm9qZWN0cyBleHRlcm5hbCBjb250ZW50IGludG8gaXRzIHZpZXcuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gT25jZSB0aGUgdmlldyBpcyBjcmVhdGVkIGFuZCByZWFkeSwgaW5pdGlhaXNlIHRoZSBkYXRhIGdyaWQgY29tcG9uZW50LlxuICAgIHRoaXMuYnVpbGREYXRhR3JpZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMucmVmcmVzaEhpbnQgIT09IFJlZnJlc2hIaW50RmxhZ3MuTm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVDb250cm9sKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAganVzdCBiZWZvcmUgQW5ndWxhciBkZXN0cm95cyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBVbnN1YnNjcmliZSBvYnNlcnZhYmxlcywgZGV0YWNoIGV2ZW50IGhhbmRsZXJzIGFuZCByZW1vdmUgb3RoZXIgcmVzb3VyY2VzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveURhdGFHcmlkKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgTWVtYmVyc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBqUXVlcnkgY29udHJvbCAoYW5kIGFueSBvdGhlciByZXNvdXJjZXMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgZGVzdHJveURhdGFHcmlkKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIGR5bmFtaWMgY29tcG9uZW50cy5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHRoZSBjYWNoZS5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzID0gW107XG5cbiAgICAvLyBSZW1vdmUgcm93VGVtcGxhdGUgZHluYW1pYyBjb21wb25lbnRzLlxuICAgIGlmICh0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cyAmJiB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3cgZGVzdHJveSB0aGUgZ3JpZC5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgaWYgKHRoaXMuZGF0YWdyaWQuZGVzdHJveSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YWdyaWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSAncG9zdENlbGxSZW5kZXInIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgdG8gaG9zdCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIGFyZ3MgdGhlIGZvcm1hdHRlciBhcmd1bWVudHMuXG4gICAqL1xuICBwcml2YXRlIG9uUG9zdFJlbmRlckNlbGwoY29udGFpbmVyOiBKUXVlcnksIGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykge1xuICAgIC8vIFByZS1jb25kaXRpb25zXG4gICAgaWYgKCFhcmdzLmNvbC5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybjsgLy8gdGhyb3cgRXJyb3IoYE1pc3NpbmcgJ2NvbXBvbmVudCcgaW4gY29sdW1uICR7YXJncy5jb2wuaWR9YCk7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgZmFjdG9yeSBmb3IgdGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgb24gdGhlIGNvbHVtbi5cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShhcmdzLmNvbC5jb21wb25lbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluamVjdG9yIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBhcmd1bWVudHMgZm9yIHRoZVxuICAgIC8vIGNvbXBvbmVudC5cbiAgICAvLyBjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGFyZ3MgfV0sIHRoaXMuaW5qZWN0b3IpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBhcmdzIH1dLCBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgW10sIGNvbnRhaW5lcik7XG5cbiAgICAvLyBDb3B5IGludG8gaXQgYW55IGNvbHVtbiBsZXZlbCBJbnB1dHMsIHRoZXNlIGFyZSBvcHRpb25hbCBidXQgYWxsb3dcbiAgICAvLyBjb2x1bW4gc3BlY2lmaWMgb3ZlcnJpZGVzIHRvIGJlIGRlZmluZWQuXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnQuaW5zdGFuY2UsIGFyZ3MuY29sLmNvbXBvbmVudElucHV0cyk7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gRG8gdGhpcyBhdCB0aGUgZW5kP1xuXG4gICAgLy8gLi4uIGZpbmFsbHkgc3RvcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGZvciBsYXRlciwgd2UnbGwgZGVsZXRlIGl0IHdoZW5cbiAgICAvLyByZXF1ZXN0ZWQsIG9yIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMuY2VsbENvbXBvbmVudHMucHVzaChcbiAgICAgIHsgcm93OiBhcmdzLnJvdywgY2VsbDogYXJncy5jZWxsLCBjb21wb25lbnQgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgJ2Rlc3Ryb3lDZWxsJyBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gYXJncyB0aGUgYXJnc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRlc3Ryb3lDZWxsKGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2VsbENvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBhcmdzLnJvdyA9PT0gYy5yb3cgJiYgYXJncy5jZWxsID09PSBjLmNlbGwpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5jZWxsQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLmNlbGxDb21wb25lbnRzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25FZGl0Q2VsbChlZGl0b3I6IEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvcikge1xuICAgIC8vIFByZS1jb25kaXRpb25zXG4gICAgaWYgKCFlZGl0b3IuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm47IC8vIHRocm93IEVycm9yKGBNaXNzaW5nICdjb21wb25lbnQnIGluIGNvbHVtbiAke2FyZ3MuY29sLmlkfWApO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGZhY3RvcnkgZm9yIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIG9uIHRoZSBjb2x1bW4uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZWRpdG9yLmNvbXBvbmVudCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5qZWN0b3IgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGFyZ3VtZW50cyBmb3IgdGhlXG4gICAgLy8gY29tcG9uZW50LlxuICAgIC8vIGNvbnN0IGkgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBlZGl0b3IuYXJncyB9XSwgdGhpcy5pbmplY3Rvcik7XG4gICAgY29uc3QgaSA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGVkaXRvci5hcmdzIH1dLFxuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yXG4gICAgfSk7XG5cbiAgICAvLyBXYXJuaW5nISEgdGhlIGR5bmFtaWMgY29tcG9uZW50IGlzIG5vdCBhZGRlZCBpbnNpZGUgdGhlIGNvbnRhaW5lcixcbiAgICAvLyBidXQgYXMgYSBzaWJsaW5nLCBzbyB3aGVuIGl0J3MgZGVzdHJveWVkIGl0IHRha2VzIGFueSBzaWJsaW5ncyAgd2l0aFxuICAgIC8vIGl0LiAgSXQgaXMgbm90IGNsZWFyIHdoeSB0aGlzIC0gc28gdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgYWRkXG4gICAgLy8gYSBzaW5nbGUgY2hpbGQgdG8gdGhlIGNlbGwgY29udGFpbmVyLlxuICAgIGNvbnN0IHRyYW5zaWVudENvbnRhaW5lciA9ICQoJzxkaXY+PC9kaXY+JykuYXBwZW5kVG8oZWRpdG9yLmFyZ3MuY29udGFpbmVyKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50LCBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKGksIFtdLCB0cmFuc2llbnRDb250YWluZXJbMF0pIGFzIENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPjtcblxuICAgIC8vIENvcHkgaW50byBpdCBhbnkgY29sdW1uIGxldmVsIElucHV0cywgdGhlc2UgYXJlIG9wdGlvbmFsIGJ1dCBhbGxvd1xuICAgIC8vIGNvbHVtbiBzcGVjaWZpYyBvdmVycmlkZXMgdG8gYmUgZGVmaW5lZC5cbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgZWRpdG9yLmFyZ3MuY29sLmVkaXRvckNvbXBvbmVudElucHV0cyk7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRvIHRoZSBlZGl0b3IuXG4gICAgZWRpdG9yLmluaXQoY29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREYXRhR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBjYWxsIG91dHNpZGUgdGhlIGFuZ3VsYXIgem9uZSBzbyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgLy8gaXNuJ3QgdHJpZ2dlcmVkIGJ5IHRoZSBzb2hvIGNvbXBvbmVudC5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBXcmFwIHRoZSBlbGVtZW50IGluIGEgalF1ZXJ5IHNlbGVjdG9yLlxuICAgICAgdGhpcy5qUXVlcnlFbGVtZW50ID0galF1ZXJ5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgLy8gQWRkIHRoZSBvblBvc3RDZWxsUmVuZGVyZXJcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uUG9zdFJlbmRlckNlbGwgPSAoYywgYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSA9PiB7XG4gICAgICAgIHRoaXMub25Qb3N0UmVuZGVyQ2VsbChjLCBhcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCB0aGUgZGVzdHJveSBjZWxsIGNhbGxiYWNrLlxuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25EZXN0cm95Q2VsbCA9IChfLCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpID0+IHtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3lDZWxsKGFyZ3MpO1xuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBlZGl0IGNlbGwgY2FsbGJhY2suXG4gICAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkVkaXRDZWxsID0gKGVkaXRvcjogRXh0ZW5kZWRTb2hvRGF0YUdyaWRDZWxsRWRpdG9yKSA9PiB7XG4gICAgICAgIHRoaXMub25FZGl0Q2VsbChlZGl0b3IpO1xuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBrZXlkb3duIGNhbGxiYWNrLlxuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25LZXlEb3duID0gKGU6IEpRdWVyeS5FdmVudCwgYXJnczogU29ob0RhdGFHcmlkS2V5RG93bkFyZ3MsIHJlc3BvbnNlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm9uS2V5RG93bihlLCBhcmdzLCByZXNwb25zZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXNlIGFueSBldmVudCBoYW5kbGVycy5cbiAgICAgIHRoaXMualF1ZXJ5RWxlbWVudFxuICAgICAgICAub24oJ2FkZHJvdycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRBZGRSb3dFdmVudCkgPT4gdGhpcy5vblJvd0FkZChhcmdzKSlcbiAgICAgICAgLm9uKCdjZWxsY2hhbmdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudCkgPT4gdGhpcy5vbkNlbGxDaGFuZ2UoYXJncykpXG4gICAgICAgIC5vbignY2xpY2snLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vblJvd0NsaWNrZWQoYXJncykpXG4gICAgICAgIC5vbignY2xvc2VmaWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkQ2xvc2VGaWx0ZXJSb3dFdmVudCkgPT4gdGhpcy5vbkNsb3NlRmlsdGVyUm93KGFyZ3MpKVxuICAgICAgICAub24oJ2NvbGxhcHNlcm93JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NvbGxhcHNlRXZlbnQpID0+IHRoaXMub25Db2xsYXBzZVJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdjb250ZXh0bWVudScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSA9PiB0aGlzLm9uQ29udGV4dE1lbnUoYXJncykpXG4gICAgICAgIC5vbignZGJsY2xpY2snLCAoX2U6IEpRdWVyeS5UcmlnZ2VyZWRFdmVudCwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vbkRvdWJsZUNsaWNrKGFyZ3MpKVxuICAgICAgICAub24oJ2JlZm9yZWVudGVyZWRpdG1vZGUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkgPT4gdGhpcy5vbkJlZm9yZUVudGVyRWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZXhpdGVkaXRtb2RlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpID0+IHRoaXMub25FeGl0RWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZW50ZXJlZGl0bW9kZScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSA9PiB0aGlzLm9uRW50ZXJFZGl0TW9kZShhcmdzKSlcbiAgICAgICAgLm9uKCdleHBhbmRyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpID0+IHRoaXMub25FeHBhbmRSb3coYXJncykpXG4gICAgICAgIC5vbignZmlsdGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ29wZW5maWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkT3BlbkZpbHRlclJvd0V2ZW50KSA9PiB0aGlzLm9uT3BlbkZpbHRlclJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW1vdmUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQpID0+IHRoaXMub25Sb3dSZW1vdmUoYXJncykpXG4gICAgICAgIC5vbigncmVuZGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudCkgPT4gdGhpcy5vblJlbmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ2FmdGVycmVuZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQpID0+IHRoaXMub25BZnRlclJlbmRlcihhcmdzKSlcbiAgICAgICAgLm9uKCdiZWZvcmVyb3dhY3RpdmF0ZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25CZWZvcmVSb3dBY3RpdmF0ZWQoYXJncykpXG4gICAgICAgIC5vbigncm93YWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSA9PiB0aGlzLm9uUm93QWN0aXZhdGVkKGFyZ3MpKVxuICAgICAgICAub24oJ3Jvd2RlYWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25Sb3dEZWFjdGl2YXRlZChhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW9yZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1Jlb3JkZXJlZEV2ZW50KSA9PiB0aGlzLm9uUm93UmVvcmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ3NlbGVjdGVkJyxcbiAgICAgICAgICAoZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdLCB0eXBlPzogU29ob0RhdGFHcmlkU2VsZWN0ZWRFdmVudFR5cGUpID0+XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWQoeyBlLCByb3dzOiBhcmdzLCB0eXBlIH0pKVxuICAgICAgICAub24oJ3NldHRpbmdzY2hhbmdlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudCkgPT4gdGhpcy5vblNldHRpbmdzQ2hhbmdlZChhcmdzKSlcbiAgICAgICAgLm9uKCdzb3J0ZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkU29ydGVkRXZlbnQpID0+IHRoaXMub25Tb3J0ZWQoYXJncykpXG4gICAgICAgIC5vbignYmVmb3JlcGFnaW5nJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25CZWZvcmVQYWdpbmcoYXJncykpXG4gICAgICAgIC5vbignYWZ0ZXJwYWdpbmcnLCAoX2U6IGFueSwgYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykgPT4gdGhpcy5vbkFmdGVyUGFnaW5nKGFyZ3MpKVxuICAgICAgICAub24oJ3Njcm9sbCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTY3JvbGxFdmVudCkgPT4gdGhpcy5vblZlcnRpY2FsU2Nyb2xsKGFyZ3MpKVxuICAgICAgICAub24oJ2ZpbHRlcm9wZXJhdG9yY2hhbmdlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzKSlcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpc2UgdGhlIFNvaG9YaSBjb250cm9sLlxuICAgIHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YWdyaWQodGhpcy5fZ3JpZE9wdGlvbnMpO1xuXG4gICAgLy8gT25jZSB0aGUgY29udHJvbCBpcyBpbml0aWFsaXNlZCwgZXh0cmFjdCB0aGUgY29udHJvbFxuICAgIC8vIHBsdWctaW4gZnJvbSB0aGUgZWxlbWVudC4gIFRoZSBlbGVtZW50IG5hbWUgaXNcbiAgICAvLyBkZWZpbmVkIGJ5IHRoZSBwbHVnLWluLCBidXQgaW4gdGhpcyBjYXNlIGlzICdkYXRhZ3JpZCcuXG4gICAgdGhpcy5kYXRhZ3JpZCA9IHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YSgnZGF0YWdyaWQnKTtcblxuICAgIC8vIElmIFwiYXV0b1wiIGFuZCB0aGVyZSdzIGEgc2VydmljZSwgZ2V0IHRoZSBjb2x1bW5zIGZyb20gaXQuXG4gICAgLy8gKG1heSB3YW50IHRvIGNoZWNrIGlmIGNvbHVtbnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0PyBFcnJvcj8pXG4gICAgaWYgKHRoaXMuZGF0YWdyaWRUeXBlID09PSBTb2hvRGF0YUdyaWRDb21wb25lbnQuQVVUTyAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgLy8gQm9vdHN0cmFwIGZyb20gc2VydmljZSwgbm90ZSB0aGlzIGlzIG5vdCBhc3luYy5cbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldENvbHVtbnMoKTtcbiAgICAgIC8vIE9uY2UgdGhlIGNvbHVtbnMgYXJlIHNldCwgcmVxdWVzdCB0aGUgZGF0YSAocGFnaW5nPylcbiAgICAgIHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldERhdGEobnVsbClcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55W10pID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWREYXRhKSB7XG4gICAgICAvLyBOb3QgdXNpbmcgYSBzZXJ2aWNlLCBzbyB1c2UgdGhlIHByZS1sb2FkZWQgZGF0YS5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ubG9hZERhdGEoKHRoaXMuZ3JpZERhdGEgYXMgYW55KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGNvbXBvbmVudHMgYXMgcmVxdWlyaW5nIGEgcmVidWlsZCBhZnRlciB0aGUgbmV4dCB1cGRhdGUuXG4gICAqXG4gICAqIEB0b2RvIHBvc3NpYmxlIGFkZCBoaW50cz8gUmVidWlsZCwgVXBkYXRlLCBTZXRPcHRpb25cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbk5hbWUgLSB0aGUgb3B0aW9uIHRoYXQgd2FzIHVwZGF0ZWQsIChhbGxvd2luZyBzcGVjaWZpYyBoYW5kbGluZylcbiAgICogQHBhcmFtIGhpbnQgLSB0aGUgdHlwZSBvZiByZWZyZXNoIHJlcXVpcmVkLCB1cGRhdGU/LlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrRm9yUmVmcmVzaChvcHRpb25OYW1lOiBzdHJpbmcsIGhpbnQ6IFJlZnJlc2hIaW50RmxhZ3MpIHtcblxuICAgIC8vIE1lcmdlIGluIHRoZSBoaW50LlxuICAgIHRoaXMucmVmcmVzaEhpbnQgfD0gaGludDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgLy8gLi4uIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXJcbiAgICB0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2gob3B0aW9uTmFtZSk7XG5cbiAgICAvLyAuLi4gbWFrZSBzdXJlIHRoZSBjaGFuZ2UgZGV0ZWN0b3Iga2lja3MgaW4sIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRzXG4gICAgLy8gd2VyZSBjaGFuZ2UgcHJvZ3JhbW1hdGlhbGx5IHRoZSBjb21wb25lbnQgbWF5IG5vdCBiZSBlbGlnaWJsZSBmb3JcbiAgICAvLyB1cGRhdGluZy5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgZ2FwIG1ldGhvZCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgZGF0YWdyaWQgYW5kIHJlYnVpbGQgaXQgYWdhaW4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgd2hpbHN0IHRoZXJlIGlzIG5vIG1ldGhvZCBmb3VuZCB0aGF0IGNhbiB1cGRhdGUgdGhlIHZpZXdcbiAgICogZm9yIGEgcGFydGljdWxhciBpbnB1dC5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29udHJvbCgpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgbmFzdHkgcmVmcmVzaGVzIGJ5IHJ1bm5pbmcgb3V0c2lkZSBhbmd1bGFyLlxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlZnJlc2hIaW50ICYgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgdGhpcy5kZXN0cm95RGF0YUdyaWQoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGFHcmlkKCk7XG5cbiAgICAgICAgLy8gQXNzdW1lIGEgcmVidWlsZCB0cnVtcHMgYWxsIG90aGVyIGNhbmRpZGF0ZXMgLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBAdG9kbyB2ZXJpZnkgaWYgY2FsbGluZyB0aGVzZSBzZXBhcmF0ZWx5IG1ha2VzIHNlbnNlLlxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVySGVhZGVyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICB0aGlzLmRhdGFncmlkPy5yZW5kZXJIZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVuZGVyUm93cygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBmbGFncy5cbiAgICAgIHRoaXMucmVmcmVzaEhpbnQgPSBSZWZyZXNoSGludEZsYWdzLk5vbmU7XG4gICAgICB0aGlzLmNoYW5nZWRPcHRpb25zID0gW107XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc291cmNlIHNldHRpbmcvZnVuY3Rpb24gdG8gdXNlIHNvdXJjZSBpbnB1dCBpZiBzZXQuXG4gICAqIE90aGVyd2lzZSB1c2UgZGF0YUdyaWRTZXJ2aWNlIGlmIHRoYXQgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2Uoc291cmNlOiBTb2hvRGF0YUdyaWRTb3VyY2VGdW5jdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIElmIGEgc291cmNlIHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhbmQgYSBzZXJ2aWNlIGhhc1xuICAgIC8vIHVzZSB0aGUgZGF0YSBzZXJ2aWNlIHRvIGxvYWQgdGhlIGRhdGEgZHluYW1pY2FsbHkgZm9yIHBhZ2luZy5cbiAgICBpZiAoIXNvdXJjZSAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlID0gKHJlcXVlc3Q6IFNvaG9EYXRhR3JpZFNvdXJjZVJlcXVlc3QsIHJlc3BvbnNlOiBTb2hvRGF0YUdyaWRSZXNwb25zZUZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnNvdXJjZSA9IChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gc291cmNlKHJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JDb21wb25lbnRFZGl0b3JzKCkge1xuICAgIC8vIEFkZCBhbiBhZGFwdGVyIGZvciBhbGwgdGhlIGNvbHVtbnMgdXNpbmcgYW4gY29tcG9uZW50IGFzIGFuIGVkaXRvci5cbiAgICAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgaWYgKGMuZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIFVzZSBhIGBmdW5jdGlvbiBleHByZXNzaW9uYCByYXRoZXIgdGhhbiBhbiBgYXJyb3cgZnVuY3Rpb25gIGFzIHRoZSBlZGl0b3IgaXMgdXNlZFxuICAgICAgICAvLyBhcyBjb25zdHJ1Y3Rvci5cbiAgICAgICAgLy8gdGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGMuZWRpdG9yID0gZnVuY3Rpb24gKHJvdz86IGFueSwgY2VsbD86IGFueSwgdmFsdWU/OiBhbnksIGNvbnRhaW5lcj86IEpRdWVyeSwgY29sPzogU29ob0RhdGFHcmlkQ29sdW1uIHwgdW5kZWZpbmVkLCBlPzogYW55LCBhcGk/OiBhbnksIGl0ZW0/OiBhbnkpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcmV0dXJuIG5ldyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIoYy5lZGl0b3JDb21wb25lbnQsIHsgcm93LCBjZWxsLCB2YWx1ZSwgY29udGFpbmVyOiAoY29udGFpbmVyIGFzIGFueSlbMF0sIGNvbCwgZSwgYXBpLCBpdGVtIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvclN1bW1hcnlSb3dTZXR0aW5ncygpIHtcbiAgICBpZiAoIXRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zIHx8IHRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgICAgYy5zdW1tYXJ5Um93Rm9ybWF0dGVyID0gdW5kZWZpbmVkO1xuICAgICAgICBjLnN1bW1hcnlUZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBjLmFnZ3JlZ2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGMuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMuZm9yRWFjaCgoc2MpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5maW5kKChjOiBhbnkpID0+IGMuZmllbGQgPT09IHNjLmZpZWxkKTtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLnN1bW1hcnlSb3dGb3JtYXR0ZXIgPSBzYy5zdW1tYXJ5Um93Rm9ybWF0dGVyO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHQgPSBzYy5zdW1tYXJ5VGV4dDtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmFnZ3JlZ2F0b3IgPSBzYy5hZ2dyZWdhdG9yO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSBzYy5zdW1tYXJ5VGV4dFBsYWNlbWVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgJ2V4cGFuZHJvdycgYW5kICdjb2xsYXBzZXJvdycgZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50IGV4dGVuZHMgU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQge1xuICAvLyBUaGUgZGF0YSBncmlkIGNvbXBvbmVudCBvcmlnaW5hdGluZyB0aGUgY2FsbC5cbiAgZ3JpZDogU29ob0RhdGFHcmlkQ29tcG9uZW50O1xuICBhcmdzPzogYW55O1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlICdrZXlkb3duJyBldmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZEtleURvd25FdmVudCB7XG4gIC8vIFRoZSBkYXRhIGdyaWQgY29tcG9uZW50IG9yaWdpbmF0aW5nIHRoZSBjYWxsLlxuICBlOiBKUXVlcnkuRXZlbnQ7XG4gIGFyZ3M/OiBTb2hvRGF0YUdyaWRLZXlEb3duQXJncztcbiAgcmVzcG9uc2U/OiBGdW5jdGlvbjtcbn1cbiJdfQ==
|
|
2635
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29oby1kYXRhZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZHMtZW50ZXJwcmlzZS1uZy9zcmMvbGliL2RhdGFncmlkL3NvaG8tZGF0YWdyaWQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUdULE1BQU0sRUFDTixZQUFZLEVBQ1osV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBSVIsUUFBUSxFQUtULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7O0FBb0MxRCxNQUFNLE9BQU8sd0JBQXdCO0lBV25DLFlBQ1MsU0FBdUMsRUFDdkMsSUFBc0M7UUFEdEMsY0FBUyxHQUFULFNBQVMsQ0FBOEI7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBa0M7UUFSL0MsK0RBQStEO1FBQy9ELGFBQVEsR0FBRyxJQUFJLENBQUM7SUFRaEIsQ0FBQztJQUVELElBQUksQ0FBQyxZQUFrRDtRQUNyRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFFakMsZ0ZBQWdGO1FBQ2hGLGtCQUFrQjtRQUNsQixxREFBcUQ7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRO2VBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVM7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxHQUFHLENBQUMsS0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gscUNBQXFDO0FBQ3JDLElBQUssZ0JBU0o7QUFURCxXQUFLLGdCQUFnQjtJQUNuQix1QkFBdUI7SUFDdkIsdURBQVEsQ0FBQTtJQUNSLG9DQUFvQztJQUNwQyxtRUFBYyxDQUFBO0lBQ2Qsd0NBQXdDO0lBQ3hDLHVFQUFnQixDQUFBO0lBQ2hCLDhCQUE4QjtJQUM5Qiw2REFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVRJLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFTcEI7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFNSCxNQUFNLE9BQU8scUJBQXFCO0lBMHNDaEM7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFDVSxNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsY0FBaUMsRUFDakMsUUFBa0MsRUFDbEMsUUFBa0IsRUFDbEIsR0FBbUIsRUFDTCxlQUFvQztRQU5sRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBMEI7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixRQUFHLEdBQUgsR0FBRyxDQUFnQjtRQUNMLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtRQWpMNUQsOENBQThDO1FBQzlDLG1CQUFtQjtRQUNuQiw4Q0FBOEM7UUFFOUMseURBQXlEO1FBRXpELGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUV6RCw4Q0FBOEM7UUFFOUMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBRTdELDZDQUE2QztRQUU3QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFFM0QsMkNBQTJDO1FBRTNDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUVyRCxpREFBaUQ7UUFFakQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRXpELDBEQUEwRDtRQUUxRCxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQThCLENBQUM7UUFFM0Q7Ozs7V0FJRztRQUNILDREQUE0RDtRQUU1RCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFFdkQsZ0RBQWdEO1FBRWhELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFFN0QsbURBQW1EO1FBRW5ELHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUE2QixDQUFDO1FBRXBFOztXQUVHO1FBRUgsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUU5RCwyREFBMkQ7UUFFM0QsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQUc3RCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFHckQsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUd2RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBR3RELHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO1FBR2xFLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFHNUQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUc5RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFHeEQscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFHOUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUd6RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFpQyxDQUFDO1FBR2pFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWtDLENBQUM7UUFHbkUsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBbUMsQ0FBQztRQUdyRSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFvQyxDQUFDO1FBR3ZFLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBNkIsQ0FBQztRQUd6RCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFnQyxDQUFDO1FBRy9ELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFHN0QsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFDbkYsOENBQThDO1FBQzlDLGdCQUFnQjtRQUNoQiw4Q0FBOEM7UUFFOUMsZ0RBQWdEO1FBRWhELGVBQVUsR0FBRyxLQUFLLENBQUM7UUE4Qm5CLDREQUE0RDtRQUM1RCwyQkFBMkI7UUFDbkIsaUJBQVksR0FBd0I7WUFDMUMsYUFBYSxFQUFFLE1BQU07WUFDckIsY0FBYyxFQUFFLEtBQUs7U0FDdEIsQ0FBQztRQUVGLDBEQUEwRDtRQUNsRCxnQkFBVyxHQUFxQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFFOUQsZ0RBQWdEO1FBQ3hDLG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBRW5DLHFFQUFxRTtRQUM3RCxtQkFBYyxHQUFVLEVBQUUsQ0FBQztRQUVuQyx1RUFBdUU7UUFDL0QsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO0lBcUIxQyxDQUFDO0lBL3NDRCw4Q0FBOEM7SUFDOUMsbUJBQW1CO0lBQ25CLDhDQUE4QztJQUU5Qzs7Ozs7T0FLRztJQUNILElBQWEsV0FBVyxDQUFDLFdBQWdDO1FBQ3ZELGNBQWMsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBRWhDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QiwyREFBMkQ7WUFDM0QsdUNBQXVDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUNELElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQy9CO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQWEsVUFBVSxDQUFDLFVBQThCO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7U0FDMUM7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7U0FDN0M7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQWEsYUFBYSxDQUFDLGFBQW9EO1FBQzdFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUVyRCwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFhLGNBQWMsQ0FBQyxjQUFtQztRQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztTQUM5QztRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFRLElBQUksQ0FBQyxRQUFnQixDQUFDLHFCQUFxQixDQUFDO1NBQ3JEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQWEsYUFBYSxDQUFDLGFBQWtDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1NBQzdDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYSxtQkFBbUIsQ0FBQyxtQkFBd0M7UUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUM1RCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1lBQzFFLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDekU7SUFDSCxDQUFDO0lBRUQsSUFBSSxtQkFBbUI7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1NBQzdDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFhLE9BQU8sQ0FBQyxPQUErQjtRQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLE1BQU0sU0FBUyxHQUF3QixFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLHVFQUF1RTtnQkFDdEUsSUFBSSxDQUFDLFFBQWdCLENBQUMsYUFBYSxDQUFFLE9BQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLE9BQU87UUFFVCx5REFBeUQ7UUFDekQseURBQXlEO1FBQ3pELGNBQWM7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7U0FDdkM7UUFFRCwyREFBMkQ7UUFDM0QsMERBQTBEO1FBQzFELHVEQUF1RDtRQUN2RCx5Q0FBeUM7UUFDekMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxhQUFhLENBQUMsYUFBa0M7UUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ3JELElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztTQUM3QztRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7SUFDekMsQ0FBQztJQUVELElBQWEsaUJBQWlCLENBQUMsaUJBQXNDO1FBQ25FLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDeEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO1NBQ2pEO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFhLG1CQUFtQixDQUFDLG1CQUF3QztRQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQzVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztTQUNsRTtJQUNILENBQUM7SUFFRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztTQUNuRDtRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFhLFFBQVEsQ0FBQyxRQUE2QjtRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1NBQ3hDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFhLGFBQWEsQ0FBQyxhQUFvRDtRQUM3RSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDckQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1NBQzdDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFhLFlBQVksQ0FBQyxZQUFpQztRQUN6RCxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7WUFDbkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBYSxNQUFNLENBQUMsTUFBMkI7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUVoRCw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3RDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBYSxNQUFNLENBQUMsTUFBVztRQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFhLGNBQWMsQ0FBQyxjQUEyQztRQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQVEsSUFBSSxDQUFDLFlBQW9CLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsU0FBUyxDQUFDLFNBQWdDO1FBQ3JELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFFdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxRQUFnQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLGNBQWMsQ0FBQyxjQUEwQztRQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDbEQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1lBQ2hFLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsVUFBVSxDQUFDLFVBQWU7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0Qiw0RUFBNEU7WUFDM0UsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1NBQzFDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBYSxxQkFBcUIsQ0FBQyxxQkFBMEM7UUFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztRQUNoRSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsNEVBQTRFO1lBQzNFLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztZQUM5RSxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUVELElBQUkscUJBQXFCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBYSxhQUFhLENBQUMsYUFBa0M7UUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUM5RCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7U0FDN0M7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFhLE9BQU8sQ0FBQyxPQUEyQjtRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVELElBQWEsZ0JBQWdCLENBQUMsZUFBNkM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUM7U0FDcEU7SUFDSCxDQUFDO0lBRUQsSUFBYSxNQUFNLENBQUMsTUFBMkI7UUFDN0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUVoRCwrREFBK0Q7WUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNO1FBQ1IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1NBQ3RDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBYSxRQUFRLENBQUMsUUFBZ0I7UUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFRCxJQUFhLFNBQVMsQ0FBQyxTQUF3QjtRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDeEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ3RELElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQUVELElBQWEsYUFBYSxDQUFDLGFBQXNCO1FBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRUQsSUFBYSxjQUFjLENBQUMsY0FBbUM7UUFDN0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztZQUNoRSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7U0FDOUM7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDO0lBQzFDLENBQUM7SUFFRCxJQUFhLFdBQVcsQ0FBQyxXQUFvQjtRQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQzFELElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFhLE1BQU0sQ0FBQyxNQUE4QztRQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFFLE1BQWMsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNoRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxVQUFVLENBQUMsVUFBK0I7UUFDckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUN4RCxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7U0FDMUM7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILElBQWEsUUFBUSxDQUFDLFFBQTZCO1FBQ2pELElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFO1lBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUV0Qyx5REFBeUQ7WUFDekQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDM0Q7U0FDRjtJQUNILENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDeEM7UUFFRCwyREFBMkQ7UUFDM0QsdURBQXVEO1FBQ3ZELFdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksUUFBUTtRQUNWLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUN4QztRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBYSxRQUFRLENBQUMsUUFBNEI7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBRTNDLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztTQUMxQztRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBYSxVQUFVLENBQUMsS0FBMEI7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBRTFDLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM3RDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztTQUN6QztRQUVELDJEQUEyRDtRQUMzRCx1REFBdUQ7UUFDdkQsV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBYSxTQUFTLENBQUMsS0FBMEI7UUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBRXpDLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxVQUFVLENBQUMsS0FBeUM7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBRTFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFEO0lBQ0gsQ0FBQztJQUVELElBQUksc0JBQXNCO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDO1NBQ3REO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFhLHNCQUFzQixDQUFDLEtBQTBCO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7U0FDckQ7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUM7SUFDakQsQ0FBQztJQUVELElBQWEscUJBQXFCLENBQUMsS0FBMEI7UUFDM0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDaEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztTQUN0RDtJQUNILENBQUM7SUFDRDs7O09BR0c7SUFDSCxJQUFhLFVBQVUsQ0FBQyxVQUEyQjtRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1NBQzFDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1NBQ3pDO1FBRUQsMkRBQTJEO1FBQzNELHVEQUF1RDtRQUN2RCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFhLFNBQVMsQ0FBQyxLQUF3QztRQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFFekMsMkNBQTJDO1lBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsSUFBYSxJQUFJLENBQUMsSUFBdUI7UUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUU5QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDakMsc0VBQXNFO2dCQUN0RSxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQWEsT0FBTyxDQUFDLE9BQXlDO1FBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFFMUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEMsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUVqQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUUsSUFBSSxDQUFDLFlBQW9CLENBQUMsT0FBTyxFQUFHLElBQUksQ0FBQyxZQUFvQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RyxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYSxpQkFBaUIsQ0FBQyxpQkFBeUQ7UUFDdEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUN4RCxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFlLEVBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFvQixDQUFDLENBQUMsQ0FBQztTQUM5RztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxZQUFZLENBQUMsWUFBaUM7UUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFHRDs7T0FFRztJQUNILElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxJQUFhLFlBQVksQ0FBQyxZQUFxQjtRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1lBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxJQUFhLFVBQVUsQ0FBQyxVQUFrQztRQUN4RCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1lBQ3hELElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdEO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxZQUFZLENBQUMsWUFBb0Q7UUFDNUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMvRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQWEsYUFBYSxDQUFDLGFBQWlDO1FBQzFELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDOUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEU7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEscUJBQXFCLENBQUMscUJBQTBDO1FBQzNFLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsR0FBRyxxQkFBcUIsQ0FBQztZQUM5RSxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hFO0lBQ0gsQ0FBQztJQUNEOztPQUVHO0lBQ0gsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsb0JBQW9CLENBQUMsb0JBQTZCO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztZQUU1RSwrSEFBK0g7WUFDL0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN2RTtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsa0JBQWtCLENBQUMsa0JBQTJCO1FBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7UUFDMUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztZQUV4RSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQWEsV0FBVyxDQUFDLFlBQXVDO1FBQzlELElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUVuRSxzRUFBc0U7WUFDckUsSUFBSSxDQUFDLFFBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9FO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWEsWUFBWSxDQUFDLFlBQXdEO1FBQ2hGLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLGlGQUFpRjtZQUNqRixZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQWEsY0FBYyxDQUFDLEtBQTBCO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7WUFFdkQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCwyREFBMkQ7SUFDM0QsSUFBNEIsWUFBWSxDQUFDLFlBQThCO1FBQ3JFLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQztJQUMvRSxDQUFDO0lBbUhEOztPQUVHO0lBQ0gsSUFDSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUM5QixPQUFPLFVBQVUsQ0FBQztTQUNuQjthQUFNO1lBQ0wsT0FBTyxVQUFVLENBQUM7U0FDbkI7SUFDSCxDQUFDO0lBMERELDhDQUE4QztJQUM5QyxhQUFhO0lBQ2IsOENBQThDO0lBRTlDLGNBQWMsQ0FBQyxHQUFXO1FBQ3hCLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVztRQUN2QixPQUFRLElBQUksQ0FBQyxRQUFnQixDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxlQUFlLENBQUMsWUFBc0M7UUFDcEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztTQUMzQzthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQzlDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsYUFBYSxDQUFDLFFBQWdCLEVBQUUsU0FBbUI7UUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsU0FBcUM7UUFDdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQWdCLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDbkQsQ0FBQztJQUVELGdCQUFnQixDQUFDLFFBQTZCO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVyxFQUFFLEdBQVE7UUFDN0IsY0FBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFPO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFPO1FBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFVO1FBQ25CLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQ2pELENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQ3RELENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsYUFBYSxDQUFDLFFBQWdCO1FBQzVCLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxHQUFRO1FBQ3pCLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLElBQVMsRUFBRSxRQUFvQztRQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsUUFBZ0IsRUFBRSxNQUFnQixFQUFFLFNBQW1CO1FBQy9ELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEdBQVc7UUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGNBQWMsQ0FBQyxHQUFXLEVBQUUsSUFBWTtRQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGlCQUFpQixDQUFDLEdBQVcsRUFBRSxJQUFZO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsSUFBUztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxHQUFXO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELDJGQUEyRjtJQUMzRixZQUFZLENBQUMsR0FBVyxFQUFFLE9BQWUsRUFBRSxJQUFtQjtRQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsMkNBQTJDO0lBQzNDLFdBQVcsQ0FBQyxHQUFXO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFNBQVMsQ0FBQyxHQUFXLEVBQUUsTUFBYyxFQUFFLE9BQWU7UUFDcEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxNQUFlLEVBQUUsSUFBYTtRQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxVQUErQztRQUN6RCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLFVBQThDO1FBQ2hFLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDN0I7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxPQUFRLElBQUksQ0FBQyxRQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFNBQVMsQ0FBQyxHQUFXO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsR0FBVztRQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxLQUFhLEVBQUUsR0FBVztRQUNwQyxNQUFNLEtBQUssR0FBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLEdBQXNCO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxzQkFBc0IsQ0FBQyxLQUFzQztRQUNsRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQy9GLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtnQkFDdkIsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDO3FCQUN2QyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQzthQUN0QztZQUVELElBQUksS0FBSyxLQUFLLEtBQUssRUFBRTtnQkFDbkIsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO3FCQUNuQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO2dCQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUM7cUJBQ3BDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2FBQ3pDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEdBQVc7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxhQUFhLENBQUMsR0FBVyxFQUFFLElBQVk7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBR0Q7Ozs7T0FJRztJQUNJLGlCQUFpQixDQUFDLEdBQVc7UUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLFNBQWlCLEVBQUUsS0FBVTtRQUMzQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGFBQWEsQ0FBQyxTQUE2QyxFQUFFLFFBQW1CO1FBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQUMsUUFBZ0IsRUFBRSxhQUFrQyxFQUFFLFFBQW1CO1FBQ3JGLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRyxhQUFxQixFQUFHLFFBQWdCLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsV0FBVyxDQUFDLFFBQWdCLEVBQUUsUUFBbUIsRUFBRSxZQUFvQixPQUFPLEVBQUUsTUFBZ0I7UUFDOUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFHLFFBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsYUFBYSxDQUFDLE9BQTZCLEVBQUUsWUFBdUM7UUFDbEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLENBQUMsT0FBZTtRQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUN4QyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxRQUFhO1FBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLGlCQUFpQjtJQUNqQiw4Q0FBOEM7SUFFOUM7Ozs7T0FJRztJQUNLLGFBQWEsQ0FBQyxPQUFrQyxFQUFFLFFBQXNDO1FBQzlGLHVGQUF1RjtRQUN2RixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQzthQUNsQyxTQUFTLENBQUMsQ0FBQyxPQUFpQixFQUFFLEVBQUU7WUFDL0Isd0RBQXdEO1lBQ3hELDRCQUE0QjtZQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLElBQWdDO1FBQ2xELE1BQU0sS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRTtZQUN6QyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyx5QkFBeUIsQ0FBQyxLQUFVO1FBRTFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixFQUFFO1lBQzFDLE9BQU87U0FDUjtRQUVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FDNUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FDdEMsQ0FBQztRQUVGLGdDQUFnQztRQUNoQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFFRCxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ3RGLGVBQWUsQ0FBQyxTQUFTLEdBQUcsMENBQTBDLENBQUM7UUFDdkUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksYUFBa0IsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUNoRSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUF3QixDQUFDLENBQUM7U0FDeEU7YUFBTTtZQUNMLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDM0I7UUFFRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsTUFBTTtvQkFDZixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsS0FBSyxFQUFFO2lCQUNyRzthQUNGO1lBQ0QsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3RCLENBQUMsQ0FBQztRQUVILDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRSxLQUFLLENBQUMsc0JBQXNCLENBQUMsR0FBRyxTQUFTLENBQUM7UUFFMUMsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4Qyw2QkFBNkI7UUFDN0IsU0FBUyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTVDLDBFQUEwRTtRQUMxRSw0Q0FBNEM7UUFDNUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFakUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssU0FBUyxDQUFDLENBQWUsRUFBRSxJQUE2QixFQUFFLFFBQWtCO1FBQ2xGLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDakMsQ0FBQyxDQUFFLENBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQWEsY0FBYyxDQUFDLG9CQUFrRTtRQUM1RixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztRQUN4RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztZQUN0RSxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYSxzQkFBc0IsQ0FBQyxzQkFBMkM7UUFDN0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNsRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUM7WUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0RTtJQUNILENBQUM7SUFDRCxJQUFJLHNCQUFzQjtRQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUM7U0FDL0Q7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxvQkFBb0IsQ0FBQyxvQkFBeUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7WUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNwRTtJQUNILENBQUM7SUFDRCxJQUFJLG9CQUFvQjtRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7U0FDN0Q7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUM7SUFDaEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYSxTQUFTLENBQUMsU0FBNkM7UUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQzdDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUNELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFRLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7U0FDbEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBYSxtQkFBbUIsQ0FBQyxtQkFBd0M7UUFDdkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUM1RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7WUFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRTtJQUNILENBQUM7SUFDRCxJQUFJLG1CQUFtQjtRQUNyQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7U0FDNUQ7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQWEsZ0JBQWdCLENBQUMsc0JBQXNFO1FBQ2xHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLHNCQUFzQixDQUFDO1lBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQVEsSUFBSSxDQUFDLFFBQWdCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFhLGtCQUFrQixDQUFDLHdCQUEwRTtRQUN4RyxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyx3QkFBd0IsQ0FBQztZQUNyRSxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFRLElBQUksQ0FBQyxRQUFnQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsd0RBQXdEO0lBQ3hELElBQWEsYUFBYSxDQUFDLGFBQWlDO1FBQzFELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNoRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUNyRCxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1NBQ3REO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0RBQWdEO0lBQ2hELElBQWEsZUFBZSxDQUFDLGVBQXVEO1FBQ2xGLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUNwRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztZQUN6RCxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xFO0lBQ0gsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBUSxJQUFJLENBQUMsUUFBZ0IsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxJQUErQjtRQUNwRCxNQUFNLEtBQUssR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHFCQUFxQixDQUFDLElBQStCO1FBQzNELE1BQU0sS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxlQUFlLENBQUMsSUFBK0I7UUFDckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLElBQWtDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLFFBQVEsQ0FBQyxJQUE2QjtRQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsSUFBaUM7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLElBQTRCO1FBQy9DLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLElBQXFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGFBQWEsQ0FBQyxJQUE0QjtRQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsSUFBNEI7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsSUFBK0I7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZUFBZSxDQUFDLElBQW9DO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxJQUFnQztRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsSUFBK0I7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYSxDQUFDLElBQWtDO1FBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQixDQUFDLElBQW1DO1FBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLElBQW1DO1FBQ3hELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLElBQXFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUFtQztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxVQUFVLENBQUMsSUFBK0I7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCLENBQUMsSUFBc0M7UUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUSxDQUFDLElBQTZCO1FBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxJQUF5QjtRQUM5QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsSUFBeUI7UUFDN0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsSUFBNkI7UUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCLENBQUMsSUFBNEM7UUFDMUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25CLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsT0FBTyxDQUFDLEdBQVcsRUFBRSxhQUFzQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxRQUFRLENBQUMsR0FBVyxFQUFFLElBQVksRUFBRSxhQUFzQjtRQUN4RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQUMzRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCw2Q0FBNkM7SUFDN0MsbUJBQW1CO0lBQ25CLDZDQUE2QztJQUU3Qzs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLHlFQUF5RTtRQUN6RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsa0JBQWtCO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7WUFDOUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsa0JBQWtCO0lBQ2xCLDhDQUE4QztJQUU5Qzs7O09BR0c7SUFDSyxlQUFlO1FBQ3JCLDJDQUEyQztRQUMzQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2hDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxtQkFBbUI7UUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFFekIseUNBQXlDO1FBQ3pDLElBQUksSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7U0FDakM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO29CQUNqQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxnQkFBZ0IsQ0FBQyxTQUFpQixFQUFFLElBQW9DO1FBQzlFLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxDQUFDLCtEQUErRDtTQUN4RTtRQUNELDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFMUUsNkRBQTZEO1FBQzdELGFBQWE7UUFDYiw4R0FBOEc7UUFDOUcsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFOUcsMENBQTBDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUxRCxxRUFBcUU7UUFDckUsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRTVELDRCQUE0QjtRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFeEMsNkJBQTZCO1FBQzdCLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUU1QyxzQkFBc0I7UUFFdEIsMEVBQTBFO1FBQzFFLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGFBQWEsQ0FBQyxJQUFvQztRQUN4RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdGLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQztJQUVPLFVBQVUsQ0FBQyxNQUFzQztRQUN2RCxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDckIsT0FBTyxDQUFDLCtEQUErRDtTQUN4RTtRQUNELDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RSw2REFBNkQ7UUFDN0QsYUFBYTtRQUNiLDhHQUE4RztRQUM5RyxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3hCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZELE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN0QixDQUFDLENBQUM7UUFFSCxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLG9FQUFvRTtRQUNwRSx3Q0FBd0M7UUFDeEMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFNUUsMENBQTBDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBeUMsQ0FBQztRQUUxRyxxRUFBcUU7UUFDckUsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTVFLDRCQUE0QjtRQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFM0MsNkJBQTZCO1FBQzdCLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUvQyxvQ0FBb0M7UUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU8sYUFBYTtRQUNuQixvREFBb0Q7UUFDcEQseUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRTNELDZCQUE2QjtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxFQUFFLElBQW9DLEVBQUUsRUFBRTtnQkFDL0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUM7WUFFRixpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBb0MsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQztZQUVGLDhCQUE4QjtZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxDQUFDLE1BQXNDLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUM7WUFFRiw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFlLEVBQUUsSUFBNkIsRUFBRSxRQUFrQixFQUFFLEVBQUU7Z0JBQ25HLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUM7WUFFRixpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLGFBQWE7aUJBQ2YsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUE2QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3RSxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBTyxFQUFFLElBQWlDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3pGLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBNEIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0UsRUFBRSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBTyxFQUFFLElBQXFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDckcsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUFrQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1RixFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBTyxFQUFFLElBQTRCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RGLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUF5QixFQUFFLElBQTRCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUErQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3pHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBK0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDM0YsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUErQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3RixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBTyxFQUFFLElBQWdDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RGLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBK0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkYsRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUFvQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBTyxFQUFFLElBQWdDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RGLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBK0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkYsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUFrQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1RixFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBbUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMzRyxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBTyxFQUFFLElBQW1DLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQy9GLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUFxQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBbUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDN0YsRUFBRSxDQUFDLFVBQVUsRUFDWixDQUFDLENBQU0sRUFBRSxJQUErQixFQUFFLElBQW9DLEVBQUUsT0FBNkQsRUFBRSxFQUFFLENBQy9JLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDckQsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsRUFBTyxFQUFFLElBQXNDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDeEcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUE2QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3RSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBTyxFQUFFLElBQXlCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JGLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFPLEVBQUUsSUFBeUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDbkYsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUE2QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3JGLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEVBQU8sRUFBRSxJQUE0QyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMvSCxDQUFDLENBQUMsQ0FBQztRQUVILGlDQUFpQztRQUNqQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFaEQsdURBQXVEO1FBQ3ZELGlEQUFpRDtRQUNqRCwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyRCw0REFBNEQ7UUFDNUQsK0RBQStEO1FBQy9ELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxxQkFBcUIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUM1RSxrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pELHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7aUJBQy9CLFNBQVMsQ0FBQyxDQUFDLElBQVcsRUFBRSxFQUFFO2dCQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtvQkFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN4QixtREFBbUQ7WUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFFLElBQUksQ0FBQyxRQUFnQixDQUFDLENBQUM7WUFDbEQsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssY0FBYyxDQUFDLFVBQWtCLEVBQUUsSUFBc0I7UUFFL0QscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsc0JBQXNCO1FBRWhELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVyQyxzRUFBc0U7UUFDdEUsb0VBQW9FO1FBQ3BFLFlBQVk7UUFDWixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGFBQWE7UUFFbkIsc0RBQXNEO1FBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxzQkFBc0I7Z0JBQ3ZFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUVyQixtREFBbUQ7YUFDcEQ7aUJBQU07Z0JBQ0wsd0RBQXdEO2dCQUN4RCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEVBQUUsc0JBQXNCO29CQUM1RSxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDO2lCQUMvQjtnQkFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLEVBQUUsc0JBQXNCO29CQUMxRSxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxDQUFDO2lCQUM3QjthQUNGO1lBRUQsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssWUFBWSxDQUFDLE1BQThDO1FBQ2pFLCtEQUErRDtRQUMvRCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBa0MsRUFBRSxRQUFzQyxFQUFFLEVBQUU7Z0JBQ3hHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQztTQUNIO2FBQU0sSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBa0MsRUFBRSxRQUFzQyxFQUFFLEVBQUU7Z0JBQ3hHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNuRCxDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsc0VBQXNFO1FBQ3JFLElBQUksQ0FBQyxZQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JCLG9GQUFvRjtnQkFDcEYsa0JBQWtCO2dCQUNsQixvQ0FBb0M7Z0JBQ3BDLENBQUMsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFTLEVBQUUsSUFBVSxFQUFFLEtBQVcsRUFBRSxTQUFrQixFQUFFLEdBQW9DLEVBQUUsQ0FBTyxFQUFFLEdBQVMsRUFBRSxJQUFVO29CQUMvSSxhQUFhO29CQUNiLE9BQU8sSUFBSSx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFHLFNBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDcEksQ0FBQyxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywwQkFBMEI7UUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzNGLElBQUksQ0FBQyxZQUFvQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDcEQsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2dCQUN6QixDQUFDLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ2pELE1BQU0sTUFBTSxHQUFJLElBQUksQ0FBQyxZQUFvQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN4RixNQUFjLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2dCQUM1RCxNQUFjLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7Z0JBQzVDLE1BQWMsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUMsTUFBYyxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7QUF2c0ZELDhDQUE4QztBQUM5Qyx1QkFBdUI7QUFDdkIsOENBQThDO0FBRTlDLHVFQUF1RTtBQUN2RSw2Q0FBNkM7QUFDdEMsMEJBQUksR0FBcUIsTUFBTyxDQUFBO0FBRXZDLDZEQUE2RDtBQUM3RCxvQkFBb0I7QUFDYixrQ0FBWSxHQUFxQixjQUFlLENBQUE7a0hBWjVDLHFCQUFxQjtzR0FBckIscUJBQXFCLHU5RkFIdEIsNEJBQTRCOzJGQUczQixxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLDRCQUE0QjtvQkFDdEMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkE0dENJLFFBQVE7NENBbnNDRSxXQUFXO3NCQUF2QixLQUFLO2dCQStCTyxVQUFVO3NCQUF0QixLQUFLO2dCQXdDTyxhQUFhO3NCQUF6QixLQUFLO2dCQWFPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBbUNPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBdUJPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkEwQk8sT0FBTztzQkFBbkIsS0FBSztnQkFxQ08sYUFBYTtzQkFBekIsS0FBSztnQkFtQk8saUJBQWlCO3NCQUE3QixLQUFLO2dCQWtCTyxtQkFBbUI7c0JBQS9CLEtBQUs7Z0JBcUJPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBc0JPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBc0JPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBZU8sTUFBTTtzQkFBbEIsS0FBSztnQkFxQk8sTUFBTTtzQkFBbEIsS0FBSztnQkFTTyxjQUFjO3NCQUExQixLQUFLO2dCQWlCTyxTQUFTO3NCQUFyQixLQUFLO2dCQWdCTyxjQUFjO3NCQUExQixLQUFLO2dCQWFPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBb0JPLHFCQUFxQjtzQkFBakMsS0FBSztnQkFhTyxhQUFhO3NCQUF6QixLQUFLO2dCQW1CTyxPQUFPO3NCQUFuQixLQUFLO2dCQVFPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFPTyxNQUFNO3NCQUFsQixLQUFLO2dCQW9CTyxRQUFRO3NCQUFwQixLQUFLO2dCQVFPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBUU8sYUFBYTtzQkFBekIsS0FBSztnQkFRTyxjQUFjO3NCQUExQixLQUFLO2dCQW1CTyxXQUFXO3NCQUF2QixLQUFLO2dCQWFPLE1BQU07c0JBQWxCLEtBQUs7Z0JBYU8sVUFBVTtzQkFBdEIsS0FBSztnQkEyQk8sUUFBUTtzQkFBcEIsS0FBSztnQkEyQ08sUUFBUTtzQkFBcEIsS0FBSztnQkE4Qk8sVUFBVTtzQkFBdEIsS0FBSztnQkE4Qk8sU0FBUztzQkFBckIsS0FBSztnQkFlTyxVQUFVO3NCQUF0QixLQUFLO2dCQW9CTyxzQkFBc0I7c0JBQWxDLEtBQUs7Z0JBZU8scUJBQXFCO3NCQUFqQyxLQUFLO2dCQVVPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBdUNPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUJPLElBQUk7c0JBQWhCLEtBQUs7Z0JBa0JPLE9BQU87c0JBQW5CLEtBQUs7Z0JBa0JPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFlTyxZQUFZO3NCQUF4QixLQUFLO2dCQWlCTyxZQUFZO3NCQUF4QixLQUFLO2dCQVNPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBV08sWUFBWTtzQkFBeEIsS0FBSztnQkFzQk8sYUFBYTtzQkFBekIsS0FBSztnQkFxQk8scUJBQXFCO3NCQUFqQyxLQUFLO2dCQWlCTyxvQkFBb0I7c0JBQWhDLEtBQUs7Z0JBYU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQWdCTyxXQUFXO3NCQUF2QixLQUFLO2dCQWFPLFlBQVk7c0JBQXhCLEtBQUs7Z0JBdUJPLGNBQWM7c0JBQTFCLEtBQUs7Z0JBdUJzQixZQUFZO3NCQUF2QyxLQUFLO3VCQUFDLGVBQWU7Z0JBVXRCLFFBQVE7c0JBRFAsTUFBTTtnQkFLUCxVQUFVO3NCQURULE1BQU07Z0JBS1AsU0FBUztzQkFEUixNQUFNO2dCQUtQLE1BQU07c0JBREwsTUFBTTtnQkFLUCxRQUFRO3NCQURQLE1BQU07Z0JBS1AsU0FBUztzQkFEUixNQUFNO2dCQVVQLE9BQU87c0JBRE4sTUFBTTtnQkFLUCxZQUFZO3NCQURYLE1BQU07Z0JBS1AsbUJBQW1CO3NCQURsQixNQUFNO2dCQU9QLGFBQWE7c0JBRFosTUFBTTtnQkFLUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsTUFBTTtzQkFETCxNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsa0JBQWtCO3NCQURqQixNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAsVUFBVTtzQkFEVCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLGNBQWM7c0JBRGIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxjQUFjO3NCQURiLE1BQU07Z0JBSVAscUJBQXFCO3NCQURwQixNQUFNO2dCQVFQLFVBQVU7c0JBRFQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBTzVCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxXQUFXO2dCQWl5QlgsY0FBYztzQkFBMUIsS0FBSztnQkFrQk8sc0JBQXNCO3NCQUFsQyxLQUFLO2dCQWlCTyxvQkFBb0I7c0JBQWhDLEtBQUs7Z0JBaUJPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBbUJPLG1CQUFtQjtzQkFBL0IsS0FBSztnQkFjTyxnQkFBZ0I7c0JBQTVCLEtBQUs7Z0JBZU8sa0JBQWtCO3NCQUE5QixLQUFLO2dCQWdCTyxhQUFhO3NCQUF6QixLQUFLO2dCQWdCTyxlQUFlO3NCQUEzQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIEVsZW1lbnRSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBJbmplY3RvcixcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudFJlZixcbiAgVHlwZSxcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcmd1bWVudEhlbHBlciB9IGZyb20gJy4uL3V0aWxzL2FyZ3VtZW50LmhlbHBlcic7XG5pbXBvcnQgeyBTb2hvRGF0YUdyaWRTZXJ2aWNlIH0gZnJvbSAnLi9zb2hvLWRhdGFncmlkLnNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBTb2hvRGF0YUdyaWRUeXBlID0gJ2F1dG8nIHwgJ2NvbnRlbnQtb25seSc7XG5cbi8qKlxuICogQ29udHJhY3QgZm9yIGNlbGwgZWRpdG9ycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3IgZXh0ZW5kcyBTb2hvRGF0YUdyaWRDZWxsRWRpdG9yIHtcbiAgLy8gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cbiAgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+O1xuXG4gIC8vIFRoZSBhcmdzIHBhc3NlZCB0byB0aGUgZWRpdG9yXG4gIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRDZWxsRnVuY3Rpb25BcmdzO1xuXG4gIC8vIFRoaXMgaXMgdGhlIGlucHV0IGVsZW1lbnQgKHNpbmdsZSkgd2l0aGluIHRoZSBmaWVsZFxuICBpbnB1dD86IEpRdWVyeTxIVE1MRWxlbWVudD47XG5cbiAgLy8gVXNlIHRoZSBkaXJlY3QgdmFsdWUgZnJvbSB0aGUgZGF0YXNldCB2cyB0aGUgZm9ybWF0dGVkIHZhbHVlXG4gIHVzZVZhbHVlOiBib29sZWFuO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5pdGlhbGlzZSB0aGUgZWRpdCBjb250cm9sIHdpdGggdGhlIGdpdmVuIGNvbXBvbmVudC4gIFRoZSBjb250cm9sXG4gICAqIG1pc3QgY29uZm9ybSB0byB0aGUgU29ob0RhdGFHcmlkQ2VsbEVkaXRvciBjb250cmFjdC5cbiAgICovXG4gIGluaXQoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBlZGl0b3IuXG4gICAqL1xuICBkZXN0cm95KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIgaW1wbGVtZW50cyBFeHRlbmRlZFNvaG9EYXRhR3JpZENlbGxFZGl0b3Ige1xuICBjb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8U29ob0RhdGFHcmlkQ2VsbEVkaXRvcj4gfCBudWxsO1xuXG4gIGlucHV0PzogSlF1ZXJ5PEhUTUxFbGVtZW50PjtcblxuICAvLyBVc2UgdGhlIGRpcmVjdCB2YWx1ZSBmcm9tIHRoZSBkYXRhc2V0IHZzIHRoZSBmb3JtYXR0ZWQgdmFsdWVcbiAgdXNlVmFsdWUgPSB0cnVlO1xuXG4gIC8vIFRoZSBwYXJlbnQgY2xhc3Mgb2YgdGhlIGlubmVyIGVkaXRvci4gVXNlZCB0byBkZXRlcm1pbmUgaWYgb3BlbiBvciBub3QuXG4gIGNsYXNzTmFtZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgY29tcG9uZW50OiBUeXBlPFNvaG9EYXRhR3JpZENlbGxFZGl0b3I+LFxuICAgIHB1YmxpYyBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0Q2VsbEZ1bmN0aW9uQXJncykge1xuICB9XG5cbiAgaW5pdChjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPikge1xuICAgIC8vIFN0b3JlIHRoZSBjb21wb25lbnQuXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSBjb21wb25lbnRSZWY7XG5cbiAgICAvLyBUaGUgU29obyBkYXRhZ3JpZCB3YW50cyBhbiBpbnB1dCBjb250cm9sLCBvdGhlcndpc2UgaXQgd29udCBhY2NlcHQgdGhlIGVkaXRvclxuICAgIC8vIGFzIGEgY29tcG9uZW50LlxuICAgIC8vIEB0b2RvIHRhbGsgdG8gVGltIGFib3V0IHJlbW92aW5nIHRoaXMgcmVxdWlyZW1lbnQuXG4gICAgdGhpcy5pbnB1dCA9ICQodGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkuZmluZCgnaW5wdXQ6Zmlyc3QnKTtcbiAgICB0aGlzLmNsYXNzTmFtZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgICAmJiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5jbGFzc05hbWVcbiAgICAgID8gdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuY2xhc3NOYW1lIDogJy5lZGl0b3InO1xuICB9XG5cbiAgdmFsKHZhbHVlPzogYW55KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWY/Lmluc3RhbmNlLnZhbCh2YWx1ZSk7XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZj8uaW5zdGFuY2UuZm9jdXMoKTtcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50UmVmKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgcmVmcmVzaCBoaW50cyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHR5cGUgb2YgXCJyZWZyZXNoXCIgaXNcbiAqIHJlcXVpcmVkIGFmdGVyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MgaGFzIGNvbXBsZXRlZCBhbmQgdGhlXG4gKiBBZnRlclZpZXdDaGVja2VkIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHRvZG8gcmVzb2x2ZSBuby1zaGFkb3dcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuZW51bSBSZWZyZXNoSGludEZsYWdzIHtcbiAgLy8gTm8gcmVmcmVzaCByZXF1aXJlZC5cbiAgTm9uZSA9IDAsXG4gIC8vIFRoZSByb3dzIG5lZWRzIHRvIGJlIHJlLXJlbmRlcmVkLlxuICBSZW5kZXJSb3dzID0gMSxcbiAgLy8gVGhlIGhlYWRlciBuZWVkcyB0byBiZSByZS1yZW5lbmRlcmVkLlxuICBSZW5kZXJIZWFkZXIgPSAyLFxuICAvLyBBIGZ1bGwgcmVidWlsZCBpcyByZXF1aXJlZC5cbiAgUmVidWlsZCA9IDRcbn1cblxuLyoqXG4gKiBBbmd1bGFyIFdyYXBwZXIgZm9yIHRoZSBTb2hvIERhdGEgR3JpZCBDb21wb25lbnQuXG4gKlxuICogVGhpcyBjb21wb25lbnQgc2VhcmNoZXMgZm9yIGFuIGVsZW1lbnQgd2l0aCB0aGUgYXR0cmlidXRlXG4gKiAnc29oby1kYXRhZ3JpZCcgaW4gdGhlIHBhcmVudCdzIERPTSB0cmVlLCBpbml0aWFsaXNpbmcgaXQgd2l0aFxuICogdGhlIFNvaG8gZGF0YWdyaWQgY29udHJvbC5cbiAqXG4gKiBUaGUgZGF0YSBpcyBwcm92aWRlZCBlaXRoZXIgYnkgYSBjb21wb25lbnQgaW5wdXQgb3IgYW4gaW1wbGVtZW50YXRpb25cbiAqIG9mIHRoZSBEYXRhR3JpZFNlcnZpY2UgaW50ZXJmYWNlLCBieSBzcGVjaWZ5aW5nIGFuIGltcGxlbWVudGF0aW9uXG4gKiBvbiB0aGUgaG9zdGluZyBjb21wb25lbnQsIGkuZS5cbiAqXG4gKiBwcm92aWRlcnM6IFsgcHJvdmlkZTogRGF0YUdyaWRTZXJ2aWNlLCB1c2VDbGFzczogRGF0YUdyaWREZW1vU2VydmljZX0gXVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdbc29oby1kYXRhZ3JpZF0nLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIHRlbXBsYXRlOiAnIDxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTb2hvRGF0YUdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTb2hvIERhdGEgR3JpZCBUeXBlc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgaW5qZWN0ZWQgc2VydmljZVxuICAvLyAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMsIG90aGVyd2lzZS5cbiAgc3RhdGljIEFVVE86IFNvaG9EYXRhR3JpZFR5cGUgPSAnYXV0byc7XG5cbiAgLy8gJ2NvbnRlbnQtb25seScgd2hlcmUgdGFibGUgZWxlbWVudHMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZVxuICAvLyBjb2x1bW5zIGFuZCByb3dzLlxuICBzdGF0aWMgQ09OVEVOVF9PTkxZOiBTb2hvRGF0YUdyaWRUeXBlID0gJ2NvbnRlbnQtb25seSc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb21wb25lbnQgSW5wdXRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JpZCBvcHRpb25zIGZvciB0aGUgZGF0YSBncmlkLCBtYXJraW5nIHRoaXMgY29tcG9uZW50c1xuICAgKiBhcyByZXF1aXJpbmcgYSBmdWxsIHJlYnVpbGQgYXQgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGxpZmVjeWNsZS5cbiAgICpcbiAgICogQHBhcmFtIGdyaWRPcHRpb25zIC0gbm90IG51bGwgZ3JpZCBvcHRpb25zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGdyaWRPcHRpb25zKGdyaWRPcHRpb25zOiBTb2hvRGF0YUdyaWRPcHRpb25zKSB7XG4gICAgQXJndW1lbnRIZWxwZXIuY2hlY2tOb3ROdWxsKCdncmlkT3B0aW9ucycsIGdyaWRPcHRpb25zKTtcblxuICAgIHRoaXMuX2dyaWRPcHRpb25zID0gZ3JpZE9wdGlvbnM7XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuICAgIHRoaXMuY2hlY2tGb3JTdW1tYXJ5Um93U2V0dGluZ3MoKTtcblxuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IHRoZSAnc2V0dGluZ3MnIGFzIHRoZSBSZWJ1aWxkIHdpbGwgY3JlYXRlXG4gICAgICAvLyBhIG5ldyBjb250cm9sIHdpdGggdGhlIF9ncmlkT3B0aW9ucy5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2dyaWRPcHRpb25zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGdyaWRPcHRpb25zKCk6IFNvaG9EYXRhR3JpZE9wdGlvbnMge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHdoaWNoIHByb3BlcnR5IGluIHRoZSBkYXRhIHJvd3MgaXMgdG8gYmUgdXNlZCBhcyB0aGUgaWQgb2YgZWFjaFxuICAgKiByb3cgb2YgdGhlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IGlkUHJvcGVydHkoaWRQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaWRQcm9wZXJ0eSA9IGlkUHJvcGVydHk7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpZFByb3BlcnR5JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaWRQcm9wZXJ0eSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pZFByb3BlcnR5O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBmcm96ZW5Db2x1bW5zIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZnJvemVuQ29sdW1ucygpOiBTb2hvRGF0YUdyaWRGcm96ZW5Db2x1bW5zIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZnJvemVuQ29sdW1ucztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5mcm96ZW5Db2x1bW5zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZyb3plbkNvbHVtbnMgc2V0dGluZ3MgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZnJvemVuQ29sdW1ucyAtIHRoZSBmcm96ZW5Db2x1bW5zIHNldHRpbmdzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGZyb3plbkNvbHVtbnMoZnJvemVuQ29sdW1uczogU29ob0RhdGFHcmlkRnJvemVuQ29sdW1ucyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZyb3plbkNvbHVtbnMgPSBmcm96ZW5Db2x1bW5zO1xuXG4gICAgICAvLyBGb3JjZSBhbGwgYSBmdWxsIHJlYnVpbGQgb2YgdGhlIGNvbnRyb2wuXG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmcm96ZW5Db2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdHJ1ZSBhbGxvd3NcbiAgICovXG4gIEBJbnB1dCgpIHNldCBjZWxsTmF2aWdhdGlvbihjZWxsTmF2aWdhdGlvbjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNlbGxOYXZpZ2F0aW9uID0gY2VsbE5hdmlnYXRpb247XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jZWxsTmF2aWdhdGlvbiA9IGNlbGxOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY2VsbE5hdmlnYXRpb24nLCBSZWZyZXNoSGludEZsYWdzLlJlbmRlclJvd3MpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjZWxsTmF2aWdhdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2VsbE5hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY2VsbE5hdmlnYXRpb247XG4gIH1cblxuICBnZXQgaXNWZXJ0aWNhbFNjcm9sbFRvRW5kKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5pc1ZlcnRpY2FsU2Nyb2xsVG9FbmQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIHJvdyBuYXZpZ2F0aW9uIHNldHRpbmcgb2YgdGhlIGRhdGEgZ3JpZC4gSWYgcm93TmF2aWdhdGlvblxuICAgKiBpcyBcImZhbHNl4oCdIHRoZW4gYSBib3JkZXIgaXMgbm90IGRpc3BsYXllZCBhcm91bmQgdGhlIHJvdy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIHJvd2xOYXZpZ2F0aW9uIGkgXCJmYWxzZeKAnSB0aGVuIGdyaWQgd2lsbCBOT1Qgc2hvdyBhIGJvcmRlciBhcm91bmQgdGhlIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dOYXZpZ2F0aW9uKHJvd05hdmlnYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uID0gcm93TmF2aWdhdGlvbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnJvd05hdmlnYXRpb24gPSByb3dOYXZpZ2F0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncm93TmF2aWdhdGlvbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvd05hdmlnYXRpb24oKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBkaXNwbGF5cyB0aGUgcm93cyBpbiB0aGUgZ3JpZCB1c2luZyBhbHRlcm5hdGUgc2hhZGluZywgb3RoZXJ3aXNlXG4gICAqIGFsbCB0aGUgcm93cyB1c2UgdGhlIHNhbWUgc2hhZGluZy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbHRlcm5hdGVSb3dTaGFkaW5nKGFsdGVybmF0ZVJvd1NoYWRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbHRlcm5hdGVSb3dTaGFkaW5nID0gYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmFsdGVybmF0ZVJvd1NoYWRpbmcgPSBhbHRlcm5hdGVSb3dTaGFkaW5nO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWx0ZXJuYXRlUm93U2hhZGluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGFsdGVybmF0ZVJvd1NoYWRpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd05hdmlnYXRpb247XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWx0ZXJuYXRlUm93U2hhZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSB0byBiZSBkaXNwbGF5ZWQgcHJvdmlkZWQgYXMgYW4gYXJyYXlcbiAgICogb2YganNvbiBvYmplY3RzIGNvbXBhdGlibGUgd2l0aCB0aGUgY29sdW1uIG1ldGFcbiAgICogZGF0YSBwcm92aWRlZC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgLSBhcnJheSBvZiBqc29uIG9iamVjdHNcbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhc2V0KGRhdGFzZXQ6IEFycmF5PGFueT4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0ID0gZGF0YXNldDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICBjb25zdCBwYWdlckluZm86IFNvaG9QYWdlclBhZ2luZ0luZm8gPSB7fTtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZGF0YXNldCA9IGRhdGFzZXQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gZG8gd2UgbmVlZCBoaW50cyBhcyB0aGlzIG1heSBiZSBidW5kbGVkIHVwIHdpdGggb3RoZXIgY2hhbmdlcy5cbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVEYXRhc2V0KChkYXRhc2V0IGFzIGFueSksIHBhZ2VySW5mbyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkYXRhc2V0IGN1cnJlbnRseSBkaXNwbGF5ZWQgYnkgdGhlIGRhdGFncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG9iamVjdHMuXG4gICAqL1xuICBnZXQgZGF0YXNldCgpOiBhbnlbXSB8IHVuZGVmaW5lZCB7XG5cbiAgICAvLyBJZiB0aGUgU29obyBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZW4gdGhlIGRhdGFzZXRcbiAgICAvLyBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiB0aGUgcm93cyBjdXJyZW50bHlcbiAgICAvLyBvbiBkaXNwbGF5LlxuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kYXRhc2V0O1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIG5vIGRhdGEgaGFzIGJlZW4gc2V0IChvciBwb3RlbnRpYWxseVxuICAgIC8vIHJldHJpZXZlZCBmcm9tIGEgc2VydmljZSksIHNvIHRoZSBvbmx5IG9wdGlvbiBpcyB0aGVcbiAgICAvLyBJbnB1dCBkYXRhc2V0LCB3aGljaCBtYXkgYmUgdW5kZWZpbmVkLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kYXRhc2V0IHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGNvbHVtbnMgY2FuIGJlIHJlb3JkZXJzOyBvdGhlcndpc2UgaWYgZmFsc2UgdGhleSBhcmUgZml4ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uUmVvcmRlcihjb2x1bW5SZW9yZGVyOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uUmVvcmRlciA9IGNvbHVtblJlb3JkZXI7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjb2x1bW5SZW9yZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJIZWFkZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2x1bW5SZW9yZGVyKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5jb2x1bW5SZW9yZGVyO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblJlb3JkZXI7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZUNsaWVudFNvcnQoZGlzYWJsZUNsaWVudFNvcnQ6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydCA9IGRpc2FibGVDbGllbnRTb3J0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmRpc2FibGVDbGllbnRTb3J0ID0gZGlzYWJsZUNsaWVudFNvcnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVDbGllbnRTb3J0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50U29ydDtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBkaXNhYmxlQ2xpZW50RmlsdGVyKGRpc2FibGVDbGllbnRGaWx0ZXI6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlQ2xpZW50RmlsdGVyID0gZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG4gIH1cblxuICBnZXQgZGlzYWJsZUNsaWVudEZpbHRlcigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZUNsaWVudEZpbHRlcjtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlQ2xpZW50RmlsdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHRoZSBncmlkIGFsbG93cyBlZGl0cywgb3RoZXJ3aXNlIGlmIGZhbHNlIGVkaXRzIGFyZSBkaXNhYmxlZC5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBlZGl0YWJsZShlZGl0YWJsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmVkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZWRpdGFibGUgPSBlZGl0YWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VkaXRhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWRpdGFibGUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmVkaXRhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVkaXRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIElucHV0IHRoYXQgZGVmaW5lcyBhIGZ1bmN0aW9uIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgcm93IGlzIGRpc2FibGVkLCBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaXNSb3dEaXNhYmxlZChpc1Jvd0Rpc2FibGVkOiBTb2hvSXNSb3dEaXNhYmxlZEZ1bmN0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaXNSb3dEaXNhYmxlZCA9IGlzUm93RGlzYWJsZWQ7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaXNSb3dEaXNhYmxlZCA9IGlzUm93RGlzYWJsZWQ7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdpc1Jvd0Rpc2FibGVkJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNSb3dEaXNhYmxlZCgpOiBTb2hvSXNSb3dEaXNhYmxlZEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuaXNSb3dEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5pc1Jvd0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHdpbGwgc2VsZWN0IHRoZSBjZWxsIHRleHQgc29vbiBhcyBlbnRlcmluZyBlZGl0IG1vZGVcbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RPbkVkaXQoc2VsZWN0T25FZGl0OiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2VsZWN0T25FZGl0ID0gc2VsZWN0T25FZGl0O1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdE9uRWRpdCA9IHNlbGVjdE9uRWRpdDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VkaXRhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0T25FZGl0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RPbkVkaXQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RPbkVkaXQ7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaXNMaXN0KGlzTGlzdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmlzTGlzdCA9IGlzTGlzdDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmlzTGlzdCA9IGlzTGlzdDtcblxuICAgICAgLy8gY2FsbGluZyByZWJ1aWxkIGFzIGEgYnJ1dGUgZm9yY2Ugd2F5IG9mIHVkcGF0aW5nIHRoZSB2aWV3LlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaXNMaXN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgaXNMaXN0KCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5pc0xpc3Q7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuaXNMaXN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1lbnVJZChtZW51SWQ6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm1lbnVJZCA9IG1lbnVJZDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVJZCA9IG1lbnVJZDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ21lbnVJZCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIGJlZm9yZU9wZW4gLSBhamF4IGNhbGxiYWNrIGZvciBvcGVuIGV2ZW50ICovXG4gIEBJbnB1dCgpIHNldCBtZW51QmVmb3JlT3BlbihtZW51QmVmb3JlT3BlbjogU29ob1BvcHVwTWVudVNvdXJjZUZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMubWVudUJlZm9yZU9wZW4gPSBtZW51QmVmb3JlT3BlbjtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuID0gbWVudUJlZm9yZU9wZW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdtZW51QmVmb3JlT3BlbicsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1lbnVCZWZvcmVPcGVuKCk6IFNvaG9Qb3B1cE1lbnVTb3VyY2VGdW5jdGlvbiB7XG4gICAgcmV0dXJuICh0aGlzLl9ncmlkT3B0aW9ucyBhcyBhbnkpLnNldHRpbmdzLm1lbnVCZWZvcmVPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJvdyBoZWlnaHQgZm9yIHRoZSBncmlkLCB0byBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gcm93SGVpZ2h0IC0gJ2V4dHJhLXNtYWxsJyB8ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZSdcbiAgICovXG4gIEBJbnB1dCgpIHNldCByb3dIZWlnaHQocm93SGVpZ2h0OiBTb2hvRGF0YUdyaWRSb3dIZWlnaHQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5yb3dIZWlnaHQocm93SGVpZ2h0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byBzb21ldGhpbmcgb3RoZXIgdGhlbiB0aGUgdGhyZWUgYnVpbHQgaW4gcm93SGVpZ2h0cy5cbiAgICpcbiAgICogQHBhcmFtIGZpeGVkUm93SGVpZ2h0IEFueSBpbnRlZ2VyXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZml4ZWRSb3dIZWlnaHQoZml4ZWRSb3dIZWlnaHQ6IG51bWJlciB8IHN0cmluZyB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgPSBmaXhlZFJvd0hlaWdodDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZpeGVkUm93SGVpZ2h0ID0gZml4ZWRSb3dIZWlnaHQ7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdmaXhlZFJvd0hlaWdodCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc2VsZWN0aW9uIGlzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHZhbGlkIHZhbHVlcyBhcmU6ICdtdWx0aXBsZScsICdzaW5nbGUnLCAnbWl4ZWQnLCAnc2libGluZ3MnIGFuZCBmYWxzZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzZWxlY3RhYmxlKHNlbGVjdGFibGU6IGFueSkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGUgPSBzZWxlY3RhYmxlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIC8vIEp1c3QgY2hhbmdpbmcgdGhlIGRhdGFncmlkLnNldHRpbmdzLnNlbGVjdGFibGUgdXBkYXRlcyB0aGUgZGF0YWdyaWQgdmlldy5cbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0YWJsZSA9IHNlbGVjdGFibGU7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc2VsZWN0YWJsZSgpOiBhbnkge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnNlbGVjdGFibGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2hvd1NlbGVjdEFsbENoZWNrQm94KHNob3dTZWxlY3RBbGxDaGVja0JveDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAvLyBKdXN0IGNoYW5naW5nIHRoZSBkYXRhZ3JpZC5zZXR0aW5ncy5zZWxlY3RhYmxlIHVwZGF0ZXMgdGhlIGRhdGFncmlkIHZpZXcuXG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLnNob3dTZWxlY3RBbGxDaGVja0JveCA9IHNob3dTZWxlY3RBbGxDaGVja0JveDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dTZWxlY3RBbGxDaGVja0JveCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNob3dTZWxlY3RBbGxDaGVja0JveCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd1NlbGVjdEFsbENoZWNrQm94O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGNsaWNrVG9TZWxlY3QoY2xpY2tUb1NlbGVjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNsaWNrVG9TZWxlY3QgPSBjbGlja1RvU2VsZWN0O1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdCA9IGNsaWNrVG9TZWxlY3Q7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdjbGlja1RvU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZW5kZXJSb3dzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2xpY2tUb1NlbGVjdCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY2xpY2tUb1NlbGVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5jbGlja1RvU2VsZWN0O1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHRvb2xiYXIodG9vbGJhcjogU29ob1Rvb2xiYXJPcHRpb25zKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudG9vbGJhciA9IHRvb2xiYXI7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy50b29sYmFyID0gdG9vbGJhcjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Rvb2xiYXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzYXZlVXNlclNldHRpbmdzKHNldHRpbmdzRm9yU2F2ZTogU29ob0RhdGFHcmlkU2F2ZVVzZXJTZXR0aW5ncykge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNhdmVVc2VyU2V0dGluZ3MgPSBzZXR0aW5nc0ZvclNhdmU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zYXZlVXNlclNldHRpbmdzID0gc2V0dGluZ3NGb3JTYXZlO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdpbmcocGFnaW5nOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnaW5nID0gcGFnaW5nO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnaW5nID0gcGFnaW5nO1xuXG4gICAgICAvLyB0b2RvOiB1cGRhdGUgc29obyBkYXRhIGdyaWRzIHZpZXcgLSB0aGlzLnVwZGF0ZVBhZ2luZ0luZm8oKT9cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3BhZ2luZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG4gIGdldCBwYWdpbmcoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnBhZ2luZztcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5wYWdpbmc7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgcGFnZXNpemUocGFnZXNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnBhZ2VzaXplID0gcGFnZXNpemU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5wYWdlc2l6ZSA9IHBhZ2VzaXplO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBwYWdlc2l6ZXMocGFnZXNpemVzOiBBcnJheTxudW1iZXI+KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MucGFnZXNpemVzID0gcGFnZXNpemVzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgncGFnZXNpemVzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBASW5wdXQoKSBzZXQgaW5kZXRlcm1pbmF0ZShpbmRldGVybWluYXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuaW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5pbmRldGVybWluYXRlID0gaW5kZXRlcm1pbmF0ZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2luZGV0ZXJtaW5hdGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBhY3Rpb25hYmxlTW9kZShhY3Rpb25hYmxlTW9kZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmFjdGlvbmFibGVNb2RlID0gYWN0aW9uYWJsZU1vZGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hY3Rpb25hYmxlTW9kZSA9IGFjdGlvbmFibGVNb2RlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnYWN0aW9uYWJsZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhY3Rpb25hYmxlTW9kZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuYWN0aW9uYWJsZU1vZGU7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuYWN0aW9uYWJsZU1vZGU7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgc2F2ZUNvbHVtbnMoc2F2ZUNvbHVtbnM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zYXZlQ29sdW1ucyA9IHNhdmVDb2x1bW5zO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2F2ZUNvbHVtbnMgPSBzYXZlQ29sdW1ucztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3NhdmVDb2x1bW5zJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5wdXQgZm9yIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgdGhlIGRhdGFzZXQncyBzb3VyY2UgZnVuY3Rpb24uXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc291cmNlKHNvdXJjZTogU29ob0RhdGFHcmlkU291cmNlRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZSgoc291cmNlIGFzIGFueSkpO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc291cmNlID0gc291cmNlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc291cmNlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZmlsdGVyIGJhciBvbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGZpbHRlcmFibGUgaWYgdHJ1ZSwgdGhlIGZpbHRlciBiYXIgaXMgZGlzcGxheWVkOyBvdGhlcndpc2Ugbm8gZmlsdGVyIGJhciBpcyBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZmlsdGVyYWJsZShmaWx0ZXJhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZSA9IGZpbHRlcmFibGU7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5maWx0ZXJhYmxlID0gZmlsdGVyYWJsZTtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZpbHRlcmFibGUnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZmlsdGVyYWJsZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZmlsdGVyYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5maWx0ZXJhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGRhdGFncmlkIGlzIGRpc3BsYXllZCBhcyBhIHRyZWUsIG90aGVyd2lzZVxuICAgKiB0aGUgZ3JpZCBpcyBkaXNwbGF5ZWQgYXMgZmxhdCByb3dzLlxuICAgKlxuICAgKiBUaGlzIGZpZWxkIGlzIGR5bmFtaWMsIGFuZCB3aWxsIGNhdXNlIHRoZSBncmlkIHRvIGJlIHJlYnVpbHRcbiAgICogaWYgY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHRyZWVHcmlkIC0gYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGRhdGEgaXMgaGllcmFyY2hpY2FsLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHRyZWVHcmlkKHRyZWVHcmlkOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRyZWVHcmlkICE9PSB0aGlzLl9ncmlkT3B0aW9ucy50cmVlR3JpZCkge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQgPSB0cmVlR3JpZDtcblxuICAgICAgLy8gSWYgdGhlIGpRdWVyeSBjb250cm9sIGhhcyBiZWVuIGluaXRpYWxpc2VkLCB1cGRhdGUgaXQuXG4gICAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MudHJlZUdyaWQgPSB0cmVlR3JpZDtcbiAgICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgndHJlZUdyaWQnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCB0cmVlR3JpZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudHJlZUdyaWQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMudHJlZUdyaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5xaXVlIGlkZW50aWZpZXI7IHdoaWNoIG1heSBiZSB1bmRlZmluZWQuXG4gICAqL1xuICBnZXQgdW5pcXVlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudW5pcXVlSWQ7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMudW5pcXVlSWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdW5xaXVlSWQgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gdW5xaXVlSWQgLSB0aGUgbmV3IGlkLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHVuaXF1ZUlkKHVuaXF1ZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3VuaXF1ZUlkJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSByb3dSZW9yZGVyIGZsYWcgLSByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaWYgdGhlIGNvbnRyb2wgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LlxuICAgKi9cbiAgZ2V0IHJvd1Jlb3JkZXIoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnJvd1Jlb3JkZXI7XG4gICAgfVxuXG4gICAgLy8gLi4uIHdlJ3ZlIGJlZW4gY2FsbGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGhhcyBjb21wbGV0ZWRcbiAgICAvLyBpbml0aWFsaXNhdGlvbiwgc28gcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlXG4gICAgLy8gb3B0aW9ucy5cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMucm93UmVvcmRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSByb3dSZW9yZGVyIGZsYWcgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gcm93UmVvcmRlciAtIGlmIHRydWUgdGhlIHJvd3Mgd2lsbCBiZSByZW9yZGVyYWJsZTsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcm93UmVvcmRlcih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJvd1Jlb3JkZXIgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yb3dSZW9yZGVyID0gdmFsdWU7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Jvd1Jlb3JkZXInLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlIHNob3dEaXJ0eSBmbGFnIC0gcmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlIGlmIHRoZSBjb250cm9sIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldC5cbiAgICovXG4gIGdldCBzaG93RGlydHkoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dEaXJ0eTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zaG93RGlydHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc2hvd0RpcnR5IGZsYWcgLSB3aWxsIGZvcmNlIGEgZ3JpZCByZWJ1aWxkIGlmIHRoZSBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlblxuICAgKiBjcmVhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2hvd0RpcnR5IC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd0RpcnR5KHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd0RpcnR5ID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Muc2hvd0RpcnR5ID0gdmFsdWU7XG5cbiAgICAgIC8vIEZvcmNlIGFsbCBhIGZ1bGwgcmVidWlsZCBvZiB0aGUgY29udHJvbC5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Nob3dEaXJ0eScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHJlc2l6ZU1vZGUgb3B0aW9uIHRvIGNoYW5nZXMgdGhlIGNvbHVtbiByZXNpemUgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSByZXNpemVNb2RlIC0gaWYgdHJ1ZSB0aGVuIGRpcnR5IHJvd3Mgd2lsbCBiZSBoaWdobGlnaHRlZDsgb3RoZXJ3aXNlIHRoZXkgd2lsbCBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgcmVzaXplTW9kZSh2YWx1ZTogU29ob0RhdGFHcmlkUmVzaXplTW9kZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnJlc2l6ZU1vZGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5yZXNpemVNb2RlID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3Jlc2l6ZU1vZGUnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNhYmxlUm93RGVhY3RpdmF0aW9uKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uO1xuICAgIH1cblxuICAgIC8vIC4uLiB3ZSd2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBoYXMgY29tcGxldGVkXG4gICAgLy8gaW5pdGlhbGlzYXRpb24sIHNvIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZVxuICAgIC8vIG9wdGlvbnMuXG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0RlYWN0aXZhdGlvbih2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmRpc2FibGVSb3dEZWFjdGl2YXRpb24gPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5kaXNhYmxlUm93RGVhY3RpdmF0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc2FibGVSb3dEZXNlbGVjdGlvbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5kaXNhYmxlUm93RGVzZWxlY3Rpb247XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZGlzYWJsZVJvd0Rlc2VsZWN0aW9uKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuZGlzYWJsZVJvd0Rlc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVc2VkIHRvIGhvbGQgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgaW4gZm9ybWF0dGVyc1xuICAgKiBhbmQgZWRpdG9ycyBvciBhbnl3aGVyZSBlbHNlIGEgZGF0YWdyaWQgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuICAgKi9cbiAgQElucHV0KCkgc2V0IHVzZXJPYmplY3QodXNlck9iamVjdDogYW55IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdCA9IHVzZXJPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHVzZXJPYmplY3QoKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MudXNlck9iamVjdDtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy51c2VyT2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBhYmxlIG9wdGlvbiAtIHJldHVybnMgdGhlIHJlcXVlc3RlZFxuICAgKiB2YWx1ZSBpZiB0aGUgY29udHJvbCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuXG4gICAqL1xuICBnZXQgZ3JvdXBhYmxlKCk6IFNvaG9EYXRhR3JpZEdyb3VwYWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmdyb3VwYWJsZTtcbiAgICB9XG5cbiAgICAvLyAuLi4gd2UndmUgYmVlbiBjYWxsZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgaGFzIGNvbXBsZXRlZFxuICAgIC8vIGluaXRpYWxpc2F0aW9uLCBzbyByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGVcbiAgICAvLyBvcHRpb25zLlxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZ3JvdXBhYmxlIHNldHRpbmdzIC0gd2lsbCBmb3JjZSBhIGdyaWQgcmVidWlsZCBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW5cbiAgICogY3JlYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwYWJsZSAtIHRoZSBncm91cGFibGUgc2V0dGluZ3MuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgZ3JvdXBhYmxlKHZhbHVlOiBTb2hvRGF0YUdyaWRHcm91cGFibGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5ncm91cGFibGUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5ncm91cGFibGUgPSB2YWx1ZTtcblxuICAgICAgLy8gRm9yY2UgYWxsIGEgZnVsbCByZWJ1aWxkIG9mIHRoZSBjb250cm9sLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZ3JvdXBhYmxlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFycmF5IG9mIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGFuIGFycmF5IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIGNvbHVtbiBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBkYXRhKGRhdGE6IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5ncmlkRGF0YSA9IGRhdGE7XG4gICAgaWYgKGRhdGEgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgY29sdW1ucyB0byBkaXNwbGF5IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBBcyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY29udHJvbCBpc1xuICAgKiBpbml0aWFsaXNlZCwgc3Rhc2ggdGhlIGRhdGEgZm9yIGxhdGVyLCBhbmQgb25seVxuICAgKiBjYWxsIGxvYWREYXRhIG9uIHRoZSBjb250cm9sIGFwaSBpZiByZWFkeS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5zKGNvbHVtbnM6IFNvaG9EYXRhR3JpZENvbHVtbltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyA9IGNvbHVtbnMgfHwgW107XG5cbiAgICB0aGlzLmNoZWNrRm9yQ29tcG9uZW50RWRpdG9ycygpO1xuXG4gICAgaWYgKGNvbHVtbnMgJiYgdGhpcy5qUXVlcnlFbGVtZW50KSB7XG5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucygodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLCAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5Hcm91cHMpO1xuICAgICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldE9yaWdpbmFsQ29sdW1ucygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFN1bW1hcnkgcm93IGNvbHVtbnMgc2V0dGluZ3NzXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc3VtbWFyeVJvd0NvbHVtbnMoc3VtbWFyeVJvd0NvbHVtbnM6IFNvaG9EYXRhR3JpZFN1bW1hcnlSb3dDb2x1bW5TZXR0aW5nc1tdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMgPSBzdW1tYXJ5Um93Q29sdW1ucztcbiAgICB0aGlzLmNoZWNrRm9yU3VtbWFyeVJvd1NldHRpbmdzKCk7XG5cbiAgICBpZiAodGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XG4gICAgICAgIHRoaXMuZGF0YWdyaWQ/LnVwZGF0ZUNvbHVtbnMoKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMgYXMgYW55KSwgKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbkdyb3VwcyBhcyBhbnkpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCB0aGF0IGZpbGxzIHRoZSBzcGFjZS5cbiAgICogVGhpcyBhbGxvd3MgY29sdW1ucyB0byBub3Qgc3RyZXRjaCB0byBmaWxsIHNvIHRoZXkgYXJlIGEgY29uc3RhbnQgc2l6ZS5cbiAgICogVGhpcyBzZXR0aW5nIGNhbm5vdCBiZSB1c2VkIHdpdGggcGVyY2VudCBjb2x1bW5zLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IHNwYWNlckNvbHVtbihzcGFjZXJDb2x1bW46IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zcGFjZXJDb2x1bW4gPSBzcGFjZXJDb2x1bW47XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzcGFjZXJDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIElmIHRydWUgYW4gZXh0cmEgY29sdW1uIGlzIGN1cnJlbnRseSBhZGRlZCB0byB0aGUgZW5kIHRoYXQgZmlsbHMgdGhlIHNwYWNlLlxuICAgKi9cbiAgZ2V0IHNwYWNlckNvbHVtbigpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnM/LnNwYWNlckNvbHVtbjtcbiAgfVxuXG4gIC8qIEV4cGVyaW1lbnRhbCBGZWF0dXJlIHRvIHN0aWNrIG9uIHRoZSB0b3Agb2YgdGhlIHBhZ2UuIFRoaXMgZmVhdHVyZSBoYXMgbnVtZXJvdXMgbGltaXRhdGlvbnMuICovXG4gIEBJbnB1dCgpIHNldCBzdGlja3lIZWFkZXIoc3RpY2t5SGVhZGVyOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RpY2t5SGVhZGVyID0gc3RpY2t5SGVhZGVyO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RpY2t5SGVhZGVyJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKiBFeHBlcmltZW50YWwgRmVhdHVyZSB0byBzdGljayBvbiB0aGUgdG9wIG9mIHRoZSBwYWdlLiBUaGlzIGZlYXR1cmUgaGFzIG51bWVyb3VzIGxpbWl0YXRpb25zLiAqL1xuICBASW5wdXQoKSBzZXQgYXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBBcnJheTxPYmplY3Q+IHwgT2JqZWN0KSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2F0dHJpYnV0ZXMnLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBzaXppbmcgbWV0aG9kIGZvciB0aGUgYXV0byBzaXppbmcgY29sdW1ucy5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBjb2x1bW5TaXppbmcoY29sdW1uU2l6aW5nOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmNvbHVtblNpemluZyA9IGNvbHVtblNpemluZztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2NvbHVtblNpemluZycsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHNpemluZyBtZXRob2QgZm9yIHRoZSBhdXRvIHNpemluZyBjb2x1bW5zLlxuICAgKi9cbiAgZ2V0IGNvbHVtblNpemluZygpOiAnYm90aCcgfCAnZGF0YScgfCAnaGVhZGVyJyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtblNpemluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSB3aWR0aCBvZiB0aGUgZGF0YWdyaWQsXG4gICAqIG9yICdsYXN0JyB3aGVyZSB0aGUgbGFzdCBjb2x1bW4gd2lsbCBiZSBzdHJldGNoZWQgdG8gZmlsbCB0aGVcbiAgICogcmVtYWluaW5nIHNwYWNlLlxuICAgKlxuICAgKiBAcGFyYW0gc3RyZXRjaENvbHVtbiAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gdG8gc3RyZXRjaDsgb3IgJ2xhc3QnLFxuICAgKi9cbiAgQElucHV0KCkgc2V0IHN0cmV0Y2hDb2x1bW4oc3RyZXRjaENvbHVtbjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbiA9IHN0cmV0Y2hDb2x1bW47XG4gICAgaWYgKHRoaXMualF1ZXJ5RWxlbWVudCkge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zdHJldGNoQ29sdW1uID0gc3RyZXRjaENvbHVtbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ3N0cmV0Y2hDb2x1bW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sdW1uIHRvIHN0cmV0Y2gsIG9yICdsYXN0JyBpZiB0aGVcbiAgICogbGFzdCBjb2x1bW4gaXMgc3RyZXRjaGVkLlxuICAgKi9cbiAgZ2V0IHN0cmV0Y2hDb2x1bW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjb2x1bW4gd2lsbCByZWNhbGN1bGF0ZSBpdHMgd2lkdGggYW5kIHN0cmV0Y2ggaWYgcmVxdWlyZWQgb24gY29sdW1uIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZSAtIElmIGZhbHNlIHN0cmV0Y2ggbG9naWMgd29udCBydW4gb24gY29sdW1uIGNoYW5nZS5cbiAgICovXG4gIEBJbnB1dCgpIHNldCBzdHJldGNoQ29sdW1uT25DaGFuZ2Uoc3RyZXRjaENvbHVtbk9uQ2hhbmdlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc3RyZXRjaENvbHVtbk9uQ2hhbmdlID0gc3RyZXRjaENvbHVtbk9uQ2hhbmdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc3RyZXRjaENvbHVtbk9uQ2hhbmdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHZhbHVlIG9mIHN0cmV0Y2hDb2x1bW5PbkNoYW5nZS5cbiAgICovXG4gIGdldCBzdHJldGNoQ29sdW1uT25DaGFuZ2UoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLnN0cmV0Y2hDb2x1bW5PbkNoYW5nZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBhZ2Ugc2l6ZSBzZWxlY3RvciBvciBub3QuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2hvd1BhZ2VTaXplU2VsZWN0b3Ioc2hvd1BhZ2VTaXplU2VsZWN0b3I6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zaG93UGFnZVNpemVTZWxlY3RvciA9IHNob3dQYWdlU2l6ZVNlbGVjdG9yO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2hvd1BhZ2VTaXplU2VsZWN0b3IgPSBzaG93UGFnZVNpemVTZWxlY3RvcjtcblxuICAgICAgLy8gdG9kbzogbmVlZCBhIGZ1bmN0aW9uIGluIGRhdGFncmlkLmpzIHRoYXQgYWxsb3dzIHRvZ2dsaW5nIG9mIHRoZSBwYWdlIHNpemUgc2VsZWN0b3IuIGZvciBub3cgSSBoYXZlIHRvIHJlYnVpbGQgdGhlIGRhdGFncmlkLlxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd1BhZ2VTaXplU2VsZWN0b3InLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBoaWRlcyB0aGUgcGFnZXIgaWYgdGhlcmUncyBvbmx5IG9uZSBwYWdlIHdvcnRoIG9mIHJlc3VsdHMuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgaGlkZVBhZ2VyT25PbmVQYWdlKGhpZGVQYWdlck9uT25lUGFnZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmhpZGVQYWdlck9uT25lUGFnZSA9IGhpZGVQYWdlck9uT25lUGFnZTtcblxuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnaGlkZVBhZ2VyT25PbmVQYWdlJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbHVtbiBncm91cHNcbiAgICpcbiAgICogQXMgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRyb2wgaXNcbiAgICogaW5pdGlhbGlzZWQsIHN0YXNoIHRoZSBkYXRhIGZvciBsYXRlciwgYW5kIG9ubHlcbiAgICogY2FsbCBsb2FkRGF0YSBvbiB0aGUgY29udHJvbCBhcGkgaWYgcmVhZHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgY29sdW1uR3JvdXAoY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uR3JvdXBzID0gY29sdW1uR3JvdXBzIHx8IFtdO1xuICAgIGlmIChjb2x1bW5Hcm91cHMgJiYgdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1ucyAmJiB0aGlzLmpRdWVyeUVsZW1lbnQpIHtcblxuICAgICAgLy8gQHRvZG8gYWRkIGhpbnRzIGZvciB0aGlzIHRvbywgYXMgb3RoZXIgY2hhbmdlcyBtYXkgZm9yY2UgYSByZWJ1aWxkP1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS51cGRhdGVDb2x1bW5zKHRoaXMuX2dyaWRPcHRpb25zLmNvbHVtbnMsIGNvbHVtbkdyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgZW1wdHlNZXNzYWdlYCBkYXRhIGdyaWQgb3B0aW9uLlxuICAgKiBVc2UgbnVsbCBvciB1bmRlZmluZWQgdG8gcmVtb3ZlIGFueSBlbXB0eSBtZXNzYWdlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVtcHR5TWVzc2FnZShlbXB0eU1lc3NhZ2U6IFNvaG9FbXB0eU1lc3NhZ2VPcHRpb25zIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIC8vIENoZWNrIGZvciB1bmRlZmluZWQvbnVsbCBhbmQgcmVzZXQgdG8gdGhlIGRlZmF1bHQgbWVzc2FnZVxuICAgIGlmICghZW1wdHlNZXNzYWdlKSB7XG4gICAgICAvLyBzb2hvIG9ubHkgdGFrZXMgYSBudWxsIGhlcmUgc28gbWFraW5nIGl0IHNvIGFueSAhZW1wdHlNZXNzYWdlIGdldHMgc2V0IHRvIG51bGxcbiAgICAgIGVtcHR5TWVzc2FnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgIGlmICh0aGlzLmpRdWVyeUVsZW1lbnQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZW1wdHlNZXNzYWdlID0gZW1wdHlNZXNzYWdlO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFncmlkPy5zZXRFbXB0eU1lc3NhZ2UoZW1wdHlNZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbXB0eU1lc3NhZ2UoKTogU29ob0VtcHR5TWVzc2FnZU9wdGlvbnMgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuZW1wdHlNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0b29saXBzIG9uIHRoZSBjZWxsIHZhbHVlcywgYXQgYSBjb3N0IG9mIHBlcmZvcm1hbmNlLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGVuYWJsZVRvb2x0aXBzKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZW5hYmxlVG9vbHRpcHMgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5qUXVlcnlFbGVtZW50KSB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmVuYWJsZVRvb2x0aXBzID0gdmFsdWU7XG5cbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2VuYWJsZVRvb2x0aXBzJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZW5hYmxlVG9vbHRpcHMoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmVuYWJsZVRvb2x0aXBzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHNvdXJjZSB0eXBlIG9mIHRoZSBncmlkLCBlaXRoZXI6XG4gICAqXG4gICAqIC0gXCJjb250ZW50LW9ubHlcIiB3aGVyZSB0YWJsZSBlbGVtZW50cyBhcmUgcHJvdmlkZWQgaW4gdGhlIGJvZHkuXG4gICAqIC0gXCJhdXRvXCIgd2hlcmUgY29sdW1ucyBhbmQgcm93cyBhcmUgb2J0YWluZWQgZm9yIGFuXG4gICAqICAgaW5qZWN0ZWQgc2VydmljZSAoaWYgZGVmaW5lZCkgb3IgdmlhIHRoZSBJbnB1dHMgaWYgbm90LlxuICAgKlxuICAgKiBBbGxvdyB0aGUgaW5wdXQgdG8gYmUgb3ZlcnJpZGVuLCB0byBtYXRjaCB0aGUgY29tcG9uZW50IHNlbGVjdG9yLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdzb2hvLWRhdGFncmlkJykgc2V0IHNvaG9EYXRhZ3JpZChkYXRhZ3JpZFR5cGU6IFNvaG9EYXRhR3JpZFR5cGUpIHtcbiAgICB0aGlzLmRhdGFncmlkVHlwZSA9IGRhdGFncmlkVHlwZSA/IGRhdGFncmlkVHlwZSA6IFNvaG9EYXRhR3JpZENvbXBvbmVudC5BVVRPO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDb21wb25lbnQgT3V0cHV0XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgKG9yIHJvd3MpIGFyZSBzZWxlY3RlZC5cbiAgQE91dHB1dCgpXG4gIHNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50PigpO1xuXG4gIC8vIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNlbGwgaXMgY2hhbmdlZC5cbiAgQE91dHB1dCgpXG4gIGNlbGxjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaXMgcmVtb3ZlZC5cbiAgQE91dHB1dCgpXG4gIHJvd1JlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgcm93IGlzIGFkZGVkLlxuICBAT3V0cHV0KClcbiAgcm93QWRkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRBZGRSb3dFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIGdyaWQgaXMgZmlsdGVyZWQuXG4gIEBPdXRwdXQoKVxuICBmaWx0ZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaW4gdGhlIGdyaWQgaXMgZXhwYW5kZWQuXG4gIEBPdXRwdXQoKVxuICBleHBhbmRyb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBrZXkgaXMgcHJlc3NlZFxuICAgKlxuICAgKiBAdG9kbyByZW1vdmUgb3ZlcnJpZGUgb2YgbmF0aXZlIGF0dHJpYnV0ZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKVxuICBrZXlkb3duID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRLZXlEb3duRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGVkaXQgbW9kZSBpcyBleGl0ZWQuXG4gIEBPdXRwdXQoKVxuICBleGl0ZWRpdG1vZGUgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQ+KCk7XG5cbiAgLy8gVGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgZWRpdCBtb2RlIGlzIHN0YXJ0ZWQuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVlbnRlcmVkaXRtb2RlID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gZWRpdCBtb2RlIGlzIGVudGVyZWQuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgZW50ZXJlZGl0bW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudD4oKTtcblxuICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSByb3cgaW4gdGhlIGdyaWQgaXMgY29sbGFwc2VkLlxuICBAT3V0cHV0KClcbiAgY29sbGFwc2Vyb3cgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBzb3J0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNvcnRlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVQYWdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9QYWdlclBhZ2luZ0luZm8+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGFmdGVyUGFnaW5nID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvUGFnZXJQYWdpbmdJbmZvPigpO1xuXG4gIEBPdXRwdXQoKVxuICBiZWZvcmVSb3dBY3RpdmF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZD4oKTtcblxuICBAT3V0cHV0KClcbiAgcm93QWN0aXZhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0RlYWN0aXZhdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dBY3RpdmF0ZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0NsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHJvd0RvdWJsZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd0NsaWNrZWQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGNvbnRleHRNZW51ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRSb3dDbGlja2VkPigpO1xuXG4gIEBPdXRwdXQoKVxuICByb3dSZW9yZGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFJvd1Jlb3JkZXJlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvcGVuRmlsdGVyUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRPcGVuRmlsdGVyUm93RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIGNsb3NlRmlsdGVyUm93ID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRDbG9zZUZpbHRlclJvd0V2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICBzZXR0aW5nc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZFNldHRpbmdzQ2hhbmdlZEV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKVxuICByZW5kZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgYWZ0ZXJSZW5kZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHZlcnRpY2FsU2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRTY3JvbGxFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgZmlsdGVyb3BlcmF0b3JjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudD4oKTtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBIb3N0IEJpbmRpbmdzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBTZXQgdGhlIGVuYWJsZSAvIGRpc2FibGVkIGNsYXNzIChub3Qgd29ya2luZylcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pcy1kaXNhYmxlZCcpXG4gIGlzRGlzYWJsZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcm9sZSBmb3IgdGhlIGdyaWQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBkYXRhZ3JpZFJvbGUoKSB7XG4gICAgaWYgKHRoaXMuX2dyaWRPcHRpb25zLnRyZWVHcmlkKSB7XG4gICAgICByZXR1cm4gJ3RyZWVncmlkJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdkYXRhZ3JpZCc7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQcml2YXRlIE1lbWJlciBEYXRhXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGpRdWVyeSBjb250cm9sLlxuICBwcml2YXRlIGpRdWVyeUVsZW1lbnQ/OiBKUXVlcnk7XG5cbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBTb2hvIGRhdGFncmlkIGNvbnRyb2wgYXBpLlxuICBwcml2YXRlIGRhdGFncmlkPzogU29ob0RhdGFHcmlkU3RhdGljIHwgbnVsbDtcblxuICAvLyBSZWZlcmVuY2UgdG8gdGhlIGdyaWQncyBkYXRhLlxuICBwcml2YXRlIGdyaWREYXRhPzogYW55W107XG5cbiAgLy8gVGhlIHNvdXJjZSB0eXBlIGZvciB0aGUgZ3JpZC5cbiAgcHJpdmF0ZSBkYXRhZ3JpZFR5cGU/OiBzdHJpbmc7XG5cbiAgLy8gQW4gaW50ZXJuYWwgZ3JpZE9wdGlvbnMgb2JqZWN0IHRoYXQgZ2V0cyB1cGRhdGVkIGJ5IHVzaW5nXG4gIC8vIHRoZSBjb21wb25lbnQncyBJbnB1dHMoKVxuICBwcml2YXRlIF9ncmlkT3B0aW9uczogU29ob0RhdGFHcmlkT3B0aW9ucyA9IHtcbiAgICBzdHJldGNoQ29sdW1uOiAnbGFzdCcsXG4gICAgZW5hYmxlVG9vbHRpcHM6IGZhbHNlXG4gIH07XG5cbiAgLy8gUHJvdmlkZXMgaGludHMgdG8gdGhlIGNvbXBvbmVudCBhZnRlciB0aGUgbmV4dCByZWZyZXNoLlxuICBwcml2YXRlIHJlZnJlc2hIaW50OiBSZWZyZXNoSGludEZsYWdzID0gUmVmcmVzaEhpbnRGbGFncy5Ob25lO1xuXG4gIC8vIExpc3Qgb2Ygb3B0aW9uIG5hbWVzIGNoYW5nZWQgKGZvciBkZWJ1Z2dpbmcpLlxuICBwcml2YXRlIGNoYW5nZWRPcHRpb25zOiBhbnlbXSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgZHluYW1pYyBmb3JtYXR0ZXIgY29tcG9uZW50cyAtIGtleWVkIGJ5IHRoZSBvcmlnaW5hbCBhcmdzLlxuICBwcml2YXRlIGNlbGxDb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIC8vIExpc3Qgb2YgZHluYW1pYyByb3d0ZW1wbGF0ZSBjb21wb25lbnRzIC0ga2V5ZWQgYnkgdGhlIG9yaWdpbmFsIGFyZ3MuXG4gIHByaXZhdGUgcm93VGVtcGxhdGVDb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIG5nWm9uZSAtIHRoZSBhbmd1bGFyIHpvbmUgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gZWxlbWVudFJlZiAtIHRoZSBlbGVtZW50IG1hdGNoaW5nIHRoZSBjb21wb25lbnQncyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yIC0gdGhlIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3Rvci5cbiAgICogQHBhcmFtIHJlc29sdmVyIC0gY29tcG9uZW50IGZhY3RvcnkgcmVzb2x2ZXIgKGZvciBlZGl0b3JzL2Zvcm1hdHRlcnMpLlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBkeW5hbWljIGNvbXBvbmVudCBpbmplY3RvciAoZm9yIGVkaXRvcnMvZm9ybWF0dGVycykuXG4gICAqIEBwYXJhbSBkYXRhZ3JpZFNlcnZpY2UgLSBzZXJ2aWNlIGZvciBvYnRhaW5pbmcgZGF0YSAob3B0aW9uYWwpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhcHA6IEFwcGxpY2F0aW9uUmVmLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBkYXRhZ3JpZFNlcnZpY2U6IFNvaG9EYXRhR3JpZFNlcnZpY2UpIHtcblxuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBQdWJsaWMgQVBJXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBnZXRDb2x1bW5Hcm91cChpZHg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZ2V0Q29sdW1uR3JvdXAoaWR4KTtcbiAgfVxuXG4gIGdldENvbHVtbkJ5SWQoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldENvbHVtbkdyb3VwKGlkeCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBzb3J0IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRhdGFncmlkLFxuICAgKiBjYW4gb25seSBiZSB1c2VkIG9uY2UgdGhlIGdyaWQgaGFzIGJlZW4gY3JlYXRlZC5cbiAgICpcbiAgICogQHRvZG8gdGhpcyBzaG91bGQgbWFkZSBsYXp5LlxuICAgKi9cbiAgc2V0U29ydEZ1bmN0aW9uKHNvcnRGdW5jdGlvbjogU29ob0RhdGFHcmlkU29ydEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc29ydEZ1bmN0aW9uID0gc29ydEZ1bmN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGFncmlkIG5vdCBpbml0aWFsaXplZC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY29sdW1uIGFuZCBkaXJlY3Rpb24gdG8gc29ydCB0aGUgZGF0YXNldCBvbi5cbiAgICpcbiAgICogQ2FuIG9ubHkgYmUgdXNlZCBvbmNlIHRoZSBncmlkIGhhcyBiZWVuIGluaXRpYWxpc2VkLCBvdGhlcndpc2VcbiAgICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1uSWQgdGhlIGlkIG9mIHRoZSBjb2x1bW4gdG8gc29ydCBvbjsgbXVzdCBiZSBub24tbnVsbC5cbiAgICogQHBhcmFtIGFzY2VuZGluZyBpZiB0cnVlIHNvcnQgYXNjZW5kaW5nLCBvdGhlcndpc2UgZGVzY2VuZGluZy4gIElmIG5vdCBzdXBwbGllZCB0aGUgc2V0dGluZyBpcyB0b2dnbGVkLlxuICAgKi9cbiAgc2V0U29ydENvbHVtbihjb2x1bW5JZDogc3RyaW5nLCBhc2NlbmRpbmc/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXRTb3J0Q29sdW1uKGNvbHVtbklkLCBhc2NlbmRpbmcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YWdyaWQgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBzb3J0IGluZGljYXRvciBvbiBhIGNvbHVtbiB3aGVuIGRpc2FibGVDbGllbnRTb3J0IGlzIHNldCB0byB0cnVlLlxuICAgKi9cbiAgc2V0U29ydEluZGljYXRvcihjb2x1bW5JZDogc3RyaW5nLCBhc2NlbmRpbmc6IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXRTb3J0SW5kaWNhdG9yKGNvbHVtbklkLCBhc2NlbmRpbmcpO1xuICAgIH0pO1xuICB9XG5cbiAgcGFnZVNpemUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8ucGFnZXJBUEkuc2V0dGluZ3MucGFnZXNpemU7XG4gIH1cblxuICB1cGRhdGVQYWdpbmdJbmZvKHBhZ2VJbmZvOiBTb2hvUGFnZXJQYWdpbmdJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucGFnZXJBUEkudXBkYXRlUGFnaW5nSW5mbyhwYWdlSW5mbyk7XG4gICAgfSk7XG4gIH1cblxuICBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkID0gZmFsc2U7XG4gIH1cblxuICBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IHRydWU7XG4gIH1cblxuICB1cGRhdGVSb3coaWR4OiBudW1iZXIsIHJvdzogYW55KTogdm9pZCB7XG4gICAgQXJndW1lbnRIZWxwZXIuY2hlY2tOb3ROdWxsKCdyb3cnLCByb3cpO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlUm93KGlkeCwgcm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIGhpZGVDb2x1bW4oaWQ6IGFueSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmhpZGVDb2x1bW4oaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgc2hvd0NvbHVtbihpZDogYW55KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2hvd0NvbHVtbihpZCk7XG4gICAgfSk7XG4gIH1cblxuICBjb2x1bW5CeUlkKGlkOiBzdHJpbmcpOiBBcnJheTxhbnk+IHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5CeUlkKGlkKTtcbiAgfVxuXG4gIGdldENvbHVtbnMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1ucztcbiAgfVxuXG4gIGdldENvbHVtbkdyb3VwcygpOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5jb2x1bW5Hcm91cHM7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjb2x1bW4gaW5kZXggZnJvbSB0aGUgY29sJ3MgaWQgKi9cbiAgY29sdW1uSWR4QnlJZChjb2x1bW5JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5JZHhCeUlkKGNvbHVtbklkKTtcbiAgfVxuXG4gIGdldEhlYWRlclJvd0NvbHVtbihmbGQ6IGFueSkge1xuICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmdldEhlYWRlclJvd0NvbHVtbihmbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByb3cgb2YgZGF0YSB0byB0aGUgZGF0YWdyaWQgYXQgdGhlIGdpdmVuIG9wdGlvbmFsIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSB0aGUgcm93IG9mIGRhdGEgdG8gYWRkLlxuICAgKiBAcGFyYW0gbG9jYXRpb24gdGhlIG9wdGlvbmFsIGxvY2FsdGlvbiwgJ3RvcCcgb3IgJ2JvdHRvbScgb3IgYSBudW1iZXIuXG4gICAqL1xuICBhZGRSb3coZGF0YTogYW55LCBsb2NhdGlvbj86ICd0b3AnIHwgJ2JvdHRvbScgfCBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmFkZFJvdyhkYXRhLCBsb2NhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJvdyBtYXRjaGluZyB0aGUgcm93SW5kZXggcGFzc2VkIGluIGZyb20gdGhlIGRhdGEgYW5kIGdyaWQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dJbmRleCB0aGUgaW5kZXggb2YgdGhlIHJvdyB0byByZW1vdmUuXG4gICAqL1xuICByZW1vdmVSb3cocm93SW5kZXg6IG51bWJlciwgbm9TeW5jPzogYm9vbGVhbiwgbm9UcmlnZ2VyPzogYm9vbGVhbikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlbW92ZVJvdyhyb3dJbmRleCwgbm9TeW5jLCBub1RyaWdnZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqXG4gICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGRpcnR5IHJvd3MgaW4gdGhlIGdyaWQuXG4gICAqL1xuICBkaXJ0eVJvd3MoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Um93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGRpcnR5IGNlbGxzIGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBkaXJ0eSBjZWxscyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIGRpcnR5Q2VsbHMoKTogQXJyYXk8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLmRpcnR5Q2VsbHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgZGlydHkgY2VsbHMuXG4gICAqL1xuICBjbGVhckRpcnR5KCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IHRoZSBjZWxsIHRoYXQncyBjdXJyZW50bHkgaW4gZWRpdCBtb2RlLlxuICAgKi9cbiAgY29tbWl0Q2VsbEVkaXQoKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNvbW1pdENlbGxFZGl0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGRpcnR5IGNlbGxzIGluIGdpdmVuIHJvdy5cbiAgICpcbiAgICogQHBhcmFtIHJvdyAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cuXG4gICAqL1xuICBjbGVhckRpcnR5Um93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LmNsZWFyRGlydHlSb3cocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBkaXJ0eSBvbiBnaXZlbiBjZWxsLlxuICAgKlxuICAgKiBAcGFyYW0gcm93IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gY2VsbCAtIHRoZSBjZWxsIG51bWJlciAoaWR4KSBvZiB0aGUgY2VsbFxuICAgKi9cbiAgY2xlYXJEaXJ0eUNlbGwocm93OiBudW1iZXIsIGNlbGw6IG51bWJlcik6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5jbGVhckRpcnR5Q2VsbChyb3csIGNlbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvciBmb3IgYSBnaXZlbiBjZWxsIGluIGEgcm93XG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqL1xuICBjbGVhckFsbENlbGxFcnJvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJBbGxDZWxsRXJyb3Iocm93LCBjZWxsKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSBjZWxsIHdpdGggYW4gZXJyb3Igb2YgYSBnaXZlbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtIGNlbGwgVGhlIGNlbGwgaW5kZXguXG4gICAqIEBwYXJhbSB0eXBlIG9mIGVycm9yLlxuICAgKi9cbiAgY2xlYXJDZWxsRXJyb3Iocm93OiBudW1iZXIsIGNlbGw6IG51bWJlciwgdHlwZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8uY2xlYXJDZWxsRXJyb3Iocm93LCBjZWxsLCB0eXBlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYSByb3cgbGV2ZWwgYWxsIGVycm9ycywgYWxlcnRzLCBpbmZvIG1lc3NhZ2VzXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleC5cbiAgICovXG4gIGNsZWFyUm93RXJyb3Iocm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhclJvd0Vycm9yKHJvdykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBlcnJvcnMsIGFsZXJ0cyBhbmQgaW5mbyBtZXNzYWdlcyBpbiBlbnRpcmUgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckFsbEVycm9ycygpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5jbGVhckFsbEVycm9ycygpKTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSBhbGwgcm93cyBhbmQgY2VsbHMgaW4gdGhlIGVudGlyZSBncmlkIGlmIHRoZXkgaGF2ZSB2YWxpZGF0aW9uIG9uIHRoZSBjb2x1bW4gKi9cbiAgc2hvd1Jvd0Vycm9yKHJvdzogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIHR5cGU6IFNvaG9BbGVydFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB0aGlzLmRhdGFncmlkPy5zaG93Um93RXJyb3Iocm93LCBtZXNzYWdlLCB0eXBlKSk7XG4gIH1cblxuICAvKiogVmFsaWRhdGUgYWxsIGNlbGxzIGluIGEgc3BlY2lmaWMgcm93ICovXG4gIHZhbGlkYXRlUm93KHJvdzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVSb3cocm93KSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGFuZCBzaG93IGEgbWVzc2FnZS9lcnJvciBvbiB0aGUgZ2l2ZW4gcm93LlxuICAgKi9cbiAgdmFsaWRhdGVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5kYXRhZ3JpZD8udmFsaWRhdGVBbGwoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gcm93IGluIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gaWR4IC0gdGhlIHJvdyBudW1iZXIgKGlkeCkgb2YgdGhlIHJvd1xuICAgKiBAcGFyYW0gc3RhdHVzIC0gc3RhdHVzIGNsYXNzIG5hbWUgZS5nLiAnZXJyb3InXG4gICAqIEBwYXJhbSB0b29sdGlwIC0gc3RyaW5nIHZhbHVlIGZvciB0b29sdGlwIG1lc3NhZ2UgZS5nLiAnRXJyb3InXG4gICAqL1xuICByb3dTdGF0dXMoaWR4OiBudW1iZXIsIHN0YXR1czogc3RyaW5nLCB0b29sdGlwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucm93U3RhdHVzKGlkeCwgc3RhdHVzLCB0b29sdGlwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlIGN1cnJlbnRseSBtb2RpZmllZCByb3dzLCB0aGUgdHlwZSBvZiBtb2RpZmljYXRpb25cbiAgICogYW5kIHRoZSBjZWxscyB0aGF0IGFyZSBkaXJ0eSBhbmQgdGhlIGRhdGEuXG4gICAqXG4gICAqIEByZXR1cm5zIEFuIGtleWVkIG9iamVjdCBzaG93aW5nIHRoZSBkaXJ0eSByb3cgaW5mby5cbiAgICovXG4gIGdldE1vZGlmaWVkUm93cygpOiBTb2hvRGF0YUdyaWRNb2RpZmllZFJvd3Mge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5nZXRNb2RpZmllZFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjZWxsIHRvIGRpcnR5IGFuZCBhZGQgdGhlIGRpcnR5IGljb24gdmlzdWFsbHkuXG4gICAqXG4gICAqIEBwYXJhbSByb3cgVGhlIHJvdyBpbmRleFxuICAgKiBAcGFyYW0gY2VsbCBUaGUgY2VsbCBpbmRleFxuICAgKiBAcGFyYW0gdG9nZ2xlIFRydWUgdG8gc2V0IGl0IGFuZCBmYWxzZSB0byByZW1vdmUgaXRcbiAgICogQHBhcmFtIGRhdGEgQWRkcyBkaXJ0eSBkYXRhIHRvIHRoZSBpbnRlcm5hbCB0cmFja2VyXG4gICAqL1xuICBzZXREaXJ0eUluZGljYXRvcihyb3c6IG51bWJlciwgY2VsbDogbnVtYmVyLCB0b2dnbGU6IGJvb2xlYW4sIGRhdGE/OiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXREaXJ0eUluZGljYXRvcihyb3csIGNlbGwsIHRvZ2dsZSwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgc2VsZWN0ZWQgcm93c1xuICAgKi9cbiAgcmVtb3ZlU2VsZWN0ZWQoKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBkaXNwbGF5IG9mIHRoZSBmaWx0ZXIgcm93LlxuICAgKi9cbiAgdG9nZ2xlRmlsdGVyUm93KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRvZ2dsZUZpbHRlclJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBjb25kaXRpb25zIGZyb20gb3V0c2lkZSBvciBwdWxsIGZyb20gZmlsdGVyIHJvd1xuICAgKi9cbiAgYXBwbHlGaWx0ZXIoY29uZGl0aW9ucz86IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5hcHBseUZpbHRlcihjb25kaXRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbHRlciByb3cgZnJvbSBwYXNzZWQgZGF0YSAvIHNldHRpbmdzXG4gICAqL1xuICBzZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnM6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZXRGaWx0ZXJDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWx0ZXIgY29uZGl0aW9ucyBpbiBhcnJheSBmb3JtIGZyb20gdGhlIFVJXG4gICAqL1xuICBmaWx0ZXJDb25kaXRpb25zKCk6IEFycmF5PFNvaG9EYXRhR3JpZEZpbHRlckNvbmRpdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5maWx0ZXJDb25kaXRpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFueSBmaWx0ZXIgZGVmaW5lZCwgZm9yIHRoaXMgZGF0YWdyaWQuXG4gICAqL1xuICBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgICB0aGlzLmRhdGFncmlkLmNsZWFyRmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZWxlY3RlZFJvd3MgaW5zdGVhZC5cbiAgICovXG4gIGdldFNlbGVjdGVkUm93cygpOiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5zZWxlY3RlZFJvd3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93cyBjdXJyZW50bHkgc2VsZWN0ZWQgb24gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHJldHVybiBhbiBhcnJheSBvZiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvdyBpbnN0YW5jZXMuXG4gICAqL1xuICBzZWxlY3RlZFJvd3MoKTogU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNlbGVjdGVkUm93cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdHMgYWxsIHRoZSByb3dzIGluIHRoZSBncmlkLlxuICAgKi9cbiAgc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RBbGxSb3dzKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5zZWxlY3RzIGFsbCB0aGUgcm93cyBpbiB0aGUgZ3JpZC5cbiAgICovXG4gIHVuU2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy51blNlbGVjdEFsbFJvd3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBzdGF0dXMgb2YgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gc2VsZWN0LlxuICAgKiBAZGVwcmVjYXRlZCAtIHVzZSBzZWxlY3RSb3dzIGluc3RlYWQuXG4gICAqL1xuICBzZWxlY3RSb3coaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlbGVjdHMgdGhlIHNwZWNpZmllZCByb3cgaW4gdGhlIGRhdGEgZ3JpZC5cbiAgICpcbiAgICogQHBhcmFtIGlkeCAtIHRoZSByb3cgbnVtYmVyIChpZHgpIG9mIHRoZSByb3cgdG8gZGVzZWxlY3QuXG4gICAqL1xuICB1bnNlbGVjdFJvdyhpZHg6IG51bWJlcikge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnVuc2VsZWN0Um93KGlkeCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBhIHJhbmdlIG9mIHJvd3MgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHJvdyBpbmRleGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhcnQgLSB0aGUgc3RhcnQgaW5kZXhcbiAgICogQHBhcmFtIGVuZCAtIHRoZW4gZW5kIGluZGV4XG4gICAqL1xuICBzZWxlY3RSYW5nZShzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikge1xuICAgIGNvbnN0IHJhbmdlOiBudW1iZXJbXSA9IFtzdGFydCwgZW5kXTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5zZWxlY3RSb3dzQmV0d2VlbkluZGV4ZXMocmFuZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc2VsZWN0ZWQgcm93cyBieSBwYXNzaW5nIHRoZSByb3cgaW5kZXggb3IgYW4gYXJyYXkgb2Ygcm93IGluZGV4ZXNcbiAgICovXG4gIHNlbGVjdFJvd3Mocm93OiBudW1iZXIgfCBudW1iZXJbXSkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNlbGVjdFJvd3Mocm93KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXR1cyBvZiB0aGUgY2hlY2tib3ggb24gdGhlIGhlYWRlci5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlICdhbGwnLCAncGFydGlhbCcgb3IgJ2FsbCcuXG4gICAqL1xuICBwdWJsaWMgc2V0SGVhZGVyQ2hlY2tib3hTdGF0ZShzdGF0ZTogU29ob0RhdGFHcmlkSGVhZGVyQ2hlY2tib3hTdGF0ZSkge1xuICAgIGNvbnN0IGhlYWRlckNoZWNrYm94ID0gdGhpcy5qUXVlcnlFbGVtZW50Py5maW5kKCcuZGF0YWdyaWQtaGVhZGVyJykuZmluZCgnLmRhdGFncmlkLWNoZWNrYm94Jyk7XG4gICAgaWYgKGhlYWRlckNoZWNrYm94KSB7XG4gICAgICBpZiAoc3RhdGUgPT09ICdwYXJ0aWFsJykge1xuICAgICAgICBoZWFkZXJDaGVja2JveC5kYXRhKCdzZWxlY3RlZCcsICdwYXJ0aWFsJylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLWNoZWNrZWQgaXMtcGFydGlhbCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09ICdhbGwnKSB7XG4gICAgICAgIGhlYWRlckNoZWNrYm94LmRhdGEoJ3NlbGVjdGVkJywgJ2FsbCcpXG4gICAgICAgICAgLmFkZENsYXNzKCdpcy1jaGVja2VkJykucmVtb3ZlQ2xhc3MoJ2lzLXBhcnRpYWwnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSAnbm9uZScpIHtcbiAgICAgICAgaGVhZGVyQ2hlY2tib3guZGF0YSgnc2VsZWN0ZWQnLCAnbm9uZScpXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1jaGVja2VkIGlzLXBhcnRpYWwnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWN0aXZhdGUgdGhlIHJvdyBvZiB0aGUgcGFzc2VkLWluIGlkeC5cbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGFjdGl2YXRlUm93KGlkeDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uYWN0aXZhdGVSb3coaWR4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWFjdGl2YXRlIHRoZSBjdXJyZW50bHkgYWN0aXZhdGVkIHJvdy5cbiAgICpcbiAgICogTk9URTogdmFsaWQgb25seSB3aGVuIHNlbGVjdGlvbiBtb2RlIGlzICdtaXhlZCdcbiAgICovXG4gIGRlYWN0aXZhdGVSb3coKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVhY3RpdmF0ZVJvdygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudGx5IGFjdGl2YXRlZCByb3cuXG4gICAqIE5PVEU6IHZhbGlkIG9ubHkgd2hlbiBzZWxlY3Rpb24gbW9kZSBpcyAnbWl4ZWQnXG4gICAqL1xuICBhY3RpdmF0ZWRSb3coKTogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuYWN0aXZhdGVkUm93KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYWN0aXZlIGNlbGwuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgb2YgdGhlIGNlbGwgdG8gc2V0IGFjdGl2ZS5cbiAgICogQHBhcmFtIGlkeDIgVGhlIGluZGV4IG9mIHRoZSBjZWxsIHRvIHNldCBhY3RpdmUuXG4gICAqL1xuICBwdWJsaWMgc2V0QWN0aXZlQ2VsbChpZHg6IG51bWJlciwgaWR4MjogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uc2V0QWN0aXZlQ2VsbChpZHgsIGlkeDIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGFjdGl2ZSBjZWxsIGluZm9cbiAgICovXG4gIHB1YmxpYyBnZXRBY3RpdmVDZWxsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5hY3RpdmVDZWxsO1xuICAgIH0pO1xuICB9XG5cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgcm93IGF0IDxiPmlkeDwvYj4gaW50byB2aWV3IGluIHRoZSB2aWV3IHBvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBpZHggVGhlIGluZGV4IG9mIHRoZSByb3cgdG8gc2Nyb2xsIGludG8gdmlldy5cbiAgICovXG4gIHB1YmxpYyBzY3JvbGxSb3dJbnRvVmlldyhpZHg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnNldEFjdGl2ZUNlbGwoaWR4LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJvdyBudW1iZXJzIGZvciB0aGUgcm93cyBjb250YWluaW5nIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBmaWVsZC5cbiAgICpcbiAgICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgZmllbGQgbmFtZSB0byBzZWFyY2guXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdXNlIGluIHNlYXJjaC5cbiAgICovXG4gIGZpbmRSb3dzQnlWYWx1ZShmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuZmluZFJvd3NCeVZhbHVlKGZpZWxkTmFtZSwgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2dyYW1tYXRpY2FsbHkgdHJpZ2dlciBhIGNhbGwgdG8gdGhlIGRhdGFncmlkLnNldHRpbmdzLnNvdXJjZVxuICAgKiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBwYWdlclR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlclR5cGUgLSBhIHZhbGlkIHBhZ2VyIHR5cGUuXG4gICAqL1xuICB0cmlnZ2VyU291cmNlKHBhZ2VyVHlwZTogU29ob0RhdGFHcmlkVHJpZ2dlclNvdXJjZVBhZ2VyVHlwZSwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnRyaWdnZXJTb3VyY2UocGFnZXJUeXBlLCBjYWxsYmFjayk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBleHBvcnQgb2YgZ3JpZCBkYXRhIHRvIEV4Y2VsLlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZU5hbWUgVGhlIHByZWZpeCBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBleHBvcnRlZCBmaWxlLlxuICAgKiBAcGFyYW0gd29ya3NoZWV0TmFtZSBUaGUgbmFtZSB0byBiZSB1c2VkIGZvciB0aGUgd29ya3NoZWV0LlxuICAgKiBAcGFyYW0gY3VzdG9tRHMgQSBkYXRhc291cmNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IChkZXByZWNhdGVkKVxuICAgKi9cbiAgZXhwb3J0VG9FeGNlbChmaWxlTmFtZTogc3RyaW5nLCB3b3Jrc2hlZXROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkLCBjdXN0b21Ecz86IE9iamVjdFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8uZXhwb3J0VG9FeGNlbChmaWxlTmFtZSwgKHdvcmtzaGVldE5hbWUgYXMgYW55KSwgKGN1c3RvbURzIGFzIGFueSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgZXhwb3J0IG9mIGdyaWQgZGF0YSB0byBDU1YgZm9ybWF0dGVkIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcHJlZml4IG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIGV4cG9ydGVkIGZpbGUuXG4gICAqIEBwYXJhbSBjdXN0b21EcyBBIGRhdGFzb3VyY2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuXG4gICAqIEBwYXJhbSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciB0byB1c2UgaW4gdGhlIGN2cyBmaWxlLCBkZWZhdWx0cyB0byAnc2VwPSwnXG4gICAqIEBwYXJhbSBmb3JtYXQgaWYgdHJ1ZSwgZGF0ZSBhbmQgbnVtYmVyIHZhbHVlcyB3aWxsIGJlIGZvcm1hdHRlZCBiYXNlZCBvbiB0aGUgbG9jYWxlXG4gICAqL1xuICBleHBvcnRUb0NzdihmaWxlTmFtZTogc3RyaW5nLCBjdXN0b21Ecz86IE9iamVjdFtdLCBzZXBhcmF0b3I6IHN0cmluZyA9ICdzZXA9LCcsIGZvcm1hdD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5leHBvcnRUb0NzdihmaWxlTmFtZSwgKGN1c3RvbURzIGFzIGFueSksIHNlcGFyYXRvciwgZm9ybWF0KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb2x1bW5zIGFuZCBjb2x1bW5Hcm91cHMgZGlzcGxheWVkIG9uIHRoZSBncmlkLlxuICAgKlxuICAgKiBAcGFyYW0gY29sdW1ucyBUaGUgZGF0YWdyaWQgY29sdW1ucyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBjb2x1bW5Hcm91cHMgVGhlIGNvbHVtbiBncm91cHMgdG8gdXBkYXRlLlxuICAgKi9cbiAgdXBkYXRlQ29sdW1ucyhjb2x1bW5zOiBTb2hvRGF0YUdyaWRDb2x1bW5bXSwgY29sdW1uR3JvdXBzOiBTb2hvRGF0YUdyaWRDb2x1bW5Hcm91cFtdKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8udXBkYXRlQ29sdW1ucyhjb2x1bW5zLCBjb2x1bW5Hcm91cHMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgSlNPTiBhcnJheSB3aXRoIGNvbHVtbnMgYW5kIHJldHVybiB0aGUgY29sdW1uIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbHVtblN0ciBUaGUganNvbiByZXByZXNudGF0aW9uIG9mIHRoZSBjb2x1bW4gb2JqZWN0LlxuICAgKiBAcmV0dXJuICBUaGUgYXJyYXkgb2YgY29sdW1ucy5cbiAgICovXG4gIGNvbHVtbnNGcm9tU3RyaW5nKGNvbHVtbnM6IHN0cmluZyk6IE9iamVjdCB7IC8vIEB0b2RvIHR5cGluZ3MgZm9yIHJldHVybiB2YWx1ZVxuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5jb2x1bW5zRnJvbVN0cmluZyhjb2x1bW5zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBjb2x1bW5zIHRvIHRoZWlyIGRlZmF1bHRzICh1c2VkIG9uIHJlc3RvcmUgbWVudSBpdGVtKS5cbiAgICovXG4gIHJlc2V0Q29sdW1ucygpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVzZXRDb2x1bW5zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgcGVyc29uYWxpemUgZGlhbG9nLlxuICAgKi9cbiAgcGVyc29uYWxpemVDb2x1bW5zKCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRhdGFncmlkPy5wZXJzb25hbGl6ZUNvbHVtbnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0b3JlIHRoZSB1c2VyIHNldHRpbmdzIGZyb20gbG9jYWwgU3RvcmFnZSBvciBhcyBwYXNzZWQgaW4uXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzIHRvIHVzZS5cbiAgICovXG4gIHJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3M6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YWdyaWQ/LnJlc3RvcmVVc2VyU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBFdmVudCBIYW5kbGVyc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIHJlcXVlc3QgdG8gbG9hZCB0aGUgZGF0YSBmb3IgdGhlIGdyaWQgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogQHRvZG8gcGFnaW5nIC0gbm90IHlldCBmdWxseSBpbXBsZW1lbnRlZD9cbiAgICovXG4gIHByaXZhdGUgb25EYXRhUmVxdWVzdChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikge1xuICAgIC8vIFRoZSByZXF1ZXN0IGZvciBkYXRhIGlzIG1hZGUgYnkgdGhlIGRhdGFncmlkLCBzbyBqdW1wIGJhY2sgaW50byB0aGUgYW5ndWxhciB6b25lIC4uLlxuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxuICAgICAgLy8gLi4uIHJlcXVlc3QgdGhlIGRhdGEgZnJvbSB0aGUgc2VydmljZSAuLi5cbiAgICAgIHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldERhdGEocmVxdWVzdClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0czogT2JqZWN0W10pID0+IHtcbiAgICAgICAgICAvLyAuLiBvbiByZWNlaXB0LCBwYXNzIHRoZSBkYXRhIGJhY2sgdG8gdGhlIGRhdGFncmlkIGJ1dFxuICAgICAgICAgIC8vIG91dHNpZGUgdGhlIGFuZ3VsYXIgem9uZS5cbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiByZXNwb25zZShyZXN1bHRzLCByZXF1ZXN0KSk7XG4gICAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBhIGNoaWxkIHJvdyBoYXMgYmVlbiBleHBhbmRlZC5cbiAgICovXG4gIHByaXZhdGUgb25FeHBhbmRSb3coYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLmJ1aWxkUm93VGVtcGxhdGVDb21wb25lbnQoZXZlbnQpO1xuICAgIH1cbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5leHBhbmRyb3cubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgY29tcG9uZW50IGZvciByb3dUZW1wbGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJvd1RlbXBsYXRlQ29tcG9uZW50KGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLnJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFxuICAgICAgdGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUNvbXBvbmVudFxuICAgICk7XG5cbiAgICAvLyBSZW1vdmUgY29tcG9uZW50IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IGlkeCA9IHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLmZpbmRJbmRleCgoYykgPT4gZXZlbnQucm93ID09PSBjLnJvdyk7XG4gICAgaWYgKGlkeCA+IC0xKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5zcGxpY2UoaWR4LCAxKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXJQYXJlbnQgPSBldmVudC5kZXRhaWxbMF0ucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLXJvdy1kZXRhaWwtcGFkZGluZycpO1xuICAgIGNvbnRhaW5lclBhcmVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImRhdGFncmlkLWNlbGwtbGF5b3V0XCI+PC9kaXY+JztcbiAgICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJQYXJlbnQucXVlcnlTZWxlY3RvcignLmRhdGFncmlkLWNlbGwtbGF5b3V0Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgbGV0IGRhdGFDb21wb25lbnQ6IGFueTtcbiAgICBpZiAoZXZlbnQuaXRlbS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmdyaWRPcHRpb25zLnJvd1RlbXBsYXRlRmllbGQpKSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gZXZlbnQuaXRlbVsodGhpcy5ncmlkT3B0aW9ucy5yb3dUZW1wbGF0ZUZpZWxkIGFzIGFueSldO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhQ29tcG9uZW50ID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogJ2FyZ3MnLFxuICAgICAgICAgIHVzZVZhbHVlOiB7IGlucHV0c0RhdGE6IHRoaXMuZ3JpZE9wdGlvbnMucm93VGVtcGxhdGVDb21wb25lbnRJbnB1dHMsIGRhdGE6IGRhdGFDb21wb25lbnQsIC4uLmV2ZW50IH0sXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IsXG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgW10sIGNvbnRhaW5lcik7XG4gICAgZXZlbnRbJ3Jvd1RlbXBsYXRlQ29tcG9uZW50J10gPSBjb21wb25lbnQ7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gLi4uIGZpbmFsbHkgc3RvcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGZvciBsYXRlciwgd2UnbGwgZGVsZXRlIGl0IHdoZW5cbiAgICAvLyByZXF1ZXN0ZWQsIG9yIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMucm93VGVtcGxhdGVDb21wb25lbnRzLnB1c2goeyByb3c6IGV2ZW50LnJvdywgY29tcG9uZW50IH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjb250ZXh0IG1lbnUgaXMgb3BlbmVkXG4gICAqL1xuICBwcml2YXRlIG9uS2V5RG93bihlOiBKUXVlcnkuRXZlbnQsIGFyZ3M6IFNvaG9EYXRhR3JpZEtleURvd25BcmdzLCByZXNwb25zZTogRnVuY3Rpb24pIHtcbiAgICBjb25zdCBldmVudCA9IHsgZSwgYXJncywgcmVzcG9uc2UgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5rZXlkb3duLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgaWYgKGUua2V5ID09PSAnRjEwJyAmJiBlLnNoaWZ0S2V5KSB7XG4gICAgICAkKChlIGFzIGFueSkuY3VycmVudFRhcmdldCkudHJpZ2dlcignY29udGV4dG1lbnUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gZXhwYW5kZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpZFByb3BlcnR5IHN0cmluZyBpZFxuICAgKi9cbiAgQElucHV0KCkgc2V0IG9uQmVmb3JlU2VsZWN0KGJlZm9yZVNlbGVjdEZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRCZWZvcmVTZWxlY3RGdW5jdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uQmVmb3JlU2VsZWN0ID0gYmVmb3JlU2VsZWN0RnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3QgPSBiZWZvcmVTZWxlY3RGdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uQmVmb3JlU2VsZWN0JywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cbiAgZ2V0IG9uQmVmb3JlU2VsZWN0KCk6IFNvaG9EYXRhR3JpZEJlZm9yZVNlbGVjdEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Mub25CZWZvcmVTZWxlY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5vbkJlZm9yZVNlbGVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgTWFrZXMgaXQgcG9zc2libGUgdG8gc2F2ZSBzZWxlY3Rpb25zIHdoZW4gY2hhbmdpbmcgcGFnZXMgb24gc2VydmVyIHNpZGUgcGFnaW5nLlxuICAgKiAgWW91IG1heSB3YW50IHRvIGFsc28gdXNlIHNob3dTZWxlY3RBbGxDaGVja0JveDogZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHNldCBhbGxvd1NlbGVjdEFjcm9zc1BhZ2VzKGFsbG93U2VsZWN0QWNyb3NzUGFnZXM6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5hbGxvd1NlbGVjdEFjcm9zc1BhZ2VzID0gYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2FsbG93U2VsZWN0QWNyb3NzUGFnZXMnLCBSZWZyZXNoSGludEZsYWdzLk5vbmUpO1xuICAgIH1cbiAgfVxuICBnZXQgYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuYWxsb3dTZWxlY3RBY3Jvc3NQYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmFsbG93U2VsZWN0QWNyb3NzUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogIFNlbGVjdCBhbGwgd2lsbCBlZmZlY3Qgb25seSBvbiBjdXJyZW50IHBhZ2UgYW5kIGl0cyBmb3IgY2xpZW50IHNpZGUgcGFnaW5nIG9ubHkuXG4gICAqL1xuICBASW5wdXQoKSBzZXQgc2VsZWN0QWxsQ3VycmVudFBhZ2Uoc2VsZWN0QWxsQ3VycmVudFBhZ2U6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZSA9IHNlbGVjdEFsbEN1cnJlbnRQYWdlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNlbGVjdEFsbEN1cnJlbnRQYWdlID0gc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgICB0aGlzLm1hcmtGb3JSZWZyZXNoKCdzZWxlY3RBbGxDdXJyZW50UGFnZScsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzZWxlY3RBbGxDdXJyZW50UGFnZSgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3Muc2VsZWN0QWxsQ3VycmVudFBhZ2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ncmlkT3B0aW9ucy5zZWxlY3RBbGxDdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBjb2x1bW4gSURzIHVzZWQgdG8gZGVmaW5lIGFyaWEgZGVzY3JpcHRvcnMgZm9yIHNlbGVjdGlvbiBjaGVja2JveGVzLlxuICAgKi9cbiAgQElucHV0KCkgc2V0IGNvbHVtbklkcyhjb2x1bW5JZHM6IEFycmF5PFN0cmluZyB8IE51bWJlcj4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5jb2x1bW5JZHMgPSBjb2x1bW5JZHM7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3MuY29sdW1uSWRzID0gY29sdW1uSWRzO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnY29sdW1uSWRzJywgUmVmcmVzaEhpbnRGbGFncy5Ob25lKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbHVtbklkcygpOiBBcnJheTxTdHJpbmcgfCBOdW1iZXI+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuY29sdW1uSWRzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuY29sdW1uSWRzO1xuICB9XG5cbiAgLyoqXG4gICAqSWYgdHJ1ZSwgdGhlIG5ldyByb3cgaW5kaWNhdG9yIHdpbGwgZGlzcGxheSBhZnRlciBhZGRpbmcgYSByb3dcbiAgICpcbiAgICogQHBhcmFtIHNob3dOZXdSb3dJbmRpY2F0b3IgYm9vbGVhbiBzaG93IG5ldyBpbmRpY2F0b3Igc2V0dGluZ1xuICAgKi9cbiAgQElucHV0KCkgc2V0IHNob3dOZXdSb3dJbmRpY2F0b3Ioc2hvd05ld1Jvd0luZGljYXRvcjogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLnNob3dOZXdSb3dJbmRpY2F0b3IgPSBzaG93TmV3Um93SW5kaWNhdG9yO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnc2hvd05ld1Jvd0luZGljYXRvcicsIFJlZnJlc2hIaW50RmxhZ3MuTm9uZSk7XG4gICAgfVxuICB9XG4gIGdldCBzaG93TmV3Um93SW5kaWNhdG9yKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5zaG93TmV3Um93SW5kaWNhdG9yO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMuc2hvd05ld1Jvd0luZGljYXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkV4cGFuZENoaWxkcmVuKGV4cGFuZENoaWxkcmVuRnVuY3Rpb246IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgdGhpcy5kYXRhZ3JpZC5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuID0gZXhwYW5kQ2hpbGRyZW5GdW5jdGlvbjtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ29uRXhwYW5kQ2hpbGRyZW4nLCBSZWZyZXNoSGludEZsYWdzLlJlYnVpbGQpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBvbkV4cGFuZENoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZEV4cGFuZENoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICByZXR1cm4gKHRoaXMuZGF0YWdyaWQgYXMgYW55KS5zZXR0aW5ncy5vbkV4cGFuZENoaWxkcmVuO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZ3JpZE9wdGlvbnMub25FeHBhbmRDaGlsZHJlbjtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBvbkNvbGxhcHNlQ2hpbGRyZW4oY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uOiBTb2hvRGF0YUdyaWRDb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkNvbGxhcHNlQ2hpbGRyZW4gPSBjb2xsYXBzZUNoaWxkcmVuRnVuY3Rpb247XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHRoaXMuZGF0YWdyaWQuc2V0dGluZ3Mub25Db2xsYXBzZUNoaWxkcmVuID0gY29sbGFwc2VDaGlsZHJlbkZ1bmN0aW9uO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnb25Db2xsYXBzZUNoaWxkcmVuJywgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb25Db2xsYXBzZUNoaWxkcmVuKCk6IFNvaG9EYXRhR3JpZENvbGxhcHNlQ2hpbGRyZW5GdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLm9uQ29sbGFwc2VDaGlsZHJlbjtcbiAgfVxuXG4gIC8qIEljb24gbmFtZSBmb3IgZmFsbGJhY2tzIGlmIHRoZSBpbWFnZSBkb2VzIG5vdCBsb2FkICovXG4gIEBJbnB1dCgpIHNldCBmYWxsYmFja0ltYWdlKGZhbGxiYWNrSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrSW1hZ2UgPSBmYWxsYmFja0ltYWdlO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZhbGxiYWNrSW1hZ2UgPSBmYWxsYmFja0ltYWdlO1xuICAgICAgdGhpcy5tYXJrRm9yUmVmcmVzaCgnZmFsbGJhY2tJbWFnZScsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZhbGxiYWNrSW1hZ2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgcmV0dXJuICh0aGlzLmRhdGFncmlkIGFzIGFueSkuc2V0dGluZ3MuZmFsbGJhY2tJbWFnZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrSW1hZ2U7XG4gIH1cblxuICAvKiBUb29sdGlwIHRvIHNob3cgaWYgaXQgdGhlIGZhbGxiYWNrIGFwcGVhcnMgKi9cbiAgQElucHV0KCkgc2V0IGZhbGxiYWNrVG9vbHRpcChmYWxsYmFja1Rvb2x0aXA6IFNvaG9GYWxsYmFja1Rvb2x0aXBPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fZ3JpZE9wdGlvbnMuZmFsbGJhY2tUb29sdGlwID0gZmFsbGJhY2tUb29sdGlwO1xuICAgIGlmICh0aGlzLmRhdGFncmlkKSB7XG4gICAgICB0aGlzLmRhdGFncmlkLnNldHRpbmdzLmZhbGxiYWNrVG9vbHRpcCA9IGZhbGxiYWNrVG9vbHRpcDtcbiAgICAgIHRoaXMubWFya0ZvclJlZnJlc2goJ2ZhbGxiYWNrVG9vbHRpcCcsIFJlZnJlc2hIaW50RmxhZ3MuUmVidWlsZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZhbGxiYWNrVG9vbHRpcCgpOiBTb2hvRmFsbGJhY2tUb29sdGlwT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuZGF0YWdyaWQpIHtcbiAgICAgIHJldHVybiAodGhpcy5kYXRhZ3JpZCBhcyBhbnkpLnNldHRpbmdzLmZhbGxiYWNrVG9vbHRpcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dyaWRPcHRpb25zLmZhbGxiYWNrVG9vbHRpcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCBhZnRlciBlZGl0IG1vZGUgaXMgYWN0aXZhdGVkIG9uIGFuIGVkaXRvci5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3MgdGhlIGV2ZW50IGFyZ3VtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBvbkV4aXRFZGl0TW9kZShhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5leGl0ZWRpdG1vZGUubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYmVmb3JlIGVkaXQgbW9kZSBpcyBhY3RpdmF0ZWQgb24gYW4gZWRpdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXJncyB0aGUgZXZlbnQgYXJndW1lbnRzXG4gICAqL1xuICBwcml2YXRlIG9uQmVmb3JlRW50ZXJFZGl0TW9kZShhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSB7XG4gICAgY29uc3QgZXZlbnQgPSB7IGdyaWQ6IHRoaXMsIC4uLmFyZ3MgfTtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5iZWZvcmVlbnRlcmVkaXRtb2RlLm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gZWRpdCBtb2RlIGlzIGFjdGl2YXRlZCBvbiBhbiBlZGl0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIHRoZSBldmVudCBhcmd1bWVudHNcbiAgICovXG4gIHByaXZhdGUgb25FbnRlckVkaXRNb2RlKGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmVudGVyZWRpdG1vZGUubmV4dChldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYWZ0ZXIgYSBjaGlsZCByb3cgaGFzIGJlZW4gY29sbGFwc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbkNvbGxhcHNlUm93KGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NvbGxhcHNlRXZlbnQpIHtcbiAgICBjb25zdCBldmVudCA9IHsgZ3JpZDogdGhpcywgLi4uYXJncyB9O1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNvbGxhcHNlcm93Lm5leHQoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaGFzIGJlZW4gYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93QWRkKGFyZ3M6IFNvaG9EYXRhR3JpZEFkZFJvd0V2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93QWRkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIGNlbGwgaGFzIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ2VsbENoYW5nZShhcmdzOiBTb2hvRGF0YUdyaWRDZWxsQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5jZWxsY2hhbmdlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBhIHJvdyBoYXMgYmVlbiBjbGlja2VkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0NsaWNrZWQoYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd0NsaWNrZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHRoZSBmaWx0ZXIgcm93IGlzIGNsb3NlZC5cbiAgICovXG4gIHByaXZhdGUgb25DbG9zZUZpbHRlclJvdyhhcmdzOiBTb2hvRGF0YUdyaWRDbG9zZUZpbHRlclJvd0V2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuY2xvc2VGaWx0ZXJSb3cubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgY29udGV4dCBtZW51IGlzIGlzIGNsaWNrZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQ29udGV4dE1lbnUoYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRleHRNZW51Py5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSBjb250ZXh0IG1lbnUgaXMgaXMgY2xpY2tlZC5cbiAgICovXG4gIHByaXZhdGUgb25Eb3VibGVDbGljayhhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93RG91YmxlQ2xpY2tlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgZmlsdGVyZWQuXG4gICAqL1xuICBwcml2YXRlIG9uRmlsdGVyZWQoYXJnczogU29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZpbHRlcmVkLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBmaWx0ZXIgcm93IG9wZW5lZC5cbiAgICovXG4gIHByaXZhdGUgb25PcGVuRmlsdGVyUm93KGFyZ3M6IFNvaG9EYXRhR3JpZE9wZW5GaWx0ZXJSb3dFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLm9wZW5GaWx0ZXJSb3cubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIHJlbW92ZWQuXG4gICAqL1xuICBwcml2YXRlIG9uUm93UmVtb3ZlKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1JlbW92ZUV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMucm93UmVtb3ZlLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZGF0YSBpcyByZW5kZXJlZFxuICAgKi9cbiAgcHJpdmF0ZSBvblJlbmRlcmVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJlbmRlcmVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgZmlsdGVyZWQuXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJSZW5kZXIoYXJnczogU29ob0RhdGFHcmlkQWZ0ZXJSZW5kZXJFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmFmdGVyUmVuZGVyLm5leHQoYXJncyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgYmVmb3JlIGEgcm93IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVSb3dBY3RpdmF0ZWQoYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5iZWZvcmVSb3dBY3RpdmF0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIGFjdGl2YXRlZC5cbiAgICovXG4gIHByaXZhdGUgb25Sb3dBY3RpdmF0ZWQoYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dBY3RpdmF0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIGEgcm93IGlzIGRlYWN0aXZhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd0RlYWN0aXZhdGVkKGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5yb3dEZWFjdGl2YXRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgcmVvcmRlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJvd1Jlb3JkZXJlZChhcmdzOiBTb2hvRGF0YUdyaWRSb3dSZW9yZGVyZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnJvd1Jlb3JkZXJlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC5cbiAgICovXG4gIHByaXZhdGUgb25TZWxlY3RlZChhcmdzOiBTb2hvRGF0YUdyaWRTZWxlY3RlZEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWQubmV4dChhcmdzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmVudCBmaXJlZCB3aGVuIHNldHRpbmdzIGFyZSBjaGFuZ2VkIG9uIHRoZSBncmlkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNldHRpbmdzQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNldHRpbmdzQ2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRhdGEgaXMgc29ydGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvblNvcnRlZChhcmdzOiBTb2hvRGF0YUdyaWRTb3J0ZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnNvcnRlZC5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGJlZm9yZSBwYWdpbmdcbiAgICovXG4gIHByaXZhdGUgb25CZWZvcmVQYWdpbmcoYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmJlZm9yZVBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHBhZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBvbkFmdGVyUGFnaW5nKGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlclBhZ2luZy5uZXh0KGFyZ3MpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvblZlcnRpY2FsU2Nyb2xsKGFyZ3M6IFNvaG9EYXRhR3JpZFNjcm9sbEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMudmVydGljYWxTY3JvbGwubmV4dChhcmdzKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGZpcmVkIGFmdGVyIHZlcnRpY2FsIHNjcm9sbFxuICAgKi9cbiAgcHJpdmF0ZSBvbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmZpbHRlcm9wZXJhdG9yY2hhbmdlZC5uZXh0KGFyZ3MpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcm93IGRvbSBqUXVlcnkgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBpbmNsdWRlR3JvdXBzIElmIHRydWUgZ3JvdXBzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuXG4gICAqIEByZXR1cm4gVGhlIGRvbSBqUXVlcnkgbm9kZVxuICAgKi9cbiAgcm93Tm9kZShyb3c6IG51bWJlciwgaW5jbHVkZUdyb3VwczogYm9vbGVhbik6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGFncmlkPy5yb3dOb2RlKHJvdywgaW5jbHVkZUdyb3Vwcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2VsbCBkb20gbm9kZS5cbiAgICpcbiAgICogQHBhcmFtICByb3cgVGhlIHJvdyBpbmRleC5cbiAgICogQHBhcmFtICBjZWxsIFRoZSBjZWxsIGluZGV4LlxuICAgKiBAcGFyYW0gIGluY2x1ZGVHcm91cHMgSWYgdHJ1ZSBncm91cHMgYXJlIHRha2VuIGludG8gYWNjb3VudC5cbiAgICogQHJldHVybiBUaGUgZG9tIG5vZGVcbiAgICovXG4gIGNlbGxOb2RlKHJvdzogbnVtYmVyLCBjZWxsOiBudW1iZXIsIGluY2x1ZGVHcm91cHM6IGJvb2xlYW4pOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhZ3JpZD8uY2VsbE5vZGUocm93LCBjZWxsLCBpbmNsdWRlR3JvdXBzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGUgRXZlbnRzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBpbml0aWFsaXplcyB0aGUgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVTb3VyY2UodGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgQW5ndWxhciBwcm9qZWN0cyBleHRlcm5hbCBjb250ZW50IGludG8gaXRzIHZpZXcuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gT25jZSB0aGUgdmlldyBpcyBjcmVhdGVkIGFuZCByZWFkeSwgaW5pdGlhaXNlIHRoZSBkYXRhIGdyaWQgY29tcG9uZW50LlxuICAgIHRoaXMuYnVpbGREYXRhR3JpZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMucmVmcmVzaEhpbnQgIT09IFJlZnJlc2hIaW50RmxhZ3MuTm9uZSkge1xuICAgICAgdGhpcy51cGRhdGVDb250cm9sKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAganVzdCBiZWZvcmUgQW5ndWxhciBkZXN0cm95cyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBVbnN1YnNjcmliZSBvYnNlcnZhYmxlcywgZGV0YWNoIGV2ZW50IGhhbmRsZXJzIGFuZCByZW1vdmUgb3RoZXIgcmVzb3VyY2VzIHRvIGF2b2lkIG1lbW9yeSBsZWFrcy5cbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveURhdGFHcmlkKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFByaXZhdGUgTWVtYmVyc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBqUXVlcnkgY29udHJvbCAoYW5kIGFueSBvdGhlciByZXNvdXJjZXMpXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIHByaXZhdGUgZGVzdHJveURhdGFHcmlkKCk6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIGR5bmFtaWMgY29tcG9uZW50cy5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHRoZSBjYWNoZS5cbiAgICB0aGlzLmNlbGxDb21wb25lbnRzID0gW107XG5cbiAgICAvLyBSZW1vdmUgcm93VGVtcGxhdGUgZHluYW1pYyBjb21wb25lbnRzLlxuICAgIGlmICh0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cyAmJiB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd1RlbXBsYXRlQ29tcG9uZW50cy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGMuY29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb3dUZW1wbGF0ZUNvbXBvbmVudHMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBOb3cgZGVzdHJveSB0aGUgZ3JpZC5cbiAgICBpZiAodGhpcy5kYXRhZ3JpZCkge1xuICAgICAgaWYgKHRoaXMuZGF0YWdyaWQuZGVzdHJveSkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5kYXRhZ3JpZD8uZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YWdyaWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIHRoZSAncG9zdENlbGxSZW5kZXInIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyIHRoZSBjb250YWluZXIgdG8gaG9zdCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIGFyZ3MgdGhlIGZvcm1hdHRlciBhcmd1bWVudHMuXG4gICAqL1xuICBwcml2YXRlIG9uUG9zdFJlbmRlckNlbGwoY29udGFpbmVyOiBKUXVlcnksIGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykge1xuICAgIC8vIFByZS1jb25kaXRpb25zXG4gICAgaWYgKCFhcmdzLmNvbC5jb21wb25lbnQpIHtcbiAgICAgIHJldHVybjsgLy8gdGhyb3cgRXJyb3IoYE1pc3NpbmcgJ2NvbXBvbmVudCcgaW4gY29sdW1uICR7YXJncy5jb2wuaWR9YCk7XG4gICAgfVxuICAgIC8vIEdldCB0aGUgZmFjdG9yeSBmb3IgdGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgb24gdGhlIGNvbHVtbi5cbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShhcmdzLmNvbC5jb21wb25lbnQpO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluamVjdG9yIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBhcmd1bWVudHMgZm9yIHRoZVxuICAgIC8vIGNvbXBvbmVudC5cbiAgICAvLyBjb25zdCBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGFyZ3MgfV0sIHRoaXMuaW5qZWN0b3IpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBhcmdzIH1dLCBwYXJlbnQ6IHRoaXMuaW5qZWN0b3IgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGNvbXBvbmVudCwgaW4gdGhlIGNvbnRhaW5lci5cbiAgICBjb25zdCBjb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZShpbmplY3RvciwgW10sIGNvbnRhaW5lcik7XG5cbiAgICAvLyBDb3B5IGludG8gaXQgYW55IGNvbHVtbiBsZXZlbCBJbnB1dHMsIHRoZXNlIGFyZSBvcHRpb25hbCBidXQgYWxsb3dcbiAgICAvLyBjb2x1bW4gc3BlY2lmaWMgb3ZlcnJpZGVzIHRvIGJlIGRlZmluZWQuXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnQuaW5zdGFuY2UsIGFyZ3MuY29sLmNvbXBvbmVudElucHV0cyk7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnQuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnQuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gRG8gdGhpcyBhdCB0aGUgZW5kP1xuXG4gICAgLy8gLi4uIGZpbmFsbHkgc3RvcmUgdGhlIGNyZWF0ZWQgY29tcG9uZW50IGZvciBsYXRlciwgd2UnbGwgZGVsZXRlIGl0IHdoZW5cbiAgICAvLyByZXF1ZXN0ZWQsIG9yIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgIHRoaXMuY2VsbENvbXBvbmVudHMucHVzaChcbiAgICAgIHsgcm93OiBhcmdzLnJvdywgY2VsbDogYXJncy5jZWxsLCBjb21wb25lbnQgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgJ2Rlc3Ryb3lDZWxsJyBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gYXJncyB0aGUgYXJnc1xuICAgKi9cbiAgcHJpdmF0ZSBvbkRlc3Ryb3lDZWxsKGFyZ3M6IFNvaG9EYXRhR3JpZFBvc3RSZW5kZXJDZWxsQXJncykge1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2VsbENvbXBvbmVudHMuZmluZEluZGV4KChjKSA9PiBhcmdzLnJvdyA9PT0gYy5yb3cgJiYgYXJncy5jZWxsID09PSBjLmNlbGwpO1xuICAgIGlmIChpZHggPiAtMSkge1xuICAgICAgdGhpcy5jZWxsQ29tcG9uZW50c1tpZHhdLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICB0aGlzLmNlbGxDb21wb25lbnRzLnNwbGljZShpZHgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25FZGl0Q2VsbChlZGl0b3I6IEV4dGVuZGVkU29ob0RhdGFHcmlkQ2VsbEVkaXRvcikge1xuICAgIC8vIFByZS1jb25kaXRpb25zXG4gICAgaWYgKCFlZGl0b3IuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm47IC8vIHRocm93IEVycm9yKGBNaXNzaW5nICdjb21wb25lbnQnIGluIGNvbHVtbiAke2FyZ3MuY29sLmlkfWApO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIGZhY3RvcnkgZm9yIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIG9uIHRoZSBjb2x1bW4uXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZWRpdG9yLmNvbXBvbmVudCk7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5qZWN0b3IgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIGFyZ3VtZW50cyBmb3IgdGhlXG4gICAgLy8gY29tcG9uZW50LlxuICAgIC8vIGNvbnN0IGkgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbeyBwcm92aWRlOiAnYXJncycsIHVzZVZhbHVlOiBlZGl0b3IuYXJncyB9XSwgdGhpcy5pbmplY3Rvcik7XG4gICAgY29uc3QgaSA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6ICdhcmdzJywgdXNlVmFsdWU6IGVkaXRvci5hcmdzIH1dLFxuICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yXG4gICAgfSk7XG5cbiAgICAvLyBXYXJuaW5nISEgdGhlIGR5bmFtaWMgY29tcG9uZW50IGlzIG5vdCBhZGRlZCBpbnNpZGUgdGhlIGNvbnRhaW5lcixcbiAgICAvLyBidXQgYXMgYSBzaWJsaW5nLCBzbyB3aGVuIGl0J3MgZGVzdHJveWVkIGl0IHRha2VzIGFueSBzaWJsaW5ncyAgd2l0aFxuICAgIC8vIGl0LiAgSXQgaXMgbm90IGNsZWFyIHdoeSB0aGlzIC0gc28gdG8gd29yayBhcm91bmQgdGhpcyBpc3N1ZSwgYWRkXG4gICAgLy8gYSBzaW5nbGUgY2hpbGQgdG8gdGhlIGNlbGwgY29udGFpbmVyLlxuICAgIGNvbnN0IHRyYW5zaWVudENvbnRhaW5lciA9ICQoJzxkaXY+PC9kaXY+JykuYXBwZW5kVG8oZWRpdG9yLmFyZ3MuY29udGFpbmVyKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50LCBpbiB0aGUgY29udGFpbmVyLlxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKGksIFtdLCB0cmFuc2llbnRDb250YWluZXJbMF0pIGFzIENvbXBvbmVudFJlZjxTb2hvRGF0YUdyaWRDZWxsRWRpdG9yPjtcblxuICAgIC8vIENvcHkgaW50byBpdCBhbnkgY29sdW1uIGxldmVsIElucHV0cywgdGhlc2UgYXJlIG9wdGlvbmFsIGJ1dCBhbGxvd1xuICAgIC8vIGNvbHVtbiBzcGVjaWZpYyBvdmVycmlkZXMgdG8gYmUgZGVmaW5lZC5cbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgZWRpdG9yLmFyZ3MuY29sLmVkaXRvckNvbXBvbmVudElucHV0cyk7XG5cbiAgICAvLyAuLi4gYXR0YWNoIHRvIHRoZSBhcHAgLi4uXG4gICAgdGhpcy5hcHAuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuXG4gICAgLy8gLi4uIHVwZGF0ZSBmb3IgY2hhbmdlcyAuLi5cbiAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRvIHRoZSBlZGl0b3IuXG4gICAgZWRpdG9yLmluaXQoY29tcG9uZW50UmVmKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGREYXRhR3JpZCgpOiB2b2lkIHtcbiAgICAvLyBjYWxsIG91dHNpZGUgdGhlIGFuZ3VsYXIgem9uZSBzbyBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgLy8gaXNuJ3QgdHJpZ2dlcmVkIGJ5IHRoZSBzb2hvIGNvbXBvbmVudC5cbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAvLyBXcmFwIHRoZSBlbGVtZW50IGluIGEgalF1ZXJ5IHNlbGVjdG9yLlxuICAgICAgdGhpcy5qUXVlcnlFbGVtZW50ID0galF1ZXJ5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgLy8gQWRkIHRoZSBvblBvc3RDZWxsUmVuZGVyZXJcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLm9uUG9zdFJlbmRlckNlbGwgPSAoYywgYXJnczogU29ob0RhdGFHcmlkUG9zdFJlbmRlckNlbGxBcmdzKSA9PiB7XG4gICAgICAgIHRoaXMub25Qb3N0UmVuZGVyQ2VsbChjLCBhcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCB0aGUgZGVzdHJveSBjZWxsIGNhbGxiYWNrLlxuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25EZXN0cm95Q2VsbCA9IChfLCBhcmdzOiBTb2hvRGF0YUdyaWRQb3N0UmVuZGVyQ2VsbEFyZ3MpID0+IHtcbiAgICAgICAgdGhpcy5vbkRlc3Ryb3lDZWxsKGFyZ3MpO1xuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBlZGl0IGNlbGwgY2FsbGJhY2suXG4gICAgICB0aGlzLl9ncmlkT3B0aW9ucy5vbkVkaXRDZWxsID0gKGVkaXRvcjogRXh0ZW5kZWRTb2hvRGF0YUdyaWRDZWxsRWRpdG9yKSA9PiB7XG4gICAgICAgIHRoaXMub25FZGl0Q2VsbChlZGl0b3IpO1xuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBrZXlkb3duIGNhbGxiYWNrLlxuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMub25LZXlEb3duID0gKGU6IEpRdWVyeS5FdmVudCwgYXJnczogU29ob0RhdGFHcmlkS2V5RG93bkFyZ3MsIHJlc3BvbnNlOiBGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm9uS2V5RG93bihlLCBhcmdzLCByZXNwb25zZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBJbml0aWFsaXNlIGFueSBldmVudCBoYW5kbGVycy5cbiAgICAgIHRoaXMualF1ZXJ5RWxlbWVudFxuICAgICAgICAub24oJ2FkZHJvdycsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRBZGRSb3dFdmVudCkgPT4gdGhpcy5vblJvd0FkZChhcmdzKSlcbiAgICAgICAgLm9uKCdjZWxsY2hhbmdlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZENlbGxDaGFuZ2VFdmVudCkgPT4gdGhpcy5vbkNlbGxDaGFuZ2UoYXJncykpXG4gICAgICAgIC5vbignY2xpY2snLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vblJvd0NsaWNrZWQoYXJncykpXG4gICAgICAgIC5vbignY2xvc2VmaWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkQ2xvc2VGaWx0ZXJSb3dFdmVudCkgPT4gdGhpcy5vbkNsb3NlRmlsdGVyUm93KGFyZ3MpKVxuICAgICAgICAub24oJ2NvbGxhcHNlcm93JywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0NvbGxhcHNlRXZlbnQpID0+IHRoaXMub25Db2xsYXBzZVJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdjb250ZXh0bWVudScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRSb3dDbGlja2VkKSA9PiB0aGlzLm9uQ29udGV4dE1lbnUoYXJncykpXG4gICAgICAgIC5vbignZGJsY2xpY2snLCAoX2U6IEpRdWVyeS5UcmlnZ2VyZWRFdmVudCwgYXJnczogU29ob0RhdGFHcmlkUm93Q2xpY2tlZCkgPT4gdGhpcy5vbkRvdWJsZUNsaWNrKGFyZ3MpKVxuICAgICAgICAub24oJ2JlZm9yZWVudGVyZWRpdG1vZGUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRWRpdE1vZGVFdmVudCkgPT4gdGhpcy5vbkJlZm9yZUVudGVyRWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZXhpdGVkaXRtb2RlJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEVkaXRNb2RlRXZlbnQpID0+IHRoaXMub25FeGl0RWRpdE1vZGUoYXJncykpXG4gICAgICAgIC5vbignZW50ZXJlZGl0bW9kZScsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRFZGl0TW9kZUV2ZW50KSA9PiB0aGlzLm9uRW50ZXJFZGl0TW9kZShhcmdzKSlcbiAgICAgICAgLm9uKCdleHBhbmRyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQpID0+IHRoaXMub25FeHBhbmRSb3coYXJncykpXG4gICAgICAgIC5vbignZmlsdGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkRmlsdGVyZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ29wZW5maWx0ZXJyb3cnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkT3BlbkZpbHRlclJvd0V2ZW50KSA9PiB0aGlzLm9uT3BlbkZpbHRlclJvdyhhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW1vdmUnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93UmVtb3ZlRXZlbnQpID0+IHRoaXMub25Sb3dSZW1vdmUoYXJncykpXG4gICAgICAgIC5vbigncmVuZGVyZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUmVuZGVyZWRFdmVudCkgPT4gdGhpcy5vblJlbmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ2FmdGVycmVuZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZEFmdGVyUmVuZGVyRXZlbnQpID0+IHRoaXMub25BZnRlclJlbmRlcihhcmdzKSlcbiAgICAgICAgLm9uKCdiZWZvcmVyb3dhY3RpdmF0ZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkUm93QWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25CZWZvcmVSb3dBY3RpdmF0ZWQoYXJncykpXG4gICAgICAgIC5vbigncm93YWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0FjdGl2YXRlZEV2ZW50KSA9PiB0aGlzLm9uUm93QWN0aXZhdGVkKGFyZ3MpKVxuICAgICAgICAub24oJ3Jvd2RlYWN0aXZhdGVkJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd0RlYWN0aXZhdGVkRXZlbnQpID0+IHRoaXMub25Sb3dEZWFjdGl2YXRlZChhcmdzKSlcbiAgICAgICAgLm9uKCdyb3dyZW9yZGVyJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9EYXRhR3JpZFJvd1Jlb3JkZXJlZEV2ZW50KSA9PiB0aGlzLm9uUm93UmVvcmRlcmVkKGFyZ3MpKVxuICAgICAgICAub24oJ3NlbGVjdGVkJyxcbiAgICAgICAgICAoZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdLCB0eXBlPzogU29ob0RhdGFHcmlkU2VsZWN0ZWRFdmVudFR5cGUsIHJvd0RhdGE/OiBTb2hvRGF0YUdyaWRTZWxlY3RlZFJvd1tdIHwgU29ob0RhdGFHcmlkU2VsZWN0ZWRSb3cpID0+XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0ZWQoeyBlLCByb3dzOiBhcmdzLCB0eXBlLCByb3dEYXRhIH0pKVxuICAgICAgICAub24oJ3NldHRpbmdzY2hhbmdlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTZXR0aW5nc0NoYW5nZWRFdmVudCkgPT4gdGhpcy5vblNldHRpbmdzQ2hhbmdlZChhcmdzKSlcbiAgICAgICAgLm9uKCdzb3J0ZWQnLCAoX2U6IGFueSwgYXJnczogU29ob0RhdGFHcmlkU29ydGVkRXZlbnQpID0+IHRoaXMub25Tb3J0ZWQoYXJncykpXG4gICAgICAgIC5vbignYmVmb3JlcGFnaW5nJywgKF9lOiBhbnksIGFyZ3M6IFNvaG9QYWdlclBhZ2luZ0luZm8pID0+IHRoaXMub25CZWZvcmVQYWdpbmcoYXJncykpXG4gICAgICAgIC5vbignYWZ0ZXJwYWdpbmcnLCAoX2U6IGFueSwgYXJnczogU29ob1BhZ2VyUGFnaW5nSW5mbykgPT4gdGhpcy5vbkFmdGVyUGFnaW5nKGFyZ3MpKVxuICAgICAgICAub24oJ3Njcm9sbCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRTY3JvbGxFdmVudCkgPT4gdGhpcy5vblZlcnRpY2FsU2Nyb2xsKGFyZ3MpKVxuICAgICAgICAub24oJ2ZpbHRlcm9wZXJhdG9yY2hhbmdlZCcsIChfZTogYW55LCBhcmdzOiBTb2hvRGF0YUdyaWRGaWx0ZXJPcGVyYXRvckNoYW5nZWRFdmVudCkgPT4gdGhpcy5vbkZpbHRlck9wZXJhdG9yQ2hhbmdlZChhcmdzKSlcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpc2UgdGhlIFNvaG9YaSBjb250cm9sLlxuICAgIHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YWdyaWQodGhpcy5fZ3JpZE9wdGlvbnMpO1xuXG4gICAgLy8gT25jZSB0aGUgY29udHJvbCBpcyBpbml0aWFsaXNlZCwgZXh0cmFjdCB0aGUgY29udHJvbFxuICAgIC8vIHBsdWctaW4gZnJvbSB0aGUgZWxlbWVudC4gIFRoZSBlbGVtZW50IG5hbWUgaXNcbiAgICAvLyBkZWZpbmVkIGJ5IHRoZSBwbHVnLWluLCBidXQgaW4gdGhpcyBjYXNlIGlzICdkYXRhZ3JpZCcuXG4gICAgdGhpcy5kYXRhZ3JpZCA9IHRoaXMualF1ZXJ5RWxlbWVudD8uZGF0YSgnZGF0YWdyaWQnKTtcblxuICAgIC8vIElmIFwiYXV0b1wiIGFuZCB0aGVyZSdzIGEgc2VydmljZSwgZ2V0IHRoZSBjb2x1bW5zIGZyb20gaXQuXG4gICAgLy8gKG1heSB3YW50IHRvIGNoZWNrIGlmIGNvbHVtbnMgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0PyBFcnJvcj8pXG4gICAgaWYgKHRoaXMuZGF0YWdyaWRUeXBlID09PSBTb2hvRGF0YUdyaWRDb21wb25lbnQuQVVUTyAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgLy8gQm9vdHN0cmFwIGZyb20gc2VydmljZSwgbm90ZSB0aGlzIGlzIG5vdCBhc3luYy5cbiAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldENvbHVtbnMoKTtcbiAgICAgIC8vIE9uY2UgdGhlIGNvbHVtbnMgYXJlIHNldCwgcmVxdWVzdCB0aGUgZGF0YSAocGFnaW5nPylcbiAgICAgIHRoaXMuZGF0YWdyaWRTZXJ2aWNlLmdldERhdGEobnVsbClcbiAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55W10pID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGFncmlkPy5sb2FkRGF0YShkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWREYXRhKSB7XG4gICAgICAvLyBOb3QgdXNpbmcgYSBzZXJ2aWNlLCBzbyB1c2UgdGhlIHByZS1sb2FkZWQgZGF0YS5cbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhZ3JpZD8ubG9hZERhdGEoKHRoaXMuZ3JpZERhdGEgYXMgYW55KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgdGhlIGNvbXBvbmVudHMgYXMgcmVxdWlyaW5nIGEgcmVidWlsZCBhZnRlciB0aGUgbmV4dCB1cGRhdGUuXG4gICAqXG4gICAqIEB0b2RvIHBvc3NpYmxlIGFkZCBoaW50cz8gUmVidWlsZCwgVXBkYXRlLCBTZXRPcHRpb25cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbk5hbWUgLSB0aGUgb3B0aW9uIHRoYXQgd2FzIHVwZGF0ZWQsIChhbGxvd2luZyBzcGVjaWZpYyBoYW5kbGluZylcbiAgICogQHBhcmFtIGhpbnQgLSB0aGUgdHlwZSBvZiByZWZyZXNoIHJlcXVpcmVkLCB1cGRhdGU/LlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrRm9yUmVmcmVzaChvcHRpb25OYW1lOiBzdHJpbmcsIGhpbnQ6IFJlZnJlc2hIaW50RmxhZ3MpIHtcblxuICAgIC8vIE1lcmdlIGluIHRoZSBoaW50LlxuICAgIHRoaXMucmVmcmVzaEhpbnQgfD0gaGludDsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4gICAgLy8gLi4uIHNvIHdlIGNhbiB1c2UgaXQgbGF0ZXJcbiAgICB0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2gob3B0aW9uTmFtZSk7XG5cbiAgICAvLyAuLi4gbWFrZSBzdXJlIHRoZSBjaGFuZ2UgZGV0ZWN0b3Iga2lja3MgaW4sIG90aGVyd2lzZSBpZiB0aGUgaW5wdXRzXG4gICAgLy8gd2VyZSBjaGFuZ2UgcHJvZ3JhbW1hdGlhbGx5IHRoZSBjb21wb25lbnQgbWF5IG5vdCBiZSBlbGlnaWJsZSBmb3JcbiAgICAvLyB1cGRhdGluZy5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgZ2FwIG1ldGhvZCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgZGF0YWdyaWQgYW5kIHJlYnVpbGQgaXQgYWdhaW4uXG4gICAqXG4gICAqIFRoaXMgaXMgcmVxdWlyZWQgd2hpbHN0IHRoZXJlIGlzIG5vIG1ldGhvZCBmb3VuZCB0aGF0IGNhbiB1cGRhdGUgdGhlIHZpZXdcbiAgICogZm9yIGEgcGFydGljdWxhciBpbnB1dC5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ29udHJvbCgpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgbmFzdHkgcmVmcmVzaGVzIGJ5IHJ1bm5pbmcgb3V0c2lkZSBhbmd1bGFyLlxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlZnJlc2hIaW50ICYgUmVmcmVzaEhpbnRGbGFncy5SZWJ1aWxkKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgdGhpcy5kZXN0cm95RGF0YUdyaWQoKTtcbiAgICAgICAgdGhpcy5idWlsZERhdGFHcmlkKCk7XG5cbiAgICAgICAgLy8gQXNzdW1lIGEgcmVidWlsZCB0cnVtcHMgYWxsIG90aGVyIGNhbmRpZGF0ZXMgLi4uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBAdG9kbyB2ZXJpZnkgaWYgY2FsbGluZyB0aGVzZSBzZXBhcmF0ZWx5IG1ha2VzIHNlbnNlLlxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVySGVhZGVyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgICAgICB0aGlzLmRhdGFncmlkPy5yZW5kZXJIZWFkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yZWZyZXNoSGludCAmIFJlZnJlc2hIaW50RmxhZ3MuUmVuZGVyUm93cykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgICAgdGhpcy5kYXRhZ3JpZD8ucmVuZGVyUm93cygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2V0IHRoZSBmbGFncy5cbiAgICAgIHRoaXMucmVmcmVzaEhpbnQgPSBSZWZyZXNoSGludEZsYWdzLk5vbmU7XG4gICAgICB0aGlzLmNoYW5nZWRPcHRpb25zID0gW107XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgc291cmNlIHNldHRpbmcvZnVuY3Rpb24gdG8gdXNlIHNvdXJjZSBpbnB1dCBpZiBzZXQuXG4gICAqIE90aGVyd2lzZSB1c2UgZGF0YUdyaWRTZXJ2aWNlIGlmIHRoYXQgaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTb3VyY2Uoc291cmNlOiBTb2hvRGF0YUdyaWRTb3VyY2VGdW5jdGlvbiB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIElmIGEgc291cmNlIHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWZpbmVkLCBhbmQgYSBzZXJ2aWNlIGhhc1xuICAgIC8vIHVzZSB0aGUgZGF0YSBzZXJ2aWNlIHRvIGxvYWQgdGhlIGRhdGEgZHluYW1pY2FsbHkgZm9yIHBhZ2luZy5cbiAgICBpZiAoIXNvdXJjZSAmJiB0aGlzLmRhdGFncmlkU2VydmljZSkge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc291cmNlID0gKHJlcXVlc3Q6IFNvaG9EYXRhR3JpZFNvdXJjZVJlcXVlc3QsIHJlc3BvbnNlOiBTb2hvRGF0YUdyaWRSZXNwb25zZUZ1bmN0aW9uKSA9PiB7XG4gICAgICAgIHRoaXMub25EYXRhUmVxdWVzdChyZXF1ZXN0LCByZXNwb25zZSk7XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoc291cmNlICYmIHR5cGVvZiBzb3VyY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2dyaWRPcHRpb25zLnNvdXJjZSA9IChyZXF1ZXN0OiBTb2hvRGF0YUdyaWRTb3VyY2VSZXF1ZXN0LCByZXNwb25zZTogU29ob0RhdGFHcmlkUmVzcG9uc2VGdW5jdGlvbikgPT4ge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gc291cmNlKHJlcXVlc3QsIHJlc3BvbnNlKSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JDb21wb25lbnRFZGl0b3JzKCkge1xuICAgIC8vIEFkZCBhbiBhZGFwdGVyIGZvciBhbGwgdGhlIGNvbHVtbnMgdXNpbmcgYW4gY29tcG9uZW50IGFzIGFuIGVkaXRvci5cbiAgICAodGhpcy5fZ3JpZE9wdGlvbnMgYXMgYW55KS5jb2x1bW5zLmZvckVhY2goKGM6IGFueSkgPT4ge1xuICAgICAgaWYgKGMuZWRpdG9yQ29tcG9uZW50KSB7XG4gICAgICAgIC8vIFVzZSBhIGBmdW5jdGlvbiBleHByZXNzaW9uYCByYXRoZXIgdGhhbiBhbiBgYXJyb3cgZnVuY3Rpb25gIGFzIHRoZSBlZGl0b3IgaXMgdXNlZFxuICAgICAgICAvLyBhcyBjb25zdHJ1Y3Rvci5cbiAgICAgICAgLy8gdGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgIGMuZWRpdG9yID0gZnVuY3Rpb24gKHJvdz86IGFueSwgY2VsbD86IGFueSwgdmFsdWU/OiBhbnksIGNvbnRhaW5lcj86IEpRdWVyeSwgY29sPzogU29ob0RhdGFHcmlkQ29sdW1uIHwgdW5kZWZpbmVkLCBlPzogYW55LCBhcGk/OiBhbnksIGl0ZW0/OiBhbnkpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgcmV0dXJuIG5ldyBTb2hvQW5ndWxhckVkaXRvckFkYXB0ZXIoYy5lZGl0b3JDb21wb25lbnQsIHsgcm93LCBjZWxsLCB2YWx1ZSwgY29udGFpbmVyOiAoY29udGFpbmVyIGFzIGFueSlbMF0sIGNvbCwgZSwgYXBpLCBpdGVtIH0pO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ZvclN1bW1hcnlSb3dTZXR0aW5ncygpIHtcbiAgICBpZiAoIXRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zIHx8IHRoaXMuX2dyaWRPcHRpb25zLnN1bW1hcnlSb3dDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5mb3JFYWNoKChjOiBhbnkpID0+IHtcbiAgICAgICAgYy5zdW1tYXJ5Um93Rm9ybWF0dGVyID0gdW5kZWZpbmVkO1xuICAgICAgICBjLnN1bW1hcnlUZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICBjLmFnZ3JlZ2F0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGMuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZ3JpZE9wdGlvbnMuc3VtbWFyeVJvd0NvbHVtbnMuZm9yRWFjaCgoc2MpID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uID0gKHRoaXMuX2dyaWRPcHRpb25zIGFzIGFueSkuY29sdW1ucy5maW5kKChjOiBhbnkpID0+IGMuZmllbGQgPT09IHNjLmZpZWxkKTtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLnN1bW1hcnlSb3dGb3JtYXR0ZXIgPSBzYy5zdW1tYXJ5Um93Rm9ybWF0dGVyO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHQgPSBzYy5zdW1tYXJ5VGV4dDtcbiAgICAgICAgKGNvbHVtbiBhcyBhbnkpLmFnZ3JlZ2F0b3IgPSBzYy5hZ2dyZWdhdG9yO1xuICAgICAgICAoY29sdW1uIGFzIGFueSkuc3VtbWFyeVRleHRQbGFjZW1lbnQgPSBzYy5zdW1tYXJ5VGV4dFBsYWNlbWVudDtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG59XG5cbi8qKlxuICogRGV0YWlscyBvZiB0aGUgJ2V4cGFuZHJvdycgYW5kICdjb2xsYXBzZXJvdycgZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZFRvZ2dsZVJvd0V2ZW50IGV4dGVuZHMgU29ob0RhdGFHcmlkUm93RXhwYW5kRXZlbnQge1xuICAvLyBUaGUgZGF0YSBncmlkIGNvbXBvbmVudCBvcmlnaW5hdGluZyB0aGUgY2FsbC5cbiAgZ3JpZDogU29ob0RhdGFHcmlkQ29tcG9uZW50O1xuICBhcmdzPzogYW55O1xufVxuXG4vKipcbiAqIERldGFpbHMgb2YgdGhlICdrZXlkb3duJyBldmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvaG9EYXRhR3JpZEtleURvd25FdmVudCB7XG4gIC8vIFRoZSBkYXRhIGdyaWQgY29tcG9uZW50IG9yaWdpbmF0aW5nIHRoZSBjYWxsLlxuICBlOiBKUXVlcnkuRXZlbnQ7XG4gIGFyZ3M/OiBTb2hvRGF0YUdyaWRLZXlEb3duQXJncztcbiAgcmVzcG9uc2U/OiBGdW5jdGlvbjtcbn1cbiJdfQ==
|